contao/test — Issue #948: onload_callback wird überschrieben
Author: importer
Created: 2011-11-29 07:04:09+00:00
State: open
Labels: Defect, Invalid, news

Betrifft:

/dca/tl_news_comments.php
/dca/tl_news_archive.php
/dca/tl_news.php

und den Großteil der Standard-Extensions.

Durch die Initialisierungsstruktur werden in früher geladenen Modulen gesetzte Callbacks gelöscht.

```
$GLOBALS['TL_DCA']['tl_news'] = array
(
'config' =>
(
'onload_callback' => array(
...
)
)
)
```

h2. Lösungsvorschläge:

h2. A) array_merge

Jede callback-Deklaration muss zwingend vorhanden und nach folgendem Schema aufgebaut sein, selbst wenn das Modul keine Callbacks definiert:

```
$GLOBALS['TL_DCA']['tl_news'] = array
(
'config' =>
(

'onload_callback' => array_merge(array
(

... callbacks ...

), (array) $GLOBALS['TL_DCA']['tl_news']['config']['onload_callback']),

)
```

Da diese Variante in allen Extensions zum Einsatz kommen müsste, dürfte sie wenig praktikabel sein. Ich schlage deswegen folgende Lösung vor:

h2. B) Hook loadDataContainer

Über einen Hook in Controller:loadDataContainer läßt sich die Reihenfolge, in der die Module durchlaufen werden, beeinflussen:

```
/**
* Load a set of DCA files
*/
protected function loadDataContainer($strName)
{
$arrModules = $this->Config->getActiveModules();

// HOOK: loadDataContainer
if (isset($GLOBALS['TL_HOOKS']['loadDataContainer']) && is_array($GLOBALS['TL_HOOKS']['loadDataContainer']))
{
foreach($GLOBALS['TL_HOOKS']['loadDataContainer'] as $callback)
{
$this->import($callbackr0);
$arrModules = $this->$callbackr0->$callbackr1($strName, $arrModules);
}
}

foreach ($arrModules as $strModule)
{
$strFile = sprintf('%s/system/modules/%s/dca/%s.php', TL_ROOT, $strModule, $strName);

if (file_exists($strFile))
{
include_once($strFile);
}
}

include(TL_ROOT . '/system/config/dcaconfig.php');
}
```

h2. C) ArrayObject

Eventuell läßt sich $GLOBALS als ArrayObject-Objekt erzeugen und das Überschreiben von Callback-Indizes auf diese Weise vermeiden. Ob dies in dieser Art umsetzbar ist, muss erst noch festgestellt werden.

--- _Originally created by ciss on August 14th, 2009, at 01:15am (ID 948)_