Ich habe ein Random-Image Contentelement erstellt. Die Dateistruktur entspricht dem Contao 4 skeleton bundle.
Der Controller sieht so aus:
PHP-Code:
namespace Test\RandomImageBundle\Controller;
use Contao\System;
use Contao\ContentModel;
use Contao\CoreBundle\Controller\ContentElement\AbstractContentElementController;
use Contao\CoreBundle\Filesystem\FilesystemUtil;
use Contao\CoreBundle\Filesystem\VirtualFilesystemInterface;
use Contao\CoreBundle\Image\Studio\Figure;
use Contao\CoreBundle\Image\Studio\Studio;
use Contao\CoreBundle\Twig\FragmentTemplate;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
class RandomImageController extends AbstractContentElementController
{
private VirtualFilesystemInterface $filesStorage;
private Studio $studio;
public function __construct(Studio $studio, VirtualFilesystemInterface $filesStorage)
{
$this->filesStorage = $filesStorage;
$this->studio = $studio;
}
protected function getResponse(FragmentTemplate $template, ContentModel $model, Request $request): Response
{
$isBackend = System::getContainer()
->get('contao.routing.scope_matcher')
->isBackendRequest(System::getContainer()->get('request_stack')->getCurrentRequest() ?? Request::create(''));
$filesystemItems = FilesystemUtil::listContentsFromSerialized($this->filesStorage, $model->multiSRC);
foreach($filesystemItems as $item) {
if ( preg_match( '/(png|jpg|jpeg|gif|tif|tiff|bmp)$/i', $item->getExtension() ) ){
$imageList[] = $item->getUuid();
}
}
if ( isset( $imageList ) ) {
$i = mt_rand(0, ( count( $imageList )-1 ) );
$figureBuilder = $this->studio
->createFigureBuilder()
->setSize($model->size)
->setLightboxGroupIdentifier('lb'.$model->id)
->enableLightbox($model->fullsize)
->setMetadata($model->getOverwriteMetadata());
;
$template->set('images', $figureBuilder->fromUuid($imageList[$i])->build());
}
$template->set('counter', $isBackend ? isset($i) ? 'Bild ' . $i+1 . ' von ' . count($imageList) : 'Kein Bild' : null );
return $template->getResponse();
}
}
Als Template benutze ich eine Kopie von image.html.twig mit einem zusätzlichen Element 'counter'
HTML-Code:
{% extends "@Contao/content_element/_base.html.twig" %}
{% use "@Contao/component/_figure.html.twig" %}
{% block content %}
{% if counter %} {{ counter }} {% endif %}
{% if images %}
{% with {figure: images} %}{{ block('figure_component') }}{% endwith %}
{% endif %}
{% endblock %}
Es funktioniert soweit eigentlich ganz ordentlich, d.h im Backend kann ich das neue Inhaltselement auswählen und es erzeugt auch Zufallsbilder.
Soweit ist alles gut, aber:
- Die unter Experteneinstellungen konfigurierten CSS-Klassen, werden nicht übernommen.
Der div-Container des Bildes enthält nur class="content-random_image"
- Wenn ich den Content Elementtyp z.B. von Zufallsbild nach Bild ändern möchte, kommt ein Internal Server Error
"Tried to list template options for the modern fragment type "content_element/random_image" but could not find any template."
- Im Debugmodus kommt immer die Fehlermeldung
"Too few arguments to function Test\RandomImageBundle\Controller\RandomImageContr oller::__construct(), 1 passed"
Irgendwas mache ich falsch, ich habe aber keine Ahnung, wo ich ansetzen müsste.
Lesezeichen