Wie kann ich die Contao-Seitentypen (type) mittels einer lokalen Extension (system/modules/meine_seitentypen) 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) ?
Hallo mae,
genau wie die Inhaltselemente nur dieses mal muss in die config/config.php das da rein
Das sind jetzt die Seiten die im Core mitkommen. Nach dem Beispiel deine eigene hinzufügen.PHP-Code:
/**
* Page types
*/
$GLOBALS['TL_PTY'] = array
(
'regular' => 'PageRegular',
'forward' => 'PageForward',
'redirect' => 'PageRedirect',
'root' => 'PageRoot',
'error_403' => 'PageError403',
'error_404' => 'PageError404'
);
Also:
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.PHP-Code:
/**
* Page types
*/
$GLOBALS['TL_PTY'] = array
(
'deinSeitentyp' => 'PageDeinSeitentyp',
);
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)
edit: habe den beitrag nochmals editiert, es geht mir vornehmlich nur um die "palettisierung" im backend.
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... )
Hier stand ein völlig verwirrter Eintrag...
Geändert von Flex (27.07.2011 um 18:42 Uhr)
- 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?
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.
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)
noch eine frage: wieso generiert mir contao kein schönes icon (error_418.gif) im Backend ?
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
[entfernt, da anscheinend missverständlich]
Geändert von Ulrike (02.08.2011 um 08:29 Uhr)
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?
@ 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)
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?
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)
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
Hallo,
ich möchte eine Funktion überschreiben.
Leider bekomme ich das nicht hin.
Die Klasse ist mit dem Autoload-Creator korrekt eingetragen.PHP-Code:
class MyPage extends tl_page
{
public function addIcon($row, $label, DataContainer $dc=null, $imageAttribute='', $blnReturnImage=false, $blnProtected=false)
{
echo(' HEUREKA ');
}
}
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
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
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
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
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
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
system/modules/mymodule/pages/PageRegularext.phpCode:$GLOBALS['TL_PTY']['regularext'] = 'Contao\PageRegularext';
Kopie der PageRegular.php mit diesen Anpassungen:
Zeile 23:Zeile 829:Code:class PageRegularext extends FrontendZeile: 850:Code:'@type' => 'PageRegularext',system/modules/mymodule/dca/tl_page.phpCode:class_alias(PageRegularext::class, 'PageRegularext');
Backend: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 . '&pn=' . $row['id']) . '" title="' . Contao\StringUtil::specialchars($title) . '">' . Contao\Image::getHtml($icon, $label) . '</a> ' : Contao\Image::getHtml(preg_replace('/\.svg$/i', '_.svg', $icon)) . ' '; } }
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:
Über jede Art von Rückmeldung bin ich stets dankbar.Code:Uncaught PHP Exception Symfony\Component\ErrorHandler\Error\ClassNotFoundError: "Attempted to load class "PageRegularext" from namespace "Contao".
-EDIT-
Unvollständige Codeangaben
Geändert von typomat (15.05.2020 um 09:45 Uhr)
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)