Как вы могли бы создать эквивалент «content_for» в PHP? - PullRequest
3 голосов
/ 15 декабря 2010

Я работал над небольшой страницей в PHP, которая не нуждается в мощной полнофункциональной среде. Одна вещь, которую я действительно упускаю из предыдущей работы в Ruby-on-Rails, - это возможность эффективно передавать контент на страницу, используя «content_for».

Мне было интересно, как вы могли бы создать жизненный цикл страницы, который бы достиг такого же эффекта в PHP?

Итак, вот простой пример:

Допустим, у вас есть шаблон, который определяет индексную страницу, только повторяющийся заголовок и меню, которое вы хотите использовать на всех своих страницах. Итак, ваш index.php файл выглядит в основном так:

...header stuff...
<body>
<?php include $file.'.php'; ?>
</body>
...footer stuff...

РЕДАКТИРОВАТЬ: Спасибо за советы по безопасности URL, но давайте просто предположим, что я получаю запрос пользователя безопасно:)

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

<head>
<title><?php echo $page_title; ?></title>
</head>

Было бы неплохо иметь возможность указать заголовок во включаемом файле, поэтому по URL http://example.com/index.php?p=test вы загружаете test.php, и этот файл выглядит следующим образом:

<?php $page_title = 'Test Page'; ?>
... rest of content ...

Теперь, очевидно, это не работает, потому что включающая страница (index.php) загружается до того, как установлена ​​переменная.

В Rails вы можете передавать вещи «на страницу», используя функцию content_for.

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

Ответы [ 3 ]

4 голосов
/ 15 декабря 2010
  1. Никогда до include $_GET['p']. Это открывает огромную дыру в безопасности вашего сайта, так как include принимает имена файлов и URL-адреса, так что любой сможет прочитать любой файл на вашем сайте, а также выполнить любой код на вашем сервере. Вы можете сначала проверить и очистить значение.
  2. Если вам нужно что-то простое, вы можете поместить заголовок и нижний колонтитул в отдельные файлы, выполнить ваш test.php, который установит переменные, захватить его вывод, используя буферизацию вывода , затем включить заголовок , выведите среднюю часть и включите нижний колонтитул. Пример:

    <?php ob_start(); ?>
    <body>
    <?php include $filename.'.php'; ?>
    </body>
    <?php $content = ob_get_clean(); 
     include 'header.php';
     echo $content;
     include 'footer.php';
     ?>
    
1 голос
/ 15 декабря 2010

Вы беспокоитесь о XSS? Или вы собираетесь отфильтровать / добавить в белый список «имена файлов» из строки запроса?

Мой ответ - использовать mod_rewrite - если вы используете PHP, скорее всего, вы используете Apache!

Вы можете отфильтровать файлы с помощью RewriteCond, и ваш RewriteRule может быть:

RewriteRule /index.php?p=(.*)$ $ 1 [L, QSA]

Этот подход может отличаться от того, который вы искали в PHP, но он приходит в голову ...

1 голос
/ 15 декабря 2010

Если я вас правильно понимаю (я не использовал RoR широко), вы можете поместить свои данные в переменную или функцию. Если ваш контент находится в переменной, ваш «test.php» может просто содержать все ваши переменные, и вы можете загрузить его в самом начале вашего индексного файла (аналогично для функции в зависимости от того, насколько сложны ваши потребности; если вы делая большую дополнительную работу, вам может понадобиться использовать функцию, так как переменная не будет работать).

Например, ваш test.php будет выглядеть примерно так:

<?php
$page_title = "Test Page";
$page_content = "Some sort of content";

// Or

function page_content()
{
    // Run some functions and print content at the end
}

?>

Тогда в вашем index.php

<?php include $_GET['p'].'.php'; ?>
...header stuff...
<title><?php print $page_title; ?></title>
<body>
<?php print $page_content; ?>
<!-- OR if function -->
<?php page_content(); ?>
</body>
...footer stuff...

Таким образом, все должно загружаться правильно. Вы также можете разделить вещи, но это усложнит вашу структуру (особенно если нет необходимости в сложной структуре, в этом нет необходимости).

Удачи!
Деннис М.

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