Baigudin Software avatar
Baigudin Software logo
home
ru region
en region

PHP DOM Builder API 2.0

BOOS Core представлено для ARM микропроцессоров Texas Instruments семейства AM18x

Проект Baigudin Software представил операционное ядро BOOS Core для ARM микропроцессоров семейства AM18x компании Texas Instruments.

Копирование элементов DOM

До сих пор мы говорили о поиске с целью добавления новых узлов либо изменения их свойств, но иногда возникает потребность в их копировании. Возьмем всё тот же пример, только уберём второй блок с классом «article» и попробуем его воссоздать на основе первого блока.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru">
  <head>
    <title>PHP DOM Builder test page</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
  </head>
  <body>
    <div id="content">
      <h1>
        Заголовок
      </h1>
      <div class="article" id="id_article">
        <h2>
          Статья 1
        </h2>
        <p>
          <a href="google.com">Текст 1</a>
        </p>
      </div>
      <!-- Это то, что мы хотим получить
      <div class="article print">
        <h2>
          <a href="/article/">Статья 2</a>
        </h2>
        <p>
          <a href="baigudin.software">Текст 2</a>
        </p>
      </div>
      -->

    </div>
    <div id="footer">
      <p>
        &copy; copyright 2016
      </p>
    </div>
  </body>
</html>

Прежде чем приступить к копированию, хотелось отметить, как базовые принципы PHP, так и DOM, применительно к нашей библиотеке.

Мы уже говорили о том, что любой HTML документ может быть представлен в виде дерева, узлами которого являются теги. В нашем случае этими узлами являются классы Element. Вызывая метод create, мы создаём корневой узел, т.ё. узел, не привязанный к дереву документа. Вызывая любой метод поиска, мы получаем классы, которые имеют соединения с соседними узлами, т.е. привязаны к дереву.

Как нам известно, классы в PHPпередаются по ссылке, т.е. выбрав узел из дерева, мы получаем не класс, а ссылку на него. Все методы создания новых узлов могут принимать в качестве аргумента не только строковые значения, но и классы ElementNode или ElementList, а точнее ссылки на них. Получив такой класс, библиотека проверяет наличие его привязки к какому-либо дереву и, если она есть, клонирует этот класс и все его дочерние узлы. Таким образом, она получает точную копию переданной ей ветки. Затем эта ветка добавляется в соответствующее место дерева.

Но все классы, в рамках дерева, имеют определённый набор свойств, которые влияют на вывод HTML документа. Мы говорим об атрибутах тегов. Чтобы документ был валиден, определённые значения этих атрибутов должны быть уникальны, например «id» или «name». При клонировании классов библиотека не учитывает такие моменты, и вы вполне можете получить документ с двумя одинаковыми значениями каких-либо атрибутов.

А теперь постараемся всё это учесть и скопировать ветку, начиная с узла DIV, у которого id=id_article:

<?php
// Находим предмет копирования
$div $document->getElementById('id_article');
// Добавляем узел в дерево и получаем его копию
$div $div->after($div);
// Модифицируем атрибуты тега DIV
$div->removeAttr('id')->addClass('print');
// Изменяем тег H2
$div->find('h2')->insert('a')->href('/article/')->html('Статья 2');
// Изменяем тег P
$div->find('p a')->href('baigudin.software')->html('Текст 2');
?>

Что получится в результате выполнения этого кода, думаем, вы сможете оценить сами. А нам, в заключении этой статьи, хотелось бы сказать об удаление узлов. Узел может быть удален вызовом у него метода remove, который отвязывает узел от дерева и возвращает его. Таким образом, вы получаете удалённый узел как корневой, со всей его веткой.

К предыдущей статье

К списку статей

К следующей статье