Добавляем alt изображениям, у которых его нет (Revo)

alt является обязательным атрибутом тега img, поэтому его отсутствие негативно сказывается на валидности вашего HTML. При необходимости соответствовать требованиям валидатора, приходится как-то решать проблему отсутствия атрибута alt, например, в коде, который вставляет в контент манагер. Выкладываю небольшой плагин, добавляющий тегам IMG аттрибут alt (если последний отсутствует).

Создаем плагин, называем его как-нибудь, на закладке "Системные события" ставим галку напротив OnWebPagePrerender (MODX инициализирует это событие после того, как все теги обработаны и перед тем, как страница отправится в браузер.)

Код плагина:


<?php
if ($modx->event->name == 'OnWebPagePrerender') {
$output = &$modx->resource->_output; // получаем доступ к содержанию страницы
$dom = new DOMDocument;
$dom->loadHTML($output); // берём необходимый HTML
$xpath = new DOMXPath($dom); //инициируем XPath
$tags = $xpath->query('//img'); //ищем необходимый тег
foreach ($tags as $tag) {
    if (!$tag->hasAttribute('alt')) {
        $fn = end(explode("/",$tag->getAttribute("src" ))); //получаем имя файла
        $tag->setAttribute("alt", $fn); //записываем имя файла в alt
    }
}
$output = $dom->saveHTML();
}


Как вариант, можно добавлять пустой alt: $tag->setAttribute("alt", "");, но для разнообразия в данном примере в alt прописывается имя файла. Все, при открытии страницы в браузере, все теги img, у которых атрибут alt отсутствует, получат его в виде alt="имя_файла_картинки".

Upd 27.10.2017: Код для Evolution, для разнообразия без использования DOMDocument, на регулярках:

<?phpif ($modx->event->name == 'OnWebPagePrerender')
{
    $content = $modx->documentOutput;

    // Collect all img tags without alt on the page to $matches array
    preg_match_all(
        "/<img(?:[^>](?!(alt)=))*+>/i",
        $content,
        $matches
    );

    if (!empty($matches[0]))
    {
        foreach ($matches[0] as $key => $tag) {
            // Add alt="" attribute to the beginning of a img tag
            // and replace occurrences of old tag with new one
            $new_tag = preg_replace("/^<img/i", '<img alt=""', $tag);
            $content = str_replace($tag, $new_tag, $content);
        }

        // Set the new content to document output
        $modx->documentOutput = $content;
    }
}




Теги: Revolution, плагин, alt, img, OnWebPagePrerender, Evolution

Сообщение отправлено

Закрыть