Нет, альтернативного способа включения части файла нет.Подумайте: как бы вы описали такую функцию, где начинать и заканчивать включение?Как функция узнает, что вы хотите?
Как и предполагалось, наилучшим подходом будет рефакторинг включенного файла.Если это не вариант (я не могу представить, почему это не так), другой способ - использовать переменные или константы во включенном файле, чтобы указать, какие части следует выводить.Примерно так:
#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');
Это противный , IMO.Когда кто-то (или ваше будущее) редактирует form_template.php
, может быть неясно, когда и почему будет установлен $include_form_header
.Этот вид зависимости от переменных, объявленных во внешних файлах, может привести к появлению спагетти-кода.
Вам гораздо лучше создавать отдельные шаблоны для разных целей (или напрямую выводить тривиальный вывод, например, одну строку HTML, чтобы открыть или закрытьform), например:
<?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');