Кохана 3: Как обеспечить функции API в шаблоне / представлении, как WordPress? - PullRequest
1 голос
/ 13 октября 2010

Я работаю над проектом, который позволяет опытному пользователю самостоятельно определять способ отображения информации и получать доступ к некоторым базовым API.Например, я предоставляю функцию show_search_box (), чтобы пользователь мог вызывать эту функцию в файле представления, когда он хочет показать стандартное поле поиска, или он мог вызывать функцию с параметрами для настройки формы поиска.

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

<div><?php show_search_box('Enter keyword here'); ?></div>

То, что я думаю, на самом деле в точности похоже на то, что делает WordPress в своем шаблоне.теги.(http://codex.wordpress.org/Stepping_Into_Template_Tags)

Моя идея состоит в том, чтобы создать класс, который предоставляет все эти функции API и передает экземпляр объекта класса в файл представления, чтобы пользователи могли вызывать функции API в представлении, например:

<div><?php $API->show_search_box('Enter keyword here'); ?></div>

Я думаю, что это будет работать (но еще не проверял), но я предпочитаю предоставлять набор функций прямого вызова, как WordPress. Какой лучший способ сделать это с Kohana 3?

====== Обновление: я протестировал метод передачи объекта $ API для просмотра, и он работает, как и ожидалось.

class API {
     public function show_search_box($watermark){....}
}

В контроллере передайте $ API представлению /template

public function action_index()
{
     $this->template->API = new API();
}

Затем вызовите функцию внутри представления / шаблона, как описано выше.В отличие от этих методов контроллера, $ API не может получить доступ к переменным контроллера, если они не назначены явно: например, $ API-> setVar ('VarName', $ a_controller_variable), что довольно утомительно, я думаю.

1 Ответ

2 голосов
/ 13 октября 2010

Ну, в отличие от Kohana 2.3, представления не выполняются в пространстве имен контроллера, поэтому вы не можете просто сделать $this->something().

Если у вас есть все функции в одной модели, давайте назовем это API, тогда вы можете сделать это в представлении (или базовом контроллере, если вы хотите, чтобы он был доступен везде) ...

$this->template->internalView = View::factory('your_view')
                                  ->set('API', Model::factory('API));

(при условии, что у вас есть <?php echo $internalView; ?> в родительском представлении).

Тогда вы могли бы сделать по вашему мнению ...

<div><?php $API->show_search_box('Enter keyword here'); ?></div>

Который будет запускать ваш метод на вашей модели. Представления не должны знать о существовании моделей, но ваш случай ma будет исключением. Возможно, вы могли бы использовать вспомогательный класс вместо модели, если вы беспокоитесь о нарушении парадигмы MVC.

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

...