markocupic/export_table

Error beim Einfügen eines Hooks

Closed this issue · 6 comments

wiphi commented

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' => '&quot;', '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

wiphi commented

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;
    }
}
wiphi commented

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'
));
wiphi commented

Jep. Der Pfad ist beim Kopieren ins Issue verloren gegangen. Jetzt passt's.

OT: früher gab es dafür einen autoload creator :D