Contao-Camp 2024
Ergebnis 1 bis 26 von 26

Thema: Seitentyp erweitern (z.B. Error 418)

  1. #1
    Contao-Nutzer Avatar von mae
    Registriert seit
    20.07.2011.
    Beiträge
    99

    Standard Seitentyp erweitern (z.B. Error 418)

    Wie kann ich die Contao-Seitentypen (type) mittels einer lokalen Extension (system/modules/meine_seitentypen) erweitern (z.B. Error 418) ?

  2. #2
    Contao-Urgestein
    Registriert seit
    07.04.2010.
    Ort
    Stuttgart
    Beiträge
    2.733
    User beschenken
    Wunschliste

    Standard

    Hallo mae,

    genau wie die Inhaltselemente nur dieses mal muss in die config/config.php das da rein
    PHP-Code:
    /**
     * Page types
     */
    $GLOBALS['TL_PTY'] = array
    (
        
    'regular'   => 'PageRegular',
        
    'forward'   => 'PageForward',
        
    'redirect'  => 'PageRedirect',
        
    'root'      => 'PageRoot',
        
    'error_403' => 'PageError403',
        
    'error_404' => 'PageError404'
    ); 
    Das sind jetzt die Seiten die im Core mitkommen. Nach dem Beispiel deine eigene hinzufügen.
    Also:
    PHP-Code:
    /**
     * Page types
     */
    $GLOBALS['TL_PTY'] = array
    (
        
    'deinSeitentyp'   => 'PageDeinSeitentyp',
    ); 
    Das Page im Klassennamen ist konvention, kann auch anderst heißen, ist aber besser du lässt das Page dran, das man sofort weiß um was es sich handelt.

  3. #3
    Contao-Nutzer Avatar von mae
    Registriert seit
    20.07.2011.
    Beiträge
    99

    Standard

    done ! danke, aber .. das ist doch wohl nicht alles ? wie konfiguriere ich jetzt die ansicht im backend ? (palettisierung).

    test.png

    ich verknüpfe gerade einer ios/android-app mit einem contao cms im hintergrund (http natürlich..) - hauptsächlich verwende ich dabei nicht vom IETF standartisierte statusmeldungen, die aber via eigenkonfiguration in nginx richtig weiterleiten (error180-190 usw).
    Geändert von mae (27.07.2011 um 10:03 Uhr)

  4. #4
    Contao-Nutzer Avatar von mae
    Registriert seit
    20.07.2011.
    Beiträge
    99

    Standard

    edit: habe den beitrag nochmals editiert, es geht mir vornehmlich nur um die "palettisierung" im backend.

  5. #5
    Contao-Nutzer Avatar von mae
    Registriert seit
    20.07.2011.
    Beiträge
    99

    Standard

    lösung: system/modules/backend/dca/tl_page.php

    PHP-Code:
    $GLOBALS['TL_DCA']['tl_page']['palettes']['error_418'] = '{title_legend},title,alias,type;{meta_legend},pageTitle,language,robots,description;{forward_legend:hide},autoforward;{layout_legend:hide},includeLayout;{cache_legend:hide},includeCache;{chmod_legend:hide},includeChmod;{expert_legend:hide},cssClass;{publish_legend},published,start,stop'

    (es war nicht TL_PTY sondern TL_DCA ... wieso auch immer... )

  6. #6
    Contao-Urgestein
    Registriert seit
    03.06.2010.
    Ort
    Wuppertal
    Beiträge
    2.149
    User beschenken
    Wunschliste

    Standard

    Hier stand ein völlig verwirrter Eintrag...
    Geändert von Flex (27.07.2011 um 18:42 Uhr)

  7. #7
    Contao-Urgestein Avatar von Toflar
    Registriert seit
    15.06.2009.
    Beiträge
    4.467
    Partner-ID
    8667
    User beschenken
    Wunschliste

    Standard

    • system
      • modules
        • my_pages
          • config
            • config.php (hier gehört die Erweiterung von TL_PTY rein, weil hier wird konfiguriert)
            • database.sql (hier gehören die DB-Felder rein, die man weiter benötigt. Also tl_page erweitern)

          • dca
            • tl_page.php (hier erweitert man das DCA, also die Darstellung der Daten)

          • MyPage.php (hier drin befindet sich der Code für deine Seite)






    Hat alles seine Logik. Nichts von "wieso auch immer"
    Contao Core-Entwickler @terminal42 gmbh
    Wir sind Contao Premium-Partner!
    Für Individuallösungen kannst du uns gerne kontaktieren.
    PS: Heute schon getrakked?

  8. #8
    Maintainer Avatar von xtra
    Registriert seit
    02.07.2009.
    Ort
    Tuebingen
    Beiträge
    2.007
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von psren Beitrag anzeigen
    PHP-Code:
    /**
     * Page types
     */
    $GLOBALS['TL_PTY'] = array
    (
        
    'deinSeitentyp'   => 'PageDeinSeitentyp',
    ); 
    Damit bygelst du aber dann alle existierenden Seitentypen weg...
    richtiger ist wohl:
    PHP-Code:
    /**
     * Page types
     */
    $GLOBALS['TL_PTY']['deinSeitentyp'] = 'PageDeinSeitentyp'
    Bedenke stets: Wenn Du ungenaue oder unzureichende Angaben machst, so koennte dies die Bearbeitung deiner Frage endlos verzoegern (oder sogar dazu fyhren, dass ich zu viel nachdenken muss und die Antwort vergesse!). Kein Support per PN.

  9. #9
    Contao-Nutzer
    Registriert seit
    11.08.2010.
    Beiträge
    113

    Standard

    Hallo zusammen,
    habe es nach dem Lesen dieses Threads ausprobiert, einen Seitentyp PageError410 zu erstellen. Ist soweit geglückt.

    Auf einem Server, auf dem bereits Avisota installiert war, gab es jedoch Probleme, da Avisota ebenfalls einen neuen Seitentyp definiert. Auch Avisota verwendet eine Datei tl_page im Verzeichnis dca, in der die originale Klasse tl_page modifiziert wird. Avisotas tl_page interferiert mit der tl_page, die ich für meinen Error410-Seitentyp angelegt habe. Nun suche ich nach einer update-sicheren Lösung, die eine Koexistenz meiner Seitentyp-Erweiterung mit Avisota zulässt. Ist aber kein dringendes Problem...

    MfG, Ulrike
    Geändert von Ulrike (02.08.2011 um 08:30 Uhr)

  10. #10
    Contao-Nutzer Avatar von mae
    Registriert seit
    20.07.2011.
    Beiträge
    99

    Standard

    noch eine frage: wieso generiert mir contao kein schönes icon (error_418.gif) im Backend ?
    Angehängte Grafiken Angehängte Grafiken

  11. #11
    Contao-Urgestein
    Registriert seit
    07.04.2010.
    Ort
    Stuttgart
    Beiträge
    2.733
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von xtra Beitrag anzeigen
    Damit bygelst du aber dann alle existierenden Seitentypen weg...
    richtiger ist wohl:
    PHP-Code:
    /**
     * Page types
     */
    $GLOBALS['TL_PTY']['deinSeitentyp'] = 'PageDeinSeitentyp'
    Danke für die Info. Mein Fehler.

  12. #12
    Contao-Nutzer
    Registriert seit
    11.08.2010.
    Beiträge
    113

    Standard

    Halllo,
    in system/modules/backend/dca/tl_page gibt es in der Klasse tl_page die Methode addIcon(). Darin wird dein neuer Seitentyp nicht berücksichtigt.

    Man kann diese addIcon()-Methode in der eigenen Erweiterung durch eine neue Methode überschreiben (in system/modules/(Verzeichnis der eigenen Erweiterung)/dca/tl_page, z. B. so:

    $GLOBALS['TL_DCA']['tl_page']['list']['label']['label_callback'] = array('tl_page_error_418', 'addIcon');

    Danach die eigene addIcon()-Methode in der Klasse tl_page_error_418 anlegen, das war's. Als Vorlage kann die originale addIcon()-Methode dienen.

    (Hier kommt's dann übrigens zu der schon weiter oben angesprochenen Kollision mit Avisota...)

    Gruß,
    Ulrike

  13. #13
    Contao-Nutzer Avatar von mae
    Registriert seit
    20.07.2011.
    Beiträge
    99

    Standard

    Zitat Zitat von Ulrike Beitrag anzeigen
    Halllo,
    in system/modules/backend/dca/tl_page gibt es in der Klasse tl_page die Methode addIcon(). Darin wird dein neuer Seitentyp nicht berücksichtigt.

    Man kann diese addIcon()-Methode in der eigenen Erweiterung durch eine neue Methode überschreiben (in system/modules/(Verzeichnis der eigenen Erweiterung)/dca/tl_page, z. B. so:

    $GLOBALS['TL_DCA']['tl_page']['list']['label']['label_callback'] = array('tl_page_error_418', 'addIcon');

    Danach die eigene addIcon()-Methode in der Klasse tl_page_error_418 anlegen, das war's. Als Vorlage kann die originale addIcon()-Methode dienen.

    (Hier kommt's dann übrigens zu der schon weiter oben angesprochenen Kollision mit Avisota...)

    Gruß,
    Ulrike

    Danke Ulrike ! Du hast bessere PHP-Kenntnisse als ich.

    Würde es Dir etwas ausmachen, Deine PageError410.php-Klasse zu posten ?

  14. #14
    Contao-Nutzer
    Registriert seit
    11.08.2010.
    Beiträge
    113

    Standard

    [entfernt, da anscheinend missverständlich]
    Geändert von Ulrike (02.08.2011 um 08:29 Uhr)

  15. #15
    Contao-Urgestein Avatar von Toflar
    Registriert seit
    15.06.2009.
    Beiträge
    4.467
    Partner-ID
    8667
    User beschenken
    Wunschliste

    Standard

    Nur mal so allgemein möchte ich loswerden, dass Leo sicher gerne den Core Code anpasst sofern man das Ticket begründet und ein Patch als Implementierungsvorschlag anhängt.
    Also anstatt sich zu beklagen wäre ein Lösungsvorschlag für eine zukünftige Version sicher wünschenswert.
    Contao Core-Entwickler @terminal42 gmbh
    Wir sind Contao Premium-Partner!
    Für Individuallösungen kannst du uns gerne kontaktieren.
    PS: Heute schon getrakked?

  16. #16
    Contao-Nutzer
    Registriert seit
    11.08.2010.
    Beiträge
    113

    Standard

    @ Toflar
    Die überempfindliche Reaktion ist mir unverständlich. Ich wollte nur dem Eröffner dieses Threads weiterhelfen und dabei sachlich die Grenzen des Codes aufzeigen, den ich als error_410.zip angehängt hatte. "Beklagen" hört sich m. E. anders an.
    Ich persönlich benötige keine weiteren Seitentypen, habe also gar keinen Grund, irgendwelche Veränderungen des Contao-Systems zu wünschen. Ich bitte daher höflich, mit entsprechenden Kommentaren etwas zurückhaltender zu sein.

    MfG
    Ulrike
    Geändert von Ulrike (02.08.2011 um 08:31 Uhr)

  17. #17
    Contao-Urgestein Avatar von Toflar
    Registriert seit
    15.06.2009.
    Beiträge
    4.467
    Partner-ID
    8667
    User beschenken
    Wunschliste

    Standard

    War auch in keinster Weise "überempfindlich" oder negativer Art gemeint...hab's nur so, ohne jegliche Wertung, in den Raum geworfen...als Hinweis
    Contao Core-Entwickler @terminal42 gmbh
    Wir sind Contao Premium-Partner!
    Für Individuallösungen kannst du uns gerne kontaktieren.
    PS: Heute schon getrakked?

  18. #18
    Contao-Nutzer Avatar von mae
    Registriert seit
    20.07.2011.
    Beiträge
    99

    Standard

    hallo allerseits!

    ich hab das jetzt nicht so ganz verstanden... ehmm.. widerspricht der anhang etwa den forenregeln (ich hab den beitrag nicht gesehen) O_o oder was ist los ?

    @ulrike: gerne auch per PM, wenn das regelkonform ist
    Geändert von mae (02.08.2011 um 10:56 Uhr)

  19. #19
    Contao Core-Team
    Association Vorstand
    Avatar von andreas.schempp
    Registriert seit
    15.06.2009.
    Ort
    Lyss
    Beiträge
    5.613
    Partner-ID
    8667
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Zitat Zitat von mae Beitrag anzeigen
    noch eine frage: wieso generiert mir contao kein schönes icon (error_418.gif) im Backend ?
    Du kannst auch einfach ein Icon mit dem Alias deines Seitentyps (mypage.gif) in den Ordner system/themes/default/images/ legen.
    terminal42 gmbh
    Wir sind Contao Premium-Partner! Für Modulwünsche oder Programmierungen kannst du uns gerne kontaktieren.
    Hilfe für Isotope eCommerce kann man auch kaufen: Isotope Circle

  20. #20
    Alter Contao-Hase
    Registriert seit
    02.10.2010.
    Ort
    58636 Iserlohn
    Beiträge
    1.084

    Standard

    Hallo,

    ich möchte eine Funktion überschreiben.
    Leider bekomme ich das nicht hin.

    PHP-Code:
    class MyPage extends tl_page
    {
        public function 
    addIcon($row$labelDataContainer $dc=null$imageAttribute=''$blnReturnImage=false$blnProtected=false)
        {
                    echo(
    ' HEUREKA ');
        }

    Die Klasse ist mit dem Autoload-Creator korrekt eingetragen.

    Eigentlich sollte im Seitenbaum so keine Icons und Seitennamen angezeigt werden und für jede Seite ein HEUREKA ausgegeben werden - dachte ich.
    Der Seitenbaum wird jedoch ganz normal angezeigt.

    Liegt es daran, dass die Klasse tl_page in einer DCA-Datei enthalten ist?

    Gruß
    Frank
    Meine Extensions: contentmodify, dca_editor

  21. #21
    Contao Core-Team
    Association Vorstand
    Avatar von andreas.schempp
    Registriert seit
    15.06.2009.
    Ort
    Lyss
    Beiträge
    5.613
    Partner-ID
    8667
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Es scheint mir du hast Objektorientierung noch nicht ganz verstanden. Nur weil du eine Klasse machst die von einer andere erbt, überschreibst du diese noch lange nicht.

    Im Contao DCA ist das label_callback zuständig für diese Anzeige. Schau dir ggf. meine Erweiterung cacheicon (https://github.com/aschempp/contao-cacheicon) an. Ist zwar nicht mehr aktuell für Contao 3, das Prinzip hat sich aber nicht geändert.
    terminal42 gmbh
    Wir sind Contao Premium-Partner! Für Modulwünsche oder Programmierungen kannst du uns gerne kontaktieren.
    Hilfe für Isotope eCommerce kann man auch kaufen: Isotope Circle

  22. #22
    Alter Contao-Hase
    Registriert seit
    02.10.2010.
    Ort
    58636 Iserlohn
    Beiträge
    1.084

    Standard

    Hallo Andreas,

    danke für den Hinweis.

    Meine erste Lösung war die mit '$GLOBALS['TL_DCA']['tl_page']['list']['label']['label_callback'] ...'.
    Sie funktionierte auch super und ist zudem noch sehr einfach.

    Meine Befürchtungen waren jedoch, dass dieser Eintrag (in anderen Erweiterungen) ggf. überschrieben werden kann.
    Da es kein Array ist (wie bei den Hooks), würde meine callback-Funktion nicht ausgeführt.

    Liege ich da falsch?

    Ich probiere es gleich einfach mal aus.

    Gruß
    Thoni
    Meine Extensions: contentmodify, dca_editor

  23. #23
    Contao Core-Team
    Association Vorstand
    Avatar von andreas.schempp
    Registriert seit
    15.06.2009.
    Ort
    Lyss
    Beiträge
    5.613
    Partner-ID
    8667
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Da liegst du genau richtig, aber leider lässt sich das nicht ändern
    terminal42 gmbh
    Wir sind Contao Premium-Partner! Für Modulwünsche oder Programmierungen kannst du uns gerne kontaktieren.
    Hilfe für Isotope eCommerce kann man auch kaufen: Isotope Circle

  24. #24
    Alter Contao-Hase
    Registriert seit
    02.10.2010.
    Ort
    58636 Iserlohn
    Beiträge
    1.084

    Standard

    Es ist so, wie ich vermutet hatte - wer zuletzt kommt gewinnt.

    Ich war einfach nur auf der Suche nach einer zuverlässigen Lösung.

    Auch wenn es dem OOP-Gedanken widerstrebt - ich suche halt manchmal auf Wegen, die aus Holz sind.

    Ich habe sogar schon versucht, die tl_page mit ClassLoader::addClasses zu registrieren - das brachte aber auch nichts.

    Muss ich das Risiko (überschreiben) eingehen, ohne meine Erweiterung 'zzzzz' zu nennen oder kann es einen Weg geben?

    Viele Grüße
    Thoni
    Meine Extensions: contentmodify, dca_editor

  25. #25
    Alter Contao-Hase
    Registriert seit
    02.10.2010.
    Ort
    58636 Iserlohn
    Beiträge
    1.084

    Standard

    Zitat Zitat von andreas.schempp Beitrag anzeigen
    Da liegst du genau richtig, aber leider lässt sich das nicht ändern
    Danke - unsere Posts haben sich überschnitten.
    Meine Extensions: contentmodify, dca_editor

  26. #26
    Contao-Nutzer
    Registriert seit
    19.05.2010.
    Beiträge
    170

    Standard

    Ich (kein PHP-Programmierer) würde auch gerne einen weiteren Seitentyp bereitstellen. Da bei diesem Seitentyp weitere Felder hinzugefügt werden, welche beim "regular" Seitentyp nicht vorhanden sein sollen.
    Der neue Seitentyp soll sich eigentlich nicht komplett vom regular unterscheiden bis eben auf die neuen (dca) Felder.

    Frage 1:
    Ist das überhaupt machbar?

    Bisheriger Stand:
    system/modules/mymodule/config/config.php
    Code:
    $GLOBALS['TL_PTY']['regularext'] = 'Contao\PageRegularext';
    system/modules/mymodule/pages/PageRegularext.php
    Kopie der PageRegular.php mit diesen Anpassungen:
    Zeile 23:
    Code:
    class PageRegularext extends Frontend
    Zeile 829:
    Code:
    '@type' => 'PageRegularext',
    Zeile: 850:
    Code:
    class_alias(PageRegularext::class, 'PageRegularext');
    system/modules/mymodule/dca/tl_page.php
    Code:
    $GLOBALS['TL_DCA']['tl_page']['palettes']['regularext'] = '{title_legend},title,alias,type;{meta_legend},pageTitle,robots,description,serpPreview;{protected_legend:hide},protected;{layout_legend:hide},includeLayout;{cache_legend:hide},includeCache;{chmod_legend:hide},includeChmod;{expert_legend:hide},cssClass,sitemap,hide,noSearch,guests,requireItem;{tabnav_legend:hide},tabindex,accesskey;{publish_legend},published,start,stop';
    
    $GLOBALS['TL_DCA']['tl_page']['config']['onsubmit_callback'] = array(
        array('tl_page', 'scheduleUpdate'),
        array('tl_page_regularext', 'generateArticle')
    );
    $GLOBALS['TL_DCA']['tl_page']['operations']['articles']['button_callback'] = array(
        'tl_page_regularext', 'editArticles'
    );
    
    /**
     * Provide miscellaneous methods that are used by the data configuration array.
     *
     * @author Leo Feyer <https://github.com/leofeyer>
     */
    class tl_page_regularext extends Contao\Backend
    {
        /**
         * Automatically create an article in the main column of a new page
         *
         * @param Contao\DataContainer $dc
         */
        public function generateArticle(Contao\DataContainer $dc)
        {
            // Return if there is no active record (override all)
            if (!$dc->activeRecord)
            {
                return;
            }
        
            // No title or not a regular page
            if ($dc->activeRecord->title == '' || !in_array($dc->activeRecord->type, array('regular', 'regularext', 'error_401', 'error_403', 'error_404')))
            {
                return;
            }
        
            /** @var Symfony\Component\HttpFoundation\Session\Attribute\AttributeBagInterface $objSessionBag */
            $objSessionBag = Contao\System::getContainer()->get('session')->getBag('contao_backend');
        
            $new_records = $objSessionBag->get('new_records');
        
            // Not a new page
            if (!$new_records || !is_array($new_records[$dc->table]) || !in_array($dc->id, $new_records[$dc->table]))
            {
                return;
            }
        
            // Check whether there are articles (e.g. on copied pages)
            $objTotal = $this->Database->prepare("SELECT COUNT(*) AS count FROM tl_article WHERE pid=?")
                                        ->execute($dc->id);
        
            if ($objTotal->count > 0)
            {
                return;
            }
        
            // Create article
            $arrSet['pid'] = $dc->id;
            $arrSet['sorting'] = 128;
            $arrSet['tstamp'] = time();
            $arrSet['author'] = $this->User->id;
            $arrSet['inColumn'] = 'main';
            $arrSet['title'] = $dc->activeRecord->title;
            $arrSet['alias'] = str_replace('/', '-', $dc->activeRecord->alias); // see #5168
            $arrSet['published'] = $dc->activeRecord->published;
        
            $this->Database->prepare("INSERT INTO tl_article %s")->set($arrSet)->execute();
        }
        
        /**
         * Generate an "edit articles" button and return it as string
         *
         * @param array  $row
         * @param string $href
         * @param string $label
         * @param string $title
         * @param string $icon
         *
         * @return string
         */
        public function editArticles($row, $href, $label, $title, $icon)
        {
            if (!$this->User->hasAccess('article', 'modules'))
            {
                return '';
            }
        
            return ($row['type'] == 'regular' || $row['type'] == 'regularext' || $row['type'] == 'error_401' || $row['type'] == 'error_403' || $row['type'] == 'error_404') ? '<a href="' . $this->addToUrl($href . '&amp;pn=' . $row['id']) . '" title="' . Contao\StringUtil::specialchars($title) . '">' . Contao\Image::getHtml($icon, $label) . '</a> ' : Contao\Image::getHtml(preg_replace('/\.svg$/i', '_.svg', $icon)) . ' ';
        }
    }
    Backend:
    Frage 2:
    Muss für das Backend noch was beachtet werden und wie wird das Icon für die preview (.svg) generiert?

    Frontend:
    Frage 3:
    Im Frontend bekomme ich aktuelle diese Error-Meldung:
    Code:
    Uncaught PHP Exception Symfony\Component\ErrorHandler\Error\ClassNotFoundError: "Attempted to load class "PageRegularext" from namespace "Contao".
    Über jede Art von Rückmeldung bin ich stets dankbar.

    -EDIT-
    Unvollständige Codeangaben
    Geändert von typomat (15.05.2020 um 09:45 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
  •