Может ли PHP включать работу только для определенной части файла? - PullRequest
1 голос
/ 14 декабря 2011

У меня есть 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>

Таким образом, включение включало бы в этот файл форму с полученным HTML-кодом?Возможно ли это?

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

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

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

Ответы [ 3 ]

2 голосов
/ 14 декабря 2011

Для этого лучше всего заглянуть в функции 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);

Или, как пользователь:

print form_tag_wrapper(form_contents());
1 голос
/ 14 декабря 2011

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

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

#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');
1 голос
/ 14 декабря 2011

Вы можете структурировать ваш включаемый файл как XML-файл с инструкциями по обработке & shy; XML (DOMProcessingInstruction и застенчивый; Docs ). В таком файле будет отсутствовать только корневой элемент XML, который можно добавить на лету.

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

include.php

<form id="orderform">

    Text: <input name="element" />

</form>

Чтобы создать функцию включения, которая может справиться с этим, ему нужно только проанализировать 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,
    // e.g. 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...