Magento Custom Options um weitere Attribute erweitern (getestet in Magento 1.6)
23.12.2011
Standardmässig sind die Attribute der Custom Options in Magento stark beschränkt. So stehen etwa für ein Dropdown-Feld die Attribute Titel (title), Preis (price), Preisart (price type), Artikelnummer (sku) und Reihenfolge (sort order) zur Verfügung. Doch man kann dieses “Attributset” tatsächlich relativ einfach erweitern. Wir zeigen hier – der Einfachheit halber auf eine quick and dirty-Weise – wie’s geht. (Da “im richtigen Leben” natürlich keine Standard-Magento-Dateien geändert werden sollten, empfehlen wir für für den definitiven Einsatz dringend die Kapselung in eine Extension).
1. Attribut Option Type Value in der DB anlegen
Ändern Sie in der Magento-DB die Tabelle catalog_product_option_type_value und fügen Sie ein DB-Feld hinzu, z.B. wie folgt:
ALTER TABLE `catalog_product_option_type_value` ADD 'meinfeld' VARCHAR(255) DEFAULT NULL AFTER `option_id` ;
2. Neues Attribut im Backend “pflegbar” machen
Damit das neue Attribut nun im Backend auch bearbeitet werden kann, nehmen wir uns die Datei select.phtml vor, die im Verzeichnis app/design/adminhtml/default/default/template/catalog/product/edit/options/ liegt. Hier passen wir den Tabellenkopf sowie die Tabellenzeilen der Bearbeitungsmaske entsprechend an.
Wir fügen also in der Definition von OptionTemplateSelect die folgende Spalte bei den Tabellenköpfen ein (nach einem schliessenden </th>’+):
'<th><?php echo Mage::helper('catalog')->__('meinfeld') ?></th>'+
Dann fügen wir in der Definition von OptionTemplateSelectRow (nach dem gleichen Feld, nach dem wir die Tabellenkopfspalte eingefügt hatten) den folgenden Code ein:
'<td><input type="text" id="product_option_{{id}}_select_{{select_id}}_meinfeld" name="product[options][{{id}}][values][{{select_id}}][meinfeld]" value="{{meinfeld}}"></td>'+
Damit wird das neue Attribut im Backend bearbeitbar und erscheint beim Hinzufügen einer neuen Dropdown-Option. Was nun noch fehlt, ist, dass die Option auch gespeichert wird. Dazu gleich.
3. Speichern des Optionswertes im Objekt
Damit wir den Wert der Option speichern und damit später auch – analog wie andere Attribute – mittels der üblichen Getter-Methoden (z.B.) $_value->getMeinfeld() aus dem Objekt extrahieren können, muss das neue Attribut noch dem Objekt hinzugefügt werden. Das erreichen wir, indem wir die Datei Option.php in app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Options/ bearbeiten und das Feld in das Array $value['optionValues'][$i] (ca. in Zeile 250) aufnehmen. Wir schreiben also z.B. nach der Zeile ‘sku’ => $this->htmlEscape($_value->getSku()),:
'meinfeld' => $this->htmlEscape($_value->getMeinfeld()),
PROBLEM GELÖST
Exkurs – Datumsfelder in Custom Options mit Validierung
Wir können das Ganze jetzt noch einen Schritt weitertreiben und die Attributfelder in den Custom Options anpassen.
In der Folge führen wir Teile aus einem select.phtml an, die beispielhaft aufzeigen, wie das Anlegen zweier Datumsfelder mit Javascript Datepicker und Javascript-Validierung stattfinden kann. Vorausgesetzt wird hier, dass ein Attribut mit Namen “Datum” angelegt werden soll (vgl. oben). Man beachte die fettgedruckten Teile.
Datumsfeld in der Custom Option Row
'<td><input type="text" class="row-date input-text product-option-datum" id="product_option_{{id}}_select_{{select_id}}_datum" name="product[options][{{id}}][values][{{select_id}}][datum]" value="{{datum}}"><img src="<?php echo $this->getSkinUrl('images/grid-cal.gif'); ?>" alt="" id="_trigg_product_option_{{id}}_select_{{select_id}}_datum" title="Select Date" style="" /></td>'+'<scr'+'ipt type="text/javascript">Calendar.setup({inputField:"product_option_{{id}}_select_{{select_id}}_datum",ifFormat: "%d.%m.%Y",showsTime: false,button:"_trigg_product_option_{{id}}_select_{{select_id}}_datum",align: "Bl",singleClick : true});</scr'+'ipt>' +
Datum mittels javascript (Magento Prototype) validieren
Zur Validierung kann schliesslich im Umfeld anderer Validierungsaufgaben (am Schluss der Datei select.phtml) der folgende Code genutzt werden:
Validation.addAllThese([
['row-date', '<?php echo Mage::helper('catalog')->__('No Date.') ?>', function(v, elm) {
return /^((0?\d|[1-2]\d)[. -]\s*(0?[1-9]|10|11|12)|(30)[. -]\s*(0?[13456789]|10|11|12)|(31)[. -]\s*(0?[13578]|10|12))[. -]\s*(19\d\d|20\d\d)$/i.test(v)
}]]);
Hier muss zugegeben werden, dass mit dieser Überprüfung keine Schaltjahrüberprüfung stattfindet. Aber für den Hausgebrauch wird es reichen.
Quellen der Inspiration:
- http://aktuell.de.selfhtml.org/artikel/php/formularvalidierung für die Regex-Validierung
- http://www.magentocommerce.com/boards/viewthread/13313/ für den Input zur Erweiterung der Standard-Validierung in Magento
- http://www.magentocommerce.com/boards/viewthread/73036/P0/ für den Hinweis, wie neue Custom Option Attribute hinzugefügt werden können
Kategorien: Code-Schnipsel, How to, Magento-Problemlösungen, Shop-Design




