Zitat von
umdenker
Ich möchte nun dem Seitendesigner die Möglichkeit bieten, diese Datensätze gefiltert anzuzeigen, also z.B. beim Einbinden des Moduls auf einer Seite kann er direkt angeben: nur den Screencast mit der DCA-ID 5 anzeigen.
An anderer Stelle möchte er vielleicht auch nochmal Screencast einbinden, aber dann mit DCA-ID 7 etc.
Das wäre für mich ein Inhaltselement. D.h. Du legst eine dca/tl_content.php an und fügst der ein Optionsfeld hinzu. Die Optionen sind Deine vorhandenen Screencasts. Die holst Du Dir entweder als foreignkey in Dein Feld (falls das hier geht) oder mit einer Datenbankabfrage.
dca/tl_content.php:
PHP-Code:
$GLOBALS['TL_DCA']['tl_content']['palettes']['screencast'] = '{type_legend},type,headline;{screencast_legend},screencasts;{protected_legend:hide},protected;{expert_legend:hide},guest,cssID,space;{invisible_legend:hide},invisible,start,stop';
$GLOBALS['TL_DCA']['tl_content']['fields']['screencasts'] = array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['screencasts'],
'exclude' => true,
'options_callback' => array('tl_content_screencasts', 'getScreencasts'),
'inputType' => 'checkboxWizard',
'eval' => array('mandatory'=>true, 'multiple'=>true, 'class'=>'clr'),
'sql' => "blob NULL",
);
class tl_content_screencasts extends Backend
{
public function getScreencasts(DataContainer $dc)
{
// Screencasts laden und zuordnen
$objArchive = $this->Database->prepare("SELECT id, title FROM tl_screencasts")
->execute();
$Archiv = array();
while($objArchive->next())
{
$Archiv[$objArchive->id] = $objArchive->title;
}
return $Archiv;
}
}
Die Variablen und die SQL-Abfrage müssen natürlich an Deine Bedürfnisse angepaßt werden. Jetzt muß das neue Inhaltselement noch bekannt gemacht werden:
config/config.php:
PHP-Code:
$GLOBALS['TL_CTE']['includes']['screencasts'] = 'screencastClass';
config/autoload.php:
PHP-Code:
ClassLoader::addClasses(array
(
// Classes
'screencastClass' => 'system/modules/screencasts/classes/Screencasts.php',
));
Soweit das Backend, wo der Redakteur das Inhaltselement auswählen und die zu verwendenden Screencasts anklicken kann. Jetzt fehlt noch die Ausgabeklasse:
classes/Screencasts.php:
PHP-Code:
class screencastClass extends \ContentElement
{
/**
* Template
* @var string
*/
protected $strTemplate = 'ce_screencast';
/**
* Generate the module
*/
protected function compile()
{
// Array mit Screencast-ID's
$screencastlist = unserialize($this->screencasts);
if(is_array($screencastlist))
{
// Screencasts laden
$screencastArr = array();
foreach($screencastlist as $screencast_id)
{
// Screencastdetails laden
$objScreencast = $this->Database->prepare("SELECT * FROM tl_screencasts WHERE id=?")
->execute($screencast_id);
// Hier kannst Du das Objekt $objScreencast für das Array $screencastArr für das Template aufbereiten,
// das Du im Template dann in einer Schleife durchläufst. Den Code spare ich mir.
}
}
$this->Template = new \FrontendTemplate($this->strTemplate);
$this->Template->Screencasts = $screencastArr;
}
}
Das Template ce_screencast mußt Du natürlich auch anlegen und in der autoload.php registrieren.
P.S. Ich hoffe, ich habe keine Fehler in den Code eingebaut. Habe mir das aus einer eigenen Erweiterung kopiert und angepaßt.