Modulanpassungen / -erweiterungen

How-To-Anleitungen, wie man das Modul erweitern kann.

Weitere Elemente vom Lazyload Modul ausschließen

Standardmäßig wird im Lazyload Modul, das Logo vom lazyloading ausgeschlossen. Wie dies funktioniert sieht man im folgenden Codebeispiel.

Die Klasse muss das Interface ExcludedElementsInterface implementieren.

Der zu implementierenden Funktion noLazyLoadElement wird der zu durchsuchende HTML-Code und ein Array mitgegeben, indem die Bilder abgespeichert sind.

In der Funktion wird dann zuerst mithilfe einer Regular-Expression geprüft, ob in dem HTML-Code ein Element der Klasse "logo" vorhanden ist. Ist dies der Fall, wird durch eine weitere Regular-Expression, das erste Bild in dem Element herausgesucht und aus dem mitgegebenen Array entfernt. Anschließend wird das Array wieder zurückgegeben.

<?php
/**
 * Copyright (c) 2020 TechDivision GmbH <info@techdivision.com> - TechDivision GmbH
 * All rights reserved
 *
 * This product includes proprietary software developed at TechDivision GmbH, Germany
 * For more information see https://www.techdivision.com/
 *
 * To obtain a valid license for using this software please contact us at
 * license@techdivision.com
 */
declare(strict_types=1);

namespace TechDivision\LazyLoad\Model;

use TechDivision\LazyLoad\Model\ImageTagParser\ImageReplacer;

/**
 * @copyright   Copyright (c) 2020 TechDivision GmbH (https://www.techdivision.com)
 * @site        https://www.techdivision.com/
 * @author     MET<met@techdivision.com>
 */
class ExcludeLogo implements ExcludedElementsInterface
{
    /**
     * @inheritDoc
     */
    public function noLazyLoadElement(string $html, array $elements): array
    {
        $removing = [];
        $regex = '/<a\s*\w*(class="logo")(?:[^<>]+)?>(?:(?!<\/a>).)*.*?<\/a>/s';
        if (false === preg_match_all($regex, $html, $elemMatches)) {
            return $elements;
        }

        $regex = '/\<img\s[^>]*?src\s*=\s*[\"]([^\"]*?)[\"][^>]*?>/';
        foreach ($elemMatches[0] as $eM) {
            if (false !== preg_match_all($regex, $eM, $matches)) {
                foreach ($matches[0] as $foundImage) {
                    $removing[] = $foundImage;
                }
            }
        }

        foreach (array_values($removing) as $toRemove) {
            foreach (array_values(array_keys($elements, $toRemove)) as $idxVal) {
                unset($elements[$idxVal]);
            }
        }
        return $elements;
    }
}

Um den Ausschluss des Elements (hier das Logo) auch im Rendering des HTML-Markups durchzuführen, muss die implementierte Klasse beim ImageSearcher als Item (Array-Item) registriert werden

    <type name="TechDivision\LazyLoad\Model\ImageTagParser\ImageSearcher">
        <arguments>
            <argument name="excludes" xsi:type="array">
                <item name="logo" xsi:type="object">TechDivision\LazyLoad\Model\ExcludeLogo</item>
                <item name="pageBuilderImages" xsi:type="object">TechDivision\LazyLoad\Model\ExcludePageBuilderImages</item>
            </argument>
        </arguments>
    </type>