Contao-Camp 2024
Ergebnis 1 bis 12 von 12

Thema: Template wird nicht gefunden seit Contao 4.9

  1. #1
    Contao-Urgestein Avatar von Samson1964
    Registriert seit
    05.11.2012.
    Ort
    Berlin
    Beiträge
    2.794

    Frage Template wird nicht gefunden seit Contao 4.9

    In einer eigenen Erweiterung funktioniert die (alternative) Templateauswahl perfekt.
    dca/tl_content.php:
    PHP-Code:
    public function getAdressenTemplates()
    {
        return 
    $this->getTemplateGroup('ce_adressen_');

    Es werden mir alle entsprechenden Templates angeboten.
    Binde ich aber ein Template ein, welches nicht direkt unter templates (global) gespeichert ist, wird das Template nicht gefunden.
    PHP-Code:
    // Alternatives Template zuweisen
    if($this->adresse_alttemplate$this->Template = new \FrontendTemplate($this->adresse_tpl); 
    Hat sich in der 4.9 etwas an der Funktion FrontendTemplate geändert? Bis zur 4.8 funktionierten Templates aus Unterordnern noch einwandfrei.
    Viele Grüße
    Frank

    Seit Mai 2013 Fan von Contao
    Webmaster vom Deutschen Schachbund und Berliner Schachverband
    Mein Blog: Schachbulle
    Meine Erweiterungen bei GitHub
    Meine Videos auf YouTube: Playlist zur Contao-Programmierung/Einrichtung

  2. #2
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.059
    Partner-ID
    10107

    Standard

    Wo wird es nicht gefunden? Wird es dir im Backend nicht angezeigt? Oder wird es dir im Backend angezeigt und du kannst es auswählen - aber im Frontend wird es dann nicht gefunden? Falls Letzteres: hast du dem Unterordner dem jeweiligen Theme zugeordnet?

  3. #3
    Contao-Urgestein Avatar von Samson1964
    Registriert seit
    05.11.2012.
    Ort
    Berlin
    Beiträge
    2.794

    Standard

    "Could not find template" kommt sowohl im Frontend als auch im Backend. Dem einzigen Theme ist der entsprechende templates-Unterordner zugeordnet. Aber da drin wird wohl nicht gesucht bei der Funktion FrontendTemplate. Dafür aber bei der Funktion getTemplateGroup.
    Viele Grüße
    Frank

    Seit Mai 2013 Fan von Contao
    Webmaster vom Deutschen Schachbund und Berliner Schachverband
    Mein Blog: Schachbulle
    Meine Erweiterungen bei GitHub
    Meine Videos auf YouTube: Playlist zur Contao-Programmierung/Einrichtung

  4. #4
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.059
    Partner-ID
    10107

    Standard

    Erkläre dein Setup nochmal genauer. Dem Namen des Templates nach handelt es sich hier um ein eigenes Inhaltselement? Warum hast du in tl_content.php eine Funktion namens getAdressenTemplates()?

  5. #5
    Contao-Urgestein Avatar von Samson1964
    Registriert seit
    05.11.2012.
    Ort
    Berlin
    Beiträge
    2.794

    Standard

    tl_content.php:
    PHP-Code:
    <?php

    /**
     * Paletten
     */
    $GLOBALS['TL_DCA']['tl_content']['palettes']['__selector__'][] = 'adresse_selectmails';
    $GLOBALS['TL_DCA']['tl_content']['palettes']['__selector__'][] = 'adresse_alttemplate';
    $GLOBALS['TL_DCA']['tl_content']['palettes']['__selector__'][] = 'adresse_addImage';
    $GLOBALS['TL_DCA']['tl_content']['palettes']['__selector__'][] = 'adresse_altformat';


    $GLOBALS['TL_DCA']['tl_content']['palettes']['adressen'] = '{type_legend},type,headline;{adresse_legend},adresse_id,adresse_funktion,adresse_zusatz,adresse_selectmails;{adressefoto_legend},adresse_addImage,adresse_altformat;{adresstemplate_legend:hide},adresse_alttemplate;{protected_legend:hide},protected;{expert_legend:hide},guest,cssID,space;{invisible_legend:hide},invisible,start,stop';

    // Subpalettes
    $GLOBALS['TL_DCA']['tl_content']['subpalettes']['adresse_selectmails'] = 'adresse_mails';
    $GLOBALS['TL_DCA']['tl_content']['subpalettes']['adresse_alttemplate'] = 'adresse_tpl';
    $GLOBALS['TL_DCA']['tl_content']['subpalettes']['adresse_addImage'] = 'adresse_bildvorschau,singleSRC';
    $GLOBALS['TL_DCA']['tl_content']['subpalettes']['adresse_altformat'] = 'size';
        
    /**
     * Felder
     */

    // Adressenliste anzeigen
    $GLOBALS['TL_DCA']['tl_content']['fields']['adresse_id'] = array
    (
        
    'label'                => &$GLOBALS['TL_LANG']['tl_content']['adresse_id'],
        
    'exclude'              => true,
        
    'options_callback'     => array('tl_content_adresse''getAdressenListe'),
        
    'inputType'            => 'select',
        
    'eval'                 => array
        (
            
    'mandatory'        => false
            
    'multiple'         => false
            
    'chosen'           => true,
            
    'submitOnChange'   => true,
            
    'tl_class'         => 'wizard'
        
    ),
        
    'wizard'               => array
        (
            array(
    'tl_content_adresse''editAdresse')
        ),
        
    'sql'                  => "int(10) unsigned NOT NULL default '0'" 
    );

    // Funktion (wird vor dem Namen angezeigt)
    $GLOBALS['TL_DCA']['tl_content']['fields']['adresse_funktion'] = array
    (
        
    'label'                => &$GLOBALS['TL_LANG']['tl_content']['adresse_funktion'],
        
    'exclude'              => true,
        
    'search'               => true,
        
    'inputType'            => 'text',
        
    'eval'                 => array('maxlength'=>255'tl_class'=>'w50 clr'),
        
    'sql'                  => "varchar(255) NOT NULL default ''"
    );

    // Zusatztext (wird zwischen der Funktion und dem Namen angezeigt)
    $GLOBALS['TL_DCA']['tl_content']['fields']['adresse_zusatz'] = array
    (
        
    'label'                => &$GLOBALS['TL_LANG']['tl_content']['adresse_zusatz'],
        
    'exclude'              => true,
        
    'search'               => true,
        
    'inputType'            => 'text',
        
    'eval'                 => array('maxlength'=>255'tl_class'=>'w50''allowHtml'=>true),
        
    'sql'                  => "varchar(255) NOT NULL default ''"
    );

    // Zeigt das Standardfoto aus tl_adressen an
    $GLOBALS['TL_DCA']['tl_content']['fields']['adresse_bildvorschau'] = array
    (
        
    'exclude'              => true,
        
    'input_field_callback' => array('tl_content_adresse''getThumbnail'),
    ); 

    // Alternatives Foto aktivieren
    $GLOBALS['TL_DCA']['tl_content']['fields']['adresse_addImage'] = array
    (
        
    'label'                => &$GLOBALS['TL_LANG']['tl_content']['adresse_addImage'],
        
    'exclude'              => true,
        
    'filter'               => true,
        
    'default'              => true,
        
    'inputType'            => 'checkbox',
        
    'eval'                 => array
        (
            
    'submitOnChange'   => true,
            
    'tl_class'         => 'w50'
        
    ),
        
    'sql'                  => "char(1) NOT NULL default '1'"
    );

    // Alternatives Foto aktivieren
    $GLOBALS['TL_DCA']['tl_content']['fields']['adresse_altformat'] = array
    (
        
    'label'                => &$GLOBALS['TL_LANG']['tl_content']['adresse_altformat'],
        
    'exclude'              => true,
        
    'filter'               => true,
        
    'default'              => true,
        
    'inputType'            => 'checkbox',
        
    'eval'                 => array
        (
            
    'submitOnChange'   => true,
            
    'tl_class'         => 'w50'
        
    ),
        
    'sql'                  => "char(1) NOT NULL default ''"
    );

    // Alternatives Template aktivieren
    $GLOBALS['TL_DCA']['tl_content']['fields']['adresse_alttemplate'] = array
    (
        
    'label'                => &$GLOBALS['TL_LANG']['tl_content']['adresse_alttemplate'],
        
    'exclude'              => true,
        
    'filter'               => true,
        
    'inputType'            => 'checkbox',
        
    'eval'                 => array
        (
            
    'submitOnChange'   => true,
            
    'tl_class'         => 'clr w50'
        
    ),
        
    'sql'                  => "char(1) NOT NULL default ''"
    );

    // Template zuweisen
    $GLOBALS['TL_DCA']['tl_content']['fields']['adresse_tpl'] = array
    (
        
    'label'                => &$GLOBALS['TL_LANG']['tl_content']['adresse_tpl'],
        
    'exclude'              => true,
        
    'inputType'            => 'select',
        
    'options_callback'     => array('tl_content_adresse''getAdressenTemplates'),
        
    'eval'                 => array('tl_class'=>'w50 clr'),
        
    'sql'                  => "varchar(32) NOT NULL default ''"
    ); 

    // Nur bestimmte Adressen aktivieren einschalten
    $GLOBALS['TL_DCA']['tl_content']['fields']['adresse_selectmails'] = array
    (
        
    'label'                => &$GLOBALS['TL_LANG']['tl_content']['adresse_selectmails'],
        
    'exclude'              => true,
        
    'filter'               => true,
        
    'inputType'            => 'checkbox',
        
    'eval'                 => array
        (
            
    'submitOnChange'   => true,
            
    'tl_class'         => 'clr w50'
        
    ),
        
    'sql'                  => "char(1) NOT NULL default ''"
    );

    // Anzuzeigende Adressen auswählen
    $GLOBALS['TL_DCA']['tl_content']['fields']['adresse_mails'] = array
    (
        
    'label'                => &$GLOBALS['TL_LANG']['tl_content']['adresse_mails'],
        
    'exclude'              => true,
        
    'inputType'            => 'checkboxWizard',
        
    'options_callback'     => array('tl_content_adresse''getMails'),
        
    'eval'                 => array
        (
            
    'tl_class'         => 'w50'
            
    'multiple'         => true
        
    ),
        
    'sql'                  => "varchar(64) NOT NULL default ''"
    );

    // Feld singleSRC dynamisch ändern bei Adressen
    $GLOBALS['TL_DCA']['tl_content']['fields']['singleSRC']['load_callback'][] =  array('tl_content_adresse''setSingleSrcFlags');

    /*****************************************
     * Klasse tl_content_adresse
     *****************************************/
     
    class tl_content_adresse extends Backend
    {

        
    /**
         * Import the back end user object
         */
        
    public function __construct()
        {
            
    parent::__construct();
            
    $this->import('BackendUser''User');
        }

        
    /**
         * Dynamically add flags to the "singleSRC" field
         *
         * @param mixed         $varValue
         * @param DataContainer $dc
         *
         * @return mixed
         */
        
    public function setSingleSrcFlags($varValueDataContainer $dc)
        {
            if(
    $dc->activeRecord)
            {
                
    // Content-Element temporär ändern
                
    if($dc->activeRecord->type == 'adressen')
                {
                    
    $GLOBALS['TL_DCA']['tl_content']['fields']['singleSRC']['eval']['mandatory'] = false;
                    
    $GLOBALS['TL_DCA']['tl_content']['fields']['singleSRC']['eval']['tl_class'] = 'w50';
                    
    $GLOBALS['TL_DCA']['tl_content']['fields']['singleSRC']['eval']['extensions'] = Config::get('validImageTypes');
                    
    $GLOBALS['TL_DCA']['tl_content']['fields']['singleSRC']['label'] = &$GLOBALS['TL_LANG']['tl_content']['adresse_singleSRC'];
                }
            }

            return 
    $varValue;
        }

        
    /**
         * Funktion editAdresse
         * @param \DataContainer
         * @return string
         */
        
    public function editAdresse(DataContainer $dc)
        {

            if(
    $dc->value 1)
            {
                return 
    '';
            }

            
    $title sprintf($GLOBALS['TL_LANG']['tl_content']['editalias'], $dc->value);

            return 
    ' <a href="contao/main.php?do=adressen&amp;table=tl_adressen&amp;act=edit&amp;id=' $dc->value '&amp;popup=1&amp;&amp;rt=' REQUEST_TOKEN '" title="' StringUtil::specialchars($title) . '" onclick="Backend.openModalIframe({\'title\':\'' StringUtil::specialchars(str_replace("'""\\'"$title)) . '\',\'url\':this.href});return false">' Image::getHtml('alias.svg'$title) . '</a>';
            
        } 
        
        public function 
    getAdressenTemplates()
        {
            return 
    $this->getTemplateGroup('ce_adressen_');
        } 

        public function 
    getAdressenListe(DataContainer $dc)
        {
            
    $array = array();
            
    $objAdresse $this->Database->prepare("SELECT * FROM tl_adressen ORDER BY nachname ASC, vorname ASC")->execute();
            while(
    $objAdresse->next())
            {
                
    // Aktivstatus der Adresse ermitteln
                
    $aktivstatus $objAdresse->aktiv '' $GLOBALS['TL_LANG']['tl_content']['adresse_nichtaktiv'];
                
    // Adresse zuordnen
                
    $array[$objAdresse->id] = $objAdresse->nachname $objAdresse->nachname.','.$objAdresse->vorname.$aktivstatus '(Firma) '.$objAdresse->firma.$aktivstatus;

            }
            return 
    $array;

        }

        public function 
    getMails(DataContainer $dc)
        {
            
    //print_r($dc);
            
    $array = array();
            
    $objAdresse $this->Database->prepare("SELECT * FROM tl_adressen WHERE id = ?")
                                         ->
    execute($dc->activeRecord->adresse_id);

            
    $objAdresse->email1 $array[1] = $objAdresse->email1 '';
            
    $objAdresse->email2 $array[2] = $objAdresse->email2 '';
            
    $objAdresse->email3 $array[3] = $objAdresse->email3 '';
            
    $objAdresse->email4 $array[4] = $objAdresse->email4 '';
            
    $objAdresse->email5 $array[5] = $objAdresse->email5 '';
            
    $objAdresse->email6 $array[6] = $objAdresse->email6 '';

            return 
    $array;

        }

        public function 
    getThumbnail(DataContainer $dc)
        {

            if(
    $dc->activeRecord->adresse_id)
            {
                
    $objAdresse $this->Database->prepare("SELECT * FROM tl_adressen WHERE id=?")->execute($dc->activeRecord->adresse_id);

                
    // Bild extrahieren
                
    if($objAdresse->singleSRC)
                {
                    
    $objFile = \FilesModel::findByPk($objAdresse->singleSRC);
                }
                else
                {
                    
    $objFile = \FilesModel::findByUuid($GLOBALS['TL_CONFIG']['adressen_defaultImage']);
                }
                
    $objBild = new \stdClass();
                \
    Controller::addImageToTemplate($objBild, array('singleSRC' => $objFile->path'size' => unserialize($GLOBALS['TL_CONFIG']['adressen_ImageSize'])), \Config::get('maxImageWidth'), null$objFile);

                
    $strBild '<img src="'.$objBild->src.'" alt="'.$objBild->alt.'" title="'.$objBild->imageTitle.'" '.$objBild->imgSize.'>';

                return 
    '
    <div class="w50 clr widget">
      <h3><label>'
    .$GLOBALS['TL_LANG']['tl_content']['adresse_bildvorschau'][0].'</label></h3>
      '
    .$strBild.'
      <p class="tl_help tl_tip" title="">'
    .$GLOBALS['TL_LANG']['tl_content']['adresse_bildvorschau'][1].'</p>
    </div>'
    ;

            }
            else return 
    '';
        }

    }
    Wie ich gerade sehe ist die extra Funktion natürlich überflüssig.
    Viele Grüße
    Frank

    Seit Mai 2013 Fan von Contao
    Webmaster vom Deutschen Schachbund und Berliner Schachverband
    Mein Blog: Schachbulle
    Meine Erweiterungen bei GitHub
    Meine Videos auf YouTube: Playlist zur Contao-Programmierung/Einrichtung

  6. #6
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.059
    Partner-ID
    10107

    Standard

    Ok, also diese "Adressentemplates" sind gar keine Inhaltselement Templates, sondern eigentlich Element-Templates, die von deinem Inhaltselement benutzt werden. Typischerweise fangen diese nicht unbedingt mit "ce_" an, sondern würden bspw. address_default, address_list etc. heißen (siehe zB die Nachrichtentemplates).

    Die Templates an sich dürfen aber nicht nur im Theme Unterordner existieren, sondern müssen sich auch im generellen Template Ordner befinden. Idealerweise unter contao/templates/ (und unter templates/ bzw. templates/<theme>/ gibst du dann nur mehr die Templates, die vom überschrieben werden müssen).

  7. #7
    Contao-Urgestein Avatar von Samson1964
    Registriert seit
    05.11.2012.
    Ort
    Berlin
    Beiträge
    2.794

    Standard

    D.h. konkret "ce_" ist als Prefix in eigenen Inhaltselementen nicht erlaubt bzw. sorgt für Probleme?
    Viele Grüße
    Frank

    Seit Mai 2013 Fan von Contao
    Webmaster vom Deutschen Schachbund und Berliner Schachverband
    Mein Blog: Schachbulle
    Meine Erweiterungen bei GitHub
    Meine Videos auf YouTube: Playlist zur Contao-Programmierung/Einrichtung

  8. #8
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.059
    Partner-ID
    10107

    Standard

    Zitat Zitat von Samson1964 Beitrag anzeigen
    D.h. konkret "ce_" ist als Prefix in eigenen Inhaltselementen nicht erlaubt bzw. sorgt für Probleme?
    Nein, die Templates von Inhaltselementen haben, by default, immer den Prefix ce_<type>

    Das Template des Inhaltselements wird aber in tl_content.customTpl abgespeichert. Dir geht es ja aber um ein eigenes Feld, worum es sich vermutlich um ein Element Template innerhalb des Inhaltselementes handelt?

  9. #9
    Contao-Urgestein Avatar von Samson1964
    Registriert seit
    05.11.2012.
    Ort
    Berlin
    Beiträge
    2.794

    Standard

    Okay, jetzt habe ich verstanden. (Oder auch nicht.)

    Das ce_ das Standardprefix ist, habe ich noch nie mitbekommen. Selbst wenn ich adresse_ als Prefix genommen habe, stand nie ce_adresse_ später in der Datenbank.

    Ich müßte also mein Template auch in customTpl speichern. Contao durchsucht also Unterordner nur, wenn das Template in customTpl steht. Steht es in einem anderen Template-Feld, werden Unterordner nicht durchsucht. Benenne ich mein Template aber mit dem Prefix adresse_ o.ä. werden Unterordner wiederum durchsucht. Egal in welchem Feld der Templatename steht.
    Ich dachte, die Funktion FrontendTemplate macht da keinen Unterschied, aus welchem Feld der Templatename kommt.

    Ich werde mal ein paar Varianten ausprobieren, um das Geheimnis endgültig zu lüften.
    Viele Grüße
    Frank

    Seit Mai 2013 Fan von Contao
    Webmaster vom Deutschen Schachbund und Berliner Schachverband
    Mein Blog: Schachbulle
    Meine Erweiterungen bei GitHub
    Meine Videos auf YouTube: Playlist zur Contao-Programmierung/Einrichtung

  10. #10
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.059
    Partner-ID
    10107

    Standard

    Zitat Zitat von Samson1964 Beitrag anzeigen
    Das ce_ das Standardprefix ist, habe ich noch nie mitbekommen. Selbst wenn ich adresse_ als Prefix genommen habe, stand nie ce_adresse_ später in der Datenbank.
    Für Inhaltselementtemplates ist das der Standard. Du kannst natürlich deinem Inhaltselement auch ein eigenes Standard Template mit angeben.



    Zitat Zitat von Samson1964 Beitrag anzeigen
    Ich müßte also mein Template auch in customTpl speichern.
    Du musst selbst gar nichts machen. Wenn du customTpl in der Palette deines Inhaltselementes eingefügt hast, dann macht Contao alles für dich (je nach dem müsstest du evt. noch den Code deines Inhaltselementes ändern).



    Zitat Zitat von Samson1964 Beitrag anzeigen
    Contao durchsucht also Unterordner nur, wenn das Template in customTpl steht. Steht es in einem anderen Template-Feld, werden Unterordner nicht durchsucht.
    Nein, das ist irrelevant. Die Funktionen Controller::getTemplateGroup und FrontendTemplate::__construct() nutzen auch Theme Ordner.



    Zitat Zitat von Samson1964 Beitrag anzeigen
    Benenne ich mein Template aber mit dem Prefix adresse_ o.ä. werden Unterordner wiederum durchsucht. Egal in welchem Feld der Templatename steht.
    Ich dachte, die Funktion FrontendTemplate macht da keinen Unterschied, aus welchem Feld der Templatename kommt.

    Ich werde mal ein paar Varianten ausprobieren, um das Geheimnis endgültig zu lüften.
    Ich glaube eher, dass es hier ein Misverständnis gibt. Du müsstest mal den Code deines Inhaltselementes posten, um zu verstehen, was genau du überhaupt machst.

  11. #11
    Contao-Urgestein Avatar von Samson1964
    Registriert seit
    05.11.2012.
    Ort
    Berlin
    Beiträge
    2.794

    Standard

    Eine Frage habe ich noch.
    Wie funktioniert die automatische Zuordnung, wenn customTpl verwendet wird?

    Ich vermute: Contao kennt ja den Template-Ordner des Bundles und sucht dort nach "ce_adressen".
    Ich habe ein paar Tests gemacht:
    • "ce_adressen (Standard)" wird immer als Auswahl angezeigt, auch wenn es ce_adressen nicht gibt. Das wird manchmal bemängelt (could not find template), manchmal aber auch nicht.
    • Das Template ce_adressen_gustav wird angezeigt, ce_adressengustav aber nicht
    • Das Template ce_gustav wird nicht angezeigt, woher weiß Contao das mit "adressen"?
    • Andere Templates ohne Prefix ce_ werden nicht angezeigt
    Viele Grüße
    Frank

    Seit Mai 2013 Fan von Contao
    Webmaster vom Deutschen Schachbund und Berliner Schachverband
    Mein Blog: Schachbulle
    Meine Erweiterungen bei GitHub
    Meine Videos auf YouTube: Playlist zur Contao-Programmierung/Einrichtung

  12. #12
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.059
    Partner-ID
    10107

    Standard

    Die Konvention ist folgende:

    • Das Basistemplate heißt ce_<type>, sofern nicht anders angegeben1. Wenn der Typ deines Inhaltselmentes bspw. adressen ist, dann lautet der automatisch erwartete Name des Basistemplates ce_adressen.
    • Custom Templates müssen das Format <base>_* haben, also Name des Basistemplates, dann Underscore, dann ein beliebiger Name. Wenn der Name deines Basistemplates bspw. ce_adressen ist, dann kann ein Custom Template bspw. ce_adressen_foo heißen.


    1 Der Name des Basis Templates kann überschrieben werden. In den veralteten Inhaltselementen bspw. mit der Property $strTemplate der Inhaltselementklasse, in den neuen Inhaltselementen mit dem Attribut template im Service Tag bzw. in der Annotation.
    » sponsor me via GitHub or PayPal or Revolut

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
  •