Zend Framework - Расширяющиеся контроллеры - PullRequest
2 голосов
/ 05 октября 2009

Я бы хотел, чтобы мой контроллер - т.е. Page_IndexController - расширил базовый контроллер.

Например;

class Page_IndexController extends Content_IndexController {
}

Однако, похоже, автозагрузчик не распознает тот факт, что это класс контроллера в любой момент - я получаю ошибку Fatal error: Class 'Content_IndexController' not found

Первый вопрос: как мне это исправить?

Я могу временно исправить это с помощью require_once'ing универсального контроллера содержимого, но это вряд ли идеально.

Следующая проблема заключается в том, что, если у моего Page контроллера есть собственный скрипт вида для действия, это не проблема.

Но если я расширяю контроллер, и я вызываю, например, listAction на контроллере страницы, но это действие реализовано в Content_IndexController, оно все равно ищет скрипт представления списка в контроллерах страниц "scripts" каталог.

Второй вопрос: как мне настроить мой контроллер на использование его родительского скрипта просмотра, если у него его нет?

Ответы [ 4 ]

3 голосов
/ 05 октября 2009

Если ваше приложение может найти Page_IndexController, возможно, у вас есть модуль Page. Если вы не используете модули в своем приложении, вы должны назвать свои контроллеры PageController и ContentController, а не Page_IndexController, ... Поэтому решение состоит в том, чтобы зарегистрировать пространство имен "Content_" в автозагрузчике.

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

2 голосов
/ 05 октября 2009

Автозагрузчик не может найти ваш контроллер, потому что вы не сказали ему, где искать. Content_IndexController отсутствует в вашей папке "library" (я предполагаю, что она находится внутри модуля Content)

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

Немного больше изучил тему скрипта вида. Вы можете изменить пути к сценариям вида во время init() где-нибудь. Я почти уверен, что это, вероятно, должно быть сделано в ViewRenderer - но может также работать внутри кода инициализации / действия контроллера.

$this->view->setScriptPath(
  array(
   realpath(APPLICATION_PATH+'/../path/to/other/module/views'),
  ) + $this->view->getScriptPath());

Пути сценария обрабатываются в порядке поступления в соответствии с Zend_View_Abstract

0 голосов
/ 13 июля 2011

Я делаю этот режим.

Frist Я регистрирую новое имя подключаемого модуля в моем index.php в общую папку:

/public/index.php

$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->registerNamespace('modelo_');

Secound Я создаю новую папку, чтобы поставить свой контроллер

/library/modelo/

В-третьих, я создаю модель контроллера и помещаю ее в созданную папку и переименовываю ее.

class Modelo_ModeloController extends Zend_Controller_Action
{

protected  $_db = null;
protected $_menu = null;
protected $_util = null;
protected $_path = null;

... actions to my model

public function inicial(){}

}

и я расширяю этот класс в моем приложении

class Sispromo_PedidoController extends Modelo_ModeloController
{
public function init(){}
....
}
0 голосов
/ 05 октября 2009

По второму вопросу:

Если вы не хотите писать свой собственный ViewRenderer, вы можете использовать $ this-> renderScript ('parent / index.phtml') для визуализации определенного скрипта вида. Вы можете вызвать это в своих дочерних контроллерах, вместо того, чтобы автоматически отображать представления для вас, или если ваши дочерние контроллеры полагаются на родительский контроллер для выполнения рендеринга скрипта, вы можете просто поместить это в свои родительские контроллеры.

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