Magento Adminhtml: атрибут категории с выбором категории

Я пытаюсь реализовать атрибут категории, предназначенный для связи текущих категорий с другими категориями для конкретного использования проекта.

Для этого я создал атрибут varchar, предназначенный для хранения списка идентификаторов категорий, разделенных запятой, но мне бы хотелось, чтобы рядом с полем находился маленький значок выбора, который отображал бы средство выбора категории, например, в разделе условий акции. экран администратора.

Выбор категории из раздела Акции

На самом деле я не вижу того рендера, который я должен использовать для достижения этого, надеюсь, вы, ребята, дадите мне подсказку.
Спасибо за помощь.

1

Решение

Я сделал это — наконец — так что здесь идет:

К вашему сведению: мой атрибут категории называется «category_top_searches» и представляет собой разделенный запятыми список идентификаторов категорий. Сборщик призван помочь пополнить этот список.

1 — добавить вкладку с помощью наблюдателя

А. Заявление наблюдателя

<adminhtml_catalog_category_tabs>
<observers>
<add_topsearches_tab>
<class>mymodule/observer</class>
<method>addTopSearchesTab</method>
</add_topsearches_tab>
</observers>
</adminhtml_catalog_category_tabs>

Б. Реализация наблюдателя

public function addTopSearchesTab(Varien_Event_Observer $observer)
{
$tabs = $observer->getTabs();
$tabs->addTab(
'top_searches_tab', 'mymodule/catalog_category_edit_tab_topsearches'
);
}

2 — определить блок для вкладки

Необходимо реализовать методы интерфейса вкладки и методы для выбора проверенных категорий при инициализации дерева

class MyNamespace_Adminhtml_Block_Catalog_Category_Edit_Tab_Topsearches
extends Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Categories
implements Mage_Adminhtml_Block_Widget_Tab_Interface
{

/**
* Specify template to use
*/
public function __construct()
{
parent::__construct();
$this->setTemplate('catalog/category/edit/categorypicker.phtml');
}

/**
* Checks when this block is readonly
*
* @return bool
*/
public function isReadonly()
{
return false;
}

/**
* getCategoryIds method

* @return array
*/
protected function getCategoryIds()
{
$category = Mage::registry('current_category');
$ids = explode(',', $category->getCategoryTopSearches());
return $ids;
}/**
* getIdsString
*
* @return string
*/
public function getIdsString()
{
$category = Mage::registry('current_category');
return $category->getCategoryTopSearches();
}

/**
* Return Tab label
*
* @return string
*/
public function getTabLabel()
{
return $this->__('Top Searches');
}

/**
* Return Tab title
*
* @return string
*/
public function getTabTitle()
{
return $this->__('Top Searches');
}

/**
* Can show tab in tabs
*
* @return boolean
*/
public function canShowTab()
{
return true;
}

/**
* Tab is hidden
*
* @return boolean
*/
public function isHidden()
{
return false;
}
}

3 — Определить шаблон дерева

Я скопировал и вставил основной шаблон дерева категорий страницы редактирования продукта app / design / adminhtml / default / default / template / catalog / product / edit / Categories.phtml в app / design / adminhtml / default / mytheme / template / catalog / Категория / edit / categorypicker.phtml и внесла несколько небольших изменений:

Добавлено текстовое поле для отображения моих идентификаторов:

<div class="entry-edit">
<div class="entry-edit-head">
<h4 class="icon-head head-edit-form fieldset-legend"><?php echo Mage::helper('catalog')->__('Linked Categories') ?></h4>
</div>
<fieldset id="linked_cat">
<input type="text" name="linked_categories_list" id="linked_categories_list" value="<?php echo $this->getIdsString() ?>">
</fieldset>
</div>

И изменил заголовок дерева, чтобы он был более адекватен моему контексту

<div class="entry-edit">
<div class="entry-edit-head">
<h4 class="icon-head head-edit-form fieldset-legend"><?php echo Mage::helper('catalog')->__('Category picker') ?></h4>
</div>
<fieldset id="grop_fields">
<input type="hidden" name="linked_categories" id="linked_categories" value="<?php echo $this->getIdsString() ?>">
<div id="product-categories" class="tree"></div>
</fieldset>
</div>

Мне пришлось немного изменить функцию beforeLoad, чтобы установить параметр id:

categoryLoader.on("beforeload", function(treeLoader, node) {
treeLoader.baseParams.category = node.attributes.id;
treeLoader.baseParams.id = node.attributes.id;
});

Я добавил функцию для реализации функции array_unique

Array.prototype.unique = function(){
'use strict';
var im = {}, uniq = [];
for (var i=0;i<this.length;i++){
var type = (this[i]).constructor.name,
//          ^note: for IE use this[i].constructor!
val = type + (!/num|str|regex|bool/i.test(type)
? JSON.stringify(this[i])
: this[i]);
if (!(val in im)){uniq.push(this[i]);}
im[val] = 1;
}
return uniq;
}

А затем изменил функции categoryAdd и categoryRemove, чтобы обновить мое текстовое поле с новым проверенным / непроверенным идентификатором

function categoryAdd(id) {
var ids = $('linked_categories').value.split(',');
ids.push(id);
var idList = ids.unique().join(',').replace(/^,/, '');
document.getElementById("linked_categories_list").value = idList;
$('linked_categories').value = ids.join(',');
}
function categoryRemove(id) {
var ids = $('linked_categories').value.split(',');
// bug #7654 fixed
while (-1 != ids.indexOf(id)) {
ids.splice(ids.indexOf(id), 1);
}
var idList = ids.unique().join(',').replace(/^,/, '');
document.getElementById("linked_categories_list").value = idList;
$('linked_categories').value = ids.join(',');
}

4 — внедрить наблюдателя в событие сохранения категории, чтобы добавить новое значение в реальный атрибут

А. Декларация

<catalog_category_save_before>
<observers>
<set_top_searches>
<class>mymodule/observer</class>
<method>setTopSearches</method>
</set_top_searches>
</observers>
</catalog_category_save_before>

B. Реализация

/**
* takes the fake attribute value and insert it into the real category_top_searches attribute
*
* @param Varien_Event_Observer $observer Observer
*
* @return void
*/
public function setTopSearches(Varien_Event_Observer $observer)
{
/** @var $category Mage_Catalog_Model_Category */
$category = $observer->getEvent()->getCategory();

$params = Mage::app()->getRequest()->getParams();
$ids = $params['linked_categories_list'];
$category->setData('category_top_searches', $ids);
}

5 — Наконец, я спрятал свой оригинальный атрибут, обновив его в скрипте установки:
(Я изменил его группу, иначе его выделенная вкладка будет пустой, но все равно будет отображаться)

$installer->updateAttribute("catalog_category", "category_top_searches", 'group', "General");
$installer->updateAttribute("catalog_category", "category_top_searches", 'is_visible', false);

Не знаю, будет ли кто-нибудь использовать его, так как я довольно одинок в этой теме, но я бы хотел найти такой пост, пытаясь достичь этой функции …: D

Если кому-то интересно, я также реализовал этот инструмент выбора категорий в полях конфигурации как новый frontend_type, он довольно хорош!

1

Другие решения

Других решений пока нет …