Gibt es etwas, woran ich mich orientieren kann?
Im Prinzip möchte ich ja "nur" alle Elemente, die ich im Backend dann ausgefüllt habe, ausgeben.
Naja, sieh dir das ContentText Element des Cores zB an. Oder etwas anderes einfaches.
Hast du vielleicht noch eine Idee zur Wildcard?
Ich könnte nocheinmal etwas Hilfe gebrauchen.
Ich bin gerade, nach einer etwas längeren Pause, wieder an meiner Erweiterung dran.
Allerdings scheint die Klasse für das ContentElement nicht richtig geladen zu werden. Bisher bin ich auf den Fehler leider noch nicht gestoßen.
Könnt ihr mir hier evtl. weiterhelfen?
Meine ContentElement Klasse sieht aktuell so aus (liegt in "/src/TestBundle/ContentElement/ProductList.php"):
In der config lade ich das ganze wie folgt (liegt in "/src/TestBundle/Resources/contao/config/config.php")PHP-Code:
<?php
namespace TestBundle\ContentElement;
class ProductList extends \ContentElement {
/**
* Template
* @var string
*/
protected $strTemplate = 'ce_productlist';
/**
* Generate the content element
*/
protected function compile() {
if (TL_MODE == 'BE') {
$this->genBeOutput();
} else {
$this->genFeOutput();
}
}
private function genBeOutput(){
$this->strTemplate = 'be_wildcard';
$this->Template = new \BackendTemplate($this->strTemplate);
$this->Template->title = $this->headline;
$this->Template->wildcard = "### ContentProduct ###";
}
private function genFeOutput(){
if ($this->productproperties != '') {
$this->Template->arrProperties = deserialize($this->productproperties, true);
}
}
}
class_alias(ProductList::class, 'ProductList');
Den entsprechenden Eintrag habe ich im DCA vorgenommen. Das ganze wird auch im Backend angezeigt. Allerdings wird das Template, welches ich erstellt habe (in "/src/TestBundle/Resources/contao/templates/elements/ce_productlist.html5"), nicht geladen bzw. nicht im ContentElement angezeigt und auch die Wildcard wird nicht angezeigt. Ich habe den Eindruck, dass die ContentElement-Klasse garnicht erst geladen wird.PHP-Code:
<?php
// Content Elements
$GLOBALS['TL_CTE']['texts']['ProductList'] = \TestBundle\ContentElement\ProductList::class;
?>
Seht ihr hier einen Fehler meinerseits?
Wie sieht die Composer Autoload-Definition aus?
Contao Core-Entwickler @terminal42 gmbh
Wir sind Contao Premium-Partner!
Für Individuallösungen kannst du uns gerne kontaktieren.
PS: Heute schon getrakked?
Der Autoload sieht bei mir folgendermaßen aus:
Die Integration des DCA usw. funktioniert problemlos, nur eben wird scheinbar die ContentElement-Klasse nicht geladenCode:"autoload": { "psr-4": { "": "src/" } }
Naja, wenn du schreibst, dass das Inhaltselement im Backend verfügbar ist, wird es auch geladen
Das Inhaltselement wird ja auch richtig durch die config geladen.
Aber die ContentElement.php scheint keinerlei auswirkungen zu haben.
Das Template wird nicht zugeordnet und auch die Wildcard funktioniert beispielsweise nicht
Der Code dazu steht bei Dir in der compile(). Gehört das nicht in die generate()?
Contao-Community-Treff Bayern: http://www.contao-bayern.de
Das hatte ich zuvor auch in der generate, ich hatte teilweise auch varianten mit der compile gesehen. Leider beides mit dem selben Ergebnis.
Was ergibt denn ein?PHP-Code:
class_exists(\TestBundle\ContentElement\ProductList::class);
Müsste ja false sein, wenn sie wirklich nicht geladen wird, was auf eine falsche Autoload-Definition oder ein fehlendes "composer dump-autoload" hinweisen würde.
Contao Core-Entwickler @terminal42 gmbh
Wir sind Contao Premium-Partner!
Für Individuallösungen kannst du uns gerne kontaktieren.
PS: Heute schon getrakked?
Soweit ich ihn verstehe wurde die Klasse geladen und er konnte das Inhaltselement auch anlegen - nur die Ausgabe funktioniert nicht.
Richtig, das Inhaltselement kann ich anlegen und speichern.
Mir wird im Inhaltselement in der Templateauswahl jedoch das in der ContentElement.php zugeordnete Template 'ce_productlist' nicht in der Auswahl angezeigt.
Die Wildcard wurde ebenfalls nicht angezeigt.
Ich weiß zwar nicht, was genau ich jetzt anders gemacht habe, aber die Wildcard wird jetzt korrekt angezeigt.
Also wird die ContentElement-Klasse ja nun definitiv geladen.
Aber wieso erscheint das Template nicht in der Auswahl?
Das ist jetzt die aktuelle ContentElement-Datei:
PHP-Code:
<?php
namespace TestBundle\ContentElement;
class ProductList extends \ContentElement {
/**
* Template
* @var string
*/
protected $strTemplate = 'ce_productlist';
/**
* Generate the content element
*/
protected function compile() {
if (TL_MODE == 'BE') {
$this->genBeOutput();
} else {
$this->genFeOutput();
}
}
private function genBeOutput(){
$this->strTemplate = 'be_wildcard';
$this->Template = new \BackendTemplate($this->strTemplate);
$this->Template->title = $this->headline;
$this->Template->wildcard = "### ContentProduct ###";
}
private function genFeOutput(){
if ($this->productproperties != '') {
$this->Template->arrProperties = deserialize($this->productproperties, true);
}
}
}
class_alias(ProductList::class, 'ProductList');
Geändert von waldo (15.05.2019 um 10:08 Uhr)
generate() ist falsch, denke ich, zumindest so wie du das jetzt hast. In generate() musst du einen String zurückgeben.
Stimmt, musste es gerade auf compile() ändern, bei der generate hatte er auch gemeckert.
Aber das Templateproblem bleibt
Ich denke das Problem ist, dass dugeschrieben hast, stattPHP-Code:
$GLOBALS['TL_CTE']['texts']['ProductList']
PHP-Code:
$GLOBALS['TL_CTE']['texts']['productlist']
Das wars leider nicht, damit läd er dann die ganze Klasse nicht mehr.
Was meinst du damit?
Poste mal den gesamten Code.
Damit habe ich das gleiche Problem wie anfangs, dass weder die Wildcard angezeigt wird, noch das Template.
Meine ContentElement-Klasse sieht nun so aus (gleiche es gerade etwas daran an, wie ich es im Contao Core finde):
/src/TestBundle/ContentElement/ProductList.php
Die config sieht bei mir insgesamt so aus:PHP-Code:
<?php
namespace TestBundle\ContentElement;
class ProductList extends \ContentElement {
/**
* Template
* @var string
*/
protected $strTemplate = 'ce_productlist';
/**
* Generate the content element
*/
public function generate() {
if (TL_MODE == 'BE') {
$this->genBeOutput();
} else {
$this->genFeOutput();
}
return parent::generate();
}
private function genBeOutput(){
// $this->strTemplate = 'be_wildcard';
$this->Template = new \BackendTemplate($this->strTemplate);
$this->Template->title = $this->headline;
$this->Template->wildcard = "### ContentProduct ##";
return $this->Template->parse();
}
private function genFeOutput(){
if ($this->productproperties != '') {
$this->Template->arrProperties = deserialize($this->productproperties, true);
}
}
protected function compile(){
}
}
class_alias(ProductList::class, 'ProductList');
/src/TestBundle/Resources/contao/config/config.php
Der DCA für das ContentElement:PHP-Code:
<?php
// Content Elements
$GLOBALS['TL_CTE']['texts']['ProductList'] = \TestBundle\ContentElement\ProductList::class;
// Backend Modules
array_insert($GLOBALS['BE_MOD'],1,array(
'test' => array(
'products' => array(
'tables' => array('tl_testproducts')//,
),
'categories' => array(
'tables' => array('tl_testcategories')
)
)
));
// Models
$GLOBALS['TL_MODELS']['tl_testproducts'] = 'ProductModel';
$GLOBALS['TL_MODELS']['tl_testcategories'] = 'CategoryModel';
/src/TestBundle/Resources/contao/dca/tl_content.php
PHP-Code:
<?php
// Palettes
$GLOBALS['TL_DCA']['tl_content']['palettes']['ProductList'] = '{type_legend},type,headline;{template_legend:hide},customTpl;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID;{invisible_legend:hide},invisible,start,stop';
Und die Template-Datei (erstmal nur irgendwo her kopiert, konnte dies ja noch nicht testen):
/src/TestBundle/Resources/contao/templates/ce_productlist.html5
PHP-Code:
<?php $this->extend('block_searchable'); ?>
<?php $this->block('content'); ?>
Hello World
<?php $this->endblock(); ?>
Ansonsten die BundleDatei:
/src/TestBundle/TestBundle.php
Und die ContaoManagerPlugin Datei:PHP-Code:
<?php
use Symfony\Component\HttpKernel\Bundle\Bundle;
class TestBundle extends Bundle
{
}
/src/ContaoManagerPlugin.php
PHP-Code:
<?php
use Contao\ManagerPlugin\Bundle\Config\BundleConfig;
use Contao\ManagerPlugin\Bundle\BundlePluginInterface;
use Contao\ManagerPlugin\Bundle\Parser\ParserInterface;
use Contao\CoreBundle\ContaoCoreBundle;
class ContaoManagerPlugin implements BundlePluginInterface
{
public function getBundles(ParserInterface $parser)
{
return [
BundleConfig::create(TestBundle::class)->setLoadAfter([ContaoCoreBundle::class]
)
];
}
}
Mir fällt gerade auf, dass das "Hello World" aus dem Template in meiner Wildcard angezeigt wird...
Was ist denn da passiert ?
Wie gesagt, ich denke du musst&PHP-Code:
$GLOBALS['TL_CTE']['texts']['productlist']
verwenden.PHP-Code:
$GLOBALS['TL_DCA']['tl_content']['palettes']['productlist']
Wenn dein Template ce_productlist lautet, dann muss auch der Typ des Inhaltselements productlist lauten. Wenn der Typ des Inhaltselements productlist lautet, muss auch die Palette productlist lauten.
Diese Klassenvariable hat aber nichts mit der Liste an verfügbaren Templates zu tun. Dafür zieht Contao den Typ des Inhaltselementes heran. Der Lautet bei dir momentan noch ProductList statt productlist. Du könntest dein Template aber auch umgekehrt einfach zu ce_ProductList umbenennen, wäre aber nicht die Norm.
Die Contao 4 Norm wären übrigens camel cases . Also ce_productList und productList. Ist aber auch mehr oder weniger Geschmackssache.
Ich muss mich korrigieren!
Musste in der ContentElement-Klasse das ganze im class_alias noch korrigieren dann funktioniert es so, wie du gesagt hast.
Vielen Dank!
Habe es auch direkt mal auf die Camel Cases geändert. Wenn ich gerade schon dabei bin mich in die Thematik einzuarbeiten, dann kann ich es ja auch richtig machen
Kannst du mir vielleicht einen Tipp geben wie von hier aus die nächsten Schritte wären?
Konkret habe ich noch einen fertigen DCA über die ich verschiedene Produkte mit Bildern und Zusatzinformationen anlegen kann. Der ist soweit auch schon fertig.
Über das jetzt erstellte ContentElement möchte ich gerne quasi meinen gesamten Inhalt aus dem DCA ausgeben.
Wie müsste ich prinzipiell hier denn vorgehen? Arbeite ich hier dann mit der genFeOutput() in der ContentElement-Klasse?
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
Lesezeichen