2012-11-21 6 views
22

Sto cercando di implementare il widget incorporato. Gli amministratori saranno in grado di configurare questo widget e incorporarlo nell'editor WYSIWYG. Due delle molte opzioni di configurazione sono un elenco di prodotti che dovrebbero apparire nel frontend e nell'elenco di categorie.Come consentire la selezione di più prodotti nella configurazione del widget Magento?

voglio permettere la selezione con "adminhtml/catalog_product_widget_chooser" e "adminhtml/catalog_category_widget_chooser". Ho cercato di implementare questi widget con documentazione sparsa disponibile sul Web, ma tutto ciò che sono riuscito a realizzare è l'implementazione per la selezione di un prodotto o la selezione di una categoria. Ho bisogno di un comportamento multiselect.

Per quanto posso vedere, nessuna possibilità di multiselezione è consentita dall'attuale implementazione. Ho controllato il codice per entrambe le classi e il modello grid.phtml e mi sembra che sia scritto male e non sia estensibile al di là delle attuali intenzioni d'uso. Per esempio, questo è come si potrebbe supporre inizializzare blocco aiutante per un parametro widget per consentire a più selezionare:

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

Ma Scelta prodotto è difficile codificato per l'uso, senza azioni di massa a questa parte del codice:

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

E il modello grid.phtml che dovrebbe avere un qualche tipo di pulsante per confermare la selezione multipla mostra solo i pulsanti "Cerca" e "Ripristina filtro". E non c'è modo di aggiungere un altro pulsante. Per esempio qui è il codice predefinito responsabile per il tasto stampa html:

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

Solo questi due pulsanti stanno per essere stampati per impostazione predefinita.

Così ho iniziato la mia implementazione basata su due implementazioni menzionate sopra e sta diventando brutto e potrebbe finire come un pasticcio intrattabile di copia-pasta. E io lavoro per principio che se le cose cominciano a sembrare brutte, allora sto facendo qualcosa di sbagliato.

Quindi c'è un modo semplice per implementare più prodotti e più categorie di selezione sulla schermata di configurazione del widget utilizzando il widget di griglia?

+2

buona domanda +1 per questo –

risposta

2

Sembra che tu non sia il primo a seguire il percorso di sviluppo della tua implementazione per questo.

David Manners sembra aver affrontato lo stesso problema, con il suo Manners_Widgets.

Caratteristiche del Manners_Widgets Extension:

  • multipla selezionate per i prodotti e le categorie

Non ho avuto il contatto con David, né ho usato questa soluzione, quindi non posso commentare la qualità (o la completezza) di questo codice ... ma se non hai già visto questa soluzione, potrebbe farti risparmiare un po 'di tempo (o, nel peggiore dei casi, fornirti un punto di contatto per la collaborazione orazione su questo problema).

Spero che questo ti aiuti, buona fortuna!

+1

sì ho iniziato a cercare in questo problema, ma purtroppo non ho avuto molto tempo o la fortuna ultimamente :(è su GitHub se qualcuno immagina di dare un'occhiata e aiutare Eseguo l'aggiornamento qui se trovo una soluzione – dmanners

+0

Ho appena provato l'estensione su Magento 1.9x. la maschera di selezione proviene dalla lista dei prodotti e ha pulsanti come "cambia stato" e "Cambia attributi" ma non "seleziona" Tasto " – ScubaBen

0

Ecco una soluzione rapida: non utilizzare il selettore di widget del prodotto, ma utilizzare un campo di testo che consente invece gli SKU separati da virgole.

Quindi nel codice esplode lo skus e ottieni i prodotti con sku. Restituiscilo al tuo modello. Molto più semplice :)

5

Ho trovato un modo rapido per ottenere i multiselettivi di categoria sui parametri del widget utilizzando un modello di origine basato su adminhtml/system_config_source_category. Ho rimosso il filtro a livello di radice e aggiunto il rientro per le sottocategorie.

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> 

Il modello di origine:

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

Il risultato:

Multiselect widget parameter

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

4

Ho aggiunto una risposta a questa domanda. Implement multiple product chooser widget Magento

Ho controllato il modulo che è sotto https://github.com/dio5/magento-multiproducts-widget.

Utilizzare l'opzione FORC. Anziché Download ZIP.

Funziona e ci fornisce i risultati esatti nella selezione di più prodotti in WIDGET. Se ci sono errori, fammelo sapere.

Fammi sapere se questo funziona per voi.

Grazie!

[Modifica il mio commento precedente, su richiesta del codice direttamente qui]

/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/blocchi /Adminhtml/Catalog/Product/MultiProducts/Chooser.php

Thi La funzione s chiamerà la funzione DOCHOOSE() che aiuterà "Scegli" i prodotti selezionati/selezionati.

/** 
* 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(); 
} 

La funzione di seguito deve essere utilizzato per preparare HTML dell'elemento prodotto, nel formato {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; 
} 

JS per casella controllato/incontrollato

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

JS per riga/prodotto selezionato/selezionato/selezionato

/** 
* 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(); 
      } 
     '; 
    } 
} 

codice JS, se l'utente è interessato a selezionare prodotti da una categoria specifica.

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

JS aggiuntivo per preparare l'elemento POST con ID prodotto.

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

Queste sono le principali funzioni che consentono di selezionare più prodotti dalla GRID all'interno di un pop-up.

C'è un po 'di più per il codice che può essere controllato qui: https://github.com/dio5/magento-multiproducts-widget

Passi:

  1. Passare a un CMS pagina nel pannello di controllo
  2. Clicca su "Inserisci Widget" nell'editor WYSIWYG
  3. Seleziona tipo di widget - Catalogo Più prodotti Widget
  4. Inserisci titolo, numero di prodotti
  5. Scegliere un modello (si può aggiungere come molti modelli come richiesto come optional)
  6. Fare clic su "Seleziona prodotti" pulsante
  7. Selezionare i prodotti dalla rete
  8. Cliccare sul pulsante "Scegli i prodotti selezionati"

Spero che questo aiuti qualcuno!

Coding Felice ...

+0

Si prega di condividere il codice nella risposta invece di collegarsi ad essi, almeno le parti essenziali – hotzst

+0

Ho provato a modificare la mia risposta e fornire blocchi di codice importanti.Questo potrebbe essere utile per qualcuno andando avanti.Grazie! – Shivani

+0

Questo codice funziona correttamente. Ma ha un problema come nel lato sinistro del widget che non possiamo fare il filtro prodotto con la categoria. – krutssss

Problemi correlati