Liebes Forum,
ich brauche eure Hilfe. Ich doktore hier gefühlt seit Tagen daran herum endlich mal ein eigenes Content Element nach der im Titel angegebenen Vorgehensweise zu erstellen.
Ich habe mich an der Anleitung https://docs.contao.org/dev/framework/content-elements/ orientiert, wobei ich es in meinem Fall als eigenes Bundle angelegt habe. Aber das ist glaube ich nicht die Ursache meines Problems.
Soweit ich das beurteilen kann bin ich glaube ich schon recht weit gekommen. Sprich: Die Dependency Injection funktioniert, services.yml wird verarbeitet, ich kann das Element im Backend anlegen, die Benennung aus der Sprachdatei wird korrekt verwendet, DCA Definition erscheint wie gewünscht. Nur beim Aufruf einer Seite im Frontend auf der ich das Element platziert habe, bekomme ich dann immer folgende Fehlermeldung:
Code:
The controller for URI "/notizen.html" is not callable. Method "getResponse" on class "Arno1979\GridBreak\ContentElement\GridBreak" should be public and non-abstract.
Zum besseren Verständnis hier mal der relevante Code:
#src/Resources/config/services.yml
PHP-Code:
services:
_instanceof:
Contao\CoreBundle\Framework\FrameworkAwareInterface:
calls:
- ["setFramework", ["@contao.framework"]]
Symfony\Component\DependencyInjection\ContainerAwareInterface:
calls:
- ["setContainer", ["@service_container"]]
arno1979.gridbreak.ce.gridbreak:
class: Arno1979\GridBreak\ContentElement\GridBreak
tags:
-
name: contao.content_element
category: texts
method: getResponse
type: ce_grid_break
#src/ContentElement/GridBreak.php
PHP-Code:
<?php
namespace Arno1979\GridBreak\ContentElement;
use Contao\ContentModel;
use Contao\CoreBundle\Controller\ContentElement\AbstractContentElementController;
use Contao\CoreBundle\ServiceAnnotation\ContentElement;
use Contao\Template;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
class GridBreak extends AbstractContentElementController
{
protected function getResponse(Template $template, ContentModel $model, Request $request): ?Response
{
return $template->getResponse();
}
}
Die Ausgabe von
Code:
vendor/bin/contao-console debug:container grid
ergibt folgendes:
PHP-Code:
Information for Service "arno1979.gridbreak.ce.gridbreak"
=========================================================
---------------- ------------------------------------------------------------------------------------
Option Value
---------------- ------------------------------------------------------------------------------------
Service ID arno1979.gridbreak.ce.gridbreak
Class Arno1979\GridBreak\ContentElement\GridBreak
Tags contao.content_element (category: texts, method: getResponse, type: ce_grid_break)
Calls setFragmentOptions
Public yes
Synthetic no
Lazy no
Shared yes
Abstract no
Autowired no
Autoconfigured no
---------------- ------------------------------------------------------------------------------------
Ich bin für jede Hilfe dankbar. Mir fehlt glaube ich einfach noch der Durchblick bei der ganzen Symfony Services Geschichte. Ist einfach so anders als es früher war und die dahinter liegende Logik erschließt sich mir einfach nicht vollständig. Mir ist z.B. überhaupt nicht klar nach welchem Muster die Service ID in der services.yml vergeben werden sollte und ob das überhaupt notwendig ist. Ich habe auch Beispiele gesehen in denen für die Angabe der tags Parameter einfach der Klassenname unter Berücksichtigung des Namespaces verwendet wurde. Der class Parameter fiel dann einfach weg. Die Variante habe ich übrigens natürlich auch probiert, aber das führt zum exakt gleichen Ergebnis.
Cache ist übrigens immer brav geleert worden, bzw. ich arbeite eh mit dem Debug Modus.
Danke!
Arno
Lesezeichen