如何在Magento小部件配置中允许多个产品选择?

Ale*_*vić 22 php magento magento-1.6

我正在尝试实现嵌入式小部件.管理员将能够配置此窗口小部件并将其嵌入到WYSIWYG编辑器中.许多配置选项中有两个是应该显示在前端和类别列表中的产品列表.

我想通过" adminhtml/catalog_product_widget_chooser "和" adminhtml/catalog_category_widget_chooser " 允许这个选择.我尝试使用Web上提供的稀疏文档来实现这些小部件,但我设法完成的只是选择一个产品或选择一个类别的实现.我需要多选行为.

据我所知,目前的实施不允许多选的可能性.我检查了类和grid.phtml模板的代码,它接缝很糟糕,并且不能超出当前的使用意图.例如,您可以假设初始化窗口小部件参数的辅助块以允许多个选择:

<helper_block>
    <type>adminhtml/catalog_product_widget_chooser</type>
        <data>
            <button translate="open">
                <open>Select Products...</open>
            </button>
            <use_massaction>1</use_massaction>
        </data>
</helper_block>
Run Code Online (Sandbox Code Playgroud)

但是产品选择器是硬编码的,无需使用这部分代码进行大规模操作:

public function prepareElementHtml(Varien_Data_Form_Element_Abstract $element)
{
    $uniqId = Mage::helper('core')->uniqHash($element->getId());
    $sourceUrl = $this->getUrl('*/catalog_product_widget/chooser', array(
        'uniq_id' => $uniqId,
        'use_massaction' => false,
    ));
    ...
Run Code Online (Sandbox Code Playgroud)

而应该有某种按钮来确认多项选择的grid.phtml模板只显示"搜索"和"重置过滤器"按钮.并没有添加另一个按钮的处理.例如,这里是负责打印按钮html的默认代码:

public function getMainButtonsHtml()
{
    $html = '';
    if($this->getFilterVisibility()){
        $html.= $this->getResetFilterButtonHtml();
        $html.= $this->getSearchButtonHtml();
    }
    return $html;
}
Run Code Online (Sandbox Code Playgroud)

默认情况下,仅打印这两个按钮.

所以我基于上面提到的两个实现开始了我自己的实现,它变得丑陋,最终可能成为一个难以维护的复制意大利面.我的原则是,如果事情看起来很难看,那么我做错了.

那么有一种直接的方法可以通过使用网格小部件在小部件配置屏幕上实现多个产品和多个类别选择吗?

kel*_*len 5

我已经找到了一种快速的方法来使用基于的源模型获取窗口小部件参数的类别多选adminhtml/system_config_source_category.我删除了根级过滤器并为子类别添加了缩进.

widget.xml:

<widgets>
    <my_widget type="mymodule/block" translate="name" module="mymodule">
        <name>Widget with Multiselect Categories</name>
        <parameters>
            <category_ids translate="label description">
                <visible>1</visible>
                <required>1</required>
                <label>Categories</label>
                <type>multiselect</type>
                <source_model>mymodule/system_config_source_category</source_model>
            </category_ids>
        </parameters>
    </my_widget>
</widgets>
Run Code Online (Sandbox Code Playgroud)

源模型:

class Mynamespace_Mymodule_Model_System_Config_Source_Category
{
    public function toOptionArray()
    {
        $collection = Mage::getResourceModel('catalog/category_collection');

        $collection->addAttributeToSelect('name')
            ->addFieldToFilter('path', array('neq' => '1'))
            ->load();

        $options = array();

        foreach ($collection as $category) {
            $depth = count(explode('/', $category->getPath())) - 2;
            $indent = str_repeat('-', max($depth * 2, 0));
            $options[] = array(
               'label' => $indent . $category->getName(),
               'value' => $category->getId()
            );
        }

        return $options;
    }
}
Run Code Online (Sandbox Code Playgroud)

结果:

多选小部件参数

资料来源:http://www.magentocommerce.com/knowledge-base/entry/tutorial-creating-a-magento-widget-part-2


Sep*_*ter 2

看来您并不是第一个为此开发自己的实现的人。

David Manners似乎已经通过他的Manners_Widgets解决了同样的问题。

Manners_Widgets 扩展的功能:

  • 产品和类别的多项选择

我没有与大卫联系过,也没有使用过这个解决方案,所以无法评论这段代码的质量(或完整性)......但如果您还没有看到这个解决方案,它可能会节省您一些时间(或者最坏的情况是,为您提供一个就此问题进行协作的联系人)。

希望这对您有帮助,祝您好运!