Artikel-Bewertung Controller "überschreiben"

Guten Abend zusammen

ich möchte gerne die Artikel-Bewertungen um ein paar Felder zu reduzieren. Ich habe per Overwrite die Smarty Blöcke leergelassen, aber Shopware prüft trotzdem die nicht vorhandenen Pflichtfelder.

Die Validierung erfolgt hier:
shopware/Detail.php at 5.2 · shopware/shopware · GitHub

Kann mir jemand erklären wie ich diesen Controller überschreiben kann mit einem eigenen Plugin?
zB:
if (empty(Shopware()->System()->_POST[‘sVoteName’])) {
$sErrorFlag[‘sVoteName’] = false ;
}

Vielen Danke im Voraus.

 'replaceRatingAction'
        ];
    }

    public function replaceRatingAction(\Enlight_Hook_HookArgs $args)
    {
        /** @var \Shopware_Controllers_Frontend_Detail $subject */
        $subject = $args->getSubject();

        $id = (int) $subject->Request()->sArticle;
        if (empty($id)) {
            return $subject->forward('error');
        }

        $article = Shopware()->Modules()->Articles()->sGetArticleNameByArticleId($id);
        if (empty($article)) {
            return $subject->forward('error');
        }

        $voteConfirmed = false;

        if ($hash = $subject->Request()->sConfirmation) {
            $getVote = Shopware()->Db()->fetchRow('
                SELECT * FROM s_core_optin WHERE hash = ?
            ', [$hash]);
            if (!empty($getVote['data'])) {
                Shopware()->System()->_POST = unserialize($getVote['data']);
                $voteConfirmed = true;
                Shopware()->Db()->query('DELETE FROM s_core_optin WHERE hash = ?', [$hash]);
            }
        }

        if (empty(Shopware()->System()->_POST['sVoteSummary'])) {
            $sErrorFlag['sVoteSummary'] = true;
        }

        if (!empty(Shopware()->Config()->CaptchaColor) && !$voteConfirmed) {
            $captcha = str_replace(' ', '', strtolower($subject->Request()->sCaptcha));
            $rand = $subject->Request()->getPost('sRand');
            if (empty($rand) || $captcha != substr(md5($rand), 0, 5)) {
                $sErrorFlag['sCaptcha'] = true;
            }
        }
        $validator = $this->container->get('validator.email');
        if (!empty(Shopware()->Config()->sOPTINVOTE)
            && (empty(Shopware()->System()->_POST['sVoteMail'])
                || !$validator->isValid(Shopware()->System()->_POST['sVoteMail']))
        ) {
            $sErrorFlag['sVoteMail'] = true;
        }

        if (empty($sErrorFlag)) {
            if (!empty(Shopware()->Config()->sOPTINVOTE)
                && !$voteConfirmed && empty(Shopware()->Session()->sUserId)
            ) {
                $hash = \Shopware\Components\Random::getAlphanumericString(32);
                $sql = '
                    INSERT INTO s_core_optin (datum, hash, data)
                    VALUES (NOW(), ?, ?)
                ';
                Shopware()->Db()->query($sql, [
                    $hash, serialize(Shopware()->System()->_POST->toArray()),
                ]);

                $link = $subject->Front()->Router()->assemble([
                    'sViewport' => 'detail',
                    'action' => 'rating',
                    'sArticle' => $id,
                    'sConfirmation' => $hash,
                ]);

                $context = [
                    'sConfirmLink' => $link,
                    'sArticle' => ['articleName' => $article],
                ];

                $mail = Shopware()->TemplateMail()->createMail('sOPTINVOTE', $context);
                $mail->addTo($subject->Request()->getParam('sVoteMail'));
                $mail->send();
            } else {
                unset(Shopware()->Config()->sOPTINVOTE);
                Shopware()->Modules()->Articles()->sSaveComment($id);
            }
        } else {
            $subject->View()->sFormData = Shopware()->System()->_POST->toArray();
            $subject->View()->sErrorFlag = $sErrorFlag;
        }

        $subject->View()->sAction = 'ratingAction';

        $subject->forward('index');
    }
}

Keine Gewähr - hab es nicht getestet.

Ich würde die benötigten Elemente verstecken und standardmäßig mit irgendetwas füllen. So brauchst du keine 200 Zeilen in deinen replace hook zu kopieren.

Viele Grüße

@Aquatuning GmbH schrieb:

Ich würde die benötigten Elemente verstecken und standardmäßig mit irgendetwas füllen. So brauchst du keine 200 Zeilen in deinen replace hook zu kopieren.

Das ist natürlich auch eine valide Lösung. Ich hätte nur keine Lust diesen Dummy Müll in der Datenbank zu haben :-) 

Ich würde auf alle Fälle die Lösung von [@Aquatuning GmbH](http://forum.shopware.com/profile/11752/Aquatuning GmbH “Aquatuning GmbH”)‍ bevorzugen. Replace-Hooks sollte man so gut es geht vermeiden. Einfach im PreDispatch-Event die Felder mit Dummy-Daten füllen. Und falls es dich wirklich in der Datenbank stört, kannst du sie ja im PostDispatch-Event wieder entfernen.

Speicherplatzverbrauch in der Datenbank bleibt sowieso gleich, da pro Zeile der Platz immer al­lo­zie­rt wird.

Viele Grüße

@maxf5 schrieb:

Kann mir jemand erklären wie ich diesen Controller überschreiben kann mit einem eigenen Plugin?

Mir war nicht bewusst, dass ich mit der Beantwortung der Frage hier so eine Grundsatzdiskussion auslöse.  Grin Smile 

Mit Grundsatzdiskussion hat das wenig zu tun. Shopware selbst sagt schon lange:

[…] For these reasons, events should always be preferred over hooks, especially the replace hook should be avoided when possible. Also that’s the reason why only core classes and repositories are hookable in Shopware. […]

Replace-Hooks sind einfach Bad-Practice, da sollte man den Fragesteller vor dieser Lösung warnen Sticking-out-tongue

Viele Grüße

Replace-Hooks sind einfach Bad-Practice, da sollte man den Fragesteller vor dieser Lösung warnen Sticking-out-tongue

Vorher Daten in die Datenbank zu schreiben um diese dann direkt danach wieder zu löschen ist genau so Bad-Practise.  Sticking-out-tongue