Как добавить контекст ко всему контроллеру в zendFramework - PullRequest
0 голосов
/ 03 октября 2011

есть возможность добавить, например, контекст json к определенному действию:

$this->_helper->ajaxContext()
    ->addActionContext('index', 'json')
    ->initContext();

, но как насчет того, если я хочу добавить jsonContext для двух или всех действий в текущем контроллере;Я попробовал:

$this->_helper->ajaxContext()
    ->addActionContext(array('index', 'second'), 'json')
    ->initContext();

но безрезультатно.Я знаю, что могу использовать:

$this->_helper->ajaxContext()
   ->addActionContext('index', 'json')
   ->initContext();
$this->_helper->ajaxContext()
   ->addActionContext('second', 'json')
   ->initContext();

, но я ищу более оригинальное решение.Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 19 сентября 2012

Я знаю, что это старый вопрос, но в случае, если кто-то еще ищет решение, я думаю, что подкласс Zend_Controller_Action_Helper_ContextSwitch - это путь.

В моем случае я разделил его на подклассы так, чтобы он рассматривал «*» как подстановочный знак для «всех действий»:

class My_Controller_Action_Helper_ContextSwitch extends Zend_Controller_Action_Helper_ContextSwitch {
/**
 * Adds support logic for the "*" wildcard.
 * 
 * @see Zend_Controller_Action_Helper_ContextSwitch::getActionContexts()
 */
public function getActionContexts($action = null) {
    $parentContexts = parent::getActionContexts($action = null);

    $contextKey = $this->_contextKey;
    $controller = $this->getActionController();

    if (isset($controller->{$contextKey}['*'])) {
        $contexts = $controller->{$contextKey}['*'];
    }
    else {
        $contexts = array();
    }

    return array_merge($parentContexts, $contexts);
}

/**
 * Adds support logic for the "*" wildcard.
 *
 * @see Zend_Controller_Action_Helper_ContextSwitch::hasActionContext()
 */
public function hasActionContext($action, $context) {       
    if (!$result = parent::hasActionContext($action, $context)) {
        $controller = $this->getActionController();
        $contextKey = $this->_contextKey;

        $contexts = $controller->{$contextKey};

        foreach ($contexts as $action => $actionContexts) {
            foreach ($actionContexts as $actionContext) {
                if ($actionContext == $context && $action == '*') {
                    return true;
                }
            }
        }
    }

    return $result;
}

}

И в моем контроллере я использую следующий синтаксис для настройки переключения контекста:

$contextSwitch = $this->_helper->getHelper('contextSwitch');
    $contextSwitch
        ->addActionContext('*', array('help'))
        ->initContext()
    ;

Благодаря этому контекст «справки» доступен для всех действий в моем контроллере.

Эти образцы не были полностью протестированы и, конечно, не идеальны, но они являются хорошей отправной точкой для решения проблемы.

1 голос
/ 09 сентября 2014

Чтобы добавить контекст ко ВСЕМ действиям, вы можете поместить это в инициализацию вашего контроллера:

$contextSwitch = $this->_helper->getHelper('contextSwitch');
$action = $this->getRequest()->getActionName();
$contextSwitch->addActionContext($action, 'pdf')
              ->initContext();

Это работает до тех пор, пока вы не используете пересылку или перенаправление, поскольку добавляет контекст к действию current .

1 голос
/ 03 октября 2011

Ну, ваша вторая версия неверна, а ваша третья версия излишняя.

Вот как я обычно это делаю:

$this->_helper->ajaxContext()
   ->addActionContext('index', 'json')
   ->addActionContext('second', 'json')
   ->initContext();

Если этого вам недостаточно, вы можете просмотреть все действия и добавить их в контекст.

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