Может ли PHP включать работу только для определенной части файла?

У меня есть PHP, который вставляет html-форму в другую html-форму. Когда форма включена, я теперь имею два заголовка формы. Есть ли тег php, который я мог бы использовать, что позволило бы мне …

<form id="orderform"> <!-- <?php for the include FROM here?> --> PROD:<input class="ProductName" type="text" size="75">| Discount:<input class="Discount" type="text" size="3">| QTY:<input class="qty" type="text" size="6">| Line/Total:<input class="LineTotal" type="text" size="9" disabled> <!-- <?php for the include TO here?> --> </form> 

Таким образом, include будет входить в этот файл с формой в нем и получить указанный HTML?

Это возможно?

РЕДАКТИРОВАТЬ

 <?php $dom = new DOMDocument(); $html = 'phptest3.php'; $dom->loadHTMLFile($html); $div = $dom->getElementById("divtagid"); echo $div->nodeValue; ?> 

Это возвращает текст. Как получить элементы формы HTML в divtagid?

Вы должны лучше изучить php-функции для этого.

 <?php function form_tag_wrapper($form) { return '<form id="orderform">'. $form .'</form>'; } function form_contents() { return 'PROD:<input class="ProductName" type="text" size="75"> ... Line/Total:<input class="LineTotal" type="text" size="9" disabled>'; } ?> 

Вы будете использовать это как:

 $form = form_contents(); print form_tag_wrapper($form); 

Или, как oneliner:

 print form_tag_wrapper(form_contents()); 

Нет, нет альтернативного способа включить часть файла. Подумайте: как бы вы описали такую ​​функцию, где начинать и заканчивать включение? Как функция узнает, что вы хотите?

Как было предложено, наилучшим подходом было бы реорганизовать включенный файл. Если это не вариант (я не могу себе представить, почему этого не будет), другой маршрут – использовать переменные или константы во включенном файле для обозначения того, какие части должны выводиться. Что-то вроде этого:

 #File: form_template.php <?php if (!isset($include_form_header) || $include_form_header == true) { ?> <form id="orderform"> <?php } ?> PROD:<input class="ProductName" type="text" size="75">| Discount:<input class="Discount" type="text" size="3">| QTY:<input class="qty" type="text" size="6">| Line/Total:<input class="LineTotal" type="text" size="9" disabled> <?php if (!isset($include_form_header) || $include_form_header == true) { ?> </form> <?php } ?> 

Теперь, когда вы хотите остановить вывод заголовка формы:

 $include_form_header = false; include('form_template.php'); 

Это противно , ИМО. Когда кто-то другой (или будущее вы) редактирует form_template.php , это может быть form_template.php , когда или почему будет задано значение $include_form_header . Такая зависимость от переменных, объявленных во внешних файлах, может привести к коду спагетти.

Вы гораздо лучше строите отдельные шаблоны для разных целей (или непосредственно эхоимируя тривиальный вывод, например, одну строку html для открытия или закрытия формы), например:

 <?php #File: order_form_wrapper.php echo '<form id="orderform">'; ?> <?php #File: product_fields.php echo 'PROD:<input class="ProductName" type="text" size="75">'; echo 'Discount:<input class="Discount" type="text" size="3">'; echo 'QTY:<input class="qty" type="text" size="6">|'; echo 'Line/Total:<input class="LineTotal" type="text" size="9" disabled>'; ?> // form with wrapper include 'order_form_wrapper.php'; include 'product_fields.php'; echo '</form>'; // different form with wrapper include 'some_other_form_wrapper.php'; include 'product_fields.php'; include 'some_other_fields.php'; echo '</form>'; 

Последний вариант, если у вас нет абсолютно никакого доступа к шаблону, не может его изменить, может включать только его, тогда вы можете использовать буферизацию вывода, чтобы включить файл, загрузить полученный HTML в DOMDocument, а затем отменить теги формы упаковки. Взгляните на код … это не совсем «аккуратно»:

 function extract_form_contents($template) // enable output buffer, include file, get buffer contents & turn off buffer ob_start(); include $template; $form = ob_get_clean(); ob_end_clean(); // create a new DOMDocument & load the form HTML $doc = new DOMDocument(); $doc->loadHTML($form); // since we are working with an HTML fragment here, remove <!DOCTYPE, likewise remove <html><body></body></html> $doc->removeChild($doc->firstChild); $doc->replaceChild($doc->firstChild->firstChild->firstChild, $doc->firstChild); // make a container for the extracted elements $div = $doc->createElement('div'); // grab the form $form = $doc->getElementsByTagName('form'); if ($form->length < 1) return ''; $form = $form->item(0); // loop the elements, clone, place in div $nb = $form->childNodes->length; if ($nb == 0) return ''; for($pos=0; $pos<$nb; $pos++) { $node = $form->childNodes->item($pos); $div->appendChild($node->cloneNode(true)); } // swap form for div $doc->replaceChild($div, $form); return $doc->saveHTML(); } $contents = extract_form_contents('my_form_template.php'); 

Вы можете структурировать свой файл include, как XML-файл, с инструкциями по обработке XML ( DOMProcessingInstruction Docs ). Такой файл будет пропускать только корневой элемент XML, который можно было бы добавить «на лету».

Преимущество этого заключается в том, что он совместим как с XHTML, так и с PHP, если вы пишете PHP со стандартными тегами, такими как <?php ... ?> Потому что это правильная инструкция обработки XML. Начнем с простого примера XHTML, принцип с PHP-кодом на самом деле тот же, но почему это осложняется?

include.php :

 <form id="orderform"> Text: <input name="element" /> </form> 

Чтобы создать функцию include, которая может справиться с этим, нужно только проанализировать XML-файл и вернуть этот фрагмент, например, все внутри <form> . XML-парсинг кораблей с PHP, поэтому все уже готово к действию.

 function incXML($file, $id = NULL) { if (!($xml = file_get_contents($file))) throw new Exception('File IO error.'); $xml = '<template>' . $xml . '</template>'; $doc = new DOMDocument(); if (!$doc->loadXML($xml)) throw new InvalidArgumentException('Invalid file.'); // @todo add HTML namespace if you want to support it // fetch the contents of the file however you need to, // eg with an xpath query, I leave this for a training // and just do a plastic getElementById here which does NOT // work w/o proper DTD support, it's just for illustration. if (NULL === $id) { $part = $doc; } else { if (!$part = $doc->getElementById($id)) throw new InvalidArgumentException('Invalid ID.'); } $buffer = ''; foreach($part->childNodes as $node) { $buffer .= $doc->saveXML($node); } return 'data:text/html;base64,' . base64_encode($buffer); } 

Применение:

 <?php include(incXML('include.php', 'orderform')) ?> 

Вам не нужно изменять какие-либо файлы шаблонов, если они содержат XHTML / PHP в конце с таким методом.