Zend Framework изменить расположение представления в плагине - PullRequest
3 голосов
/ 18 марта 2011

Я не могу найти решение моей проблемы нигде, будь то на SO или в документации по Zend.

В основном у меня есть эта настройка:

  1. Я создал плагин, который использует Zend_Http_UserAgent и WURFL для определения, использует ли пользователь мобильный телефон. Это сделано в предзапуске. Это прекрасно работает

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

  3. В идеале в идеальном мире я хотел бы попробовать загрузить мобильную версию представления, если оно существует, если нет, то загрузить представление по умолчанию. Но если я смогу заставить 2 работать хотя бы тогда, я буду счастлив.

Я более чем озадачен тем, как я это делаю. Я видел, что мог бы использовать:

$ view = Zend_Controller_Action_HelperBroker :: getStaticHelper ('viewRenderer') -> view; $ view-> setBasePath (APPLICATION_PATH. '/ mobile_views /');

Но похоже, что это не то, что я ожидаю, плюс это происходит в postDispatch, когда я думаю, что подобные вещи должны происходить в preDispatch?

Вот мой текущий плагин:

<?php

класс SQ_Plugins_Mobile extends Zend_Controller_Plugin_Abstract {

public function dispatchLoopStartup(Zend_Controller_Request_Abstract $flag) {

    $bootstrap  = Zend_Controller_Front::getInstance()->getParam("bootstrap");
    $useragent  = $bootstrap->getResource("useragent");
    $device     = $useragent->getDevice();

    Zend_Registry::set("useragent", $useragent);
    Zend_Registry::set("device", $device);

    echo $device->getType() . " is the type of device";

    if($device->getType() != "mobile") {
        /**
         * Set the layout to be mobile, here we make sure we streamline what is loaded
         * so as to not load things that arent needed.
         */
        Zend_Layout::getMvcInstance()->setLayout("mobile");


        /**
         * Here i wish to change the view path to be APPLICATION_PATH . "/mobile_views/"
         * @todo Change the view script path 
         */

    }
}

public function postDispatch(Zend_Controller_Request_Abstract $request) {

    /**
     * Maybe i have to change the view script path here?
     * @todo change the viewscript path if we're using a mobile
     */

    // Get the current view
    $view = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer')->view;
    $view->setBasePath(APPLICATION_PATH . '/mobile_views/');
    echo "kl;kl;kjhkl;jhlkjhjklhkl;h k;hi";
}

}

Ответы [ 2 ]

1 голос
/ 18 июня 2012

В своем действии вы можете сделать это, если это мобильная версия страницы.

$this->view->addBasePath('../application/views/mobile'); // Or whatever your path may be.

Просто мысль.

0 голосов
/ 18 марта 2011

ОК, так что я исправил это, хотя я не уверен, что это самое лучшее «зенд» решение, но я думаю, что оно довольно элегантно и работает, что является лучшим.

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

class SQ_Plugins_Mobile extends Zend_Controller_Plugin_Abstract {

public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request) {

    $bootstrap  = Zend_Controller_Front::getInstance()->getParam("bootstrap");
    $useragent  = $bootstrap->getResource("useragent");
    $device     = $useragent->getDevice();

    Zend_Registry::set("useragent", $useragent);
    Zend_Registry::set("device", $device);

    /**
     * @todo change this to be Mobile 
     */
    if($device->getType() != "mobile") {

        /**
         * Set the layout to be mobile, here we make sure we streamline what is loaded
         * so as to not load things that arent needed.
         */
        Zend_Layout::getMvcInstance()->setLayout("mobile_layout");

        /**
         * Here we check to see if a mobile version of the template exists.  if it does then we change the view suffix
         * this allows us to load the mobile view if it exists and the defgault view if it doesnt. 
         */
        $base       = APPLICATION_PATH . "/views/scripts/";
        $mobile     = $base .  $request->getControllerName() . "/" . $request->getActionName() . ".mobile.phtml";

        if(is_readable($mobile)) {
            Zend_Controller_Action_HelperBroker::getExistingHelper('ViewRenderer')->setViewSuffix('mobile.phtml');      
        } 

    }
}
}
...