2016-12-09 6 views
2

Im работает на веб-сайте - просто учитесь улучшать свое кодирование. У меня есть система маршрутизации, которая работает следующим образом:unrequire a php file

/config/routes.php:

$route->add('/' , function() { 
    require_once("/application/pages/index.php"); 
}); 

$route->add('/register', function() { 
    require_once("/application/pages/register.php"); 
}); 

$route->add('/login', function() { 
    require_once("/application/pages/login.php"); 
}); 

$route->add('/logout', function() { 
    require_once("/application/pages/logout.php"); 
}); 

$route->add('/panel', function() { 
    require_once('/application/pages/panel/index.php'); 
}); 

И в моем index.php:

require_once('application/pages/header.php'); 

include('config/routes.php'); 

require_once('application/pages/footer.php'); 

Все работает нормально, но мне нужна различные header.php и footer.php, когда пользователь входит в панель. file: /application/pages/panel/index.php

Когда я требую_запросить новый файл заголовка в панели/index.php, загружаются как новый, так и старый заголовочный файл. Как я могу освободить файлы заголовка и нижнего колонтитула в файле /panel/index.php, чтобы я мог потребовать разные? Какие-либо предложения?

+0

измените свой пост и добавить точное сообщение, которое вы получаете – WEBjuju

+1

сделать 'если else' – Blueblazer172

+0

@WEBjuju - извините, мой Ошибка. Я имел в виду, что оба файла заголовка загружаются. Я не знаю, почему я написал, что есть и ошибки, вероятно, потому, что я сейчас устал. –

ответ

0

Это решение требует наличия у вас header.php и footer.php в каждой папке, где находятся ваши субконтроллеры (application/<module name>/index.php).

index.php вызывать только ваши суб-контроллеры с помощью маршрутизации:

// require not include, because "no routing" = "no web site" ;) 
require_once('config/routes.php'); 

приложения/страницы/index.php включать соответствующий заголовок/колонтитул ж/относительный путь

require_once('header.php'); 
// page code 
require_once('footer.php'); 

application/register/index.php включают соответствующий верхний/нижний колонтитул с относительным путем

require_once('header.php'); 
// page code 
require_once('footer.php'); 

и т.д.

+0

, если ваш 'application/pages/header.php' является« стандартным »заголовком (и нижним колонтитулом), то в любой папке/модуле, где вы хотите вызывать это, а не в папке-existant' header.php', относительный путь вероятно, будет '../ pages/header.php', а затем' require_once ('../ pages/header.php'); ' – WEBjuju

1

На вашем месте, я буду делать что-то вроде этого:

Используйте из буфера и проверить, если файл уже требуется. Я даю вам быстрый пример, но адаптирую код для вас. И проверить функцию: http://php.net/manual/en/function.get-included-files.php

$route->add('/panel', function() { 
    include_once('YOUR_SPECIFIC_PATH/header.php'); 
    require_once('/application/pages/panel/index.php'); 
    include_once('YOUR_SPECIFIC_PATH_header/footer.php'); 
}); 

И:

ob_start(); 
include_once('config/routes.php'); 
$mainContent = ob_get_contents(); 
ob_end_clean(); 


include_once('application/pages/header.php'); 
echo $mainContent; 
include_once('application/pages/footer.php'); 

Я не время для помощи более жаль, но я могу объяснить позже, если вам нужно

+0

Я рад согласиться с сообществом php, которое считает, что функции' ob_' обычно указывают дефект дизайна. это, безусловно, один из тех случаев. для одного, он умножает необходимые строки кода, где они могут быть явно уменьшены. – WEBjuju

2

Примечание: маршрутизации происходит от MVC design pattern, вы должны держать свои контроллеры отдельно от своих просмотров.


Шаблоны и Просмотров может храниться отдельно, также.Это означает наш каталог настройка может выглядеть примерно так:

- Templates 
    - header_one.php 
    - footer_one.php 
    - header_two.php 
    - footer_two.php 
- Views 
    - index.php 
    - someOtherBody.php 

Вот простой, но незаконченный (то есть ваша задача) пример объекта, который мог бы сделать то, что я объясняю:

class Page { 
    private $template_path = dirname(dirname(__FILE__)) . '/templates/'; 
    private $view_path = dirname(dirname(__FILE__)) . '/views/'; 

    protected $header; 
    protected $footer; 
    protected $body; 

    public function setHeader($file_name) 
    { 
     if(is_readable($this->template_path . $file_name)) 
     { 
      $this->header = $this->template_path . $file_name; 
      return $this; 
     } 
     // add an exception 
    } 

    /* TODO: */ 

    public function setFooter() {} 
    public function setBody() {} 

    /* Render page */ 

    public function render() 
    { 
     $page = [$this->header,$this->body,$this->footer]; 
     foreach($page as $file) 
     { 
      require_once($file); 
     } 
    } 
} 

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


$route->add('/', function() { 
    $page = new Page(); 

    $page->setHeader('header_one.php') 
     ->setBody('index.php') 
     ->setFooter('footer_one.php'); 

    /* todo: add your logic here */ 

    $page->render(); 
}); 

Каждый маршрут теперь может иметь свой собственный заголовок, колонтитул и тело.
Надеюсь, это помогло.

+0

Я вставил этот класс и закончил его, но я получаю сообщение об ошибке: 'Ошибка анализа: синтаксическая ошибка, неожиданная '(', ожидающая ',' или ';' в C: \ wampserver \ www \ cms \ application \ classes \ class_page.php в строке 17' Строка 17: 'const TEMPLATE_PATH = dirname (dirname (__ FILE__)). '/ application/templates /';' –

+0

Этот фрагмент кода не является ** рабочей ** версией. это ваша собственная ответственность за создание рабочей версии концепции. Во-первых, вам нужно будет изменить свой макет каталога, что означает перемещение всех ваших представлений в каталог * views * и то же самое с вашими шаблонами. Примечание: убедитесь, что вы возвращаете $ this; 'для поддержания потока OO между методами. – KDOT

+0

Вы можете узнать больше о [dirname()] (http://php.net/manual/en/function.dirname.php), следуя этой ссылке. – KDOT

0

@KDOT, спасибо вам за вашу помощь, но с использованием кода я получаю сообщение об ошибке, что я не мог исправить:

Call to a member function setBody() on null 

но благодаря коду, мне удалось переписать класс моего пути и теперь он работает;) Еще раз спасибо @KDOT!

Если кто нуждается в этом:

class Page { 
    private $TEMPLATE_PATH = '/application/templates/'; 
    private $VIEW_PATH = '/application/views/'; 

    protected $header; 
    protected $footer; 
    protected $body; 

    public function __construct($header_file, $body_file, $footer_file) { 
     $this->header = $this->TEMPLATE_PATH . $header_file; 
     $this->body = $this->VIEW_PATH . $body_file; 
     $this->footer = $this->TEMPLATE_PATH . $footer_file; 
    } 

    public function render(){ 
     $page = [$this->header, $this->body, $this->footer]; 
     foreach($page as $file) { 
      require_once($file); 
     } 
    } 
} 

и:

$route->add('/', function() { 
    $page = new Page('header.php', 'home.php', 'footer.php'); 
    $page->render(); 
});