我有一个我在Magento 1.9.0中设置的网站,最近我试图添加一个新的小部件实例并发现它不会让我。我的目的是引用我成功添加的静态块。当我去添加新的小部件实例时,它允许我从下拉列表中选择Type:(cms static block)和Design Package / Theme,然后它会在顶部附近闪烁一条消息,说明“!Widget Instance not complete complete to create “但它已经消失了。
当我给它命名并保存它时,我不允许完成该过程,并且“前端属性”选项卡出现一个黄色三角形,上面写着“此选项卡包含无效数据,请在保存之前解决问题”。它允许我从窗口小部件选项中选择块而不会出现其他错误,但我无法保存它以完成该过程。我还应该注意,类型和设计包/主题的两个下拉列表在选择它们并变得没有响应后变为灰色。
我正在使用Magento提供的rwd主题,但我认为这并不重要,因为我尝试切换到默认主题,无论我从下拉菜单中做出什么选择(我尝试了很多组合),结果总是如此相同。
答案 0 :(得分:1)
您要添加哪个小部件?这是你自己开发的小部件吗?
“Widget Instance not full complete to create”消息似乎是良性的,并且似乎是由于表单必须分两个阶段完成 - 第一个选择模板,后者选择视图并添加布局更新。我不担心。
预计此处的问题是“窗口小部件选项”部分(请参阅右侧边栏)需要在保存实例之前需要填写的选项。如果它是你自己开发的小部件,那么widget.xml文件中的参数可能会有问题,所以如果你可以在这种情况下粘贴它,那么可能会有帮助。
答案 1 :(得分:1)
小部件实例未完全创建。
此错误消息是由Magento 1.x错误引起的。
发生这种情况时,选择Type和Theme / Package后,有两个请求完成:
http://www.domain.dev/index.php/admin/widget_instance/validate/?isAjax=true
并发布以下表单数据:
form_key:4izvVF4VrYgxs6W3 类型:yourmodule / yourwidgettype package_theme:RWD /默认
http://www.domain.dev/index.php/admin/widget_instance/edit/type/{{type}}/package/{{package}}/theme/{{theme}}/
检查发生了什么:
第一次请求致电\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,它应该被拆分以找出所需的两个参数。 这是错误。
但为什么我们认为有时这不会发生? 我们来看看请求的启动方式:
“继续”按钮有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]
}));
}
查看第二部分,我们可以看到拆分已完成且网址看起来正确:
/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请求已完成)将执行_processValidationResult
,这将显示错误消息:
$('messages').innerHTML = response.message;
这一切都取决于服务器的速度。如您所见,在setSettings函数中调用setLocation之前没有等待。 因此,如果服务器足够快,重定向将在完成验证并解析结果之前完成。
获取您拥有的任何Magento 1.x实例(最新版本为1.9.3.1,我已经在1.7.0.2和1.9.3.1上测试过),转到CMS/Widgets > Add new widget instance
,使用Chrome检查元素,转到到Network选项卡,选中Preserve logs,选择XHR requests,单击Continue并检查验证ajax响应。
错误将在那里,现在我们知道了!