with texto tag strip_tags remove limpiar from etiqueta eliminar allow all php magento magento-1.7

php - texto - string strip_tags



¿Por qué Magento mantiene solo los primeros 1000 productos en una categoría, después de guardar la categoría? (6)

Usando el back-office de Magento, después de guardar una categoría que estaba vinculada a muchos productos, solo se conservan los primeros 1000 productos (o 2000, o x000, según la configuración del host).

Todos los demás enlaces de categoría / producto se eliminan de la tabla catalog_category_product en la base de datos.
Esto ocurre aunque no se hayan desactivado las casillas de verificación en la cuadrícula de productos (pestaña Productos de categoría).

No se muestra ni se registra ningún mensaje de error.
El seguimiento de los datos publicados desde el navegador al servidor no revela ningún ID de producto faltante, pero incluso si verifica más productos en la red de back-office, cuando finalmente guarda la categoría, el servidor solo conserva el primer x000 y elimina otros ID. ..


¡Encontré una solución de trabajo, así que la estoy compartiendo aquí!

Cree un nombre de archivo php5.ini en su carpeta magento root y en la primera línea solo coloque este código

[PHP] max_input_vars = 5000

Ahora, si no funciona, deberá agregar esta línea en su SERVIDOR PHP, ini (/usr/local/lib/php.ini)

max_input_vars = 5000

Espero que sea de ayuda.


¡La solución 2 de programmeurweb está dañada, en Magento 1.8.0.0!

if (!empty($k) && !empty($v)) { $products[$k] = $v; }

Debería ser:

if (!empty($k)) { $products[$k] = $v; }

$ v se utiliza para ''posición'' y no es un valor de casilla de verificación = 1 (como casilla de verificación del producto asociado a la categoría actual).

Ya he probado esto. Me equivoco ?

Esto recuerda nunca copiar y pegar el código de la red.

PD: no puedo comentar respuestas ahora.


Aunque algunas respuestas se pueden encontrar en otros sitios web, pensé que valía la pena compartir esto en ...

El origen del problema se puede encontrar en Mage_Adminhtml_Catalog_CategoryController , donde el método saveAction() recupera una gran cadena POSTed ( category_products , codificada como una cadena de consulta), que se procesa mediante la función de PHP parse_str() :

if (isset($data[''category_products'']) && !$category->getProductsReadonly()) { $products = array(); parse_str($data[''category_products''], $products); $category->setPostedProducts($products); }

¡Ay! A partir de la versión 5.3.9 de PHP, hay un nuevo ajuste de configuración llamado max_input_vars , que limita el número de variables de entrada que pueden aceptarse.
Este límite se aplica principalmente a las $_GET , $_POST y $_COOKIE _COOKIE, pero también se usa internamente por la función parse_str() .
(Ver manual de PHP )

Dependiendo de la configuración de php.ini de su host, el número de productos vinculados a una categoría está limitado por esta configuración ...

Una solución es aumentar el valor de max_input_vars , en php.ini o en .htaccess :

<IfModule mod_php5.c> php_value max_input_vars 10000 </IfModule>

Esto incluso se puede hacer de forma más segura cambiando esta configuración solo para las páginas de administración (adapte el patrón de LocationMatch a su propio estilo de URL de back-office):

<LocationMatch "mymagentostore/(index/.php/)?admin/"> <IfModule mod_php5.c> php_value max_input_vars 10000 </IfModule> </LocationMatch>

( Source )

Esto solo soluciona el problema hasta que una de sus categorías alcanza el nuevo número máximo de productos ...

Otra solución sería corregir el código de Magento para no usar la función parse_str () en este punto.
Por ejemplo, en Mage_Adminhtml_Catalog_CategoryController , método saveAction() , reemplace:

parse_str($data[''category_products''], $products);

con:

$cat_products_split = explode(''&'', $data[''category_products'']); foreach($cat_products_split as $row) { $arr = array(); parse_str($row, $arr); //This will always work list($k, $v) = each($arr); if (!empty($k) && !empty($v)) { $products[$k] = $v; } }

( Source )

Es difícil decidir cuál es la mejor solución, ya que la primera hace que su servidor sea más vulnerable a los ataques (ya que max_input_vars pretende mitigar la posibilidad de ataques de denegación de servicio que utilizan colisiones hash), y la segunda solución le hace modificar una Clase principal de Magento, que puede llevar a más problemas en futuras actualizaciones de Magento ...

Espero que esto sea útil de todos modos, luché un poco antes de poder descubrir por qué algunas categorías perdían algunos productos.


La mejor solución sería utilizar el evento del observador "catalog_category_prepare_save". Entonces necesitas cambiar el config.xml de tu módulo:

<config> <global> <events> ... <catalog_category_prepare_save> <observers> <your_module> <class>your_module/observer</class> <method>onCatalogCategoryPrepareSave</method> </your_module> </observers> </catalog_category_prepare_save>

Luego agregue la función a app / code / local / Your / Module / Model / Observer.php

<?php class Your_Module_Model_Observer { /** * Fix bug with saving only first 1000 products in a category * It''s related to default php config ''max_input_vars'' = 1000 * * @param Varien_Event_Observer $observer */ public function onCatalogCategoryPrepareSave(Varien_Event_Observer $observer) { $phpDefaultMaxInputVars = (int)ini_get(''max_input_vars''); /** @var Mage_Core_Controller_Request_Http $request */ $request = $observer->getRequest(); $dataProducts = $request->getPost(''category_products''); $dataProducts = preg_split(''/&/'', $dataProducts, -1, PREG_SPLIT_NO_EMPTY); /** @var Mage_Catalog_Model_Category $category */ $category = $observer->getCategory(); if ($dataProducts && !$category->getProductsReadonly() && count($dataProducts) > $phpDefaultMaxInputVars) { $products = array(); foreach ($dataProducts as $_product) { $_product = trim($_product); if (preg_match(''/([0-9]*)=([/-]?[0-9]*)/'', $_product, $matches)) { $products[$matches[1]] = $matches[2]; } } $category->setPostedProducts($products); } } }

( Source )


<IfModule mod_php5.c> php_value max_input_vars 10000 </IfModule>

hice el truco para mí, tuve el mismo problema que el descrito anteriormente, Magento 1.4.1.1 solo guardó 1001 productos en la categoría, pero después de poner el código anterior en mi .htaccess, el error desapareció.


LocationMatch no está permitido en .htaccess, solo se puede colocar en Apache httpd.conf

La forma preferida es crear una inclusión de Apache y no modificar httpd.conf directamente, ya que se rompería en la próxima actualización / reconstrucción.

En mi caso, creé un archivo de inclusión pre_virtualhost_global.conf y puse este código dentro:

<LocationMatch "mymagentostore/(index/.php/)?admin/"> <IfModule mod_php5.c> php_value max_input_vars 10000 </IfModule>

Después, por supuesto, es necesario reiniciar Apache. Utilicé mi WebHostManager por lo que fue un proceso fácil.

Más información se puede encontrar en:

http://docs.cpanel.net/twiki/bin/view/EasyApache3/WebHome#Custom Directives to http.conf

Creo que esta es la solución más elegante, no toca Magento Core, se aplica a todos los sitios en su servidor y también protege la interfaz.