我在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,也不会保存所有标签的行为。
答案 0 :(得分:18)
您可以尝试变量max_input_vars(在PHP 5.3.9中引入),默认情况下它是1000,因此应该足够了,但也许您的配置使用较低的数量。但是我认为由于您遇到的主要性能问题,表单无法通过。
关于选项标签:任何更改都有属性图像的上传器吗?当我们在拥有300多个制造商选项的商店中安装GoMage高级导航扩展时,我们遇到了完全相同的问题(扩展使用了Magento的内置Flash上传器)。
我们没有该功能的扩展名,因此我禁用了上传器,但极端性能下降肯定是在加载的300部Flash电影中。也许你可以通过插入一个按钮或链接代替电影来尝试在每个选项上懒惰加载上传器。
希望这能指向正确(或确切)的方向。
答案 1 :(得分:13)
[工作解决方案]
你好,Alan Storm提到,这个问题与JS逻辑有关,它处理选项标签输入的验证。我在我的一个项目的项目中遇到了这个问题,我写了一个简单的扩展,解决了它。
您可以在此处下载exntesion:https://github.com/Jarlssen/Jarlssen_FasterAttributeOptionEdit
基本上,扩展程序将原始选项模板替换为我的模板。在我的模板中,我重写了模板底部的大部分JS,并用div元素(伪输入)替换了表单输入,因此当管理员单击伪输入时,它将替换为真实输入。通过这种方式,我们避免验证所有输入,并且我们仅验证已编辑的和新添加的条目。如果您在块上添加选项,则扩展可以正常工作,例如每个属性保存500个条目。
希望,这有帮助。
快速查看伪代码:
<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>
答案 2 :(得分:3)
我确实遇到了这个问题(POST被截断),它来自一个suhosin补丁,它的POST限制太少了。 (或标准PHP post_max_size)
在你的php.ini中检查这些值并在需要时增加它们的值(并重启apache):
post_max_size
suhosin.post.max_vars
suhosin.request.max_vars
对于你的第二个问题(JS性能问题),我无法帮助你
答案 3 :(得分:1)
对不起!!
我遇到了同样的问题,解决方法如下。
问题说明
问题
一个客户有一个非常大的轮胎基地,也有许多汽车添加到同一个,从而在轮胎和车辆之间迁移停泊只有255个字符的属性被插入到表中与它导致迁移错误
magento插入一个字符串,其中id由
分隔问题出现在表格&#34; catalog_product_entity_varchar&#34;在值字段中,如果我放置文本并解析,默认情况下为255个字符。
注意:我知道你修改数据库并不好,但遗憾的是必须执行此操作。
示例产品
轮胎175 / 65R14
- &GT;制作(+ - 200个选项)
- &GT;型号(+ - 4mil选项)
- &GT;系列(+ - 15mil选项)
- &GT;年
- &GT; ...
ATT,
答案 4 :(得分:1)
这里的问题相同。我用BELVG模块“属性分页”解决了:http://blog.belvg.com/attribute-admin-page-pagination-in-magento.html
它运作正常。
希望有所帮助。
答案 5 :(得分:1)
打开你的服务器的php.ini,搜索max_input_vars并将其值设置为大于2500将解决你的问题
; How many GET/POST/COOKIE input variables may be accepted
max_input_vars = 5000