Augmenter le nombre maximun de produits par categorie

janvier 14th, 2015 | by | magento

Jan
14

 

Suite à la migration d'un client sur un nouveau serveur j'ai été confronté à un problème pour ajouter des produits au dela de 1000 pour une catégorie.
Les produits étaient ajoutés puis lorsque l'on sauvegardait nous avions bien le message disant que la catégorie avait bien été sauvegardée mais les produits n'étaient pas ajoutés…

Le problème vient de la variable php max_input_vars.
Le plus simple est d'augmenter cette valeur dans votre php.ini ou via votre htaccess mais nous allons voir comment modifier cela uniquement pour la sauvegarde des catégories sur Magento.

Nous allons donc surcharger le contrôleur d'administration des catégories.

Il faut donc créer un fichier config.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!-- /app/code/local/NAMESPACE/Categorylimit/etc/config.xml -->
<config>
   ...
   <admin>
      <routers>
         <adminhtml>
            <args>
               <namespace_categorylimit before="Mage_Adminhtml">Namespace_Categorylimit_Adminhtml</namespace_catergorylimit>
            </args> 
         </adminhtml>
      </routers>
   </admin>
   ...
</config>

Ce fichier dit à Magento d'appeler notre module avant "Mage_Adminhtml". Il reste donc à surcharger la methode save du CategoryController.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
<?php
// /app/etc/local/NAMESPACE/Categorylimit/controllers/Adminhtml/Catalog/CategoryController.php
 
class Namespace_Categorylimit_Adminhtml_Catalog_CategoryController extends Mage_Adminhtml_Catalog_CategoryController
{
 
  /**
     * Category save
     */
    public function saveAction()
    {
        if (!$category = $this->_initCategory()) {
            return;
        }
 
        $storeId = $this->getRequest()->getParam('store');
        $refreshTree = 'false';
        if ($data = $this->getRequest()->getPost()) {
            $category->addData($data['general']);
            if (!$category->getId()) {
                $parentId = $this->getRequest()->getParam('parent');
                if (!$parentId) {
                    if ($storeId) {
                        $parentId = Mage::app()->getStore($storeId)->getRootCategoryId();
                    }
                    else {
                        $parentId = Mage_Catalog_Model_Category::TREE_ROOT_ID;
                    }
                }
                $parentCategory = Mage::getModel('catalog/category')->load($parentId);
                $category->setPath($parentCategory->getPath());
            }
 
            /**
             * Process "Use Config Settings" checkboxes
             */
            if ($useConfig = $this->getRequest()->getPost('use_config')) {
                foreach ($useConfig as $attributeCode) {
                    $category->setData($attributeCode, null);
                }
            }
 
            /**
             * Create Permanent Redirect for old URL key
             */
            if ($category->getId() && isset($data['general']['url_key_create_redirect']))
            // && $category->getOrigData('url_key') != $category->getData('url_key')
            {
                $category->setData('save_rewrites_history', (bool)$data['general']['url_key_create_redirect']);
            }
 
            $category->setAttributeSetId($category->getDefaultAttributeSetId());
 
            if (isset($data['category_products']) &&
                !$category->getProductsReadonly()) {
                $products = array();
                $cat_products_array = explode('&', $data['category_products']);
foreach($cat_products_array as $products) {
    $temp_array = array();
    parse_str($products, $temp_array);
    list($key, $val) = each($temp_array);
    if (!empty($key) && !empty($val)) {
        $products[$key] = $val;
    }
}
                $category->setPostedProducts($products);
            }
 
            Mage::dispatchEvent('catalog_category_prepare_save', array(
                'category' => $category,
                'request' => $this->getRequest()
            ));
 
            /**
             * Proceed with $_POST['use_config']
             * set into category model for proccessing through validation
             */
            $category->setData("use_post_data_config", $this->getRequest()->getPost('use_config'));
 
            try {
                $validate = $category->validate();
                if ($validate !== true) {
                    foreach ($validate as $code => $error) {
                        if ($error === true) {
                            Mage::throwException(Mage::helper('catalog')->__('Attribute "%s" is required.', $category->getResource()->getAttribute($code)->getFrontend()->getLabel()));
                        }
                        else {
                            Mage::throwException($error);
                        }
                    }
                }
 
                /**
                 * Check "Use Default Value" checkboxes values
                 */
                if ($useDefaults = $this->getRequest()->getPost('use_default')) {
                    foreach ($useDefaults as $attributeCode) {
                        $category->setData($attributeCode, false);
                    }
                }
 
                /**
                 * Unset $_POST['use_config'] before save
                 */
                $category->unsetData('use_post_data_config');
 
                $category->save();
                Mage::getSingleton('adminhtml/session')->addSuccess(Mage::helper('catalog')->__('The category has been saved.'));
                $refreshTree = 'true';
            }
            catch (Exception $e){
                $this->_getSession()->addError($e->getMessage())
                    ->setCategoryData($data);
                $refreshTree = 'false';
            }
        }
        $url = $this->getUrl('*/*/edit', array('_current' => true, 'id' => $category->getId()));
        $this->getResponse()->setBody(
            '<script type="text/javascript">parent.updateContent("' . $url . '", {}, '.$refreshTree.');</script>'
        );
    }
}

En fait la modification porte sur cette ligne :

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

que l'on remplace par :

1
2
3
4
5
6
7
8
9
$cat_products_array = explode('&', $data['category_products']);
foreach($cat_products_array as $products) {
    $temp_array = array();
    parse_str($products, $temp_array);
    list($key, $val) = each($temp_array);
    if (!empty($key) && !empty($val)) {
        $products[$key] = $val;
    }
}

Pour expliquer, on découpe les produits de la catégorie une plusieurs morceaux pour ne plus être limiter par le serveur.

Il ne reste plus qu'à déclarer notre module app/etc/modules/Namespace_Categorylimit.xml

Authored by

Laisser un commentaire