我在Magento系统中遇到了一个问题,即保存大量属性要么根本不起作用,要么只能部分起作用.它似乎是一个与javascript相关的问题,我希望Stack Overflow上的某个人有一些"已知的科学"来处理这种情况,或者可以指出我正确的方向.
基本问题是,有问题的Magento系统有超过250种颜色属性选项标签.如果管理员用户尝试通过执行以下操作来管理这些操作
发生了两件事之一.
在OS X上的谷歌浏览器中,该按钮处于"低迷"状态,经过一段时间谷歌Chrome的"此页面无响应"后,出现了杀死对话框.
在OS X上基于Mozilla的浏览器中,单击该按钮会使浏览器"思考"一下,但最终会提交表单. 但是,只有部分属性标签列表会发布到管理控制器.这意味着用户只能编辑前75-100个标签,因为其他标签从未提交过.
我有来自Windows用户的报告,描述了第二种行为(浏览器是非特定的)
显而易见的答案是调查表现不佳的javascript,或者(Grouch Marx风格)"不要那样做".在我花时间分析/挖掘该页面上的javascript之前,我希望有一些已知的修复程序,或者有关导致问题的具体知识.
Magento CE 1.7.x,如果它成熟.
更新: Javascript性能问题是一个红色的鲱鱼.它们是由大量输入字段迭代引起的
js/prototype/validation.js
Run Code Online (Sandbox Code Playgroud)
特别是在这个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) {
}
Run Code Online (Sandbox Code Playgroud)
但是,即使我将其短路并使函数返回true,也不会保存所有标签的行为.
小智 18
您可以尝试变量max_input_vars(在PHP 5.3.9中引入),默认情况下它是1000,因此应该足够了,但也许您的配置使用较低的数量.但我认为由于您遇到的主要性能问题,表单无法通过.
关于选项标签:通过任何更改,它们是否具有属性图像的上传器?当我们在拥有300多个制造商选项的商店中安装GoMage高级导航扩展时,我们遇到了完全相同的问题(扩展使用了Magento的内置Flash-uploader).
我们没有该功能的扩展,因此我禁用了上传器,但极端性能下降肯定是在加载的300部Flash电影中.也许您可以通过插入按钮或链接而不是电影来尝试在每个选项的基础上延迟加载上传器.
希望这能指向正确(或确切)的方向.
cec*_*lab 13
[工作方案]
你好,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>
Run Code Online (Sandbox Code Playgroud)