Загрузите шаблон или представление в зависимости от содержимого переменных $ _GET - PullRequest
2 голосов
/ 07 апреля 2011

Я разрабатываю сайт Q & A, использующий php.Вот структура каталогов:

+include
  db.php
  user.php
  template.php
  ...
  question.php
+public
  +images
  +styles
.htaccess
index.php
...

Я хочу использовать index.php REQUEST_STRING для загрузки шаблона.

Например: index.php?page=signin загрузит функцию get_signin_template() вtemplate.php.И покажет посетителю URL-адрес типа http://example.com/signin/.

Вот мои вопросы:

  1. Как загрузить различные шаблоны в index.php (что следует делать в этом файле)?
  2. Как переписать URL (используя apache mod_rewrite)?

Ответы [ 2 ]

1 голос
/ 07 апреля 2011

Ответ на вопрос 1

$valid_templates = array('signin', 'logout', 'home');
if(isset($_GET['page'])
   and in_array($_GET['page'], $valid_templates)) {
    $function_name = 'get_' . $_GET['page'] . '_template';
    $template = call_user_func($function_name);
}

См. call_user_func() в руководстве по PHP и функцию in_array() в руководстве по PHP .

Думаю, также стоит упомянуть, что я бы так не поступил. Сопоставление URL-адресов напрямую с функциями - это негибкий способ ведения дел.

Причина, по которой я добавил массив $valid_templates, состоит в том, чтобы гарантировать, что пользователь не пытается изменить URL-адрес при попытке вызвать несуществующую функцию и т. Д. Вам необходимо добавить каждую страницу / шаблонную функцию к нему.

Если вам действительно нравится такой способ работы, я бы порекомендовал вам проверить Limonade , так как он использует метод отправки, аналогичный тому, который вы пытаетесь настроить (следующий пример от их официальный сайт ):

require_once 'vendors/limonade.php';
dispatch('/', 'hello');
  function hello()
  {
      return 'Hello world!';
  }
run();

Но, на мой взгляд, немного безопаснее и проще в управлении. Плюс вся «тяжелая» сантехническая работа уже выполнена, и вы можете просто сосредоточиться на добавлении своих страниц.

Еще одна похожая опция - Slim , которая выглядит следующим образом:

require 'Slim/Slim.php';
Slim::init();
Slim::get('/hello/:name', function ($name) {
    echo "Hello $name";
});
Slim::run();

Пример из их сайта .

Ответ на вопрос 2

Что-то вроде этого в вашем файле .htaccess должно работать для ваших нужд переписывания.

RewriteEngine On
RewriteBase /
RewriteRule ^(.*)$ index.php?page=$1 [QSA,L]
0 голосов
/ 07 апреля 2011

1.for index.php? Page = вход

$urlEnd=$_GET['page'];
require('path_to_file'.$urlEnd);//Require your file
header('Location: index.php?/$urlEnd');//WARNING!!! HEADER MUST go befor any echo's
...