где подходящее место для размещения кода для переключения используемой Zend Layout? - PullRequest
2 голосов
/ 07 января 2011

Я создал веб-сайт Zend Framework и теперь обновляю его, чтобы отключить файл макета в зависимости от того, находится ли пользователь на мобильном устройстве.

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

Код:

include(APPLICATION_PATH . "/classes/MobileDetection.php");
$detect = new MobileDetect();

if ($detect->isMobile()) {
    $layout = $layout->setLayout('mobile');
} 

Я могу вызвать макет из функции Bootstrap_initViewHelpers() но я получаю ошибку 500, как только добавляю строку включения выше.

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

Ответы [ 3 ]

2 голосов
/ 07 января 2011

Вы можете использовать плагин, вот что я делаю:

<?php

class Mobile_Layout_Controller_Plugin_Layout extends Zend_Layout_Controller_Plugin_Layout
{

    public function preDispatch(Zend_Controller_Request_Abstract $request)
    {
        switch ($request->getModuleName()) {
            case 'mobile': $this->_moduleChange('mobile');
        }
    }

    protected function _moduleChange($moduleName) {
        $this->getLayout()->setLayoutPath(
            dirname(dirname(
                $this->getLayout()->getLayoutPath()
            ))
            . DIRECTORY_SEPARATOR . 'layouts/scripts/' . $moduleName
        );
        $this->getLayout()->setLayout($moduleName);
    }

}

Я держу его в library/ProjectName/Layout/Controller/Plugin/Layout.php.

В вашем Bootsrap вам нужно будет включить что-то вроде этого:

Zend_Layout::startMvc(
    array(
        'layoutPath' => self::$root . '/application/views/layouts/scripts',
        'layout' => 'layout',
        'pluginClass' => 'Mobile_Layout_Controller_Plugin_Layout'
    )
);

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

0 голосов
/ 10 февраля 2011

Представьте, что у вас есть www.example.com, и когда вы переходите на эту страницу с мобильного устройства, вы хотите перенаправиться на mobile.example.com:

зная, что www - это модуль, а mobile - это модуль в приложении с различными макетами

Я нашел следующую страницу о том, как обнаружить мобильное устройство http://framework.zend.com/manual/de/zend.http.user-agent.html#zend.http.user-agent.quick-start

Как и куда перенаправить?

Привет

0 голосов
/ 10 января 2011

На самом деле, на самом деле происходит то, что у вас есть один новый отдельный модуль, называемый «мобильный», и помощник плагина макета фактически выполняет метод preDispatch (), проверяя, вызван ли этот модуль.После этого метод меняет макет.Это довольно сложно.Я думаю, что вы можете сделать базовый контроллер для своей мобильной версии и в его методе init () изменить макет с помощью $ this -> _ helper-> layout-> changeLayout ().

...