无法在Magento 1.9中添加新的小部件实例

时间:2014-12-03 09:21:01

标签: magento widget

我有一个我在Magento 1.9.0中设置的网站,最近我试图添加一个新的小部件实例并发现它不会让我。我的目的是引用我成功添加的静态块。当我去添加新的小部件实例时,它允许我从下拉列表中选择Type:(cms static block)和Design Package / Theme,然后它会在顶部附近闪烁一条消息,说明“!Widget Instance not complete complete to create “但它已经消失了。

当我给它命名并保存它时,我不允许完成该过程,并且“前端属性”选项卡出现一个黄色三角形,上面写着“此选项卡包含无效数据,请在保存之前解决问题”。它允许我从窗口小部件选项中选择块而不会出现其他错误,但我无法保存它以完成该过程。我还应该注意,类型和设计包/主题的两个下拉列表在选择它们并变得没有响应后变为灰色。

我正在使用Magento提供的rwd主题,但我认为这并不重要,因为我尝试切换到默认主题,无论我从下拉菜单中做出什么选择(我尝试了很多组合),结果总是如此相同。

2 个答案:

答案 0 :(得分:1)

您要添加哪个小部件?这是你自己开发的小部件吗?

“Widget Instance not full complete to create”消息似乎是良性的,并且似乎是由于表单必须分两个阶段完成 - 第一个选择模板,后者选择视图并添加布局更新。我不担心。

预计此处的问题是“窗口小部件选项”部分(请参阅右侧边栏)需要在保存实例之前需要填写的选项。如果它是你自己开发的小部件,那么widget.xml文件中的参数可能会有问题,所以如果你可以在这种情况下粘贴它,那么可能会有帮助。

答案 1 :(得分:1)

  

小部件实例未完全创建。

此错误消息是由Magento 1.x错误引起的。

说明

发生这种情况时,选择Type和Theme / Package后,有两个请求完成:

  1. http://www.domain.dev/index.php/admin/widget_instance/validate/?isAjax=true并发布以下表单数据:

    form_key:4izvVF4VrYgxs6W3 类型:yourmodule / yourwidgettype package_theme:RWD /默认

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

  3. 检查发生了什么: 第一次请求致电\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响应。 错误将在那里,现在我们知道了!

    enter image description here