W tym artykule postaram się wyjaśnić jak dodać kolumnę z listą zestawów cech, do których przypisana jest cecha produktu w widoku wszystkich cech, w panelu admina.

Tabela cech generowana jest w pliku app/code/core/Mage/Adminhtml/Block/Catalog/Product/Attribute/Grid.php. Zacznijmy więc od stworzenia jego kopii w folderze app/code/local/Mage/Adminhtml/Block/Catalog/Product/Attribute/ aby podczas ewentualnego upgrade’u wersji systemu, nie został on nadpisany przez nowy plik.

Na końcu funkcji _prepareColumns() dodajemu nową kolumnę metodą addColumn():

$this->addColumn('set_name',
 array(
 'header'=> Mage::helper('catalog')->__('Attrib. Set Name'),
 'index' => 'attribute_code',
 'width' => '220px',
 'filter'  => false,
 'sortable'  => false
 ));

Ponieważ dane na temat przypisania cechy do zestawu cech są pobierane z zupełnie innej tabeli bazy danych (eav_entity_attribute) niż ta wykorzystywana dla gridu cech, do identyfikacji cechy użyjemy jednoznacznego kodu cechy użytego w opcji ‘index’:

'index' => 'attribute_code',

Gdyby tak pozostawić deklarację nowej kolumny, jako wartości wyświetlane byłyby po prostu kody cech. My natomiast potrzebujemy poznać listę zestawów cech, do których są one przypisane. W tym celu musimy zadeklarować własny renderer. Użyjemy do tego opcji:

'renderer'  => 'Mage_Adminhtml_Block_Catalog_Product_Attribute_Attset',

Zgodnie z zasadami panującymi w Zend Framework, nazwa klasy jest budowana ze ścieżki gdzie jest ona zadeklarowana. W tym więc przypadku w folderze Mage/Adminhtml/Block/Catalog/Product/Attribute tworzymy nowy plik o nazwie Attset.php, w którym zadeklarujemy nową klasę. Nowy plik tworzymy w samym corze systemu (app/code/core/…) ponieważ nie zostanie on nadpisany w razie upgrade’u systemu, a jeśli będzie zadeklarowany w folderze app/code/local, nie zostanie wzięty pod uwagę przez system.
W nowym pliku Attset.php deklarujemy wspomnianą już klasę jako dziedziczącą klasę Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Abstract. Kod więc na początek wygląda tak:

<?php
class Mage_Adminhtml_Block_Catalog_Product_Attribute_Attset extends Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Abstract
{
 public function render(Varien_Object $row)
 {
 }
}
?>

Zacznijmy od pobrania aktualnej wartości jaką przekazuje nam plik Grid.php. W naszym przypadku jest to kod cechy (z kodu cechy będzie nam potrzebny jeszcze Id cechy):


$attribute_code =  $row->getData($this->getColumn()->getIndex());
 $attribute_id = Mage::getModel('catalog/product')->getResource()->getAttribute($attribute_code)->getAttributeId();

Aby dowiedzieć się do jakich zestawów cech jest przypisana dana cecha, wykorzystamy zapytanie do bazy danych, do tabeli ‘eav_entity_attribute’:


$resource = new Mage_Core_Model_Resource();
 $read = $resource->getConnection('core_read');
 $select = $read->select()->from(Mage::getSingleton('core/resource')->getTableName('eav_entity_attribute'))->where('attribute_id = ?', $attribute_id);
 $result = $read->fetchAll($select);

W powyższym kodzie warto zwrócić uwagę na ten fragment:


->from(Mage::getSingleton('core/resource')->getTableName('eav_entity_attribute'))

Ponieważ tabele bazy danych mogą posiadać prefix (deklarowany podczas instalacji Magento), którego nie znamy, aby dowiedzieć się jaka jest prawdziwa nazwa tabeli, używamy powyższego fragmentu kodu.

Wykonując powyższe zapytanie uzyskujemy w zmiennej $result wiersze z Id zestawów cech, do których przypisana jest dana cecha. Możemy więc na podstawie Id uzyskać nazwy zestawów cech i przypisać je do zmiennej:


$return = array();
 $attributeSetModel = Mage::getModel("eav/entity_attribute_set");
 foreach($result as $row) {
 $attributeSetModel->load($row['attribute_set_id']);
 $attributeSetName  = $attributeSetModel->getAttributeSetName();
 $return[] = $attributeSetName;
 }

Teraz wystarczy zmienną $return scalić w string i zwrócić jako rezultat naszej funkcji:


$result_text = implode('<br/>',$return);
 return $result_text;

Podsumowując, kod w pliku Attset.php powinien wyglądać tak:


<?php
class Mage_Adminhtml_Block_Catalog_Product_Attribute_Attset extends Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Abstract
{

 public function render(Varien_Object $row)
 {
 $attribute_code =  $row->getData($this->getColumn()->getIndex());
 $attribute_id = Mage::getModel('catalog/product')->getResource()->getAttribute($attribute_code)->getAttributeId();

 $resource = new Mage_Core_Model_Resource();
 $read = $resource->getConnection('core_read');
 $select = $read->select()->from(Mage::getSingleton('core/resource')->getTableName('eav_entity_attribute'))->where('attribute_id = ?', $attribute_id);
 $result = $read->fetchAll($select);
 $return = array();
 $attributeSetModel = Mage::getModel("eav/entity_attribute_set");
 foreach($result as $row) {
 $attributeSetModel->load($row['attribute_set_id']);
 $attributeSetName  = $attributeSetModel->getAttributeSetName();
 $return[] = $attributeSetName;
 }
 $result_text = implode('<br/>',$return);
 return $result_text;
 }
}
?>

natomiast deklaracja nowej kolumny w pliku Grid.php:

$this->addColumn('set_name',
 array(
 'header'=> Mage::helper('catalog')->__('Attrib. Set Name'),
 'index' => 'attribute_code',
 'renderer'  => 'Mage_Adminhtml_Block_Catalog_Product_Attribute_Attset',
 'width' => '220px',
 'filter'  => false,
 'sortable'  => false
 ));
Kamil Borkowski

Specjalista do spraw developingu w firmie Operator24.pl