22

埋め込みウィジェットを実装しようとしています。管理者は、このウィジェットを構成して、WYSIWYGエディター内に埋め込むことができます。多くの構成オプションのうちの2つは、フロントエンドに表示される製品のリストとカテゴリーのリストです。

「 adminhtml/catalog_product_widget_chooser」と「adminhtml/catalog_category_widget_chooser 」でこの選択を許可したいと思います。Webで入手できるまばらなドキュメントを使用してこれらのウィジェットを実装しようとしましたが、1つの製品を選択するか、1つのカテゴリを選択するための実装しか達成できませんでした。複数選択動作が必要です。

私が見る限り、現在の実装では複数選択の可能性は許可されていません。クラスと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>

ただし、製品チューザーは、コードのこの部分で大量のアクションなしで使用できるようにハードコードされています。

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,
    ));
    ...

また、複数選択を確認するための何らかのボタンがあるはずのgrid.phtmlテンプレートには、「検索」ボタンと「フィルターのリセット」ボタンが表示されているだけです。また、別のボタンを追加する処理はありません。たとえば、ボタンhtmlの印刷を担当するデフォルトのコードは次のとおりです。

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

デフォルトでは、これら2つのボタンのみが印刷されます。

それで、私は上記の2つの実装に基づいて独自の実装を開始しましたが、それは醜くなり、コピーパスタの保守不可能な混乱に終わる可能性があります。そして、私は原則として、物事が醜く見え始めたら、私は何か間違ったことをしていると考えています。

では、グリッドウィジェットを使用して、ウィジェット構成画面に複数の製品と複数のカテゴリの選択を実装する簡単な方法はありますか?

4

5 に答える 5

5

に基づくソース モデルを使用して、ウィジェット パラメーターでカテゴリの複数選択を取得する簡単な方法を見つけましたadminhtml/system_config_source_category。ルート レベルのフィルターを削除し、サブカテゴリのインデントを追加しました。

ウィジェット.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>

ソースモデル:

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;
    }
}

結果:

複数選択ウィジェット パラメータ

ソース: http://www.magentocommerce.com/knowledge-base/entry/tutorial-creating-a-magento-widget-part-2

于 2013-10-10T17:32:53.343 に答える
2

このために独自の実装を開発する道をたどったのは、あなたが初めてではないようです。

David MannersはManners_Widgetsで同じ問題に取り組んでいるようです。

Manners_Widgets 拡張機能の機能:

  • 商品とカテゴリーの複数選択

私は David と連絡を取っていないし、このソリューションを使用したこともないので、このコードの品質 (または完全性) についてコメントすることはできません... しかし、このソリューションをまだ見ていない場合は、時間を節約できるかもしれません(または、最悪の場合、この問題に関する共同作業の連絡先を教えてください)。

これがお役に立てば幸いです。頑張ってください!

于 2013-03-24T06:00:06.770 に答える
0

簡単な修正方法は次のとおりです。商品ウィジェット チューザーを使用せず、代わりに、カンマ区切りの SKU を許可するテキスト フィールドを使用します。

次に、コードで sku を展開し、sku ごとに製品を取得します。それをテンプレートに戻します。はるかに簡単:)

于 2013-06-20T18:10:10.830 に答える