Hinzufügen eines Produktattributs mit Werten und Markieren eines Werts als Standard

7

Ich weiß, wie ich ein Produktattribut aus einem Installationsskript hinzufügen kann, aber wie kann ich Magento anweisen, einen der Werte als Standardwert zu verwenden? (oder mehr Werte, falls es sich um ein Mehrfachauswahlattribut handelt).
Ich verwende diesen Code in einem Installationsskript, um ein Attribut mit folgenden Optionen hinzuzufügen:

$installer->addAttribute('catalog_product', "some_code_here", array(
    'type'       => 'int', //or varchar if it's multiselect
    'input'      => 'select', //or multiselect
    'label'      => 'Attribute label here',
    'sort_order' => 1000,
    'required'   => false,
    'global'     => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_STORE,
    'backend'    => 'eav/entity_attribute_backend_array',
    'option'     => array (
        'values' => array(
            0 => 'Value 1',
            1 => 'Value 2',
            2 => 'Value 3',
        )
    ),

)); 

Also muss ich Value 2den Standardwert festlegen. Oder Value 2und Value 3falls ich ein Mehrfachauswahlattribut erstelle

Marius
quelle
Die einzige Möglichkeit, die ich kenne, besteht darin, die Werte nach dem Erstellen des Attributs abzurufen, die ID abzurufen und das Attribut zu aktualisieren. Ich denke du hast es versucht default => 'value 2’?
Fabian Blechschmidt
@FabianBlechschmidt. Vielen Dank. Ich kenne diesen Ansatz, aber das versuche ich zu vermeiden. Ich möchte, wenn möglich, dies über das Installationsskript ohne zusätzliche Auswahlen und Aktualisierungen tun. Ich fühle mich schmutzig, wenn ich es anders mache. Aber wenn es nicht möglich ist, muss ich es wohl so angehen.
Marius
@ Marius vielleicht bin ich noch verwirrt. Ist Ihr Problem, dass Sie ein Attribut haben, das Sie in einem Setup-Skript hinzufügen, aber Optionen später über den Administrator hinzugefügt werden? Oder ein anderes Setup-Skript? Oder etwas ganz anderes;)
David Manners
@ DavidManners. Ich füge ein Attribut über ein Setup-Skript hinzu und füge zusammen mit dem Attribut einige Optionen hinzu. Und über dasselbe Setup-Skript möchte ich eine der Optionen als Standard festlegen. Dies hat nichts mit dem Administrator zu tun. Angenommen, ich erstelle das Attribut colormit Optionen Red, Green, Blueund möchte (ohne Administratorinteraktion), dass die GreenOption die Standardoption ist. Ich hoffe das war etwas klarer.
Marius
1
@FabianBlechschmidt. Könnte auch Ihren Kommentar als Antwort schreiben. Ich denke, es gibt keine Möglichkeit, dies elegant über das Installationsskript zu tun.
Marius

Antworten:

7

tl; dr: Für ausgewählte Attribute kann dies nicht direkt beim ersten addAttribute()Aufruf deklariert werden . Es sind zwei Anrufe erforderlich.

Um den Standardwert eav_attribute.defaultfestzulegen , muss er mit dem Primärschlüsselwert aus der eav_attribute_optionTabelle festgelegt werden. Auf hoher Ebene wird die Notwendigkeit von zwei Aufrufen anhand des Ablaufs und der Funktion der Methoden addAttribute()und ersichtlich addAttributeOption():

  1. Werte vorbereiten
  2. In die eav_attributeTabelle einfügen / aktualisieren
  3. Set / Gruppe einfügen / aktualisieren
  4. Aufruf addAttributeOption()zum Einfügen / Aktualisieren von Optionswerten

Die einzige Hoffnung wäre dann, dass addAttributeOption()der eav_attributeDatensatz aktualisiert werden kann . Es gibt jedoch keinen Code, der dies tut. Die einzigen Tabellen, auf die mit dieser Methode zugegriffen wird, sind eav_attribute_optionund eav_attribute_option_value.

Es ist daher erforderlich, getAttribute()nach dem ersten addAttribute()Aufruf aufzurufen, die Attributoptions-ID abzurufen und dann aufzurufen updateAttribute().

Bearbeiten:

Nach der früheren Antwort konnte ich nicht anders, als meine Antwort anhand des vorhandenen Codes zu überprüfen. Schließlich catalog_producthaben wir für Entitäten dank des Attributs CRUD GUI einen schönen MVC-Ablauf. Und da \Mage_Adminhtml_Catalog_Product_AttributeController::saveAction()sah ich, dass das Attributmodell kurz vor dem Speichern mit den folgenden Daten festgelegt wurde:

Mit PhpStorm & Xdebug visualisierte Options- und Optionskonfigurationsdaten

Beachten Sie, dass der defaultWert des Attributs Verweise auf die valueSchlüssel enthält. Wenn Sie ein wenig graben, landen Sie bei \Mage_Eav_Model_Resource_Entity_Attribute::_saveOption(), was von der _afterSave()Methode dieser Ressource aufgerufen wird - genau wie Sie es erwarten würden, da wir einen eav_attributeDatensatz zum Aktualisieren benötigen . Sie können sogar sehen, wie Multiselect- und Select-Standardeinstellungen unmittelbar vor dem endgültigen Update an derselben Stelle behandelt werden:

$bind  = array('default_value' => implode(',', $attributeDefaultValue));
$where = array('attribute_id =?' => $object->getId());
$adapter->update($this->getMainTable(), $bind, $where);

Eine andere Alternative besteht darin, direkt mit dem Ressourcenmodell zu arbeiten.

Benmarks
quelle
Vielen Dank. Ich bin sehr enttäuscht. Ich habe den updateAttributeAnsatz gewählt, aber es sollte einen Weg geben, dies elegant zu tun. Vielleicht in Magento 2. oh ... und nette Erklärung.
Marius
Danke, aber ... schade, dass ich mich irre! Ich versuche herauszufinden, warum.
Benmarks
Was meinst du damit, dass du falsch liegst? Schade, dass du recht hast :)
Marius
Aktualisiert - dachte, ich habe mich geirrt, aber ich war nicht. Es ist möglich, direkt mit dem Ressourcenmodell zu arbeiten, und es gibt einen Präzedenzfall dafür, wie Attribute über die GUI gespeichert werden.
Benmarks
1
Danke für das Update. Großartige Köpfe gleichermaßen. Ich bin am selben Ort gelandet, um mich inspirieren zu lassen. Genau so habe ich das in der Zwischenzeit gehandhabt :)
Marius
0

Im Installationsprogramm Dies sind die beiden Zeilen nach addAttribute, die erläutert werden, um Standard hinzuzufügen:

$setup = new Mage_Eav_Model_Entity_Setup('core_setup');
. . . . 
. . . . 
. . . .     
$attr = $setup->getAttribute('catalog_product', 'attribute_code');
$setup->updateAttribute('catalog_product',$attr['attribute_id'],'default_value', 'default_value1,default_value2,default_value3,default_value4');

attribute_code: ist Ihr Attributcode default_value1: ist Ihr entsprechender Wert, getrennt durch,

Hassan Ali Shahzad
quelle