2012-11-29 8 views
11

Magentoシステムで多数の属性の保存が全く機能しない、または部分的にしか機能しないという問題が発生しています。これはJavaScriptに関する問題であると思われ、Stack Overflowの誰かがこの状況に対処するための「既知の科学」を持っていることを望んでいたか、正しい方向に向けることができました。Magentoで大量の属性オプションラベルを保存する際の問題

問題のMagentoシステムは250以上の色属性オプションラベルを持っています。 >属性 - - >色を選択する属性

  • を管理する管理ラベル/ [オプション]タブ
  • 編集に
  • クリックすると属性管理者ユーザは、カタログに移動し、次の

    • を行うことにより、これらを管理しようとした場合

    「の編集を保存して続行」をクリックする最後のラベルオプション
  • は、2点の一つが起こります。

    Google Chrome on OS Xでは、ボタンが「押し下げられた」状態になり、一定時間が経過するとGoogle Chromeの「このページは反応しません」という殺人ダイアログが表示されます。

    OS XのMozillaベースのブラウザでは、ボタンをクリックするとブラウザが少し考えられますが、最終的にフォームが送信されます。 の場合、属性ラベルの部分的なリストのみが管理コントローラに送信されます。これは、他のラベルが決して提出されないので、最初の75〜100のラベルだけを編集できることを意味します。

    私は明白な答えがパフォーマンスの低いJavaScriptを調査し、または(グルーチョ・マルクススタイル)するのどちらかであるだけでなく第2行動を記述したWindowsユーザーからの報告(ブラウザは非特異的である)

    を持って「実行しませんそれ"。そのページでJavaScriptのプロファイリング/発掘に時間を費やす前に、問題の原因となっていたことに関する特定の知識があることが分かっていました。

    Magento CE 1.7.x、それが揃っていれば、

    更新: JavaScriptのパフォーマンスの問題は、赤いニシンです。彼らは、入力フィールドの膨大な数に起因しているが、反復処理されている。具体的

    try { 
         if(this.options.stopOnFirst) { 
          result = Form.getElements(this.form).all(function(elm) { 
           if (elm.hasClassName('local-validation') && !this.isElementInForm(elm, this.form)) { 
            return true; 
           } 
           return Validation.validate(elm,{useTitle : useTitles, onElementValidate : callback}); 
          }, this); 
         } else { 
          result = Form.getElements(this.form).collect(function(elm) { 
           if (elm.hasClassName('local-validation') && !this.isElementInForm(elm, this.form)) { 
            return true; 
           } 
           return Validation.validate(elm,{useTitle : useTitles, onElementValidate : callback}); 
          }, this).all(); 
         } 
        } catch (e) { 
        } 
    

    しかし、このトライcatchブロックで

    js/prototype/validation.js 
    

    であってもI短絡これと真の関数の戻り値を持っています、すべてのラベルを保存しないという動作はそのままです。

  • 答えて

    17

    を助けることができないあなたは、変数max_input_varsを(試すことができますPHP 5.3.9で導入されました)、デフォルトでは1000で十分ですが、設定によってはより少ない量が使用されることがあります。しかし、あなたが経験している主要なパフォーマンス上の問題のためにフォームがちょっとしたことがないと思います。

    オプションラベルについて:どのような変更によってそれらの属性ラベルに属性画像のアップローダがありますか? GoMageアドバンスドナビゲーションエクステンションを300種類以上のメーカーオプション(Magentoの内蔵フラッシュアップローダーを使用)でインストールしたときも、まったく同じ問題が発生しました。

    私はその機能の拡張機能がありませんでしたので、アップローダを無効にしましたが、300のFlashムービーが読み込まれている間は、パフォーマンスが極端に低下していました。おそらく、ムービーの代わりにボタンまたはリンクを挿入することによって、オプションごとにアップローダをlazyloadingすることができます。

    これが正しい(または正確な)方向を指し示すことを望みます。

    +0

    これは問題のようです。私がPOST配列を平坦化して数えれば、それはちょうど1000の要素を持っています。来る人達は、このバグレポートを読むべきです.max_input_varsのドキュメントはやや不正確です。 https://bugs.php.net/bug.php?id=62921&edit=1 –

    +0

    これも私の問題を修正しました(Alan Stormと同じ問題です)。 max_input_varsはすでに1000に設定されていましたが、380の属性値では機能しませんでした。 3000に設定すると、ボタンはクロムで押されたままですが、値は正しく保存されました。 –

    3

    私はまさにこの問題を抱えていました(POSTは切り捨てられました)、それはPOST制限があまりにも小さいsuhosinパッチから来ています。 (または標準のPHP post_max_size)

    あなたのPHPで。これらの値をチェックし、必要に応じてその値を増加(とApacheを再起動します)INI:

    post_max_size 
    suhosin.post.max_vars 
    suhosin.request.max_vars 
    

    2番目probleme(JSのパフォーマンスの問題)のために、私はあなたに

    +0

    1あなたの問題を解決しますが、suhosinまたはpost_max_sizeのはということであるように、それは見ていない、サーバーのphp.iniのを開きmax_input_varsの検索およびより大きい2500にその値を設定ここに犯人しかし、ありがとう! –

    +0

    私はまた、このsuhosinの問題にカップルの時間を実行します。また、Magentoで時々使用される長いGETラインを殺すことに注意してください。 – macki

    +0

    慎重にすべてのphpinfo()変数を確認してください。何か関連があります。 –

    11

    [使用液]

    こんにちはアラン・ストームが述べたように、このussueは、オプションのラベルの入力の検証を処理JSロジックと関連しています。私は、私の兄弟のプロジェクトでこの問題を抱えていました。私は簡単な拡張を書いて、それを解決しました。

    あなたはここのためexntesionをdowloadことができます。https://github.com/Jarlssen/Jarlssen_FasterAttributeOptionEdit

    基本的に延長は私のテンプレートとオリジナルのオプションテンプレートを置き換えます。私のテンプレートでは、ほとんどのJSをテンプレートの最後に書き直し、フォーム入力をdiv要素(擬似入力)に置き換えました。管理者が擬似入力をクリックすると、その入力が実際の入力に置き換えられました。このようにして、すべての入力の検証を避け、編集されたエントリと新しい追加されたエントリだけを検証します。拡張子は、チャンクにオプションを追加した場合(たとえば、属性の保存ごとに500エントリ)にうまく機能します。

    希望、それは役立ちます。

    追加情報:擬似生成コードでhttp://www.jarlssen.de/blog/2014/05/07/magento-timeout-saving-attribute-options-type-multiple-select-and-dropdown

    クイックルック:

    <tr class="option-row"> 
    <?php foreach ($this->getStores() as $_store): ?> 
        <td> 
        <div class="replace-content pseudo-input input-text <?php if($_store->getId()==0): ?> required-option<?php endif; ?>" id="option[value][<?php echo $_value->getId() ?>][<?php echo $_store->getId() ?>]"><?php echo $_value->getData('store' . $_store->getId()) ?></div> 
        </td> 
        <?php endforeach; ?> 
        <td> 
         <div class="replace-content pseudo-input" id="option[order][<?php echo $_value->getId() ?>]"><?php echo $_value->getSortOrder() ?></div> 
        </td> 
        <td class="a-center default-checkbox"> 
         <div id="option_<?php echo $_value->getId() ?>" class="checkbox-radio-container replace-content"> 
         <?php if($_value->getChecked()) : ?> 
          <input class="input-radio" type="<?php echo $defaultChooserInputType; ?>" name="default[]" value="<?php echo $_value->getId() ?>" checked <?php if ($this->getReadOnly()):?> disabled="disabled"<?php endif;?>/> 
         <?php else : ?> 
          <?php if('radio' == $defaultChooserInputType) : ?> 
           <span class="fake-radio"></span> 
          <?php else : ?> 
           <span class="fake-checkbox"></span> 
          <?php endif; ?> 
         <?php endif; ?> 
         </div> 
        </td> 
        <td class="a-left actions-column" id="delete_button_container_<?php echo $_value->getId() ?>"> 
         <div id="option[delete][<?php echo $_value->getId() ?>]" title="<?php echo $this->__('Delete') ?>" class="scalable left pseudo-delete-option"> 
         <span class="pseudo-delete-button" option_id="<?php echo $_value->getId(); ?>"> 
          <span> 
           <span><?php echo $this->__('Delete') ?></span> 
          </span> 
         </span> 
         </div> 
        </td> 
    </tr> 
    
    +1

    この仕事は魅力のように私には、2000年のオプションの値のようなもので、この問題は完全に遅い問題を解決します。 – Guerra

    +0

    @Guerra素晴らしい!この修正プログラムを使用して問題が発生した場合は、githubでissueを開いてください。 – ceckoslab

    +1

    もう1人の幸せなユーザー! 4000以上のアイテム、問題ありません。 Magentoはこの方法をデフォルトで使用する必要があります。 –

    0

    申し訳ありません!

    私はこの同じ問題を解決しました。解決方法は以下のとおりです。問題の

    説明

    問題

    顧客も多くの車が、それによってタイヤや車の属性のみ255文字の間に係留を移行するには、同じに追加したタイヤの非常に大規模な基盤を持っている

    のIDがテーブルに挿入され、移行にエラーが発生しました。

    Magentoのは、区切らIDを持つ文字列を挿入し、

    問題は、私は、テキストを入れて解決した場合、デフォルトでは255個の文字である値フィールドに表に「catalog_product_entity_varchar」を発生しました。

    注:あなたはDBがうまくいきませんが、残念なことにこの操作を実行しなければならないことを知っています。

    実施例品

    タイヤ175/65R14

    - >確認します(+ - 200オプション)
    - >モデル(+ - 4milオプション)
    - >シリーズ(+ - 15milオプション)
    - >年 - > ...

    ATT、ここ

    1

    貴重な情報について

    ; How many GET/POST/COOKIE input variables may be accepted 
    max_input_vars = 5000 
    
    +0

    これは私にとっては簡単な解決策でした。 –

    関連する問題