他のウェブサイトでいくつかの答えを見つけることができますが、StackOverflowでこれを共有する価値があると思いました...
問題の原因はにありますMage_Adminhtml_Catalog_CategoryController
。ここで、メソッドは、PHP関数によって処理されるsaveAction()
大きなPOST文字列(クエリ文字列のようにエンコードされた)を取得します。category_products
parse_str()
if (isset($data['category_products']) && !$category->getProductsReadonly()) {
$products = array();
parse_str($data['category_products'], $products);
$category->setPostedProducts($products);
}
ああ!max_input_vars
PHPのバージョン5.3.9以降、受け入れることができる入力変数の数を制限する、と呼ばれる新しい構成設定があります。
この制限は主に$_GET
、$_POST
およびスーパーグローバルに適用されますが、関数$_COOKIE
によって内部的にも使用されます。
(PHPマニュアルを参照)parse_str()
php.ini
したがって、ホストの構成に応じて、カテゴリにリンクされる製品の数はこの設定によって制限されます...
1つの解決策max_input_vars
は、inphp.ini
またはinの値を増やすことです.htaccess
。
<IfModule mod_php5.c>
php_value max_input_vars 10000
</IfModule>
これは、管理ページに対してのみこの設定を変更することで、より安全に行うことができます(LocationMatchパターンを独自のバックオフィスURLスタイルに適合させます)。
<LocationMatch "mymagentostore/(index\.php/)?admin/">
<IfModule mod_php5.c>
php_value max_input_vars 10000
</IfModule>
</LocationMatch>
(出典)
これは、カテゴリの1つが新しい最大数の製品に達するまで問題を解決するだけです...
別の解決策は、この時点でparse_str()関数を使用しないようにMagentoのコードを修正することです。
たとえばMage_Adminhtml_Catalog_CategoryController
、saveAction()
メソッドで、次を置き換えます。
parse_str($data['category_products'], $products);
と:
$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;
}
}
(出典)
最初のソリューションはサーバーを攻撃に対してより脆弱にするため(max_input_vars
ハッシュ衝突を使用するサービス拒否攻撃の可能性を軽減するため)、2番目のソリューションはMagentoを変更するため、どちらのソリューションが最適かを判断するのは困難です。コアクラス。将来のMagentoアップグレードでさらに問題が発生する可能性があります...
これがとにかく役立つことを願って、私はいくつかのカテゴリーがいくつかの製品を失い続けた理由を見つける前にしばらく苦労しました!