Ergebnis 1 bis 9 von 9

Thema: Bilder-Generierung in eigenem Helper

  1. #1
    Contao-Fan Avatar von rezico
    Registriert seit
    04.01.2011.
    Ort
    Nürnberg
    Beiträge
    451

    Standard Bilder-Generierung in eigenem Helper

    Hallo zusammen,
    ich habe mir damals in Contao 4 einen eigenen Helper geschrieben um die Bildergenerierung für meine Templates zu vereinheitlichen...
    diesen habe ich bereits etwas angepasst und nun geht es nur noch um die Bildergenerierung mit Hilfe eines $size Arrays das auch bereits existiert:

    PHP-Code:
    <?php

    namespace VSM_HelperFunctions;

    use 
    Contao\FilesModel;
    use 
    Contao\System;
    use 
    Contao\StringUtil;
    use 
    Contao\Image\ResizeConfiguration;
    use 
    Contao\Image\PictureConfiguration;
    use 
    Contao\Image\PictureConfigurationItem;
    use 
    Contao\Image\ImageFactory;

    class 
    ImageHelper
    {
        public static function 
    generateImageHTML($imageSource$altText ''$headline ''$size null$class ''$inSlider false$lazy true)
        {
            
    $imageObject FilesModel::findByUuid($imageSource);

            
    $imageFactory System::getContainer()->get('contao.image.factory');
            
    $globalLanguage System::getContainer()->getParameter('kernel.default_locale');

            
    $currentLanguage $GLOBALS['TL_LANGUAGE'] ?? $globalLanguage;

            if (
    $imageObject) {
                
    $imageMeta StringUtil::deserialize($imageObject->metatrue);
                
    $meta $imageMeta[$currentLanguage] ?? reset($imageMeta) ?? [];
            }


            
    // Bildgrößenkonfiguration definieren
            
    $config = new ResizeConfiguration();
            if (
    $size && is_array($size) && count($size) === 3) {
                [
    $width$height$mode] = $size;
                
    $config->setWidth($width)
                    ->
    setHeight($height)
                    ->
    setMode($mode);
            }

            
    $imageSrc $imageObject->path;
            

            
    // Alt und Titel von Metadaten oder alternativ Text verwenden; Headline als Fallback für den Titel
            
    $alt $meta['alt'] ?: ($meta['title'] ?: ($headline ?: ''));
            
    $title $meta['title'] ?: ($headline ?: $altText);
            
    $link $meta['link'] ?: '';
            
    $caption $meta['caption'] ?: '';

            
    // Verwendet die Standardgröße [null, null, null], wenn $size null ist
            
    $sizeParams $size ?: [nullnullnull];

            
    // Erstellung des HTML-Links, falls vorhanden
            
    $linkStart $link '<a href="' htmlspecialchars($link) . '" title="' htmlspecialchars($title) . '">' '';
            
    $linkEnd $link '</a>' '';

            
    // Hinzufügen der Klasse, falls vorhanden
            // Erstellung des Bild-HTML-Codes
            
    if ($lazy) {
                if (
    $inSlider) {
                    
    $classAttribute $class ' class=" ' htmlspecialchars($class) . '"' ' class=""';
                    
    $imageHTML $linkStart '<div class="swiper-lazy-preloader"></div><img' $classAttribute ' loading="lazy" src="' $imageSrc '" alt="' htmlspecialchars($alt) . '" title="' htmlspecialchars($title) . '">' $linkEnd;
                } else {
                    
    $classAttribute $class ' class="lazy ' htmlspecialchars($class) . '"' ' class="lazy"';
                    
    $imageHTML $linkStart '<img' $classAttribute ' loading="lazy" data-src="' $imageSrc '" alt="' htmlspecialchars($alt) . '" title="' htmlspecialchars($title) . '">' $linkEnd;
                }
            } else {
                if (
    $inSlider) {
                    
    $classAttribute $class ' class=" ' htmlspecialchars($class) . '"' ' class=""';
                    
    $imageHTML $linkStart '<img' $classAttribute '  src="' $imageSrc '" alt="' htmlspecialchars($alt) . '" title="' htmlspecialchars($title) . '">' $linkEnd;
                } else {
                    
    $classAttribute $class ' class=" ' htmlspecialchars($class) . '"' ' ';
                    
    $imageHTML $linkStart '<img' $classAttribute ' src="' $imageSrc '" alt="' htmlspecialchars($alt) . '" title="' htmlspecialchars($title) . '">' $linkEnd;
                }

            }


            
    // Hinzufügen der Bildunterschrift, falls vorhanden
            
    if ($caption) {
                
    $imageHTML .= '<figcaption class="mt-1 text-muted fs-6">' htmlspecialchars($caption) . '</figcaption>';
            }

            return 
    $imageHTML;
        }
    }
    Ich probiere jetzt schon seit einigen Stunden aber ich komme einfach nicht weiter...

    Ich möchte innerhalb von $imageSrc den Bildpfad eines generierten Bildes nutzen.

    Wie geht das in Contao 5.3 ?
    Ich möchte nicht den FigureBuilder o. ä. nutzen, ich möchte einfach nur den Bildpfad eines Bildes.

    DANKE und schönes Wochenende!

    Liebe Grüße,

    Christian

    PS: Das ist übrigens der Bildaufruf im Template (Rocksolid Custom Elements-Element)
    PHP-Code:
     <?= VSM_HelperFunctions\ImageHelper::generateImageHTML($datanull$this->headline$this->sizenulltrue); ?>
    $data ist in diesem Fall die UUID des Bildes.
    Geändert von rezico (26.04.2024 um 16:12 Uhr)
    Contao ist schon was Feines...

  2. #2
    Contao-Urgestein Avatar von do_while
    Registriert seit
    15.06.2009.
    Ort
    Berlin | Deutschland
    Beiträge
    3.614
    Partner-ID
    1081
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Die Bilder werden erst erstellt, wenn sie zur Anzeige abgerufen werden.
    Wenn Du das Bild vorher benötigst, kannst Du es vorab mit
    PHP-Code:
    (new File$src ))->createIfDeferred(); 
    erstellen lassen.

  3. #3
    Contao-Fan Avatar von rezico
    Registriert seit
    04.01.2011.
    Ort
    Nürnberg
    Beiträge
    451

    Standard

    Lieben Dank dir erst einmal für die Rückmeldung
    Ich bin aber ganz ehrlich, keine Ahnung was ich jetzt an meinem Code oben anpassen soll :-)

    Evtl. kannst du ja etwas konkretisieren was zu tun ist.

    DANKE!
    Contao ist schon was Feines...

  4. #4
    Contao-Fan Avatar von rezico
    Registriert seit
    04.01.2011.
    Ort
    Nürnberg
    Beiträge
    451

    Standard

    Ich hab es hinbekommen... was für ein Act.

    PHP-Code:
    <?php

    namespace VSM_HelperFunctions;

    use 
    Contao\FilesModel;
    use 
    Contao\System;
    use 
    Contao\StringUtil;
    use 
    Contao\Image\ResizeConfiguration;


    class 
    ImageHelper
    {
        public static function 
    generateImageHTML($imageSource$altText ''$headline ''$size null$class ''$inSlider false$colorBox false$lazy true)
        {
            
    $imageObject FilesModel::findByUuid($imageSource);
            
    $originalSrc $imageObject->path;
            
    $rootDir System::getContainer()->getParameter('kernel.project_dir');
            
    $globalLanguage System::getContainer()->getParameter('kernel.default_locale');
            
    $imageFactory System::getContainer()->get('contao.image.factory');

            
    $currentLanguage $GLOBALS['TL_LANGUAGE'] ?? $globalLanguage;

            if (
    $imageObject) {
                
    $imageMeta StringUtil::deserialize($imageObject->metatrue);
                
    $meta $imageMeta[$currentLanguage] ?? reset($imageMeta) ?? [];
            }


            
    // Bildgrößenkonfiguration definieren
            
    $config = new ResizeConfiguration();
            if (
    $size && is_array($size) && count($size) === 3) {
                [
    $width$height$mode] = $size;
                
    $config->setWidth($width)
                    ->
    setHeight($height)
                    ->
    setMode($mode);
            }

            
    $relativeImagePath $imageObject->path;

            
    $absoluteImagePath $rootDir '/' $relativeImagePath;


            try {
                
    $processedImage $imageFactory->create($absoluteImagePath$config);
                
    $imageSrc $processedImage->getPath();
            } catch (\
    Exception $e) {
                echo 
    "Fehler beim Bearbeiten des Bildes: " $e->getMessage();
            }


            
    $imageSrc str_replace($rootDir""$imageSrc);

            
    // Alt und Titel von Metadaten oder alternativ Text verwenden; Headline als Fallback für den Titel
            
    $alt $meta['alt'] ?? $meta['title'] ?? $altText ?? $headline ?? '';
            
    $title $headline ?? $meta['title'] ?? $meta['alt'] ?? $altText ?? '';
            
    $link $meta['link'] ?: '';
            
    $caption $meta['caption'] ?: '';

            
    // Verwendet die Standardgröße [null, null, null], wenn $size null ist
            
    $sizeParams $size ?: [nullnullnull];

            
    // Erstellung des HTML-Links, falls vorhanden
            
    $linkStart $link '<a href="' htmlspecialchars($link) . '" title="' htmlspecialchars($title) . '">' '';
            
    $linkEnd $link '</a>' '';

            
    // Hinzufügen der Klasse, falls vorhanden
            // Erstellung des Bild-HTML-Codes

            
    if (!empty($colorBox)) {
                
    $linkStart '<a href="' htmlspecialchars($originalSrc) . '" class="group_' htmlspecialchars($colorBox) . ' bts-cboxElement cboxElement">';
                
    $linkEnd '</a>';
            } else {
                
    $linkStart '';
                
    $linkEnd '';
            }

            if (
    $lazy) {
                if (
    $inSlider) {
                    
    $classAttribute $class ' class="' htmlspecialchars($class) . '"' ' class=""';
                    
    $imageHTML $linkStart '<div class="swiper-lazy-preloader"></div><img' $classAttribute ' loading="lazy" src="' htmlspecialchars($imageSrc) . '" alt="' htmlspecialchars($alt) . '" title="' htmlspecialchars($title) . '">' $linkEnd;
                } else {
                    
    $classAttribute $class ' class="lazy ' htmlspecialchars($class) . '"' ' class="lazy"';
                    
    $imageHTML $linkStart '<img' $classAttribute ' loading="lazy" data-src="' htmlspecialchars($imageSrc) . '" alt="' htmlspecialchars($alt) . '" title="' htmlspecialchars($title) . '">' $linkEnd;
                }
            } else {
                if (
    $inSlider) {
                    
    $classAttribute $class ' class="' htmlspecialchars($class) . '"' ' class=""';
                    
    $imageHTML $linkStart '<img' $classAttribute ' src="' htmlspecialchars($imageSrc) . '" alt="' htmlspecialchars($alt) . '" title="' htmlspecialchars($title) . '">' $linkEnd;
                } else {
                    
    $classAttribute $class ' class="' htmlspecialchars($class) . '"' ' ';
                    
    $imageHTML $linkStart '<img' $classAttribute ' src="' htmlspecialchars($imageSrc) . '" alt="' htmlspecialchars($alt) . '" title="' htmlspecialchars($title) . '">' $linkEnd;
                }
            }


            
    // Hinzufügen der Bildunterschrift, falls vorhanden
            
    if ($caption) {
                
    $imageHTML .= '<figcaption class="">' htmlspecialchars($caption) . '</figcaption>';
            }

            return 
    $imageHTML;
        }
    }
    Geändert von rezico (26.04.2024 um 18:45 Uhr)
    Contao ist schon was Feines...

  5. #5
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.178
    Partner-ID
    10107

    Standard

    Wozu genau brauchst du das alles überhaupt?
    » sponsor me via GitHub or PayPal or Revolut

  6. #6
    Contao-Fan Avatar von rezico
    Registriert seit
    04.01.2011.
    Ort
    Nürnberg
    Beiträge
    451

    Standard

    Ich habe mittler weile über 25 eigene Custom-Elements in denen ich ein paar Dinge wie die Ausgabe von Buttons, Headlines und eben auch Bilder standardisiert habe. Dafür habe ich mir die 3 Helper gebaut.
    Selbst der FigureBuilder hilft mir nur bedingt und ist im Template dann zu komplex wenn ich diese ganzen Parameter und Optionen haben möchte. Beispielsweise auch die Übergabe des Alt-Texts / Titles bzw. dann die Nutzung der Metadaten der Datei, Verwendung des Links in den Meta-Daten der Datei bzw. der Metadaten generell, Lazyloading, Nutzung innerhalb eines Sliders usw.

    Daher hatte ich mir das damals zusammengebaut und konnte so die jeweiligen Elemente mit nur einer Zeile Code in die Templates integrieren, außerdem habe ich so natürlich die Möglichkeit die Helper um weitere Funktionen zu erweitern falls ich möchte.

    Das hat bei der Migration nach Contao 5 auch alles soweit funktioniert nur bei der Generierung von Bildern bin ich einfach nicht dahinter gestiegen.
    Contao ist schon was Feines...

  7. #7
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.178
    Partner-ID
    10107

    Standard

    Zitat Zitat von rezico Beitrag anzeigen
    Beispielsweise auch die Übergabe des Alt-Texts / Titles bzw. dann die Nutzung der Metadaten der Datei, Verwendung des Links in den Meta-Daten der Datei bzw. der Metadaten generell, Lazyloading, Nutzung innerhalb eines Sliders usw.
    Das macht Contao ja alles schon von Haus aus, daher die Frage warum genau du die eigene Lösung brauchst.
    » sponsor me via GitHub or PayPal or Revolut

  8. #8
    Contao-Fan Avatar von rezico
    Registriert seit
    04.01.2011.
    Ort
    Nürnberg
    Beiträge
    451

    Standard

    Also ich lasse mich gerne vom Gegenteil überzeugen, aber mir ist keine Möglichkeit bekannt das mit Contao-Hausmitteln zu bewerkstelligen:

    PHP-Code:
    <?php

    namespace VSM_HelperFunctions;

    use 
    Contao\FilesModel;
    use 
    Contao\System;
    use 
    Contao\StringUtil;
    use 
    Contao\Image\ResizeConfiguration;


    class 
    ImageHelper
    {
        public static function 
    generateImageHTML($imageSource$altText ''$headline ''$size null$class ''$inSlider false$colorBox false$lazy true)
        {
            
    $imageObject FilesModel::findByUuid($imageSource);
            
    $originalSrc $imageObject->path;
            
    $rootDir System::getContainer()->getParameter('kernel.project_dir');
            
    $globalLanguage System::getContainer()->getParameter('kernel.default_locale');
            
    $imageFactory System::getContainer()->get('contao.image.factory');

            
    $currentLanguage $GLOBALS['TL_LANGUAGE'] ?? $globalLanguage;

            if (
    $imageObject) {
                
    $imageMeta StringUtil::deserialize($imageObject->metatrue);
                
    $meta $imageMeta[$currentLanguage] ?? reset($imageMeta) ?? [];
            }


            
    // Bildgrößenkonfiguration definieren
            
    $config = new ResizeConfiguration();
            if (
    $size && is_array($size) && count($size) === 3) {
                [
    $width$height$mode] = $size;
                
    $config->setWidth($width)
                    ->
    setHeight($height)
                    ->
    setMode($mode);
            }

            
    $relativeImagePath $imageObject->path;
            
    $absoluteImagePath $rootDir '/' $relativeImagePath;


            try {
                
    $processedImage $imageFactory->create($absoluteImagePath$config);
                
    $imageSrc $processedImage->getPath();
            } catch (\
    Exception $e) {
                echo 
    "Fehler beim Bearbeiten des Bildes: " $e->getMessage();
            }

            
    $imageSrc str_replace($rootDir""$imageSrc);
            
    $alt $meta['alt'] ?? $meta['title'] ?? $altText ?? $headline ?? '';
            
    $title $headline ?: $meta['title'] ?: $meta['alt'] ?: $altText ?: '';
            
    $link $meta['link'] ?: '';
            
    $caption $meta['caption'] ?: '';

            
    // Verwendet die Standardgröße [null, null, null], wenn $size null ist
            
    $sizeParams $size ?: [nullnullnull];

            
    // Hinzufügen der Klasse, falls vorhanden
            // Erstellung des Bild-HTML-Codes
            
    if (!empty($colorBox)) {
                
    $linkStart '<a title="' $title '" data-gall="group_' htmlspecialchars($colorBox) . '" href="' htmlspecialchars($originalSrc) . '" class="lightbox_' htmlspecialchars($colorBox) . '">';
                
    $linkEnd '</a>';
            } else {
                if (!empty(
    $link)) {
                    
    // Erstellung des HTML-Links, falls vorhanden
                    
    $linkStart $link '<a href="' htmlspecialchars($link) . '" title="' htmlspecialchars($title) . '">' '';
                    
    $linkEnd $link '</a>' '';
                } else {
                    
    $linkStart '';
                    
    $linkEnd '';
                }
            }

            if (
    $lazy) {
                if (
    $inSlider) {
                    
    $classAttribute $class ' class="' htmlspecialchars($class) . '"' ' class=""';
                    
    $imageHTML $linkStart '<div class="swiper-lazy-preloader"></div><img' $classAttribute ' loading="lazy" src="' htmlspecialchars($imageSrc) . '" alt="' htmlspecialchars($alt) . '" title="' htmlspecialchars($title) . '">' $linkEnd;
                } else {
                    
    $classAttribute $class ' class="lazy ' htmlspecialchars($class) . '"' ' class="lazy"';
                    
    $imageHTML $linkStart '<img' $classAttribute ' loading="lazy" data-src="' htmlspecialchars($imageSrc) . '" alt="' htmlspecialchars($alt) . '" title="' htmlspecialchars($title) . '">' $linkEnd;
                }
            } else {
                if (
    $inSlider) {
                    
    $classAttribute $class ' class="' htmlspecialchars($class) . '"' ' class=""';
                    
    $imageHTML $linkStart '<img' $classAttribute ' src="' htmlspecialchars($imageSrc) . '" alt="' htmlspecialchars($alt) . '" title="' htmlspecialchars($title) . '">' $linkEnd;
                } else {
                    
    $classAttribute $class ' class="' htmlspecialchars($class) . '"' ' ';
                    
    $imageHTML $linkStart '<img' $classAttribute ' src="' htmlspecialchars($imageSrc) . '" alt="' htmlspecialchars($alt) . '" title="' htmlspecialchars($title) . '">' $linkEnd;
                }
            }

            
    // Hinzufügen der Bildunterschrift, falls vorhanden
            
    if ($caption) {
                
    $imageHTML .= '<figcaption class="">' htmlspecialchars($caption) . '</figcaption>';
            }

            return 
    $imageHTML;
        }
    }


    Und im Template

    PHP-Code:
     <?= VSM_HelperFunctions\ImageHelper::generateImageHTML($data$this->headlinestrip_tags($data->slide_text), $this->sizenulltrue$rand); ?>
    Falls das selbe mit Contao und Hausmitteln in dieser kurzen Form (innerhalb des Templates) möglich ist, schieß los :-) Je weniger Ballast desto besser.

    Danke und nice weekend!
    Contao ist schon was Feines...

  9. #9
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.178
    Partner-ID
    10107

    Standard

    Das ist zu viel Code um herauszulesen, was genau du benötigst. Es ist denke ich einfacher zu beschreiben, was dir bei den bestehenden Lösungen fehlt.
    » sponsor me via GitHub or PayPal or Revolut

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 2 (Registrierte Benutzer: 0, Gäste: 2)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •