Переписать Zend View Directory? - PullRequest
0 голосов
/ 22 июня 2010

В моей начальной загрузке я обнаруживаю сайт, на котором находятся пользователи, а затем выдаю изменения макета и смены помощника.По сути, все, что там есть по умолчанию, - это то, к чему относится сайт, если в / public / site /

* 1002 нет версии для каждого сайта. Однако я не могу заставить реальное представление полагаться на путь, который он дает илипуть в /public/site.

Вот мой код:

protected function _initSite() {

        $this->bootstrap('db');
        $db             = $this->getPluginResource('db')->getDbAdapter();
        $site_domain    = strtolower($_SERVER['HTTP_HOST']);

        //site
        $query = $db->prepare("
            SELECT s.*, so.* 
            FROM Site AS s
            JOIN Site_Domain AS sd ON sd.site_id = s.id
            JOIN Site_Option AS so ON so.site_id = s.id 
            WHERE sd.domain = :site_domain AND s.enabled = '1'
            LIMIT 1
        ");
        $query->bindValue('site_domain', $site_domain);
        $query->execute();
        $site = $query->fetch(PDO::FETCH_OBJ);
        $query->closeCursor();

        if (empty($site)) {
            throw new exception('Unfortunately we were unable to load the site you requested via the domain you came to.');
        }

        //site definitions - we need to get away from defining global variables, so lazy
        define('SITE_ID', $site->id);

        //layout paths
        Zend_Layout::startMvc(array(
            'layout' => 'layout',
            'layoutPath' => array(
                APPLICATION_PATH.'/layouts/scripts/',
                PUBLIC_PATH.'/site/'.$site->id.'/layouts/scripts/'
            )
        ));



        $view = $this->getResource('view');
        //set site to view, we use alot of google anayltics code so
        $view->site = $site;
        //set title seperator
        $view->headTitle($site->title)->setSeparator(' - ');
        //add base path for layout overriding
        $view->addBasePath(APPLICATION_PATH.'/modules/:module/views/');
        //register view helper path
        $view->addHelperPath('My/View/Helper/', 'My_View_Helper_');

        //register partials fallback path
        $view->addScriptPath(APPLICATION_PATH.'/layouts/partials');
        //default partials path
        $view->addScriptPath(PUBLIC_PATH.'/site/'.$site->id.'/layouts/partials/');//the default helpers

        //bind objects to the registry
        Zend_Registry::set('config',    array('meta_description' => $site->meta_description, 'meta_keywords' => $site->meta_keywords));
        Zend_Registry::set('site',      $site);
        return $site;
    }

По сути, при посадке на сайт Zend_View должен проверить, если / public / site / 1 / layouts/view/scripts/default/index/index.phtml существует и используйте его, если не используете, то /application/modules/default/views/scripts/index/index.phtml и используйте его.

Ответы [ 3 ]

1 голос
/ 23 июня 2010

Zend_View может иметь несколько путей к скриптам и будет проверять их в (обратном) порядке, пока не найдет шаблон, который ищет.

Там может быть более аккуратный способ сделать это, но для макета, в Bootstrap:

protected function _initView()
{
    Zend_Layout::startMvc(array(
        'layoutPath' => array(path1, path2),
        'layout' => 'default'
    ));
}

замените path1 и path2 на используемые пути.

Для сценариев представления, предполагая, что вы используете MVC, вам нужно манипулировать путями сценариев в представлении представления. E.g.:

$viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer');
$viewRenderer->view->setScriptPath(array(
    path1,
    path2
));

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

Помните, что пути проверяются в обратном порядке, поэтому для вашего случая path2 должен быть доменным, а path1 по умолчанию.

0 голосов
/ 27 июля 2010

Ладно, вот как у меня это работает:

Bootstrap:

protected function _initSite() {

    $this->bootstrap('db');
    $db             = $this->getPluginResource('db')->getDbAdapter();
    $site_domain    = strtolower($_SERVER['HTTP_HOST']);

    //site
    $query = $db->prepare("
        SELECT s.*, so.* 
        FROM Site AS s
        JOIN Site_Domain AS sd ON sd.site_id = s.id
        JOIN Site_Option AS so ON so.site_id = s.id 
        WHERE sd.domain = :site_domain AND s.enabled = '1'
        LIMIT 1
    ");
    $query->bindValue('site_domain', $site_domain);
    $query->execute();
    $site = $query->fetch(PDO::FETCH_OBJ);
    $query->closeCursor();

    if (empty($site)) {
        throw new exception('Unfortunately we were unable to load the site you requested via the domain you came to.');
    }

    //site definitions - we need to get away from defining global variables, so lazy
    define('SITE_ID', $site->id);

    //view helper
    $view = $this->getResource('view');
    $view->addHelperPath('My/View/Helper/', 'My_View_Helper_');

    //view plugin
    $front  = $this->getResource('FrontController');
    $plugin = new My_Controller_Plugin_View();
    $front->registerPlugin($plugin);

    Zend_Registry::set('config',    array('meta_description' => $site->meta_description, 'meta_keywords' => $site->meta_keywords));
    Zend_Registry::set('site',      $site);
    return $site;
}

Плагин:

class My_Controller_Plugin_View extends Zend_Controller_Plugin_Abstract {


    public function routeShutdown(Zend_Controller_Request_Abstract $request) {

        $this->bootstrap = Zend_Controller_Front::getInstance()->getParam('bootstrap');
        $view = $this->bootstrap->getResource('view');
        $site = Zend_Registry::get('site');

        //layout paths
        Zend_Layout::startMvc(array(
            'layout' => 'layout',
            'layoutPath' => array(
                APPLICATION_PATH.'/layouts/scripts/',
                PUBLIC_PATH.'/site/'.$site->id.'/layouts/scripts/'
            )
        ));

        $front = Zend_Controller_Front::getInstance();
        $request = $front->getRequest();
        $module = $request->getModuleName();

        //set site to view, we use alot of google anayltics code so
        $view->site = $site;

        //set title seperator
        $view->headTitle($site->title)->setSeparator(' - ');

        //add base path for layout overriding
        //$view->addBasePath(APPLICATION_PATH.'/modules/:module/views/');

        //register partials fallback path
        $view->setScriptPath(NULL);
        //$view->setScriptPath(array());
        $view->addBasePath(APPLICATION_PATH.'/modules/'.$module.'/views/');
        $view->addBasePath(PUBLIC_PATH.'/site/'.$site->id.'/layouts/templates/'.$module);
        $view->addScriptPath(APPLICATION_PATH.'/layouts/partials');
        $view->addScriptPath(PUBLIC_PATH.'/site/'.$site->id.'/layouts/partials/');

        //print_r($view);exit;

        $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer');
        //$viewRenderer->setViewBasePathSpec(PUBLIC_PATH.'/site/'.$site->id.'/layouts/templates/:module/')->initView();

    }


    public function preDispatch(Zend_Controller_Request_Abstract $request) {

    }

}
0 голосов
/ 23 июня 2010

вам нужно будет расширить Zend_View и реализовать что-то вроде каталога резервных скриптов, прежде чем выдавать исключение при попытке загрузить скрипт просмотра.

...