私の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() を使用したいと考えています。これどうやってするの ?