Ссылка на DOMNode больше не работает после добавления его к другому элементу дважды - PullRequest
0 голосов
/ 02 июня 2010

Я использую обертку вокруг DOMDocument класса PHP5 для генерации моего HTML. Это позволяет легко изменять HTML с помощью DOM.

Примером является создание элемента # 1 и добавление его к элементу # 2 и возможность изменения элемента № 1 напрямую.

Однако возникает проблема со следующим:

  • Элемент # 1 добавлен к элементу # 2
  • Элемент # 2 добавлен к элементу # 3
  • Элемент # 1 изменен, но в DOM элемента # 3 (который содержит # 1 и # 2) не видно никаких изменений

Упрощенный пример кода:

<?php
$doc1 = new DOMDocument();
$el1 = $doc1->createElement('h1', 'Hello');
$doc1->appendChild($el1);

$doc2 = new DOMDocument();
$el2 = $doc2->createElement('h2', 'World');
$doc2->appendChild($el2);

$doc3 = new DOMDocument();
$el3 = $doc3->createElement('h3', 'Today');
$doc3->appendChild($el3);

// Import el1 into el2
$el1 = $doc2->importNode($el1, true);
$el2->appendChild( $el1 );
$doc1 = $doc2;

// Import el2 into el3
$el2 = $doc3->importNode($el2, true);
$el3->appendChild($el2);
$doc2 = $doc3;

// Modify el1
$el1->nodeValue = "Boo"; // This doesn't work?
//$el2->nodeValue = "Boo"; // Changing element2 or 3 works...

// Display result
echo $doc3->saveHTML();
?>`

Изменение $ el2 все еще возможно, потому что оно глубоко скопировано и добавлено в DOM $ el3. Однако $ el1 по-прежнему указывает на DOM $ doc2 / $ el2, и любые изменения не отражаются в DOM $ el3.

Существуют ли какие-либо общие способы направить $ el1 на нужный узел в DOM $ el3?

1 Ответ

0 голосов
/ 02 июня 2010
$el2 = $doc3->importNode($el2, true);

Здесь вы делаете глубокую копию $ el2, т.е. вы также делаете копию $ e1, которую вы добавили к $ e2. Когда вы позже измените значение узла $ e1, это не повлияет на клон / глубокую копию $ e1.

...