dom node — Как преобразовать HTML-строку в DOMNode, чтобы использовать DOMNode :: insertBefore в PHP?

В моем проекте PHP я использую DOMDocument, чтобы получить вид, подобный этому:

Метод объекта страницы

protected function html_page_template(){
wp_debug_log();
$htmlTmpl = new \DOMDocument;
$html = '<div class="wrap">';
$html .= $this->writeTopPage();
$html .= "<hr/>";
$html .= "</div>";
$htmlTmpl->loadXML($html);
$this->current_template->write( $htmlTmpl );
echo $htmlTmpl->saveXML();
}

В шаблоне объекта ( $this->current_template ), У меня есть write способ получить содержимое страницы. Также полезно модифицировать уже введенный HTML-код.

Метод объекта шаблона

public function write(&$htmlTmpl)
{

//Link "Options advanced"$link_advanced_options = $htmlTmpl->createElement("a", esc_html( __( "Avanced Options", PLUGIN_DOMAIN ) ) );
$linkOptionsHrefAttribute = $htmlTmpl->createAttribute("href");
$linkOptionsHrefAttribute->value = "#";
$linkOptionsClassAttribute = $htmlTmpl->createAttribute("class");
$linkOptionsClassAttribute->value = "options-advanced-link";
$link_advanced_options->appendChild($linkOptionsHrefAttribute);
$link_advanced_options->appendChild($linkOptionsClassAttribute);
$htmlTmpl->importNode($link_advanced_options, true);

//Section "Options advanced
$section_advanced_options = $htmlTmpl->createElement( "section" );
$sectionOptionsClassAttribute = $htmlTmpl->createAttribute("class");
$sectionOptionsClassAttribute->value = "options-advanced-section";
$section_advanced_options->appendChild($sectionOptionsClassAttribute);

//Input "From Date"$inp_element = $htmlTmpl->createElement( "input" );
$inpTypeAttribute = $htmlTmpl->createAttribute("type");
$inpTypeAttribute->value = "date";
$inpValueAttribute = $htmlTmpl->createAttribute("value");
$inpValueAttribute->value = "2018-06-25";
$inp_element->appendChild($inpTypeAttribute);
$inp_element->appendChild($inpValueAttribute);

//Button "Download foos"$btn_element = $htmlTmpl->createElement("a", "Download foos" );
$btnClassAttribute = $htmlTmpl->createAttribute("class");
$btnClassAttribute->value = "add-new-h2 h4a-button";
$btnHrefAttribute = $htmlTmpl->createAttribute("href");
$admin_build_url = "myexample.com?run=foo";
$btnHrefAttribute->value = $admin_build_url;
$btn_element->appendChild($btnClassAttribute);
$btn_element->appendChild($btnHrefAttribute);
$section_advanced_options->appendChild($btn_element);
$section_advanced_options->appendChild($inp_element);

$nodeLine = $htmlTmpl->getElementsByTagName("hr")->item(0);
$parentNode = $htmlTmpl->getElementsByTagName("div")->item(0);
$parentNode->insertBefore( $section_advanced_options, $nodeLine );
$parentNode->insertBefore( $link_advanced_options, $section_advanced_options );

}

Для большего удобства я хотел бы написать код для вставки в виде HTML-строки и преобразования его в DomNode для использования $ parentNode-> insertBefore ().
Как я могу это сделать ?

0

Решение

Решение си использовать createdocumentfragment как это :

Метод объекта шаблона

public function write(&$htmlTmpl)
{

$html_advanced_options = '<a href="#">My link</a>';
$html_advanced_options .= 'other html';
...

$tmpl_advanced_options = $htmlTmpl->createDocumentFragment();
$tmpl_advanced_options->appendXML( $html_advanced_options );

$nodeLine = $htmlTmpl->getElementsByTagName("hr")->item(0);
$parentNode = $htmlTmpl->getElementsByTagName("div")->item(0);
$parentNode->insertBefore( $section_advanced_options, $nodeLine );
$parentNode->insertBefore( $tmpl_advanced_options, $section_advanced_options );

}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]