Einsteigerfrage - Funktionen aus mehreren Klassen/DCAs heraus aufrufen
Hallo,
ich möchte eine oft verwendete Funktion (exemplarisch einen API-Aufruf) aus mehreren DCA-Klassen heraus ansprechen. Derzeit kann ich diese Funktion in jedem DCA in einer Klasse am Ende der Datei definieren und sie wird z.B. über ein onload, submit oder options Callback ausgeführt. Das sieht dann abstrakt so aus:
PHP-Code:
use Contao\Backend;
class tl_orders extends Backend{
public function macheEtwas($irgendeineVariable)
{
// ... irgendetwas machen
return $modifizierteVariable;
}
}
Nun würde ich gerne diesem Beispiel folgen, das ich 1:1 nachgebaut habe, bekomme jedoch stets die Meldung "Attempted to call an undefined method named "convertUmlauts" of class "tl_diverse".
https://community.contao.org/de/show...-in-Contao-4-9
Also mache ich etwas falsch.
Kann mir vielleicht jemand ein einfaches Beispiel geben, wie ich aus einem Container, der in "contao/dca" abgelegt ist, nicht nur mit "'tl_orders', 'macheEtwas'" (s.u.) ...
PHP-Code:
'fields' => [
'id' => [
'sql' => ['type' => 'integer', 'unsigned' => true, 'autoincrement' => true],
],
'tstamp' => [
'sql' => ['type' => 'integer', 'unsigned' => true, 'default' => 0]
],
'articleNo' => array
(
'inputType' => 'select',
'filter' => true,
'search' => true,
'sorting' => true,
'options_callback' => array('tl_orders', 'macheEtwas'),
'eval' => array('includeBlankOption'=>false,'tl_class'=>'w50 wizard'),
'sql' => ['type' => 'string', 'length' => 10, 'default' => '']
),
... eine Funktion aus tl_orders.php aufrufe, sondern die Funktion an anderer Stelle (z.B. in "src/MyFunctions/FunctionMacheEtwas.php") definiere und aus allen möglichen DCA-Dateien (z.B. "tl_diverse, tl_vendors etc.) heraus aufrufe?
Liste der Anhänge anzeigen (Anzahl: 3)
Hallo Zoglo,
jetzt ist es bei mir angekommen und auch nachvollziehbar - herzlichen Dank! Nur mache ich bei der Umsetzung noch einen kleinen Fehler. Ich habe es ganz simpel nachgebaut, hier die "tl_diverse.php" mit einer einfachen Testfunktion "function_1":
PHP-Code:
// contao\dca\tl_diverse.php
use Contao\DC_Table;
use Contao\Backend;
use Contao\DataContainer;
use App\EventListener\DataContainer\MyFunctions;
$GLOBALS['TL_DCA']['tl_diverse'] = [
'config' => [
'dataContainer' => DC_Table::class,
'enableVersioning' => true,
'onsubmit_callback' => [
[MyFunctions::class, 'function_1']
],
...
Hier die Funktion in der Klasse "MyFunctions". Sie gibt mir das Array für eine einache Checkbox aus:
PHP-Code:
// App\EventListener\DataContainer\MyFunctions.php
namespace App\EventListener\DataContainer;
use Contao\DataContainer;
class MyFunctions
{
public function function_1(DataContainer $dc): void
{
if (!$dc->activeRecord)
{
return;
}
var_dump($dc->activeRecord->test);
die();
}
}
Die Dateien habe ich meiner Meinung nach in den richtigen Pfaden abgelegt, aber womöglich mache ich hier einen Denkfehler:
Anhang 27144
Jedenfalls scheint die Klasse und somit die Funktion nicht gefunden zu werden, denn ich bekomme diese Meldung:
Anhang 27145
Ich denke, mir fehlt nur noch ein winziges Puzzleteil, dann habe ich es. Es wäre nett, wenn jemand noch einmal einen Blick darauf werfen könnte.
Vielen Dank.
Liste der Anhänge anzeigen (Anzahl: 1)
Entschuldige, ich hatte hier nur beide Dateien in einen Codeblock gesteckt, die Dateien waren - bis auf den Pfad - unverändert. Hier jetzt richtig:
PHP-Code:
// App\EventListener\DataContainer\MyFunctions.php
namespace EventListener\DataContainer;
use Contao\DataContainer;
class MyFunctions
{
public function function_1(DataContainer $dc): void
{
if (!$dc->activeRecord)
{
return;
}
var_dump($dc->activeRecord->test);
die();
}
}
PHP-Code:
// contao\dca\tl_diverse.php
use Contao\DC_Table;
use Contao\Backend;
use Contao\DataContainer;
use EventListener\DataContainer\MyFunctions;
$GLOBALS['TL_DCA']['tl_diverse'] = [
'config' => [
'dataContainer' => DC_Table::class,
'enableVersioning' => true,
'onsubmit_callback' => [
[MyFunctions::class, 'function_1']
],
Hier der geänderte Dateibaum:
Anhang 27146
Leider ist es nach wie vor die gleiche Meldung: System::importStatic() failed because class "EventListener\DataContainer\MyFunctions" is not a valid class name or does not exist.