AMP - php

У меня возникла проблема с AMP. Я использую amp-lightbox. По сути это модалка, с контентом, однако у меня в какой-то момент перестал работать скролл, если содержимое превышало его высоту.

Использовал я его таким образом

<amp-lightbox id="modal-popular" scrollable="1" layout="nodisplay">
<!-- <div on="tap:modal-popular.close" role="button" tabindex="0">-->
<div class="lightbox scrollable">
<?=CustomHelpers::ReplaceWithAmpUrl($this->renderPartial('//layouts/_popular-directions-inline', [], true));?>
</div>
</amp-lightbox>

Однако после того, как я делал

$amp->loadHtml($html);
$converted = $amp->convertToAmpHtml();

У меня пропадал scrollable атрибут. Я пытался напрямую выводить html и атрибут возвращался. Придётся лезть внутрь библиотеки. Просмотрев код, я понял, что в этой библиотеке есть несколько так называемых Pass, оформленных в виде классов. При генерации html кода эти пассы создаются в цикле и изменяют html для того, чтобы он стал валидным. Но почему то при проходе через amp-lightbox он как раз убирает атрибуты.

Что мы видим в файле AMP.php

foreach ($this->passes as $pass_name) {
$qp_branch = $qp->branch();

// Each of the $qp objects are pointing to the same DOMDocument
/** @var BasePass $pass */
$pass = (new $pass_name($qp_branch, $this->context, $this->validation_result, $this->grouped_validation_result, $this->parsed_rules, $this->options));

// Run the pass
$pass->pass();

$this->action_taken = array_merge($this->action_taken, $pass->getWarnings());

}

Ага.. чтобы определить какой именно пасс убирает аттрибут я сделал вставку сразу после $pass->pass();

$lb = $qp_branch->find('amp-lightbox');
if ($lb->attr('scrollable') !== '1') {
print '<pre>';
print_r('Вот этот pass: ' . $pass_name);
exit();
}

Следующий вывод я получил: Lullabot\AMP\Pass\StandardFixPass. Теперь понятно кто убирает мой любимый атрибут scrollable.

Условным break-point мы можем увидеть, что удаление scrollable происходит здесь


Смотрим выше и видим, что он в цикле проходится по $this->validation_result->errors, однако внутри себя он эти ошибке не генерирует, а они ему передаются в конструкторе. Таким образом становится понятно, что этот пасс здесь не при чём и надо искать другой класс на появление ошибки в validation_result.


Вот таким вот образом выглядит эта переменная внутри.

Делаем новую вставку, чтобы понять, откуда берётся ошибка

На выходе получаем Lullabot\AMP\Pass\StandardScanPass

Смотрим содержимое этого класса


Спустя минут 15 дебага по классам я пришёл в файл ParsedTagSpec.php


И вот оно то место, где атрибут не добавляется. После долгого изучения исходников я нашёл что есть некий validator-generated.php, в файле коричнево-серым по тёмному написано Generated by validator_gen_php.py - do not edit. Есть некий генератор validator_gen_php.py, а этот файл находится в репозитории. Можно ли добавить свой атрибут в исключение?

В общем по ходу я выснил, что атрибуты создаются при вызове конструктора главного класса AMP. Таким образом мне пришлось переопределить 3 класса


Тут просто вызываем опять же свой переопределённый класс


Внутри этого класса ещё раз вызываем ValidationRulesFactory, А там уже добавляем свой атрибут.


Если кто знает как это сделать быстрее, без форка, буду рад услышать. Таким образом атрибут больше не удаляется и я получил чуть больший контроль над библиотекой. По моему мнению нужно переделывать библиотеку, чтобы сделать её более управляемой и поддерживаемой. Сейчас это работает, а времени у меня осталось мало. Поэтому вот такой костыль =). Буду рад, если это кому-то поможет в Ваших исследованиях.