Franz Holzinger

Verse of the day

Bei Gott ist mein Heil, meine Ehre, der Fels meiner Stärke; meine Zuversicht ist auf Gott.
Psalm 62:7

© Bible Gateway's Verse of the Day


autor  
28-03-17 09:58:18 Neue individuelle Marker einsetzen
Harald S.
Hallo Herr Holzinger,

dies ist wohl ein altes Thema bei tt_products, aber nachi den vielen Updates mit allen Veränderungen habe ich nur alte Vorgehensweisen gefunden, die wahrscheinlich überholt sind.

Zur Aufgabe:
Im Shop werden neue Felder angelegt, deren Inhalte für die Rechnung/Lieferaschein von Bedeutung sein werden. Die Inhalte sind neuen Markern zugeordnet und können darüber ausgelesen werden.

Die Idee:
Beispielsweise in der Product-DB neue Felder anlegen und die Inhalte für den Shop zur Verfügung stellen.

Das Problem:
Es gibt den Kickstarter nicht mehr und andere Hilfen scheinen auch veraltet zu sein. Im MySQL bin ich mit der Sprache nicht vertraut. Sind die Anweisungen im Handbuch zu tt_products für die neuste Version passend?

Ich freue mich auf Ihre Hilfe.
H. S.
28-03-17 12:56:52 TCA von tt_products erweitern
Franz Holzinger
Das Anlegen neuer Felder geschieht durch die Datei ext_tables.sql in der neu zu schreibenden Shop-Erweiterung-Extension. Die genaue Syntax kann aus anderen Extensions abgeschaut werden. Es kann über phpMyAdmin und das TYPO3 Install Tool dann ausprobiert werden, ob es klappt.

Mit TYPO3 6.2 und 7.6 müssen die TCA Angaben über eine Datei tt_products.php oder sys_products_orders.php im Verzeichnis /Configuration/TCA/Overrides/ gemacht der Zusatz-Extension werden. Das ist die einzige Neuerung, die es von TYPO3 Seite her gegeben hat. Dafür müssen keine TCA Additions mehr, wie früher, gemacht werden (ext_localconf.php):

$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['tt_products']['extendingTCA'][] = 'my_extension_key';


Ansonsten müssen wie bisher verschiedene Hook Funktionen aus tt_products verwendet werden. Einige Hooks sind im tt_products Wiki auf https://wiki.typo3.org/Tt_products beschrieben.
Es muss aber die Stelle im PHP Code gesucht werden, denn der Hook gibt die Parameter vor.

Über dieses Link Kommando lassen sich alle Hooks auflisten:

find typo3conf/ext/tt_products -name '*.php' -exec grep -in hook {} \; -ls

Einige Texteditoren können dies aber auch.

Danach einfach die globale Variable für den entsprechenden Hook setzen.
z.B.:

$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['tt_products']['PRODUCT'][] =
'MeineFirma\\MeineTtProductsErweiterung\\Hooks\\Marker';

Unter Classes/Hooks/ befindet sich eine Datei Marker.php .

Aber in vielen Fällen wird das nicht mehr benötigt. Denn tt_products liest alle Felder aus, die über die TCA verfügbar sind. Ev. ist der Marker auch ohne den Hook schon ausgefüllt.

Die Marker.php sollte in dieser Form aufgebaut sein:

class Marker {
public function getRowMarkerArray (
$pObj,
&$markerArray,
&$cObjectMarkerArray,
$functablename,
$row,
$imageNum,
$imageRenderObj,
&$forminfoArray,
$theCode,
$basketExtra,
$id,
&$linkWrap,
$bEnableTaxZero
) {
$markerArray['###PRODUCT_TX_MEINETTPRODUCTSERWEITERUNG_MEIN_FELD###'] = htmlspecialchars($row['tx_meinettproductserweiterung_mein_feld']);
}
}

29-03-17 08:10:03 Zwischenfrage
Harald S.
Hallo Herr Holzinger,

vielen Dank für die ausführliche Erläuterung. Nach meiner Betrachtung hat vieles nach Ihren Anweisungen geklappt.

Sie schreiben nun " Denn tt_products liest alle Felder aus". Meine Frage ist: Gibt es einen Dump (o. ähnliches), den ich ziehen kann und der mir die Feldinhalte zeigt.

Nachdem ich ein paar neue Felder angelegt habe, glaube ich, dass ich die neuen Markerbezeichnungen nicht richtig nenne und deshalb nicht aufrufen kann (###PRODUCT_...###, ###PERSON_...###, ###DELIVERY_...### oder vielleicht nur ###....###). Es kann aber auch sein, dass die Felder doch nicht gefüllt sind.

Noch eine weitere Frage zu den Hooks:
In dem Listing wird immer auf MarkerArrays verwiesen. Ich habe mir die PHP-Dateien angesehen, und wenn ich es richtig verstehe, werden die Marker dort global nach einem Muster zusammengebaut und nicht jedes einzeln. Wenn das so ist, finde ich das sehr geschickt.
.... oder habe ich estwas übersehen bzw. falsch verstanden?

Viele Grüße
H. S.

Meine tt_products Version ist 2.8.14
29-03-17 11:53:52 debug
Franz Holzinger
Man kann überall in den PHP Datei Debug Anweisungen einfügen.

debug ($markerArray, '$markerArray an Position 1');

Über die Extension fh_debug kann man dann alle Marker ansehen, die es gibt.

Es gibt verschiedenste Marker, die je nach Art unterschiedlich ermittelt und ausgefüllt werden. Dazu gibt es noch Subpart Marker und Wrapped Subpart Marker für Bereiche innerhalb des HTML Templates. Alle PHP Dateien, die für die Ausgabe und somit für Marker zuständig sind, befinden sich im Verzeichnis view oder marker.
Die Behandlung der Marker für die einzelnen Felder findet in der Datei view/class.tx_ttproducts_table_base_view.php statt.


4-07-18 12:34:08 Überschreiben von Markern möglich?
Sebastian Klein
Hallo,
ich versuche ebenfalls, neue Marker bereitzustellen. Schon durch die Einrichtung der Felder im TCA werden die Inhalte meiner neuen Datenbankfelder korrekt ausgegeben.
Ich habe es aber noch nicht geschafft, die Daten durch einen Hook zu verändern.

Sobald ich in der ext_localconf.php die Zeile

$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['tt_products']['PRODUCT'][] =
'MeineFirma\\TtProductsCustomfields\\Hooks\\Marker';

einfüge, erhalte ich die folgende TYPO3 Exception:

Class 'MeineFirma\TtProductsCustomfields\Hooks\Marker' not found

Error thrown in file
/pfad/zu/typo3_src-8.7.13/typo3/sysext/core/Classes/Utility/GeneralUtility.php in line 3960.

54 TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance("MeineFirma\TtProductsCustomfields\Hooks\Marker")

/pfad/zu/typo3conf/ext/tt_products/view/class.tx_ttproducts_table_base_view.php:
00485: if (is_array ($GLOBALS['TYPO3_CONF_VARS']['EXTCONF'][TT_PRODUCTS_EXT][$marker])) {
00486: foreach ($GLOBALS['TYPO3_CONF_VARS']['EXTCONF'][TT_PRODUCTS_EXT][$marker] as $classRef) {
00487: $hookObj = t3lib_div::makeInstance($classRef);
00488:
00489: if (method_exists($hookObj, 'getRowMarkerArray')) {


Meine PHP-Datei "tt_products_customfields/Classes/Hooks/marker.php" beginnt mit dem Namespace:

<?php
namespace MeineFirma\TtProductsCustomfields\Hooks\Marker;


Die dann folgende Klasse heißt einfach "Marker" und ist aus dem Beispiel weiter oben vom 28.03.17 kopiert.

Hab ich etwas vergessen?
Würde es mit dem Hook überhaupt funktionieren, vorhandene Marker zu überschreiben/anzupassen?


TYPO3 8.7
tt_products 2.8.22
4-07-18 14:13:48 Namespace
Franz Holzinger
Es muss dann aber so lauten:

namespace MeineFirma\TtProductsCustomfields\Hooks\;

Der "Marker" ist der Name der Klasse und darf nicht mehr im Namespace enthalten sein.
Es muss in der Extension tt_products_custom außerdem eine Datei composer.json geben, damit der autoloader von TYPO3 bzw. Composer die Dateien auch finden kann.
< Zurück zum Forum