不久前,我在Stackoverflow上发现了一个问题,内容涉及通过小部件允许多个产品。我以为自己,这将是一个不错的选择,而且肯定不会那么困难。可悲的是,我错了:(我设法将大规模动作复选框和按钮显示在小部件上,但随之而来的JavaScript不包括或不工作。

显示网格包括包括质量操作选项,但是当我尝试使用这些项目时,我会收到以下JavaScript错误。

未定义的参考文献:options_fieldset1adc562cf047406a6a634a7c10ae4f7db2_product_idsa765921c1aaf6166666666c2e834683468e0bf_massactionjsobject

所以这是我到目前为止所做的。

创建一个app etc 模块 manners_widgets.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Manners_Widgets>
            <active>true</active>
            <codePool>community</codePool>
            <depends>
                <Mage_Adminhtml />
                <Mage_Widget />
            </depends>
        </Manners_Widgets>
    </modules>
</config>

创建一个app code community manners widgets etc config.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Manners_Widgets>
            <version>1.0.0</version>
        </Manners_Widgets>
    </modules>

    <global>
        <blocks>
            <manners_widgets>
                <class>Manners_Widgets_Block</class>
            </manners_widgets>
            <adminhtml>
                <rewrite>
                    <catalog_product_widget_chooser>Manners_Widgets_Block_Catalog_Product_Widget_Chooser</catalog_product_widget_chooser>
                </rewrite>
            </adminhtml>
        </blocks>

        <helpers>
            <manners_widgets>
                <class>Manners_Widgets_Helper</class>
            </manners_widgets>
        </helpers>
    </global>
</config>

创建一个app code community manners widgets etc widget.xml

<?xml version="1.0"?>
<widgets>
    <manners_widgets_products type="manners_widgets/products" translate="name description" module="manners_widgets">
        <name>Multiple Products Widget</name>
        <description>Widget to display multiple products on one page</description>
        <parameters>
            <product_ids translate="label">
                <visible>1</visible>
                <required>1</required>
                <label>Product</label>
                <type>label</type>
                <helper_block>
                    <type>manners_widgets/catalog_product_widget_chooser</type>
                    <data>
                        <button translate="open remove">
                            <open>Select Products...</open>
                        </button>
                    </data>
                </helper_block>
            </product_ids>
        </parameters>
    </manners_widgets_products>
</widgets>

最后,我创建了我的块manners_widgets_block_catalog_product_widget_chooser

<?php
class Manners_Widgets_Block_Catalog_Product_Widget_Chooser extends Mage_Adminhtml_Block_Catalog_Product_Widget_Chooser {
    /**
     *
     * @return Mage_Adminhtml_Block_Widget_Grid|void
     */
    protected function _prepareColumns() {
        $this->addColumn('entity_id', array(
            'header'    => Mage::helper('catalog')->__('ID'),
            'sortable'  => true,
            'width'     => '60px',
            'index'     => 'entity_id'
        ));
        $this->addColumn('chooser_sku', array(
            'header'    => Mage::helper('catalog')->__('SKU'),
            'name'      => 'chooser_sku',
            'width'     => '80px',
            'index'     => 'sku'
        ));
        $this->addColumn('chooser_name', array(
            'header'    => Mage::helper('catalog')->__('Product Name'),
            'name'      => 'chooser_name',
            'index'     => 'name'
        ));
    }

    /**
     * Prepare the massaction
     *  - Block,
     *  - Item
     *
     * @return $this|Mage_Adminhtml_Block_Widget_Grid
     */
    protected function _prepareMassaction() {
        $this->setMassactionIdField('entity_id');
        $this->setMassactionIdFilter('entity_id');
        $this->getMassactionBlock()->setFormFieldName('product');

        $this->getMassactionBlock()->addItem('delete', array(
            'label'=> Mage::helper('catalog')->__('Add Products'),
            'url'  => $this->getUrl('*/*/addProducts')
        ));

        Mage::dispatchEvent('manners_widgets_catalog_product_grid_prepare_massaction', array('block' => $this));
        return $this;
    }

    /**
     * Checkbox Check JS Callback
     *
     * @return string
     */
    public function getCheckboxCheckCallback()
    {
        return "function (grid, element) {
            $(grid.containerId).fire('product:changed', {element: element});
        }";
    }

    /**
     * Grid Row JS Callback
     *
     * @return string
     */
    public function getRowClickCallback()
    {
        $chooserJsObject = $this->getId();
            return '
                function (grid, event) {
                    var trElement = Event.findElement(event, "tr");
                    var productId = trElement.down("td").innerHTML;
                    var productName = trElement.down("td").next().next().innerHTML;
                    var optionLabel = productName;
                    var optionValue = "product/" + productId.replace(/^\s+|\s+$/g,"");
                    if (grid.categoryId) {
                        optionValue += "/" + grid.categoryId;
                    }
                    if (grid.categoryName) {
                        optionLabel = grid.categoryName + " / " + optionLabel;
                    }
                    '.$chooserJsObject.'.setElementValue(optionValue);
                    '.$chooserJsObject.'.setElementLabel(optionLabel);
                    '.$chooserJsObject.'.close();
                }
            ';
    }
}

原始Stackoverflow问题

https://stackoverflow.com/questions/13493630/how-to-wally-malultiple-product-selection-in-magento-widget-configuration

Github仓库

https://github.com/dmanners/manners_widgets

有帮助吗?

解决方案

首先,这就是为什么您会遇到该错误的原因。
质量动作块按钮具有此单击事件。

$this->getJsObjectName() . ".apply()"

在方法中更深入地挖掘上述代码转化为

{parent_block_id}_massactionJsObject.apply();

(对于小部件选择器,父块ID是一些随机哈希,但这并不重要)。这个想法是上面的对象不存在。
现在是(可能的)解决方案。仅针对小部件选择器更改质量动作块。为此创建一个新类:

<?php 
class Manners_Widgets_Block_Catalog_Product_Massaction extends Mage_Adminhtml_Block_Widget_Grid_Massaction{
    public function getApplyButtonHtml()
    {
        return $this->getButtonHtml($this->__('Submit'), "alert('Doh!')");//add this your js function that should do the magic.
    }
}

现在,告诉您的电网使用这个新的质量动作块。为此添加int类 Manners_Widgets_Block_Catalog_Product_Widget_Chooser 此方法:

protected function _construct(){
    parent::_construct();
    $this->setMassactionBlockName('manners_widgets/catalog_product_massaction');
}

现在,当您单击“提交”按钮时,您将获得警报,没有错误。
通过您的操作更改上面代码中的警报。

其他提示

这是一个范围问题。 mage_adminhtml_block_widget_grid_massaction_abstract在mage_adminhtml_block_widget_bstract中使用“ var”声明assactionjsobject

public function getJavaScript()
{
    return " var {$this->getJsObjectName()} = new varienGridMassaction('{$this->getHtmlId()}', "
            . "{$this->getGridJsObjectName()}, '{$this->getSelectedJson()}'"
            . ", '{$this->getFormFieldNameInternal()}', '{$this->getFormFieldName()}');"
            . "{$this->getJsObjectName()}.setItems({$this->getItemsJson()}); "
            . "{$this->getJsObjectName()}.setGridIds('{$this->getGridIdsJson()}');"
            . ($this->getUseAjax() ? "{$this->getJsObjectName()}.setUseAjax(true);" : '')
            . ($this->getUseSelectAll() ? "{$this->getJsObjectName()}.setUseSelectAll(true);" : '')
            . "{$this->getJsObjectName()}.errorText = '{$this->getErrorText()}';";
}

如果您覆盖此方法并从声明中删除“ var”关键字,则范围将是全局,并且可以从窗口小部件弹出窗口访问的对象。

因此,基本上:

  • Override mage_adminhtml_block_widget_grid_massaction with your block
  • 覆盖方法getJavaScript删除“ var”
  • 在您的widget_product_chooser块中,将受保护的$ _massactionBlockname与您的按摩块设置

    $ _massactionBlockName ='myModule/widget_product_massaction';

我为此挣扎了2天:/希望这会有所帮助

Magento 1.4.1中的新功能。是否在销售>订单页面上进行的任何过滤都可以在击中提交时通过AJAX调用更新。不幸的是,这具有未注明的副作用:在任何AJAX更新大众演员之后(取消,保留,打印发票,打印packingslips等)将无效。取而代之的是,您将被扔回仪表板(或者在管理区域中您当前用户的开始页面)。

Ajax更新后,Magento不会加载页面的完整布局。但是,在布局中,它保留了一个表单密钥来验证请求的提交。由于现在缺少这一点,它将“拒绝”质量表演的请求,然后将您扔回仪表板。

要解决此问题,您可以编辑 app/design/adminhtml/default/default/template/widget/grid/massactions.phtml并改变

<?php echo $this->getBlockHtml('formkey')?>

<div><input name="form_key" type="hidden" value="<?php echo Mage::getSingleton('core/session')->getFormKey() ?>" /></div>

在旁注上:被扔回到仪表板并第二次订购后,它将记住您以前的选择。而且,由于现在已经完成了整页加载,因此质量成分将成功。

许可以下: CC-BY-SA归因
scroll top