Проблемы Сохранение большого количества идентификаторов атрибутов в Magento
У меня возникает проблема в системе Magento, где сохранение большого количества атрибутов либо вообще не работает, либо работает только частично. Это похоже на проблему, связанную с javascript, и я надеялся, что у кого-то из Qaru есть некоторая "известная наука" для решения этой ситуации или может указать мне в правильном направлении.
Основная проблема заключается в том, что система Magento имеет более 250 ярлыков атрибутов атрибутов цвета. Если пользователь-администратор пытается их устранить, выполнив следующие
- Навигация в каталог → Атрибуты → Управление атрибутами
- Выбор цветовых атрибутов
- Нажав на вкладку "Управление ярлыками/вкладками"
- Редактирование последней опции метки
- Нажав "Сохранить и продолжить редактирование"
Случается одна из двух вещей.
В Google Chrome на OS X кнопка находится в состоянии "нажата", и через некоторое время Google Chrome "Эта страница не реагирует" появляется диалоговое окно "Kill".
В браузере на базе Mozilla на OS X нажатие кнопки заставляет браузер "думать" немного, но в конце концов он представляет форму. Однако в контроллер администратора отправляется только неполный список ярлыков атрибутов. Это означает, что пользователь может редактировать только первые 75 - 100 ярлыков, поскольку другие ярлыки никогда не отправляются.
У меня есть отчеты от пользователей Windows, описывающих второе поведение (браузеры неспецифичны)
Очевидные ответы - либо исследовать плохо исполняемый javascript, либо (стиль Гроуха Маркса) "не делайте этого". Прежде чем тратить время на профилирование/экскавацию javascript на этой странице, я надеялся, что есть какое-то известное решение для этого или конкретные знания о том, что вызывает проблему.
Magento CE 1.7.x, если он сопрягается.
Обновление: Проблемы с производительностью Javascript - это красная селедка. Они вызваны массивным количеством полей ввода, которые повторяются через
js/prototype/validation.js
В частности, в этом try catch block
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, поведение сохранения всех ярлыков сохраняется.
Ответы
Ответ 1
Вы можете попробовать переменную max_input_vars (введенную в PHP 5.3.9), по умолчанию она 1000, поэтому этого должно быть достаточно, но, возможно, ваша конфигурация использует меньшее количество. Но я полагаю, что форма просто не проходит из-за основных проблем с производительностью, которые вы испытываете.
О ярлыках опций: есть ли у них какие-либо изменения для пользователя-загрузчика для атрибута-образа? У нас была такая же проблема, когда мы установили расширение расширенной навигации GoMage в магазине с более чем 300 опциями производителя (расширение использует встроенный Flash-загрузчик Magento).
У нас не было расширения для этой функции, поэтому я отключил загрузчик, но предельное снижение производительности было, безусловно, загружено в 300 загружаемых Flash-роликов. Возможно, вы можете попробовать lazyloading загрузчика по каждой опционной основе, вставив кнопку или ссылку вместо фильма.
Надеемся, что это указывает на правильное (или точное) направление.
Ответ 2
[Working SOLUTION]
Привет, как упоминал Алан Шторм, этот ussue связан с логикой JS, которая обрабатывает валидацию входов метки метки. У меня была эта проблема в проекте одного из моих клиентов, и я написал простое расширение, которое его решает.
Вы можете загрузить exntesion здесь: https://github.com/Jarlssen/Jarlssen_FasterAttributeOptionEdit
В основном расширение заменяет исходный шаблон шаблона шаблоном. В моем шаблоне я переписал большую часть JS в нижней части шаблона и заменил входные данные формы на элементы div (псевдо-входы), поэтому, когда администратор нажимает на псевдо-вход, тогда его заменяет реальный ввод. Таким образом, мы избегаем проверки всех входов, и мы проверяем только отредактированные и новые добавленные записи. Расширение работает хорошо, если вы добавляете параметры на куски, например 500 записей на каждый атрибут save.
Надеюсь, это поможет.
Дополнительная информация: 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>
Ответ 3
У меня была именно эта проблема (POST усечена), и она исходит из пакета suhosin с слишком небольшим значением POST. (или стандартный PHP post_max_size)
В php.ini проверьте эти значения и при необходимости увеличьте их значения (и перезапустите apache):
post_max_size
suhosin.post.max_vars
suhosin.request.max_vars
Для вашей второй проблемы (проблема производительности JS) я не могу помочь вам
Ответ 4
Такая же проблема. Я решил с помощью модуля BELVG "Атрибут разбиения на страницы": http://blog.belvg.com/attribute-admin-page-pagination-in-magento.html
Он работает правильно.
Надеюсь, что это поможет.
Ответ 5
Откройте ваш сервер php.ini, найдите max_input_vars и установите его значение больше 2500, решив вашу проблему
; How many GET/POST/COOKIE input variables may be accepted
max_input_vars = 5000
Ответ 6
К сожалению!!
Я прошел эту же проблему, решение ниже.
Объяснение проблемы
Проблема
Клиент имеет очень большую базу шин, которые также имеют много автомобилей, добавленных к тому же, таким образом, чтобы мигрировать причалы между шинами и транспортными средствами, в таблицу было вставлено только 255 символов атрибутов идентификаторов, из-за чего она вызывала ошибку в миграции.
Magento вставляет строку с идентификаторами, разделенными символом
Проблема возникла в таблице "catalog_product_entity_varchar" в поле значения, которое по умолчанию составляет 255 символов, если я помещаю текст и разрешаю.
Примечание. Я знаю, что вы модифицируете БД, это не приятно, но, к сожалению, пришлось выполнить эту операцию.
Пример продукта
Шина 175/65R14
- > Сделать (+ - 200 опций)
- > Модель (+ - 4 мили)
- > Серия (+ - 15mil опций)
- > Год
- > ...
АТТ