2017-01-02 2 views
0

Я пытаюсь установить nodeValue элемента, как это:PHP DOMNode nodeValue > & л выпуск

$element->nodeValue = get_include_contents(DIR_APP . Config::getParam("layout_dir").$itemTemplateFilePath); 

get_include_contents функция возвращает HTML, который выглядит следующим образом:

<li>Person <b>{{ $name }}</b> is <span>{{ $age }}</span> years old. <a href="" data-id="{{ $id }}" data-event="Event: 'onclick', Action: 'deleteThePerson'">X</a></li> 

Проблема заключается в том, что < и> заменяется на &lt; и &gt;. Как это исправить? Как установить внутренний html элемента, который содержит другой html?

ответ

0

Если вы хотите добавить html к дереву DOM, вам следует использовать appendChild, а не способ nodeValue.

Проблема в том, что вам нужно сначала создать DON Node.

Вот трюк о том, как это сделать:

// This will be the original doc we work on. 
$doc1 = new DOMDocument(); 
$doc1->loadHTML("<html><body><p></p></body></html>"); 


$element = $doc1->getElementsByTagName('p')[0]; 

// Here is the trick - we create a new document 
$doc2 = new DOMDocument(); 
$s = '<li>Person <b>{{ $name }}</b> is <span>{{ $age }}</span> years old. <a href="" data-id="{{ $id }}" data-event="Event: \'onclick\', Action: \'deleteThePerson\'">X</a></li>'; 
// and load the html we need into that document 
$doc2->loadHTML($s); 

// Now we can append the node from `doc2` into `doc1` 
$element->appendChild($doc1->importNode($doc2->getElementsByTagName('li')[0], true)); 

echo $doc1->saveHTML(); 

Важно, что вы должны помнить, что вы должны использовать метод importNode для того, чтобы переместить что node из doc2 в doc1. Только после импорта этого узла вы можете использовать функцию appendChild.

Выходной сигнал в приведенном выше примере будет:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> 
<html><body><p><li>Person <b>{{ $name }}</b> is <span>{{ $age }}</span> years old. <a href="" data-id="{{ $id }}" data-event="Event: 'onclick', Action: 'deleteThePerson'">X</a></li></p></body></html> 
+0

он говорит: 'АРГУМЕНТ 1 ПЕРЕДАННЫЕ DOMNode :: AppendChild() должен быть экземпляром DOMNode, булевы GIVEN' – durisvk

+0

, когда я сделайте это 'public static function setInnerHTML (\ DOMDocument $ dom, \ DOMNode & $ element, $ html_string) { $ dom2 = new \ DOMDocument(); $ dom2-> loadHTML ($ html_string); $ element-> appendChild ($ dom-> importNode ($ dom2-> firstChild)); } ' – durisvk

+0

Я почти уверен, что вы должны использовать' & $ dom', а также узел второй параметр метода importNode. – Dekel