Shopware Plugin verbinden mit Datenbank

Hallo Community,

Ich hab ein einfaches Problem, aber anscheinend gibt es dazu noch keinen Forenbeitrag.

Ich möchte einfach nur innerhalb von einem Shopwareplugin mit der Datenbank connecten. Ich hab die normale Syntax von PHP und SQLi benutzt aber irgendwie funktioniert das nicht so wirklich.

 

Hier mein Quellcode:

subscribeEvent(
                    'Enlight_Controller_Action_PostDispatchSecure_Frontend',
                    'onFrontendPostDispatch',
                    'connectSQL'

            );

        $this->createConfig();

        return true;
    }


    private function createConfig()
    {
        //Configuration in the Plugin Manager goes here

        $form = $this->Form();

        $form->setElement(
            'text',
            'host_cf',
            array(
                'label' => 'Host',
                'value' => 'localhost',
                'description' => 'Type your Host URL in here',
                'required' => true
            )
        );
        $form->setElement(
            'text',
            'user_cf',
            array(
                'label' => 'Username',
                'description' => 'Type your Username in here',
                'required' => true
            )
        );
        $form->setElement(
            'text',
            'password_cf',
            array(
                'label' => 'Password',
                'description' => 'Type your Password in here',
                'required' => true
            )
        );
        $form->setElement(
            'text',
            'db_cf',
            array(
                'label' => 'DB Name',
                'description' => 'Type your Database Name in here',
                'required' => true
            )
        );
    }

    public function onFrontendPostDispatch(Enlight_Event_EventArgs $args)
    {
        /** @var \Enlight_Controller_Action $controller */
        $controller = $args->get('subject');
        $view = $controller->View();

        $view->addTemplateDir(
                    __DIR__. '/Views'
            );

    }

    public function connectSQL()
    {
				$con = mysqli_connect($host_cf, $user_cf, $password_cf, $db_cf);
				if (mysqli_connect_errno())
			  {
			  echo "Failed to connect to Database";
			} else {
				echo "Success";
			}
    }
}

 

Die Problematik ist hauptsächlich, dass ich nicht ganz verstehe, wie ich was abrufe. Ich möchte die Werte aus den textfeldern in der config benutzen als variablen für die mysqli_connect.

Außerdem verstehe ich trotz mehrfachen Lesen der Documentation nicht wie ich mit der onFrontendDispatch umgehen soll und wofür ich diese benötige.

 

Wäre toll, wenn mir da jemand einen kurzen Einblick geben könnte,

Grüße,

Max K.

Hi Max,

brauchst Du explizit eine neue DB-Verbindung? Das sollte eigentlich nur der Fall sein wenn Du Dich zu einer anderen Maschine/DB als der die Shopware nutzt verbindest. Und selbst dann solltest Du nicht die Methode mysqli_connect nutzen (die ist veraltet) sondern PDO (http://php.net/manual/de/book.pdo.php).

Sollte Dir auch eine Verbindung zur DB von Shopware reichen kannst Du Dir einfach das entsprechende Objekt aus dem Dependency Injection Container holen:

 /\*\* @var $connection \Doctrine\DBAL\Connection \*/ $connection = $this-\>get('dbal\_connection');

Bzgl. onFrontendDispatch: Der Name der Methode ist eigentlich egal, relevant ist der Name des Events auf dass Du Dich registrierst (in Deinem Fall hier “Enlight_Controller_Action_PostDispatchSecure_Frontend”), das legt fest zu welchem Zeitpunkt innerhalb des Quellcodes von Shopware Dein Code ausgeführt wird.

Ich hoffe das hilft Dir ein wenig weiter!

Hendrik

*Edit: Typo

1 Like

Ah okey vielen Dank. Ja ich muss in der Tat nur auf die Shopwaredatenbank zugreifen und möchte diese dann per SQL verändern/auslesen etc.

Eine Frage hätte ich dann aber noch: Gibt es eine Möglichkeit über echo/alert() zu testen, ob diese PDO Verbindung erfolgreich war? Einfach so ne art console.log() für php und im shopware plugin :slight_smile:

Die PHP-Pendants zu console.log sind print_r und var_dump.

Solltest Du ein sehr großes Objekt oder eines mit Rekursionen (wie bei Doctrine-Objekten) ausgeben wollen benötigst Du den Doctrine-Dump:

\Doctrine\Common\Util\Debug::dump($user);

Also ich hab jetzt das versucht so wie beschrieben, aber es ist wirklich extrem umständlich sich mit dieser syntax auszukennen, da sowas wie ein

CREATE TABLE example

sich als extrem kompliziert herausstellt für mich in dieser DBAL library. Ich kenne mich schon in PHP und SQL aus, aber irgendwie finde ich nicht die nötige Dokumentation um mich wirklich sicher fortzubewegen in der Plugin entwicklung. Habe ich vielleicht eine gewisse Dokumentation übersehen, in der das ausführlich erklärt wird wie man mit dieser Library und SQL/phpMyAdming arbeitet?

Das wäre sehr hilfreich

 

Grüße,

Max K.

Wenn du umbedingt “plain”-SQL verwenden möchtest, ist das auch mit dem Doctrine DBAL möglich:

$stmt = $connection->prepare('CREATE TABLE xxx ....');
$stmt->execute();

Wenn du aber mal die Vorteile vom DBAL erkannt hast, möchtest du es nicht mehr missen.  Wink Schau dir mal das SearchBundle an. Eine Query wird hier durch verschiedenste Stellen zusammengebastelt. Jede Klasse (auch Plugins) kann dann z.B. ein select/where/join hinzufügen, ohne kompliziert via str_replace oder ähnliches das SQL-Statement manipulieren zu müssen.

Die Dokumentation findest du hier: http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/

Viele Grüße

@simkli schrieb:

Wenn du umbedingt “plain”-SQL verwenden möchtest, ist das auch mit dem Doctrine DBAL möglich:

$stmt = $connection->prepare(‘CREATE TABLE xxx …’);
$stmt->execute();

Wenn du aber mal die Vorteile vom DBAL erkannt hast, möchtest du es nicht mehr missen.  Wink Schau dir mal das SearchBundle an. Eine Query wird hier durch verschiedenste Stellen zusammengebastelt. Jede Klasse (auch Plugins) kann dann z.B. ein select/where/join hinzufügen, ohne kompliziert via str_replace oder ähnliches das SQL-Statement manipulieren zu müssen.

Die Dokumentation findest du hier: http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/

Viele Grüße

Was mich dabei dann aber so verwirrt sind einfach dann solche CodeSnippets wie auf der Seite: Best practices of Shopware plugin development

unter dem Punkt DBAL Connection, dass da dann so ein CodeSnippet steht:

$path = $this->queryBuilder->execute()->fetch(PDO::FETCH_COLUMN);

und ich das leider nirgendwo auf der von dir oben verlinkten Documentation seite finde.

Außerdem habe ich momentan noch keinerlei Anhaltspunkt, ob mein Skript funktionert, bzw. wieso es nicht funktioniert. Es ist sehr frustrierend code zu debuggen bei dem man nicht weiß wo der Fehler liegt :smiley:

Tut mir Leid für all diese Fragen, aber ich versuche da wirklich einen Durchblick zu bekommen

Naja PDO ist nicht Doctrine DBAL. PDO ist eine Library von PHP selbst. Da liegt die Dokumentation dann hier: http://php.net/manual/de/book.pdo.php

Die hatte dir aber @hsoebbing‍ bereits oben verlinkt.

und ich das leider nirgendwo auf der von dir oben verlinkten Documentation seite finde.

Dann hast du sie dir nicht genau angesehen. Das steht in Kapitel 4. Die execute-Funktion gibt die ein Objekt vom Typ PDO_Statement zurück. 

Sorry aber beim Lesen der Doku können wir dir nicht helfen :stuck_out_tongue: Ich weiß, am Anfang ist das kompliziert, aber da hilft alles nichts. Jeder fängt mal damit an :wink:

Viele Grüße