Jump to content
xt:Commerce Community Forum

Erklärung der hookpoints im XTC


esho.de

Recommended Posts

Hallo Gemeinde,

ich bin gerade bei der Entwicklung eines kleines Testplugins.

Doch leider finde ich zu den Thema hookpoints und deren Implementierung nicht sehr viel.

Im Plugin "Serials" habe ich für die Erweiterung des Adminbereiches den folgende Coding-Block:


$rowActions[] = array('iconCls' => 'products_serials', 'qtipIndex' => 'qtip1', 'tooltip' => TEXT_PRODUCTS_SERIALS);
if ($this->url_data['edit_id'])
$js = "var edit_id = ".$this->url_data['edit_id']."; var edit_name = '".htmlentities($products_model)."';";
else
$js = "var edit_id = record.id; var edit_name=record.get('products_model');";
$js .= "addTab('adminHandler.php?load_section=product_serials&plugin=xt_serials&pg=overview&products_id='+edit_id,'".TEXT_PRODUCTS_SERIALS." ('+edit_name+')', 'product_serials'+edit_id)";

$rowActionsFunctions['products_serials'] = $js;
[/PHP]

Aus diesem Coding Block interessiert mich folgendes:

  • $this->url_data['edit_id'] - was gibt es zu diesem Zeitpunkt noch für Felder im Zugriff?
  • addTab - fügt im Adminbereich eine neus Tab hinzu, was macht aber das Feld &pg=overview? Gibt es hier weitere mögliche Werte?
  • Nach dem Klicken des Button im Adminbereich, wird in der Klasse "product_serials" der Funktion "function _get($ID = 0)" angesprochen. Welcher Rückgabewert wird hier erwartet? Ist dies immer eine Liste?
  • Wie kann ich steuern das nach dem Klick auf das Button im Adminbereich ein Eingabe Formular angezeigt wird?

Bei einem Klick auf den Button im Adminbereich erhalte ich die folgende Meldung:

Leider konnte die Seite nicht geladen werden. Bitte drücken Sie F5 oder den Aktualisieren Button in Ihrem Browser und versuchen Sie es erneut.

Sollte das Problem nach dem Neuladen erneut auftreten wenden Sie sich bitte an unseren Support unter ([email protected])

Für jeden Tipp wäre ich sehr dankbar.

Link to comment
Share on other sites

Hallo,

$this->url_data ist nichts anders als das $_GET Array, wenn mich meine Erinnerung nicht trügt. Warum lässt du dir das Array nicht einfach mal in einem var_dump anzeigen?

&pg=overview fügt einen neuen Wert zum $_GET hinzu. Du kannst mit Hilfe des & Operators Werte hinzufügen, wie es dir gefällt.

Ergebnis von _get hängt wohl immer davon ab in welcher Klasse die Funktion aufgerufen wird...auch hier: var_dump ist dein Freund

Dein Eingabeformular musst du logischerweise von einer Klasse erzeugen lassen. Also Objekt erzeugen, Funktion "display()" schreiben usw.

Link to comment
Share on other sites

Hi,

ich kenne die Klassen nicht, die du dir als Referenz ausgesucht hast, aber "pg"=>"overview" wird einfach nur eine simple Variable sein, nach der der Inhalt der Seite ausgewählt wird. Vielleicht gibt es da noch eine "detail" Ansicht oder Ähnliches : )

Wie der Aufruf der einzelnen Funktionen sauber gecoded wird, kann ich dir noch nicht aus dem Stehgreif sagen, dazu bin ich noch zu frisch im Shopsystem unterwegs.

Schnell und vermutlich eher unsauber habe ich es gelöst, indem ich in der _get zunächst alle für mich relevanten Daten gesammelt habe und diese schlicht und ergreifend an die display($data) weitergereicht habe.

Ich habe die display Methode in der selben Klasse definiert. Wenn alles sinnvoll funktioniert und ich mehr Bescheid über das System weiß(verwendete patterns etc.), wird sich das vielleicht nochmal ändern.

Link to comment
Share on other sites

Hi,

das glaube ich auch, das "pg" nur eine simple Variable sein wird.

Da ich mir bereits einige Plugins angeschaut habe und diese alle den selben Wert aufweisen, bin ich mir da nicht so sicher...

Ich würde die Display Methode jetzt auch mal eben in den Klasse selbst mit aufnehmen... Es ist ja erst einmal ein Test...

Vielleicht könntest Du mich über neue Erkenntisse auf dem Laufenden halten?

Hast Du noch einen Tipp zum Fehler:

Leider konnte die Seite nicht geladen werden. Bitte drücken Sie F5 oder den Aktualisieren Button in Ihrem Browser und versuchen Sie es erneut.

Sollte das Problem nach dem Neuladen erneut auftreten wenden Sie sich bitte an unseren Support unter ([email protected])

Link to comment
Share on other sites

Hm nein, den Fehler habe ich auch noch. Da ich aber ohnehin noch mehrere Ecken erstellen muss bis das Modul ersteinmal grundlegend steht, habe ich mir noch keine großen Gedanken gemacht, außer ein wenig im www gesucht. Ohne Ergebnis - natürlich.

Aktuell läuft ein anderer Teil meines Moduls, aber der Code wird nach dem hookpoint nicht richtig "fortgesetzt". Mit Hilfe von error_log bin ich jetzt bis zu einer Formatierungsfunktion vorgestoßen, die aus mir unerfindlichen Gründen abbricht. Ich gehe schwer davon aus, dass mein Modul irgendetwas blockiert.

Fragt sich nur was. Deshalb beschäftige ich mich jetzt erstmal mit der Codesauberkeit. Vielleicht lösen sich dann beide Fehler in Wohlgefallen auf. Ich gebe dir Bescheid ; )

Link to comment
Share on other sites

Noch ein kurzer Zusatz zu der Fehlermeldung "...Seite kann nicht angezeigt werden...drücke Sie F5..."

Mit einem wacheren Auge als am Freitag ist mir aufgegangen, dass offensichtlich noch eine Art container für den html Code fehlt, den ich per display() in den neuen Tab schreibe. Zu diesem Container zähle ich auch das buttonpanel im unteren Bereich, über welches man zu den anderen Kunden-Optionen springen kann. Also zum Beispiel "Kundenadressen".

Hat rein zufällig schon jemand einen Tipp für mich wie ich diesen container erzeuge? Ich könnte mir nämlich denken, dass der konsequente Nachbau bereits existierender Tabs auch die Fehlermeldung verschwindet.

Link to comment
Share on other sites

  • 1 month later...

So...nachdem ich jetzt einige Zeit mit anderen Projekten beschäftigt war, habe ich mich erneut in die Misere Pluginentwicklung für Veyton eingedacht.

Den beschriebenen Fehler "Seite konnte nicht geladen werden", vermeidet man tatsächlich indem man schlichtweg die richtigen Systemfunktionen verwendet.

Wie auch schon in meinem anderen Beitrag beschrieben, müssen die wichtigen Funktionen _get(), _getParams() und _setPosition in die Klasse rein.

Werden die richtig eingesetzt verschwindet der Fehler und Die Ansicht entspricht der, die es auch auf anderen Seiten der Adminoberfläche gibt. Also zum Beispiel ein Grid (aka Listenansicht) oder die Ansicht eines einzelnen Listenbeitrags nach Doppelklick auf ein Grid-Element.

Was genau in die Funktionen rein muss, habe ich mir mühselig aus anderen Klassen zusammengefrickelt. Hier mal eine kurze Zusammenfassung:

in _getParms() gehört rein:

1. Datentypen festlegen


$header['someSpecificText'] = array('type' => 'textfield');
$params['header'] = $header;
[/PHP]

2. Felder inkludieren oder exkludieren

[PHP]
if (!$this->url_data['edit_id'])
{
//Felder, die im Grid angezeigt werden sollen
$params['include'] = array('id', 'customerid')
}
//Felder aus der DB, die nichts in der view verloren haben
$params['exclude'] = array ('unrelevantSysData');
[/PHP]

Interessant ist hier vor allem die Abfrage "$this->url_data['edit_id']" Damit erfragt man ob die aktuell aktive Ansicht das Grid oder die Ansicht eines einzelnen Grid-Eintrages ist. So lassen sich zum Beispiel verschiedene Datenbankfelder im Grid ausblenden, in der Einzelansicht aber wieder anzeigen.

In _get($ID=0) gehört:

1. Alle Datenbankabfragen. Dafür gibt es die Klasse adminDB_DataRead

[PHP]
$addr_table_data = new adminDB_DataRead($this->_table_addr, $this->_table_lang, $this->_table_seo, $this->_master_key_addr, $this->_master_key_addr.'='.$vergleichsWert);
$addr_data = $addr_table_data->getData();
[/PHP]

$this->_table_lang und $this->_table_seo dürfen hier null sein, ebenso wie die letzte Variable, die dem WHERE einer query entspricht.

Das Datenarray kann man nun noch entsprechend verarbeiten. Formatiert man es zu einem Objekt und gibt es zurück, werden genau diese Daten in der Ausgabe angezeigt.

Über die header Variable in getParams() greift man auf die Daten aus _get zu und kann die Datentypen so anpassen.

Woran ich persönlich heute verzweifle ist die Frage was denn eigentlich passiert, wenn ich in der Ansicht eines einzelnen Formulars auf Speichern drücke. Wo ich in den Prozess eingreifen kann, bzw. wie ich angebe wo ich die Daten speichern will ist mir noch völlig schleierhaft.

Link to comment
Share on other sites

Wie es der Zufall so will habe ich eben die Lösung für mein letztes Problem gefunden.

Als weitere Funktion neben den oben beschriebenen kommt _set($data) in die Klasse hinein. $data entspricht dabei einem eindimensionalem Array mit genau den Werten, die in dem Formular angezeigt werden.

Ein Tipp für die Ausgabe um sich das ganze anzusehen:


foreach ($data as $key => $value)
{
$msg .= $key.' = '.$value."\r\n";
}
error_log($msg, 3, _SRV_WEBROOT._SRV_WEB_PLUGINS.'/mein_plugin/etc/develop.log');
[/PHP]

Woran ich mir den Kopf unnötigerweise zerbrochen habe: Daten, die als false bzw. null gespeichert werden (zum Beispiel nicht-selektierte Checkboxen) tauchen in $data nicht auf. Die müssen also ggf. manuell gesetzt werden um sie in der Datenbank zu speichern.

Das Speichern selbst geht so:

[PHP]
//Welches Datenbankfeld soll geupdatet werden?
$update_array = array('fieldOne' => (int) $data['anInteger'],'fieldTwo' => $data['something']);

$db->AutoExecute($table_name, $update_array, 'UPDATE', "id = ". (int) $id);
[/PHP]

Nachdem mich das einen halben Arbeitstag gekostet hat bin ich jetzt sehr froh, dass es läuft...

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
  • Create New...