Самый быстрый способ загрузить / включить шаблон PHP? - PullRequest
1 голос
/ 10 сентября 2009

У меня есть функция, которая просматривает различные типы списков, извлеченных из MySQL, и отображает их в виде «фида» в стиле Facebook. Каждый тип листинга имеет свой внешний вид и поэтому требует другого шаблона.

Вот приведенный ниже пример функции может вызываться 100 раз (при наличии 100 списков):

function display_listing($id,$type) {
    global $abs_path;

    switch($type) {

        case 'photo':
            include($abs_path . '/templates/photo.php');
            break;

        case 'video':
            include($abs_path . '/templates/video.php');
            break;

    }

}

Есть ли лучший способ сделать это, когда я потенциально не получу 100 включений - что может замедлить мой процесс? Могу ли я как-то сохранить включение на странице и ссылаться на него столько раз, сколько необходимо?

... или это лучшая практика?

Кроме того, я хочу знать, как сделать это самостоятельно, без шаблонизатора ...

РЕДАКТИРОВАТЬ: проблема не решается только с помощью include_once (я не верю) ... Мне нужно иметь возможность многократно использовать включенный файл, заменяя переменные каждый раз.

Ответы [ 6 ]

2 голосов
/ 10 сентября 2009

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

Вы, возможно, можете заключить код каждого шаблона в функцию, однако:

/*
photoTemplate.php
*/

<?php
function loadPhotoTemplate($id) {
?>
  <div id="photo">
...
  </div>
<?php
}
?>


/*
listing.php
*/

function display_listing($id,$type) {
    global $abs_path;

    switch($type) {

        case 'photo':
            include_once($abs_path . '/templates/photo.php');
            loadPhotoTemplate($id);
            break;

        case 'video':
            include_once($abs_path . '/templates/video.php');
            loadVideoTemplate($id);
            break;
    }

}

Это будет загружать каждый файл шаблона не более одного раза, а затем просто вызывать функцию каждый раз, когда вы хотите отобразить шаблон с конкретными данными для этого элемента.

Редактировать

Вероятно, было бы даже лучше включить все файлы шаблонов в начале, а затем просто вызвать соответствующую функцию в коммутаторе. Функции PHP * _once () работают медленно, так как они должны обращаться к списку ранее включенных / обязательных файлов при каждом вызове.

1 голос
/ 29 сентября 2009

Я думаю, вам стоит взглянуть на несколько вещей. Во-первых, есть ли вероятность, что вы включите один и тот же «шаблон» 100 раз? Это похоже на огромное количество контента, которое можно разместить на странице.

Если я использую крошечные «фрагменты» - скажем, строку таблицы, которая повторяется много раз - я склонен использовать функцию, которая возвращает строку, например:

/* snippets.php */
function tableRow( $row )
{
    return
        '<tr><td>' . $row['var1'] . '</td>' .
        '<td>' . $row['var2'] . '</td></tr>';
}

/* main page/view */
foreach ( $data as $row )
    echo tableRow( $row );

Основным преимуществом здесь является то, что в функции могут быть циклы и все виды.

Если вы ищете прямую замену переменной, вы можете создать свои собственные мини-шаблоны в HTML-файле; что-то вроде:

<p>{name}<br />
  Posted {date} by {author}</p>

Затем прочитайте в шаблоне, передайте всю строку вашей функции display_listing, которая запускает str_replace для всех {переменных}. Я не думаю, что производительность будет слишком сильной, но вы должны попробовать это, чтобы быть уверенным.

1 голос
/ 11 сентября 2009

Если вы беспокоитесь о производительности, лично я бы вообще не попал в этот цикл.

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

При этом вы вернете эту логику обратно в процесс создания элементов, чтобы вы делали одно и то же выражение switch, но только для одного элемента за раз - вы обрезаете цикл.

Затем во время отображения вместо вызова display_listing() вы просто выводите уже сохраненный HTML-код.

1 голос
/ 10 сентября 2009

создать массив разрешенных шаблонов. есть ли у вас функция посмотреть, есть ли запрошенный шаблон в массиве. если это так, используйте переменную $ type для включения файла. да, в общем случае вы не должны использовать предоставленные пользователем данные в имени включаемого файла, но поскольку вы проверили их по общеизвестному массиву значений, это безопасно.

0 голосов
/ 10 сентября 2009

Если вы собираетесь включать шаблоны с использованием переключателя для разных ключевых слов, то вы должны установить переменную, скажем, $ template_filename, в переключателе, а затем, как только вы отключите переключатель, выполните включение следующим образом: 1001 *

include_once("/templates/{$filename}.php");

Если вы вообще не хотите использовать, в том числе, то вы можете использовать движок шаблонов ...

Однако этот метод мне кажется разумным.

0 голосов
/ 10 сентября 2009

Вы хотите использовать функцию include_once вместо include.

Оператор include_once () включает и оценивает указанный файл во время выполнения сценария. Это поведение похоже на оператор include (), с единственным Разница в том, что если код из файл уже включен, это не будет включен снова. Как Название предполагает, оно будет включено только один раз.

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