Библиотечные вызовы в представлении заголовка - CodeIgniter - PullRequest
1 голос
/ 24 августа 2011

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

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

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

У меня есть представление, которое выводит часть страницы header страницы,В этом представлении у меня есть меню, которое меняется в зависимости от того, вошли ли вы в систему, есть ли избранные и т. Д. Чтобы определить, что отображать в меню, я должен обратиться к некоторым библиотекам, например, аутентификация и избранное библиотека.

Я пытался вызвать библиотеку из представления, но она выдает ошибку.

Полагаю, я мог бы загрузить контроллер и передать данные впросмотр в каждом контроллере, но у меня было бы много повторяющегося кода.Это путь?

Ответы [ 3 ]

2 голосов
/ 24 августа 2011

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

Любая приличная библиотека шаблонов должна быть в состоянии справиться с этим за вас.Вы можете google найти решение или написать свое собственное.

Вот что в макете кода может выглядеть так:

class Template {

    public $data = array();

    function area($area_name)
    {
        $CI =& get_instance();
        $data = isset($this->data[$area_name]) : $this->data[$area_name] ? NULL;
        $CI->load->view('templates/'.$area_name, $data);
    }

    function set_data($area_name, $data)
    {
        $this->data[$area_name] = $data;
    }
}

Затем в контроллере что-токак это:

$this->template->set_data('header', $my_data);

Тогда в представлении, что-то вроде этого:

<header><?php echo $this->template->area('header'); ?></header>
<div><?php echo $this->template->area('content'); ?></div>
<footer><?php echo $this->template->area('footer'); ?></footer>

Это слишком упрощенно, и есть миллион способов справиться с этим, но я определенно предлагаюнаписание некоторого вида класса для обработки ваших шаблонов, а не просто использование $this->load->view() для всего, даже если это просто оболочка для загрузки представлений.

Чтобы избежать ручной настройки этих же данных вДля каждого контроллера используйте MY_Controller, установите его в классе шаблона __construct() или вызовите его напрямую из файла представления из любого источника (модель, библиотека и т. д.).Отец MVC может пролить слезу, но иногда это проще всего или даже имеет смысл.

Быстрый пример использования расширения контроллера:

// File: application/core/MY_Controller.php
class MY_Controller extends CI_Controller {

    public function __construct()
    {
        parent::__construct();
        $data['var_name'] = $this->some_lib->get_data();
        $data['var_name2'] = $this->some_model->get_more_data();
        $this->template->set_data('header', $data);
    }
}

Тогда все ваши контроллеры будут расширяться MY_Controller, а не CI_Controller, и данные заголовка уже будут загружены.Это всего лишь упрощенный взгляд на другую тему. С этим методом можно сделать гораздо больше.

Я попытался вызвать библиотеку из представления, но это дает мне ошибку.

Этого не должно быть, если библиотека загружена и вы ее правильно вызываете.Синтаксис: $this->library_name->method().

В любом случае, я определенно рекомендую написать или позаимствовать какой-нибудь класс Template.

0 голосов
/ 24 августа 2011

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

0 голосов
/ 24 августа 2011

У вас нет , чтобы следовать модели MVC, но если вы хотите, «правильный» способ - это вызвать функции в контроллере, а затем передать данные в представление, где они напечатаны вне.

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