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 php Code.

Der 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 die Klasse zu benutzen muss ein neues item in der di.xml angelegt 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>