Hallo zusammen
Ich versuche mich gerade an meiner ersten Erweiterung. Klappt auch schon fast , jedoch komme ich an einem Punkt nicht weiter.
Eine Erweiterung, die es ermöglicht, Testvelos zu speichern.
Jedes Testvelo besitzt folgende Attribute:
Erfassung.png
Ziel:
Jedes Testvelo gehört in eine Kategorie resp. hat einen Typ (Bike, Rennrad, Elektro). Wenn ich nun mein Modul auswähle, möchte ich einen Typ festlegen können. Der Typ sollte per ComboBox (auch bei der Erfassung) auszuwählen sein. Dieses Modul sollte dann nur die Testvelos mit dem entsprechenden Typ ausgeben:
Modul.png
Im Endeffekt möchte ich jeweils ein Modul für jeden Typ, wobei das Template bei allen drei gleich bleiben kann.
Etwas was nicht zwingend ist, aber ziemlich nett wäre:
Sortierung der erfassten Testvelos im BE nicht nach Namen (A, B, C..), sondern zuerst gruppiert nach dem Typ (graue Zeile mit Startbuchstaben durch Typ ersetzen) und dann nach dem Namen:
Auflistung.png
Ich hoffe ihr könnt mir einen Tipp geben, wie ich das am besten löse.
Im Anschluss meine Dateien resp. Konfigurationen.
Gruss und Danke
Daniel aka Dancger
config/autoload.php
config/config.php:PHP-Code:
<?php
/**
* Contao Open Source CMS
*
* Copyright (C) 2005-2013 Leo Feyer
*
* @package Screencast
* @link https://contao.org
* @license http://www.gnu.org/licenses/lgpl-3.0.html LGPL
*/
/**
* Register the classes
*/
ClassLoader::addClasses(array
(
// Modules
'ModuleTestbikesList' => 'system/modules/testbikes/modules/ModuleTestbikesList.php',
));
/**
* Register the templates
*/
TemplateLoader::addFiles(array
(
'mod_testbikes_list' => 'system/modules/testbikes/templates',
));
dca/tl_testbikes.php:PHP-Code:
<?php
/**
* Back end modules
*/
$GLOBALS['BE_MOD']['content']['testbikes'] = array(
'tables' => array('tl_testbikes'),
'icon' => 'system/modules/testbikes/assets/images/testbikes.png'
);
/**
* Front end modules
*/
$GLOBALS['FE_MOD']['testbikes'] = array
(
'testbikes_list' => 'ModuleTestbikesList',
);
languages/de/modules.php:PHP-Code:
<?php
/**
* Table tl_testbikes
*/
$GLOBALS['TL_DCA']['tl_testbikes'] = array
(
// Config
/*
In diesem Abschnitt legen wir die Grundeinstellungen für unser Modul fest,
so z.B. woher die Daten kommen.
*/
'config' => array
(
'dataContainer' => 'Table',
'enableVersioning' => true,
'sql' => array
(
'keys' => array
(
'id' => 'primary'
)
),
),
// List
/*
Im diesem Abschnitt wird festgelegt, wie die Datensätze aufgelistet werden und welche
Sortieroptionen dem Nutzer zur Verfügung stehen sollen. So steht panelLayout z.B. dafür,
welche Optionen in der Kopzeile erscheinen sollen. Semiokolon oder Komma stehen dafür,
ob das Layout (ein- oder mehrzeilig). Fragt mich aber nicht, warum filter in Tristans
Beispiel nicht auftaucht.
*/
'list' => array
(
'sorting' => array
(
'mode' => 2,
'fields' => array('modell'),
'flag' => 1,
'panelLayout' => 'filter;sort,search,limit'
),
/*
Hier werden die Bezeichnungen gesetzt, die später in der Listenansicht erscheinen sollen.
In unserem Fall also immer der Titel der Screencasts.
*/
'label' => array
(
'fields' => array('modell'),
'format' => '%s',
),
/*
Bei den 'global operations' handelt es sich um die Bearbeitungsfelder unterhalb der Filterfelder.
*/
'global_operations' => array
(
'all' => array
(
'label' => &$GLOBALS['TL_LANG']['MSC']['all'],
'href' => 'act=select',
'class' => 'header_edit_all',
'attributes' => 'onclick="Backend.getScrollOffset()" accesskey="e"'
)
),
/*
Bei den 'operations' handelt es sich um die Bearbeitungsfelder zu jedem Listeneintrag.
*/
'operations' => array
(
'edit' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_testbikes']['edit'],
'href' => 'act=edit',
'icon' => 'edit.gif'
),
'delete' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_testbikes']['delete'],
'href' => 'act=delete',
'icon' => 'delete.gif',
'attributes' => 'onclick="if(!confirm(\'' . $GLOBALS['TL_LANG']['MSC']['deleteConfirm'] . '\'))return false;Backend.getScrollOffset()"'
),
'show' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_testbikes']['show'],
'href' => 'act=show',
'icon' => 'show.gif',
'attributes' => 'style="margin-right:3px"'
),
)
),
// Palettes
/*
Die Grobstruktur des Formulars wird angelegt, also das, was später dem BE-User zur Dateneingabe
präsentiert wird. Dabei stehen in den geschweifen Klammern immer die Abschnittsnamen. Es folgen
die Felder. Ein Semikolon leitet einen neuen Abschnitt ein.
*/
'palettes' => array
(
'default' => '{title_legend},type,modell,{testbikes_legend},size,modellyear,color,image'
),
// Fields
/*
Im Abschnitt fields werden alle Felder definiert, die in der Datenbank-Tabelle angelegt werden
sollen. Dies sind meist mehr Felder, als im Formular des Backend-Moduls ausgegeben werden (z.B.
wird man die id wohl fast immer automatisch setzen). Die Felder id und tstamp sind übrigens
immer Pflicht. sql ist (Überraschung) immer das SQL-Statement.
*/
'fields' => array
(
'id' => array
(
'sql' => "int(10) unsigned NOT NULL auto_increment"
),
'tstamp' => array
(
'sql' => "int(10) unsigned NOT NULL default '0'"
),
'modell' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_testbikes']['modell'],
'inputType' => 'text',
'exclude' => true,
'sorting' => true,
'flag' => 1,
'search' => true,
'eval' => array(
'mandatory' => true,
'unique' => true,
'maxlength' => 255,
'tl_class' => 'w50',
),
'sql' => "varchar(255) NOT NULL default ''"
),
'size' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_testbikes']['size'],
'inputType' => 'text',
'exclude' => true,
'sql' => "text NULL"
),
'modellyear' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_testbikes']['modellyear'],
'inputType' => 'text',
'exclude' => true,
'sql' => "text NULL"
),
'color' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_testbikes']['color'],
'inputType' => 'text',
'exclude' => true,
'sql' => "text NULL"
),
'image' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_testbikes']['image'],
'exclude' => true,
'inputType' => 'fileTree',
'eval' => array('filesOnly'=>true, 'extensions'=>Config::get('validImageTypes'), 'fieldType'=>'radio', 'mandatory'=>true),
'sql' => "binary(16) NULL"
)
)
);
languages/de/tl_testbikes.php:PHP-Code:
<?php
$GLOBALS['TL_LANG']['MOD']['testbikes'][0] = 'Testbikes';
$GLOBALS['TL_LANG']['MOD']['testbikes'][1] = 'Testbikes verwalten';
$GLOBALS['TL_LANG']['FMD']['testbikes_list'] = 'Testbikes Liste';
modules/ModuleTestbikesList.php:PHP-Code:
<?php
$GLOBALS['TL_LANG']['tl_testbikes']['title_legend'] = 'Titel';
$GLOBALS['TL_LANG']['tl_testbikes']['modell'][0] = 'Modell';
$GLOBALS['TL_LANG']['tl_testbikes']['modell'][1] = 'Geben Sie hier das Modell ein.';
$GLOBALS['TL_LANG']['tl_testbikes']['testbikes_legend'] = 'Testbike';
$GLOBALS['TL_LANG']['tl_testbikes']['size'][0] = 'Grösse';
$GLOBALS['TL_LANG']['tl_testbikes']['size'][1] = 'Geben Sie hier die Grösse des Testbikes ein.';
$GLOBALS['TL_LANG']['tl_testbikes']['modellyear'][0] = 'Modelljahr';
$GLOBALS['TL_LANG']['tl_testbikes']['modellyear'][1] = 'Geben Sie hier das Modelljahr des Testbikes ein.';
$GLOBALS['TL_LANG']['tl_testbikes']['color'][0] = 'Farbe';
$GLOBALS['TL_LANG']['tl_testbikes']['color'][1] = 'Geben Sie hier das Farbe des Testbikes ein.';
$GLOBALS['TL_LANG']['tl_testbikes']['image'][0] = 'Produktbild';
$GLOBALS['TL_LANG']['tl_testbikes']['image'][1] = 'Wählen Sie das Produktbild des Testbikes aus.';
$GLOBALS['TL_LANG']['tl_testbikes']['new'][0] = 'Neues Testbike';
$GLOBALS['TL_LANG']['tl_testbikes']['new'][1] = 'Ein neues Testbike anlegen';
$GLOBALS['TL_LANG']['tl_testbikes']['edit'][0] = 'Testbike bearbeiten';
$GLOBALS['TL_LANG']['tl_testbikes']['edit'][1] = 'Testbike ID %s bearbeiten';
$GLOBALS['TL_LANG']['tl_testbikes']['delete'][0] = 'Testbike löschen';
$GLOBALS['TL_LANG']['tl_testbikes']['delete'][1] = 'Testbike ID %s löschen';
$GLOBALS['TL_LANG']['tl_testbikes']['show'][0] = 'Testbikedetails';
$GLOBALS['TL_LANG']['tl_testbikes']['show'][1] = 'Details des Testbikes ID %s anzeigen';
templates/mod_testbikes_list.html5:PHP-Code:
<?php
class ModuleTestbikesList extends Module
{
/**
* Template
* @var string
*/
protected $strTemplate = 'mod_testbikes_list';
/**
* Compile the current element
*/
protected function compile()
{
/** @var \Contao\Database\Result $rs */
$rs = Database::getInstance()
->query('SELECT * FROM tl_testbikes ORDER BY modell');
$this->Template->testbikes = $rs->fetchAllAssoc();
}
}
HTML-Code:<div class="<?php echo $this->class; ?> block"<?php echo $this->cssID; ?><?php if ($this->style): ?> style="<?php echo $this->style; ?>"<?php endif; ?>> <?php if ($this->headline): ?> <<?php echo $this->hl; ?>><?php echo $this->headline; ?></<?php echo $this->hl; ?>> <?php endif; ?> <?php foreach ($this->testbikes as $testbike): ?> <h2><?php echo $testbike['modell']; ?></h2> <p><?php echo $testbike['size']; ?></p> <p><?php echo $testbike['modellyear']; ?></p> <p><?php echo $testbike['color']; ?></p> <?php endforeach; ?> </div>
Lesezeichen