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