2012-11-21 2 views
22

मैं एम्बेडेड विजेट को लागू करने की कोशिश कर रहा हूं। व्यवस्थापक इस विजेट को कॉन्फ़िगर करने और WYSIWYG संपादक के अंदर एम्बेड करने में सक्षम होंगे। कई कॉन्फ़िगरेशन विकल्पों में से दो उत्पाद की सूची हैं जो श्रेणियों की सूची और सूची में दिखानी चाहिए।Magento विजेट कॉन्फ़िगरेशन में एकाधिक उत्पाद चयन की अनुमति कैसे दें?

मैं के साथ "adminhtml/catalog_product_widget_chooser" और "adminhtml/catalog_category_widget_chooser" इस चयन की अनुमति देना चाहते। मैंने वेब पर उपलब्ध स्पैस दस्तावेज के साथ इन विगेट्स को लागू करने का प्रयास किया लेकिन मैं पूरा करने में कामयाब रहा हूं, एक उत्पाद चुनने या एक श्रेणी का चयन करने के लिए कार्यान्वयन है। मुझे बहुविकल्पीय व्यवहार की आवश्यकता है।

जहां तक ​​मैं देख सकता हूं कि वर्तमान कार्यान्वयन से कोई बहुसंख्यक संभावना नहीं है। मैंने दोनों कक्षाओं और 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 टेम्पलेट जिसे एकाधिक चयन की पुष्टि करने के लिए किसी प्रकार का बटन माना जाता है, केवल "खोज" और "फ़िल्टर रीसेट करें" बटन दिखा रहा है। और एक और बटन जोड़ने का कोई संभाल नहीं है। उदाहरण के लिए यहां प्रिंटिंग बटन एचटीएमएल के लिए जिम्मेदार डिफ़ॉल्ट कोड है:

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

केवल इन दो बटनों को डिफ़ॉल्ट रूप से मुद्रित किया जा रहा है।

इसलिए मैंने ऊपर वर्णित दो कार्यान्वयन के आधार पर अपना स्वयं का कार्यान्वयन शुरू किया और यह बदसूरत हो रहा है और कॉपी-पास्ता की एक अनजान गड़बड़ी के रूप में समाप्त हो सकता है। और मैं सिद्धांत रूप से काम करता हूं कि अगर चीजें बदसूरत लगती हैं तो मैं कुछ गलत कर रहा हूं।

तो क्या ग्रिड विजेट का उपयोग कर विजेट कॉन्फ़िगरेशन स्क्रीन पर एकाधिक उत्पाद और एकाधिक श्रेणी चयन को लागू करने का एक सीधा तरीका है?

+2

अच्छा सवाल +1 कि –

उत्तर

2

ऐसा लगता है कि आप इसके लिए अपना स्वयं का कार्यान्वयन विकसित करने के मार्ग पर जाने वाले पहले व्यक्ति नहीं हैं।

David Manners ने अपने Manners_Widgets के साथ एक ही समस्या का सामना किया है।

Manners_Widgets एक्सटेंशन की विशेषताएं:

  • एकाधिक उत्पादों और श्रेणियों

मैं दाऊद के साथ संपर्क नहीं किया है के लिए चुनते हैं, और न ही मैं इस समाधान का इस्तेमाल किया है, इसलिए इस कोड की गुणवत्ता (या पूर्णता) पर टिप्पणी नहीं कर सकते ... लेकिन यदि आपने पहले से ही इस समाधान को नहीं देखा है, तो यह आपको कुछ समय बचा सकता है (या सबसे खराब, आपको कोलाब के संपर्क का बिंदु देता है इस मुद्दे पर ओशन)।

आशा है कि इससे आपकी मदद मिलेगी, शुभकामनाएँ!

+1

हाँ मैं इस मुद्दे को देख शुरू कर दिया लेकिन दुर्भाग्य से ज्यादा समय या भाग्य हाल ही में नहीं था :(यह GitHub पर है अगर किसी को एक बार देख लेने और मदद करने के पसंद बाहर नि: शुल्क महसूस करें। अगर मुझे समाधान मिल गया है तो मैं यहां अपडेट करूंगा – dmanners

+0

मैंने अभी Magento 1.9x पर विस्तार की कोशिश की है। चयन मास्क उत्पाद सूची से आता है और इसमें "स्थिति बदलें" और "गुण बदलें" जैसे बटन हैं लेकिन कोई वास्तविक "चयन नहीं है "बटन – ScubaBen

0

यहां एक त्वरित फिक्स है: उत्पाद विजेट चयनकर्ता का उपयोग न करें, लेकिन इसके बजाय टेक्स्टफील्ड का उपयोग करें जो अल्पविराम से अलग एसकेयू की अनुमति देता है।

फिर आपके कोड में स्कस विस्फोट करें और sku द्वारा उत्पादों को प्राप्त करें। अपने टेम्पलेट पर वापस लौटें। बहुत आसान :)

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> 

स्रोत मॉडल:

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

परिणाम:

Multiselect widget parameter

स्रोत: http://www.magentocommerce.com/knowledge-base/entry/tutorial-creating-a-magento-widget-part-2

4

मैंने इस प्रश्न का उत्तर जोड़ा है। Implement multiple product chooser widget Magento

मैंने https://github.com/dio5/magento-multiproducts-widget के तहत मॉड्यूल की जांच की है।

ज़िप डाउनलोड करने के बजाय FORK विकल्प का उपयोग करें।

यह काम करता है और हमें सही परिणाम देता है i.e WIDGET में एकाधिक उत्पाद चयन। अगर कोई गलती है तो मुझे बताएं।

मुझे बताएं कि यह आपके लिए काम करता है या नहीं।

धन्यवाद!

[मेरी पिछली टिप्पणी यहाँ सीधे संपादित करना, कोड के अनुरोध पर] /Namespace/Modulename/etc/widget.xml

<widgets> 
    <catalog_product_multiproducts type="namespace_modulename/widget_catalog_product_multiproducts" translate="name description" module="namespace_modulename"> 
    <name>Catalog Multiple Products Widget</name> 
    <description>Select multiple products for display</description> 
    <parameters> 
     <title translate="label"> 
      <visible>1</visible> 
      <label>Title</label> 
      <type>text</type> 
     </title> 
     <products_count translate="label"> 
      <visible>1</visible> 
      <required>1</required> 
      <label>No of Products</label> 
      <type>text</type> 
     </products_count> 
     <ids translate="label"> 
      <visible>1</visible> 
      <required>1</required> 
      <label>Products</label> 
      <type>label</type> 
      <helper_block> 
       <type>namespace_modulename/adminhtml_catalog_product_widget_multiproducts_chooser</type> 
       <data> 
        <button translate="open"> 
         <open>Select Products...</open> 
        </button> 
       </data> 
      </helper_block> 
      <sort_order>10</sort_order> 
     </ids> 
     <template translate="label description"> 
      <required>1</required> 
      <visible>1</visible> 
      <label>Product Carousel Template</label> 
      <type>text</type> 
      <value>catalog/product/widget/products_carousel.phtml</value> 
      <values> 
       <default translate="label">              <value>catalog/product/widget/products_carousel.phtml</value> 
        <label>New Products Grid Template</label> 
       </default> 
       <list translate="label"> 
        <value>catalog/product/widget/new/content/new_list.phtml</value> 
        <label>New Products List Template</label> 
       </list> 
      </values> 
      <description>Template path cannot be changed/updated</description> 
     </template>  
    </parameters> 
    </catalog_product_multiproducts> 
</widgets> 

/namespace/ModuleName/ब्लॉक /Adminhtml/Catalog/Product/MultiProducts/Chooser.php

थी एस फ़ंक्शन DOCHOOSE() फ़ंक्शन को कॉल करेगा जो चेक/चयनित उत्पादों को "चुनें" में मदद करेगा।

/** 
* prepare layout for products grid 
* 
* @return type Mage_Adminhtml_Block_Catalog_Product_Widget_Chooser 
*/ 
protected function _prepareLayout() 
{ 
    $this->setChild('choose_button', $this->getLayout()->createBlock('adminhtml/widget_button') 
        ->setData(array(
         'label' => Mage::helper('adminhtml')->__('Choose Selected Products'), 
         'onclick' => $this->getJsObjectName() . '.doChoose()' 
        )) 
    ); 
    return parent::_prepareLayout(); 
} 

नीचे समारोह, उत्पाद तत्व के एचटीएमएल तैयार करने के लिए इस्तेमाल किया जा करने की जरूरत है प्रारूप में {1} {2} जाँच चेकबॉक्स के लिए

/** 
* Prepare chooser element HTML 
* 
* @param Varien_Data_Form_Element_Abstract $element Form Element 
* @return Varien_Data_Form_Element_Abstract 
*/ 
public function prepareElementHtml(Varien_Data_Form_Element_Abstract $element) 
{ 
    $uniqueId = Mage::helper('core')->uniqHash($element->getId()); 

    $sourceUrl = $this->getUrl('*/multiproducts/chooser', array(
     'uniq_id' => $uniqueId, 
     'use_massaction' => true, 
    )); 

    $chooser = $this->getLayout()->createBlock('widget/adminhtml_widget_chooser') 
      ->setElement($element) 
      ->setTranslationHelper($this->getTranslationHelper()) 
      ->setConfig($this->getConfig()) 
      ->setFieldsetId($this->getFieldsetId()) 
      ->setSourceUrl($sourceUrl) 
      ->setUniqId($uniqueId); 

    if ($element->getValue()) 
    { 
     $label = ""; 
     $ids = explode('}{', $element->getValue()); 
     $cleanIds = array(); 
     foreach ($ids as $id) 
     { 
      $id = str_replace('{', '', $id); 
      $id = str_replace('}', '', $id); 
      $cleanIds[] = $id; 
     } 

     $products = $this->_getProductsByIDs($cleanIds); 

     if ($products) 
     { 
      $label .= '<ul>'; 
      foreach ($products as $product) 
      { 
       $label .= '<li>' . $product->getName() . '</li>'; 
      } 
      $label .= '</ul>'; 
      $chooser->setLabel($label); 
     } 
    } 

    $element->setData('after_element_html', $chooser->toHtml()); 

    return $element; 
} 

जे एस/अनियंत्रित

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

पंक्ति/उत्पाद के लिए जेएस क्लिक/चेक/चयनित

/** 
* Grid Row JS Callback 
* 
* @return string 
*/ 
public function getRowClickCallback() 
{ 
    if (!$this->getUseMassaction()) 
    { 
     $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(); 
      } 
     '; 
    } 
} 

जेएस कोड, यदि उपयोगकर्ता विशिष्ट श्रेणी से उत्पादों का चयन करने में रुचि रखते हैं।

/** 
* Category Tree node onClick listener js function 
* 
* @return string 
*/ 
public function getCategoryClickListenerJs() 
{ 
    $js = ' 
     function (node, e) { 
      {jsObject}.addVarToUrl("category_id", node.attributes.id); 
      {jsObject}.reload({jsObject}.url); 
      {jsObject}.categoryId = node.attributes.id != "none" ? node.attributes.id : false; 
      {jsObject}.categoryName = node.attributes.id != "none" ? node.text : false; 
     } 
    '; 

    $js = str_replace('{jsObject}', $this->getJsObjectName(), $js); 

    return $js; 
} 

उत्पाद आईडी के साथ POST तत्व तैयार करने के लिए अतिरिक्त जेएस।

/** 
* return additional JS for controls 
* 
* @return JS 
*/ 
public function getAdditionalJavascript() 
{ 
    $chooserJsObject = $this->getId(); 

    $js = '  
     {jsObject}.initChecked = function() { 
      $$("#' . $chooserJsObject . '_table tbody input:checkbox").each(function(element, i) { 
       var values = ' . $chooserJsObject . '.getElementValue(); 
       var capture = values.replace("{"+element.value+"}", "match");      
       var searchValue = "match"; 

       if(capture.search(searchValue) != -1) 
       { 
        element.checked = true; 
       } 
      }); 
     } 

     {jsObject}.initChecked(); 

     var values = ' . $chooserJsObject . '.getElementValue(); 

     $("' . $chooserJsObject . '").insert({bottom: "<div class=\"filter\"><input type=\"hidden\" value=\"+values+\" name=\"selected_products\" /></div>"}); 

     $$("#' . $chooserJsObject . '_table tbody input:checkbox").invoke("observe", "change", function(event) { 
      var element = Event.element(event); 
      var label = element.up("td").next().next().next().innerHTML; 
      label = label.replace(/^\s\s*/, "").replace(/\s\s*$/, ""); 
      if(element.checked) 
      { 
       {jsObject}.addValue(element.value); 
       {jsObject}.addLabel(label); 
      } else { 
       {jsObject}.removeValue(element.value); 
       {jsObject}.removeLabel(label); 
      } 
     }); 

     {jsObject}.removeValue = function(value) { 
      var currentValue = ' . $chooserJsObject . '.getElementValue(); 
      currentValue = currentValue.replace("{"+value+"}", ""); 
      ' . $chooserJsObject . '.setElementValue(currentValue); 
     } 

     {jsObject}.addValue = function(value) { 
      var currentValue = ' . $chooserJsObject . '.getElementValue(); 
      currentValue = currentValue.replace("{"+value+"}", ""); 
      currentValue = currentValue + "{"+value+"}"; 
      ' . $chooserJsObject . '.setElementValue(currentValue); 
     } 

     {jsObject}.removeLabel = function(label) { 
      var currentLabel = ' . $chooserJsObject . '.getElementLabelText(); 
      currentLabel = currentLabel.replace("<li>"+label+"</li>", ""); 
      ' . $chooserJsObject . '.setElementLabel(currentLabel);   
     } 

     {jsObject}.addLabel = function(label) { 
      var currentLabel = ' . $chooserJsObject . '.getElementLabelText(); 
      if(currentLabel.search("ul") != -1) 
      { 
       currentLabel = currentLabel.replace("</ul>", ""); 
       currentLabel = currentLabel.replace("<li>"+label+"</li>", ""); 
      } else { 
       currentLabel = "<ul>"; 
      }  
      currentLabel = currentLabel +"<li>"+label+"</li></ul>"; 
      ' . $chooserJsObject . '.setElementLabel(currentLabel); 
     } 

     {jsObject}.doChoose = function(node,e) { 
      ' . $chooserJsObject . '.close(); 
     } 
    '; 

    $js = str_replace('{jsObject}', $this->getJsObjectName(), $js); 

    return $js; 
} 

उपरोक्त प्रमुख कार्य हैं जो आपको पॉप अप के भीतर जीआरआईडी से कई उत्पादों का चयन करने में मदद करेंगे।

वहाँ एक बिट कोड है जो यहाँ जाँच की जा सकती करने के लिए अधिक है: https://github.com/dio5/magento-multiproducts-widget

कदम: व्यवस्थापक पैनल में

  1. नेविगेट एक सीएमएस पृष्ठ करने के लिए पर "डालें विजेट"
  2. क्लिक करें WYSIWYG संपादक
  3. विजेट प्रकार का चयन करें - कैटलॉग एकाधिक उत्पाद विजेट
  4. शीर्षक दर्ज करें, उत्पाद गणना
  5. एक टेम्पलेट चुनें ग्रिड से
  6. उत्पादों का चयन करें "का चयन करें उत्पाद" बटन पर
  7. क्लिक करें (एक विकल्प के रूप में के रूप में आवश्यक के रूप में कई टेम्पलेट्स जोड़ सकते हैं)
  8. "चयनित उत्पाद चुनें" बटन पर क्लिक

आशा है कि इससे किसी की मदद मिलेगी!

मुबारक कोडिंग ... के लिए

+0

कृपया कम से कम आवश्यक भागों को जोड़ने के बजाय कोड को अपने उत्तर में साझा करें। – hotzst

+0

ने मेरा उत्तर संपादित करने और प्रमुख कोड ब्लॉक प्रदान करने का प्रयास किया है। यह किसी के आगे जाने के लिए सहायक हो सकता है। धन्यवाद! – Shivani

+0

यह कोड ठीक से काम कर रहा है। लेकिन विजेट में बाईं तरफ एक मुद्दा है, हम श्रेणी के साथ फिल्टर उत्पाद नहीं बना सकते हैं। – krutssss

संबंधित मुद्दे