Невозможно добавить новый экземпляр виджета в Magento 1.9

У меня есть веб-сайт, который я создал в Magento 1.9.0, и недавно я пытался добавить новый экземпляр виджета и обнаружил, что это не позволит мне. Мое намерение - ссылаться на статический блок, который я успешно добавил. Когда я иду добавить новый экземпляр виджета, он позволяет мне выбрать тип: (cms static block) и Design Package/Theme из раскрывающегося списка, а затем он высветится сообщение вверху, в котором говорится: "! Экземпляр виджета не заполнен полностью, чтобы создать "но потом он ушел.

Когда я иду, чтобы дать ему имя и сохранить его, мне не разрешено завершить процесс, а на вкладке "Свойства интерфейса" появляется желтый треугольник, в котором говорится: "Эта вкладка содержит недопустимые данные, пожалуйста, решите проблему перед сохранением". Это позволяет мне выбрать блок из параметров виджета без дополнительных ошибок, но я не могу его сохранить, чтобы завершить процесс. Я также должен отметить, что два раскрывающихся списка для Type and Design Package/Theme становятся серыми после их выбора и становятся невосприимчивыми.

Я использую тему rwd, предоставленную Magento, но я не думаю, что это важно, потому что я попытался переключиться на тему по умолчанию и независимо от того, какие выборы я делаю из раскрывающихся списков (я пробовал много комбинаций), результат всегда один и тот же.

2 ответа

Какой виджет вы пытаетесь добавить? Это виджет, который вы разрабатываете самостоятельно?

Сообщение "Widget Instance not full complete to create" кажется доброкачественным и, по-видимому, связано с тем, что форма должна быть завершена в два этапа - первая для выбора шаблона, вторая - для выбора представлений и добавления обновлений макета. Я бы не стал беспокоиться об этом.

Ожидайте, что проблема заключается в том, что в разделе "Параметры виджета" (см. Правую боковую панель) требуются параметры, которые необходимо заполнить, прежде чем вы сможете сохранить экземпляр. Если это виджет, который вы разрабатываете самостоятельно, могут возникнуть проблемы с параметрами в файле widget.xml, поэтому, возможно, поможет, если вы можете вставить это здесь в этом случае.


Экземпляр виджета не полностью заполнен для создания.

Это сообщение об ошибке вызвано ошибкой Magento 1.x.

объяснение

Когда это произойдет, после выбора типа и темы/пакета выполняются два запроса:

  1. http://www.domain.dev/index.php/admin/widget_instance/validate/?isAjax=true и со следующими опубликованными данными формы:

    form_key: 4izvVF4VrYgxs6W3 Тип: yourmodule/yourwidgettype package_theme: rwd/default

  2. http://www.domain.dev/index.php/admin/widget_instance/edit/type/{{type}}/package/{{package}}/theme/{{theme}}/

Проверка того, что происходит: 1-й запрос вызывает \Mage_Widget_Adminhtml_Widget_InstanceController::validateAction() который будет делать $widgetInstance = $this->_initWidgetInstance() затем $widgetInstance->validate(); _initWidgetInstance() будет делать:

$instanceId = $this->getRequest()->getParam('instance_id', null);
$type = $this->getRequest()->getParam('type', null);
$package = $this->getRequest()->getParam('package', null);
$theme = $this->getRequest()->getParam('theme', null);

Проблема здесь в том, что нет двух параметров пакета и темы, но один с именем package_theme, который должен был быть разделен, чтобы узнать, какие из них необходимы. Это ошибка.

Но почему мы думаем, что иногда этого не происходит? Проверьте, как запускаются запросы:

Кнопка Continue имеет onClick="setSettings('http://www.domain.dev/index.php/admin/widget_instance/edit/type/{{type}}/package/{{package}}/theme/{{theme}}/', 'type', 'package_theme')" Функция называется:

function setSettings(urlTemplate, typeElement, packageThemeElement) {
 if (!editForm.validate()) {
 return false;
 }

 typeElement = $F(typeElement).replace(/\//g, '-');
 packageThemeElement = $F(packageThemeElement).split(/\//g);

 setLocation(new Template(urlTemplate, /(^|.|\r|\n)({{(\w+)}})/).evaluate({
 'type': typeElement,
 'package': packageThemeElement[0],
 'theme': packageThemeElement[1]
 }));
}

Посмотрев на вторую часть, мы видим, что раскол сделан, и URL выглядит правильно:

/index.php/admin/widget_instance/edit/type/yourmodule-yourwidget/package/rwd/theme/default/

Но сначала есть часть editForm.validate() которая каким-то образом ajax вызывает validateAction() из \Mage_Widget_Adminhtml_Widget_InstanceController::validateAction. Вернемся в JS: validate() определяется в js/mage/form.js и если имеется набор validationUrl, он вызовет _validate.

_validate : function(){
 new Ajax.Request(this.validationUrl,{
 method: 'post',
 parameters: $(this.formId).serialize(),
 onComplete: this._processValidationResult.bind(this),
 onFailure: this._processFailure.bind(this)
 });

Здесь мы видим, что вызывается запрос validateAction и параметр package_theme не разделяется. onComplete (ajax request complete) выполнит _processValidationResult который отобразит сообщение об ошибке:

$('messages').innerHTML = response.message;

Но почему не все жалуются на это или почему ошибка не всегда видна?

Все зависит от скорости сервера. Как вы можете видеть, нет ожидания перед вызовом setLocation в функции setSettings. Поэтому, если сервер будет достаточно быстрым, перенаправление будет выполнено до того, как проверка будет завершена, и результат будет обработан.

Убедить себя

Возьмите любой экземпляр Magento 1.x, который у вас есть (последнее сейчас 1.9.3.1, я тестировал на 1.7.0.2 и 1.9.3.1), перейдите в CMS/Widgets > Add new widget instance, используйте элемент проверки Chrome, перейдите в Сеть вкладку, проверьте журнал сохранения, выберите XHR-запросы, нажмите "Продолжить" и проверьте ответ ajax проверки. Ошибка будет там, и теперь мы знаем!

licensed under cc by-sa 3.0 with attribution.