Verwenden Sie die Entität als Attribut einer anderen Entität in Magento


7

Ich werde diesem Tutorial folgen, aber meine Frage ist ... ist es möglich, eine EAV-Entität als Attribut einer neuen EAV-Entität zu verwenden?

Vielen Dank.

BEARBEITEN : Das Tutorial, das ich ursprünglich gepostet habe, ist ziemlich durcheinander und ich bin stattdessen diesem anderen Tutorial gefolgt.

Antworten:


13

Ja es ist möglich.
Sie müssen ein Attribut für Ihre Hauptentität hinzufügen, das über ein benutzerdefiniertes Quellmodell verfügt.

Angenommen, Ihre Entitäten werden aufgerufen Articleund AuthorSie möchten, dass die ArticleEntität ein Attribut Authorhat. Wenn Sie also einen Artikel hinzufügen / bearbeiten und einen Artikel hinzufügen, können Sie aus einer Dropdown-Liste einen aller Autoren auswählen.

Sie müssen dies in der Setup-Klasse ( TC_Skeleton_Model_Resource_Setupaus dem von Ihnen verknüpften Beispiel) unter den anderen Attributen hinzufügen :

               'author_id' => array(
                    'type' => 'int',
                    'label' => 'Author',
                    'input' => 'select',
                    'required' => true, //or false
                    'sort_order' => 10, //what ever
                    'position' => 10,//what ever
                    'global' => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_GLOBAL, //or SCOPE_WEBSITE or SCOPE_STORE,
                    'source' => '[module_alias]/source_author', //this needs to be added
                ),   

Erstellen Sie nun die Klasse [Namespace]_[Module]_Model_Source_Authormit diesem Inhalt

<?php
class [Namespace]_[Module]_Model_Source_Author extends Mage_Eav_Model_Entity_Attribute_Source_Abstract{
    protected $_options = null;
    public function getAllOptions($withEmpty = false){
        if (is_null($this->_options)){
            $this->_options = array();
            $authors = Mage::getModel('[module_alias]/author')->getCollection()->addAttributeToSelect('name')->addAttributeToSelect('country');
            foreach ($authors as $author) {
                $this->_options[] = array(
                    'value' => $author->getId(),
                    'label' => $author->getName(). ' - '.$author->getCountry()
                );
            }
        }
        $options = $this->_options;
        if ($withEmpty) {
            array_unshift($options, array('value'=>'', 'label'=>''));
        }
        return $options;
    }
    public function getOptionText($value)
    {
        $options = $this->getAllOptions(false);

        foreach ($options as $item) {
            if ($item['value'] == $value) {
                return $item['label'];
            }
        }
        return false;
    }
}

Darüber hinaus finden Sie hier ein Beispiel zum Hinzufügen eines Attributs mit einem benutzerdefinierten Quellmodell zu den Produkten. Wenn Ihre Entität EAV ist, sollte es genauso funktionieren. Der wichtigste Teil ist die getAllOptionsMethode in der oben genannten Klasse. Sie können dort alles tun, solange Sie ein Array von Werten zurückgeben.

Auch diese Erweiterung könnte helfen. Es kann im Handumdrehen die Dateien erstellen, die Sie für Ihre Entitäten benötigen (EAV oder Flat), und es ermöglicht Ihnen auch, Beziehungen zwischen Entitäten herzustellen (eine zu viele oder viele zu viele). In Ihrem Fall benötigen Sie eine Eins-zu-Viele-Beziehung.


Ich bin an der Entwicklung der Erweiterung beteiligt, aber es ist für jeden kostenlos, sie zu verwenden oder zu ändern.


4
WAS?! SCHAMLOSE SELBSTFÖRDERUNG! jk / coole Antwort :)
Sander Mangel

@ Sanders Ich muss mich nicht schämen :)
Marius

Eine Sache. Stellen Sie sich in Ihrem Beispiel vor, dass "Autor" ein Attribut namens "Land" hat. Wäre es möglich, "Autor - Land" als Dropdown-Option in der Artikelentität anzuzeigen?
VDD

1
@VDD Ich habe den Code an Ihre Bedürfnisse angepasst.
Marius

@Marius Wie kann ich von anderen Erweiterungen auf das Quellmodell zugreifen? Ich mache eine adminhtml-Erweiterung mit ausgewählten Feldsätzen für alle diese Attribute der neuen EAV-Entität. Ich habe versucht, $ fieldset-> addField ('author', 'select', array ('label' => $ this -> __ ('Author'), 'class' => 'required-entry', 'required') => true, 'name' => 'author', 'value' => '1', 'values' => Mage :: getResourceModel ('namespace_module / source_author) -> getAllOptions (),)); aber ich bekomme den Fehler Ungültige Methode Namespace_Module_Model_Author :: addFieldToSelect (Array ([0] => Name))
VDD
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.