Ajout d'onglet supplémentaire à la catégorie éditeur
-
16-10-2019 - |
Question
Je suis en train d'ajouter un onglet supplémentaire en haut de la page d'édition de la catégorie. Ceux par défaut sont: Informations générales, Paramètres d'affichage, Design et produits personnalisés Catégorie
.J'ai donc créé un nouveau module qui réécrit le bloc qui génère les onglets. Voici l'extrait pertinent de config.xml :
<blocks>
<adminhtml>
<rewrite>
<catalog_category_tabs>
MyNamespace_MyModule_Block_Catalog_Category_Tabs
</catalog_category_tabs>
</rewrite>
</adminhtml>
</blocks>
Voici mon bloc qui écrase la valeur par défaut Magento un:
class MyNamespace_MyModule_Block_Catalog_Category_Tabs extends Mage_Adminhtml_Block_Catalog_Category_Tabs
{
protected function _prepareLayout()
{
$categoryAttributes = $this->getCategory()->getAttributes();
if (!$this->getCategory()->getId()) {
foreach ($categoryAttributes as $attribute) {
$default = $attribute->getDefaultValue();
if ($default != '') {
$this->getCategory()->setData($attribute->getAttributeCode(), $default);
}
}
}
$attributeSetId = $this->getCategory()->getDefaultAttributeSetId();
/** @var $groupCollection Mage_Eav_Model_Resource_Entity_Attribute_Group_Collection */
$groupCollection = Mage::getResourceModel('eav/entity_attribute_group_collection')
->setAttributeSetFilter($attributeSetId)
->setSortOrder()
->load();
$defaultGroupId = 0;
foreach ($groupCollection as $group) {
/* @var $group Mage_Eav_Model_Entity_Attribute_Group */
if ($defaultGroupId == 0 or $group->getIsDefault()) {
$defaultGroupId = $group->getId();
}
}
foreach ($groupCollection as $group) {
/* @var $group Mage_Eav_Model_Entity_Attribute_Group */
$attributes = array();
foreach ($categoryAttributes as $attribute) {
/* @var $attribute Mage_Eav_Model_Entity_Attribute */
if ($attribute->isInGroup($attributeSetId, $group->getId())) {
$attributes[] = $attribute;
}
}
// do not add grops without attributes
if (!$attributes) {
continue;
}
$active = $defaultGroupId == $group->getId();
$block = $this->getLayout()->createBlock($this->getAttributeTabBlock(), '')
->setGroup($group)
->setAttributes($attributes)
->setAddHiddenFields($active)
->toHtml();
$this->addTab('group_' . $group->getId(), array(
'label' => Mage::helper('catalog')->__($group->getAttributeGroupName()),
'content' => $block,
'active' => $active
));
}
$this->addTab('products', array(
'label' => Mage::helper('catalog')->__('Category Products'),
'content' => $this->getLayout()->createBlock(
'adminhtml/catalog_category_tab_product',
'category.product.grid'
)->toHtml(),
));
// dispatch event add custom tabs
Mage::dispatchEvent('adminhtml_catalog_category_tabs', array(
'tabs' => $this
));
$this->addTab('myextratab', array(
'label' => Mage::helper('catalog')->__('My Extra Tab'),
'content' => 'Here is the contents for my extra tab'
));
return parent::_prepareLayout();
}
}
Notez le code d'onglet supplémentaire:
$this->addTab('myextratab', array(
'label' => Mage::helper('catalog')->__('My Extra Tab'),
'content' => 'Here is the contents for my extra tab'
));
Cependant, le côté droit de l'écran est tout simplement vide. L'arbre de la catégorie reste mais en cliquant sur une catégorie donne cette erreur Javascript dans Firebug: ReferenceError: category_info_tabsJsTabs is not defined
Mise à jour: Après avoir lu ce double question et aswer sur SO il semble que j'ai tout fait. Y at-il un code de mise en page que je suis absent?
Toute aide est massivement apprécié.
La solution
Si vous organisez simplement de nouveaux groupes d'attributs, créer un script de configuration:
$installer = Mage::getResourceModel('catalog/setup','catalog_setup');
$installer->startSetup();
//Categories typically only have one attribute set, this will retrieve its ID
$setId = Mage::getSingleton('eav/config')->getEntityType('catalog_category')->getDefaultAttributeSetId();
//Add group to entity & set
$installer->addAttributeGroup('catalog_category',$setId, 'My Extra Tab');
$installer->endSetup();
Si vous ajoutez un ou plusieurs attributs aussi bien, il suffit de spécifier le nom de l'onglet de la valeur de configuration group
pour l'attribut et le groupe sera automatiquement ajouté:
$installer = Mage::getResourceModel('catalog/setup','catalog_setup');
$installer->startSetup();
//Add group to entity & all attribute sets
$installer->addAttribute(
'catalog_category',
'new_attribute',
array(
'label' => 'New Attribute',
'group' => 'My Extra Tab' //will be created if necessary
)
);
$installer->endSetup();
Si vous essayez d'ajouter simplement un contenu générique, l'ajout d'un onglet par l'événement adminhtml_catalog_category_tabs
- comme il est indiqué dans une autre réponse -. Sera le chemin à parcourir
Autres conseils
Le problème avec votre code est assez simple.
Le xml est malformatted et devrait se présenter comme suit, avec le <catalog_category_tabs>
et MyNamespace_MyModule_Block_Catalog_Category_Tabs
sur la même ligne sans espace supplémentaire:
<blocks>
<adminhtml>
<rewrite>
<catalog_category_tabs>MyNamespace_MyModule_Block_Catalog_Category_Tabs</catalog_category_tabs>
</rewrite>
</adminhtml>
</blocks>
Après avoir fait ce changement votre code fonctionnera, mais il y a quelques autres commentaires au sujet de votre code que vous devez prendre en compte.
Le point 1
Qu'est-ce que votre code va essayer de faire est d'appeler votre _prepareLayout
de bloc, puis appeler le parent :: _ prepareLayout () qui dans ce cas est Mage_Adminhtml_Block_Catalog_Category_Tabs
. Ce que vous pouvez faire est de mettre à jour votre bloc comme suit. Note:. Cela ajoutera votre nouvel onglet premier qui pourrait ne pas être idée
protected function _prepareLayout()
{
$this->addTab('myextratab', array(
'label' => Mage::helper('catalog')->__('My Extra Tab'),
'content' => 'Here is the contents for my extra tab'
));
return parent::_prepareLayout();
}
Le point 2
Il y a un événement qui est parfait pour ce que vous voulez faire. Vous pouvez écouter la adminhtml_catalog_category_tabs
d'événement, puis dans votre observateur faire quelque chose comme.
$tabs = $observer->getTabs();
$tabs->addTab('myextratab', array(
'label' => Mage::helper('catalog')->__('My Extra Tab'),
'content' => 'Here is the contents for my extra tab'
));
Cela vous aidera si tout autre code réécrit ce bloc