12

我在 Magento 系统中遇到了一个问题,在该系统中保存大量属性要么根本不起作用,要么只能部分起作用。这似乎是一个与 javascript 相关的问题,我希望 Stack Overflow 上的某个人有一些“已知的科学”来处理这种情况,或者可以为我指明正确的方向。

基本问题是,Magento 系统有超过 250 个颜色属性选项标签。如果管理员用户尝试通过执行以下操作来管理这些

  • 导航到目录 -> 属性 -> 管理属性
  • 选择颜色属性
  • 单击管理标签/选项选项卡
  • 编辑最后一个标签选项
  • 点击“保存并继续编辑”

发生两件事之一。

在 OS X 上的谷歌浏览器中,该按钮停留在“按下”状态,一段时间后谷歌浏览器的“此页面没有响应”终止对话框出现。

在 OS X 上基于 mozilla 的浏览器中,单击按钮会使浏览器“思考”一下,但最终会提交表单。 但是,只有部分属性标签列表会发布到管理控制器。这意味着用户只能编辑前 75 - 100 个标签,因为其他标签永远不会提交。

我也有来自 Windows 用户的报告描述了第二种行为(浏览器是非特定的)

显而易见的答案是要么调查表现不佳的 javascript,要么(Grouch Marx 风格)“不要那样做”。在我花时间分析/挖掘该页面上的 javascript 之前,我希望有一些已知的解决方法,或者关于导致问题的具体知识。

Magento CE 1.7.x,如果它很重要。

更新: Javascript 性能问题是一个红鲱鱼。它们是由大量输入字段在

js/prototype/validation.js

特别是在这个 try catch 块中

    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) {
    }

但是,即使我将其短路并让函数返回 true,不保存所有标签的行为仍然存在。

4

6 回答 6

18

您可以尝试使用变量 max_input_vars(在 PHP 5.3.9 中引入),默认情况下它是 1000,这样就足够了,但您的配置可能使用的数量较少。但我想由于您遇到的主要性能问题,该表格无法通过。

关于选项标签:他们是否有任何更改属性图像的上传者?当我们在一家拥有 300 多个制造商选项的商店安装 GoMage 高级导航扩展时,我们遇到了完全相同的问题(该扩展使用 Magento 的内置 Flash 上传器)。

我们没有该功能的扩展,所以我禁用了上传器,但性能的极端下降肯定是在加载 300 部 Flash 电影时。也许您可以尝试通过插入按钮或链接而不是电影来按选项延迟加载上传器。

希望这会为您指明正确(或准确)的方向。

于 2012-11-29T21:42:44.640 回答
12

[工作解决方案]

你好,正如 Alan Storm 提到的,这个问题与 JS 逻辑有关,它处理选项标签输入的验证。我在我的一个客户的项目中遇到了这个问题,我写了一个简单的扩展来解决它。

您可以在此处下载 exntesion: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>
于 2014-05-09T12:46:21.633 回答
3

我确实遇到了这个问题(POST 被截断),它来自一个 POST 限制太少的 suhosin 补丁。(或标准的 PHP post_max_size)

在您的 php.ini 中检查这些值并在需要时增加它们的值(并重新启动 apache):

post_max_size
suhosin.post.max_vars
suhosin.request.max_vars

对于您的第二个问题(JS 性能问题),我帮不了您

于 2012-11-29T20:53:48.593 回答
1

对不起!!

我遇到了同样的问题,解决方案如下。

问题的解释

问题

一个客户有一个非常大的轮胎基数,同时也添加了许多汽车,因此要迁移轮胎和车辆之间的系泊点,只有 255 个字符的 ids 属性插入到表中,导致迁移错误。

magento 插入一个字符串,其 id 由 , 分隔

问题出现在值字段中的表“catalog_product_entity_varchar”中,如果我输入文本并解决,默认情况下为 255 个字符。

注意:我知道你修改数据库不好但不幸的是不得不执行这个操作。

示例产品

轮胎 175 / 65R14

-> 品牌(+ - 200 个选项)
-> 型号(+ - 400 万个选项)
-> 系列(+ - 1500 万个选项)
-> 年份 -> ...

阿特,

于 2015-06-22T18:56:02.807 回答
1

这里同样的问题。我用 BELVG 模块“属性分页”解决了:http: //blog.belvg.com/attribute-admin-page-pagination-in-magento.html

它工作正常。

希望有帮助。

于 2015-06-30T16:07:03.523 回答
1

打开服务器的 php.ini,搜索 max_input_vars 并将其值设置为大于 2500 将解决您的问题

; How many GET/POST/COOKIE input variables may be accepted
max_input_vars = 5000
于 2016-05-19T13:00:12.593 回答