Error beim Einfügen eines Hooks
Closed this issue · 6 comments
Umgebung: Neuinstalliertes Contao 4.6.9
exportTableHook wie in der Readme beschrieben eingerichtet (also auch genau das Beispiel mit Datumsformatierungen der Event-Tabelle) 1:1 runterkopiert.
Beim Aufrufen des Exports erhalte ich folgenden Fehler:
Warning: in_array() expects parameter 2 to be array, null given
Symfony Devmode sagt das er in der Zeile 250 der classes/ExportTable.php rausspringt:
// HOOK: add custom value
if (isset($GLOBALS['TL_HOOKS']['exportTable']) && is_array($GLOBALS['TL_HOOKS']['exportTable']))
{
foreach ($GLOBALS['TL_HOOKS']['exportTable'] as $callback)
{
$objCallback = \System::importStatic($callback[0]); // <--- Hier
$value = $objCallback->{$callback[1]}($field, $value, $strTable, $dataRecord, $dca, $options);
}
}
$arrRow[] = $value;
Der komplette Stacktrace lautet:
ErrorException:
Warning: in_array() expects parameter 2 to be array, null given
at vendor/contao/core-bundle/src/Resources/contao/library/Contao/System.php:228
at Contao\System::importStatic('Markocupic\\ExportTable\\ExportTableHook')
(vendor/markocupic/export_table/classes/ExportTable.php:250)
at Markocupic\ExportTable\ExportTable::exportTable('tl_calendar_events', array('strSorting' => 'startTime ASC', 'exportType' => 'csv', 'strDelimiter' => ';', 'strEnclosure' => '"', 'arrFilter' => array(), 'strDestination' => null, 'arrSelectedFields' => array('title', 'startTime', 'location'), 'useLabelForHeadline' => null, 'arrayDelimiter' => '||'))
(vendor/markocupic/export_table/classes/ExportTable.php:111)
at Markocupic\ExportTable\ExportTable::prepareExport()
(vendor/markocupic/export_table/dca/tl_export_table.php:215)
at tl_export_table->__construct()
(vendor/contao/core-bundle/src/Resources/contao/library/Contao/System.php:236)
at Contao\System::importStatic('tl_export_table')
(vendor/contao/core-bundle/src/Resources/contao/library/Contao/Widget.php:1328)
at Contao\Widget::getAttributesFromDca(array('label' => array('Datentabelle für Export auswählen', 'Wählen Sie eine Tabelle für den Exportvorgang aus.'), 'inputType' => 'select', 'options_callback' => array('tl_export_table', 'optionsCbGetTables'), 'eval' => array('multiple' => false, 'mandatory' => true, 'includeBlankOption' => true, 'submitOnChange' => true, 'required' => false), 'sql' => 'varchar(255) NOT NULL default \'\''), 'export_table', 'tl_calendar_events', 'export_table', 'tl_export_table', object(DC_Table))
(vendor/contao/core-bundle/src/Resources/contao/classes/DataContainer.php:327)
at Contao\DataContainer->row('{title_legend},title;{settings},export_table,exportType,fields,filterExpression,sortBy,sortByDirection,arrayDelimiter;{deep_link_legend},activateDeepLinkExport')
(vendor/contao/core-bundle/src/Resources/contao/drivers/DC_Table.php:1963)
at Contao\DC_Table->edit()
(vendor/contao/core-bundle/src/Resources/contao/classes/Backend.php:612)
at Contao\Backend->getBackendModule('export_table', null)
(vendor/contao/core-bundle/src/Resources/contao/controllers/BackendMain.php:163)
at Contao\BackendMain->run()
(vendor/contao/core-bundle/src/Controller/BackendController.php:48)
at Contao\CoreBundle\Controller\BackendController->mainAction()
(vendor/symfony/http-kernel/HttpKernel.php:149)
at Symfony\Component\HttpKernel\HttpKernel->handleRaw(object(Request), 1)
(vendor/symfony/http-kernel/HttpKernel.php:66)
at Symfony\Component\HttpKernel\HttpKernel->handle(object(Request), 1, true)
(vendor/symfony/http-kernel/Kernel.php:188)
at Symfony\Component\HttpKernel\Kernel->handle(object(Request))
(web/app_dev.php:84)
Habe ich was falsch gemacht oder ist das ein Bug?
Wie hast du den Hook registriert?
Lg Marko
Eigentlich genau so wie in der readme. Hier die Auszüge der Dateien:
// system/modules/_export_table_hook/config/config.php
<?php
$GLOBALS['TL_HOOKS']['exportTable'][] = array('Markocupic\ExportTable\ExportTableHook', 'exportTableHook');
und der Handler dazu:
// system/modules/_export_table_hook/classes
<?php
class ExportTableHook
{
/**
* @param $field
* @param string $value
* @param $table
* @param $dataRecord
* @param $dca
* @return string
*/
public static function exportTableHook($field, $value = '', $table, $dataRecord, $dca)
{
if ($table == 'tl_calendar_events')
{
if ($field == 'startDate' || $field == 'endDate' || $field == 'tstamp')
{
if ($value > 0)
{
$value = \Date::parse('d.m.Y', $value);
}
}
}
return $value;
}
}
Ja, so geht das natürlich nicht, weil die Klassen vom Classloader nicht gefunden wird.
Setze einen neuen namespace und probier mal so:
<?php
/**
* Created by PhpStorm.
* User: Marko
* Date: 25.11.2018
* Time: 18:49
*/
// system/modules/_export_table_hook/config/config.php
$GLOBALS['TL_HOOKS']['exportTable'][] = array('\Philippwinkel\ExportTable\ExportTableHook', 'exportTableHook');
// und der Handler dazu:
// system/modules/_export_table_hook/classes
namespace Philippwinkel\ExportTable;
class ExportTableHook
{
/**
* @param $field
* @param string $value
* @param $table
* @param $dataRecord
* @param $dca
* @return string
*/
public static function exportTableHook($field, $value = '', $table, $dataRecord, $dca)
{
if ($table == 'tl_calendar_events')
{
if ($field == 'startDate' || $field == 'endDate' || $field == 'tstamp')
{
if ($value > 0)
{
$value = \Date::parse('d.m.Y', $value);
}
}
}
return $value;
}
}
Ok, dann ist's klar warum das nicht gehen kann. Dann brauch man aber auch noch einen Classloader, der die neue Klasse registriert. Dann funktionierts wie gewünscht.
<?php
// system/modules/_export_table_hook/config/autoload.php
/**
* Register the namespaces
*/
ClassLoader::addNamespaces(array
(
'WiPhi'
));
/**
* Register the classes
*/
ClassLoader::addClasses(array
(
// Classes
'WiPhi\ExportTable\ExportTableHook' => 'system/modules/_export_table_hook/classes/ExportTableHook.php'
));
Danke!
Ja, aber die Klasse registrierst du bei "alten" Contao Modulen noch in der system/modules/_export_table_hook/config/autoload.php
//system/modules/_export_table_hook/config/autoload.php
/**
* Register the classes
*/
ClassLoader::addClasses(array
(
// Classes
'WiPhi\ExportTable\ExportTableHook' => 'system/modules/_export_table_hook/classes/ExportTableHook.php'
));
Jep. Der Pfad ist beim Kopieren ins Issue verloren gegangen. Jetzt passt's.
OT: früher gab es dafür einen autoload creator :D