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>