Ergebnis 1 bis 7 von 7

Thema: Typ in Modul auswählbar

  1. #1
    Contao-Nutzer
    Registriert seit
    01.10.2013.
    Ort
    Schweiz
    Beiträge
    26

    Frage Typ in Modul auswählbar

    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
    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',
    ));
    config/config.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',
    );
    dca/tl_testbikes.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/modules.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';
    languages/de/tl_testbikes.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';
    modules/ModuleTestbikesList.php:
    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();
        }
    }
    templates/mod_testbikes_list.html5:
    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>
    Geändert von dancger (25.02.2015 um 23:38 Uhr)

  2. #2
    Contao-Nutzer
    Registriert seit
    03.09.2009.
    Ort
    Baunatal
    Beiträge
    122
    Partner-ID
    6087

    Standard

    Wenn die Kategorien fest sind, könntest du sie in tl_testbikes als Feld ergänzen. Die Sortierung kannst du dann über
    PHP-Code:
    $GLOBALS['TL_DCA']['tl_testbikes']['list']['sorting'
    festlegen.

    Für die Ausgabe im FE Modul musst du dir eine tl_module.php im dca Order anlegen und diese befüllen. Da kann man sich als Vorlage gut an der tl_module.php im core Modul orientieren.

  3. #3
    Contao-Nutzer
    Registriert seit
    01.10.2013.
    Ort
    Schweiz
    Beiträge
    26

    Frage

    Zitat Zitat von Wusch Beitrag anzeigen
    Wenn die Kategorien fest sind, könntest du sie in tl_testbikes als Feld ergänzen
    Hat wunderbar geklappt:

    dca/tl_testbikes.php um folgendes erweitert:
    PHP-Code:
            'typ' => array
            ( 
                
    'label'     => &$GLOBALS['TL_LANG']['tl_testbikes']['typ'], 
                
    'inputType' => 'select'
                
    'search'    => true
                
    'options'   => array('bike','electro','road'), 
                
    'reference' => &$GLOBALS['TL_LANG']['tl_testbikes']['typ']['data'], 
                
    'eval'      => array('mandatory'=>true'maxlength'=>64'tl_class'=>'w50 wizard'),
                
    'sql'       => "varchar(255) NOT NULL default ''"
            
    ), 
    /languages/de/tl_testbikes.php um folgendes erweitert:
    PHP-Code:
    $GLOBALS['TL_LANG']['tl_testbikes']['typ'][0] = 'Biketyp';
    $GLOBALS['TL_LANG']['tl_testbikes']['typ'][1] = 'Wählen Sie den Biketyp aus';

    $GLOBALS['TL_LANG']['tl_testbikes']['typ']['data']['bike'] = 'Bike';
    $GLOBALS['TL_LANG']['tl_testbikes']['typ']['data']['electro'] = 'Elektrovelo';
    $GLOBALS['TL_LANG']['tl_testbikes']['typ']['data']['road'] = 'Rennvelo'
    Auch die Anzeige im Backend wird das Ganze nun richtig aufgelistet:
    PHP-Code:
        'list'     => array
        (
            
    'sorting'           => array
            (
                
    'mode'        => 2,
                
    'fields'      => array('typ'),
                
    'flag'        => 11,
                
    'panelLayout' => 'filter;search'
            
    ),
        
        
    'label'             => array
        (
            
    'fields' => array('modell'),
            
    'format' => '%s',
        ), 
    Aber ich verstehe nicht, wie ich nun per Dropdown im Modul die Ausgabe auf einen Typ beschränken kann.
    Hat jemand einen Tipp für mich?

    Gruss & Danke
    Daniel
    Geändert von dancger (26.02.2015 um 21:08 Uhr)

  4. #4
    Contao-Nutzer Avatar von aaronl
    Registriert seit
    20.06.2009.
    Beiträge
    111

    Standard

    Zitat Zitat von dancger Beitrag anzeigen
    Aber ich verstehe nicht, wie ich nun per Dropdown im Modul die Ausgabe auf einen Typ beschränken kann.
    Hat jemand einen Tipp für mich?

    Gruss & Danke
    Daniel
    Da du im Panel Layout filter schon dabei hast, musst du noch bei den Feldern definieren, dass sie zum Filtern verwendet werden können.

    https://contao.org/de/manual/3.3/dat...ys.html#felder

    So wie bei deinem Feld 'typ' im DCA search schon auf true steht musst du 'filter' auch auf true setzen.

  5. #5
    Contao-Nutzer
    Registriert seit
    01.10.2013.
    Ort
    Schweiz
    Beiträge
    26

    Standard

    Zitat Zitat von aaronl Beitrag anzeigen
    Panel Layout filter
    Entschuldigung, ich hab mich unklar ausgedrückt.

    Es geht nicht um die Auflistung im Backend, sondern um den Filter, der nur bestimmte Daten im FE ausgibt (der pro Modul geregelt werden kann).
    Wusch hat mir empfohlen, die tl_module.php im Core-Modul anzuschauen. Leider steig ich da nicht durch.

    Ziel:
    Bei einer Nachrichtenliste kann man mittels einer Checkboxliste die Archive auswählen. Ich möchte einen Dropdown in meinem Modul, aus dem einen Typ auswählen kann (Siehe Werte in $GLOBALS['TL_LANG']['tl_testbikes']['typ']['data']). Im FE sollten dann nur Datensätze ausgegeben werden, die den ausgewählten Wert in der Spalte typ besitzen.

  6. #6
    Contao-Nutzer Avatar von aaronl
    Registriert seit
    20.06.2009.
    Beiträge
    111

    Standard

    Okay.

    Zur Inspiration aus der modules/calendar/dca/tl_module.php des Integrierten Kalenders:

    PHP-Code:
    $GLOBALS['TL_DCA']['tl_module']['fields']['cal_calendar'] = array
    (
        
    'label'                   => &$GLOBALS['TL_LANG']['tl_module']['cal_calendar'],
        
    'exclude'                 => true,
        
    'inputType'               => 'checkbox',
        
    'options_callback'        => array('tl_module_calendar''getCalendars'),
        
    'eval'                    => array('mandatory'=>true'multiple'=>true),
        
    'sql'                     => "blob NULL"
    ); 
    Du findest dann weiter unten die zugehörige Callback Funktion die die Werte liefert. Auch sollte es möglich sein den inputType auf select zu wechseln.

    Ich würde mir noch überlegen ob du den Typ wirklich für jedes Rad einzeln von Hand einträgst oder eine neue Tabelle für die verschiedenen Typen anlegst und das Typ Feld dann damit verknüpfst.

  7. #7
    Contao-Nutzer Avatar von aaronl
    Registriert seit
    20.06.2009.
    Beiträge
    111

    Standard

    Zitat Zitat von aaronl Beitrag anzeigen
    Ich würde mir noch überlegen ob du den Typ wirklich für jedes Rad einzeln von Hand einträgst oder eine neue Tabelle für die verschiedenen Typen anlegst und das Typ Feld dann damit verknüpfst.
    Sorry. Die Frage muss anders lauten... die Frage ist, ob du das wirklich in der DCA Festlegen willst, sollte sich da was ändern.

    Für den Fall, dass du es so lassen willst würde ich sowas wie im 'cal_startDay' Feld probieren wo du anstatt der 'option_callback' gleich die
    PHP-Code:
    'options'=$GLOBALS['TL_LANG']['tl_testbikes']['typ']['data'
    mitgibst und im SQL das Feld dann natürlich auch als ein Varchar wie beim Typ definierst.

    Persönlich würde ich es aber doch über eine extra Tabelle lösen.
    Geändert von aaronl (27.02.2015 um 10:19 Uhr)

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •