Kolumna z listą zestawów cech dla cechy produktu w panelu admina
01/04/2011
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
));
| This entry was posted by kamilb on 01/04/2011 at 12:31, and is filed under Magento. Follow any responses to this post through RSS 2.0. You can leave a response or trackback from your own site. |



