Model Function ändern

Hallo, ich würde gerne eine Funktion aus der Models/Articles/Repository.php ändern. Ich ahbe gelesen, dass man dies updatesicher anstellen kann mit einem Hook. Über der Funktion selbst steht auch, das die Funktion mit einem Hook erweitert werden kann. Nun habe ich mir die Doku angesehen aber komme auf keinen grünen Zweig. Um ehrlich zu sein, ich verstehe es überhaupt nicht. Die erste grundlegende Frage wäre: Ich möchte in der Funktion lediglich einen Wert ändern. Nichts davor oder dahinter ausführen. Ist das überhaupt möglich? Wäre dafür die „Update-Hook“ von Nöten? Freue mich auf Rückmeldung.

Dieser FAQ Beitrag sollte für dich interessant sein: sonstiges-f58/faq-haufig-gestellte-fragen-t24425.html#p109837 In einem der Beispiele wird sogar ein hook auf eine repository gezeigt: http://wiki.shopware.com/Schuhgroessen- … 2_868.html Viele Grüße

Verstehe ich überhaupt nicht. Ich habe das mal so erstellt, aber was passiert mit der Funktion? Wird die komplett darein kopiert? [code]<?php class Shopware_Plugins_Frontend_variantbackend_Bootstrap
extends Shopware_Components_Plugin_Bootstrap
{

public function getCapabilities()
{
    return array(
        'install' => true, 'update' =\> true, 'enable' =\> true ); } public function getLabel() { return 'variantbackend'; } public function getVersion() { return '1.0.0'; } public function getInfo() { return array( 'version' =\> $this-\>getVersion(), 'autor' =\> 'SM', 'copyright' =\> '© 2015 ', 'label' =\> $this-\>getLabel(), 'source' =\> 'Community', 'description' =\> '', 'license' =\> '', 'support' =\> '', 'link' =\> 'https://www.' ); } public function install() { $this-\>subscribeEvents(); return array('success' =\> true, 'invalidateCache' =\> array('frontend')); } public function uninstall() { return true; } private function subscribeEvents() { $this-\>subscribeEvent( 'Shopware\Models\Articles\Repository::getListQueryBuilder::replace', 'replacegetDetailsByIdsQueryBuilder' ); } /\*\* \* Hooks the getListQueryBuilder method of the customer repository. \* Additionally selects our own attributes \* \* @param Enlight\_Hook\_HookArgs $arguments \*/ public function replacegetDetailsByIdsQueryBuilder(Enlight\_Hook\_HookArgs $arguments) { $builder = $this-\>getEntityManager()-\>createQueryBuilder(); $builder-\>select(array('details','attribute','prices','customerGroup','configuratorOptions')) -\>from('Shopware\Models\Article\Detail', 'details') -\>leftJoin('details.configuratorOptions', 'configuratorOptions') -\>leftJoin('details.prices', 'prices') -\>leftJoin('details.attribute', 'attribute') -\>innerJoin('prices.customerGroup', 'customerGroup') -\>where('details.id IN (?1)') -\>setParameter(1, $ids); if ($sort !== null && !empty($sort)) { $builder-\>addOrderBy($sort); } else { $builder-\>addOrderBy('details.additionalText', 'ASC');//Änderung } $builder-\>addOrderBy('customerGroup.id', 'ASC') -\>addOrderBy('prices.from', 'ASC'); return $builder; } } [/code]

Hi, geht der Programmfluss denn durch deine Callback-Methode? Versuch mal zusätzlich mit $args->setReturn($builder) am Ende. Hast du das Plugin nach Hinzugfügen des Hooks neu installiert? Ist hier zwingend ein Replace-Hook nötig? “after” wäre besser, da kannst du dir am Anfang der Methode mit $args->getReturn() das Ergebnis der Original-Methode hohlen. Besten Gruß, Daniel

Hallo, bin jetzt verwirrt. public function replacegetDetailsByIdsQueryBuilder(Enlight_Hook_HookArgs $arguments) beinhaltet exakt den gleichen Code wie original, nur dort wo Änderung markiert ist findet eine Änderung statt. So funktioniert das ja scheinbar nicht.

Ich werde mal noch etwas rumprobieren, danke erstmal. Eine kurze Frage noch. Wie kann ich testen ob überhaupt etwas passiert? Wenn die Funktion nicht korrekt läuft werden halt die Varianten nicht sortiert, aber ich muss doch irgendwie auf die Ergebnisse zugreifen können die mir $args->getReturn() liefert.

Noch einmal eine kurze Frage, ich sitze da jetzt schon Stunden daran, es wird langsam :slight_smile: Ich habe jetzt ein Event registriert, es soll in der Funktion getDetailsByIdsQueryBuilder ein Wert geändert werden. Hier der Hook: [quote]public function replacegetDetailsByIdsQueryBuilder(Enlight_Hook_HookArgs $arguments) { $builder = $arguments->getReturn(); $builder->addOrderBy(‘details.additionalText’, ‘ASC’); $arguments->setReturn($builder); }[/quote] $builder->addOrderBy(‘details.id’, ‘ASC’); soll geändert werden auf $builder->addOrderBy(‘details.additionalText’, ‘ASC’); Ich sehe nicht, warum es nicht geht. Habe es auch mit einem After Hook versucht.:frowning:

Mit addOrderBy() fügst du nur eine zusätzliche, zweitrangige Sortierung hinzu. Du suchst orderBy(), um die aktuell hinterlegten Sortierungen zu ersetzen. Siehe auch: http://doctrine-orm.readthedocs.org/en/ … ilder.html Viele Grüße

Ah prima, mit orderBy überschreibe ich also jeder Sortierung, noch ebsser, vielen Dank! Leider funktioniert das auch nicht. Ich habe auch hier wieder replace und after Hook probiert :oops: [quote]$builder = $arguments->getReturn(); $builder->orderBy(‘details.additionalText’, ‘ASC’); $arguments->setReturn($builder); [/quote] Es passiert nichts. Registriert ist der Hook doch korrekt?? [quote] private function subscribeEvents() { $this->subscribeEvent( ‘Shopware\Models\Articles\Repository::getDetailsByIdsQueryBuilder::replace’, ‘replacegetDetailsByIdsQueryBuilder’ ); } [/quote]

Ok, es funktioniert nun, super! In der Registrierung war ein “s” zuviel :smiley: