A while back I found a question on stackoverflow about allowing multiple products via a widget. I thought to myself that it would be a great option and surely could not be that difficult. Sadly I was wrong :( I have managed to get the mass action checkboxes and buttons to display on a widget but the JavaScript that goes with it is either not included or not working.
The grid is displayed include mass action options but when I try to use these items I get the following JavaScript error.
Uncaught ReferenceError: options_fieldset1adc562cf047406a634a7c10ae4f7db2_product_idsa765921c1aaf6166ee36c2e83468e0bf_massactionJsObject is not defined
So here is what I have done so far.
Created a app\etc\modules\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>
Created a 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>
Created a 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>
Finally I created my block 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();
}
';
}
}
Original stackoverflow question
GitHub Repo