Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZendFramework] Kontrolery, akcje itp.
Forum PHP.pl > Forum > PHP > Frameworki
wlamywacz
Witam smile.gif

Mam pytanie odnośnie kontrolerów akcji itp. Problem polega na tym, iż będę miał adresy w stylu:
localhost/admin/categories/add/

Mój kontroler:
  1. <?php
  2. class AdminController extends Zend_Controller_Action    {
  3.  
  4.    public function init() {
  5.    
  6.        $this->_helper->layout->setLayout('workers-layout');
  7.        
  8.        $this->layout = new Zend_Layout();
  9.        $this->layout->title = "Panel administracyjny";
  10.        
  11.        $response = $this->getResponse();
  12.        $response->insert('menu', $this->view->render('menu-admin.phtml'));  
  13.        
  14.    }
  15.  
  16.    public function indexAction()  {
  17.    
  18.    }
  19.    
  20.    public function categoriesAction() {
  21.        
  22.        $categories = new Categories();
  23.        
  24.        $this->view->categories = $categories->getTree();
  25.        
  26.    }
  27. }
  28. ?>


I teraz w akcji categories musiałbym zrobić switcha żeby obsłużyć ten dodatkowy parametr. Czy jest jakiś sposób na rozwiązanie tego ?

Pozdrawiam
EarthCitizen
Najlepiej chyba jak podzielisz sobie wszystko na moduły: http://framework.zend.com/manual/en/zend.c...er.modular.html

wtedy
admin - modul
categories - controller
add - akcja

Trochę bardziej logicznie, prawda?
wlamywacz
Dzięki o to chodziło, a czy jest jakaś możliwość w konfiguracji ustawić stały layout i patche dla danego modułu ?
qbatoja
ja w swoim cms, mam podzial na aplikacje. frontendowa i backendowa. jesli rozpoznal na poczatku sciezki /admin, to usuwa go i ustawia katalog modolow odpowiednio. co do stalego layoutu dla modulu, to napisz sobie plugin, ktory w preDispatch bedzie ustawial layout. dzial pluginy w zend_controller
EarthCitizen
Ja kwestię layoutu mam rozwiązaną w xmlu i działa to tak:

  1. <?xml version='1.0' encoding='utf-8' ?>
  2. <request-layouts>
  3.  
  4.    <module>
  5.        <controller>
  6.            <action>frontend/default</action>
  7.        </controller>
  8.    </module>
  9.  
  10.    <administrator>
  11.        <controller>
  12.            <action>backend/default</action>
  13.        </controller>
  14.        <user>
  15.            <login>backend/login</login>
  16.        </user>
  17.    </administrator>
  18.  
  19. </request-layouts>


Mam klasę Plugin_Controller, którą rejestruję do front controllera
  1. <?php
  2. $front->registerPlugin(new Plugin_Controller());
  3. ?>


a w tej klasie

  1. <?php
  2. public function routeShutdown(Zend_Controller_Request_Abstract $request)
  3.    {
  4.        $module     = $request->getModuleName();
  5.        $controller = $request->getControllerName();
  6.        $action     = $request->getActionName();
  7.  
  8.        try {
  9.            $requestLayout = new Zend_Config_Xml('request-layouts.xml', $module);
  10.        } catch (Exception $exception) {
  11.            $requestLayout = new Zend_Config_Xml('request-layouts.xml', 'module');
  12.        }
  13.  
  14.        if (isset($requestLayout->$controller->$action)) {
  15.            $layoutController = $controller;
  16.            $layoutAction     = $action;
  17.        } else {
  18.            $layoutController = 'controller';
  19.            $layoutAction     = 'action';
  20.        }
  21.  
  22.        $options = array(
  23.            'layout'     => $layoutName,
  24.            'layoutPath' =>
  25.            'view' =>
  26.        );
  27.  
  28.        $layout = Zend_Layout::startMvc($options);
  29.  
  30.    }
  31. ?>


W taki sposób mam domyślny layout dla wszystkich modułów, kontrolerów i akcji, ale też dla każdego modułu, kontrolera i akcji mogę sobie ustawić inny.
wlamywacz
Niestety dostaje komunikat:
Cytat
Catchable fatal error: Argument 1 passed to Zend_Layout::setView() must implement interface Zend_View_Interface, string given, called in E:\Serwer\Apache\Zend\library\Zend\Layout.php on line 240 and defined in E:\Serwer\Apache\Zend\library\Zend\Layout.php on line 496


Ok poradziłem sobie, parametr view w tablicy wywalał błąd. Zrobiłem to w ten sposób:
  1. <?php
  2. $frontController->registerPlugin(new ViewPlugin($config->layouts->toArray()));
  3. ?>

  1. <?php
  2. class ViewPlugin extends Zend_Controller_Plugin_Abstract
  3. {
  4.  
  5.    private $config;
  6.    
  7.    public function __construct($config) {
  8.    
  9.        $this->config = $config;
  10.    
  11.    }
  12.    
  13.    public function preDispatch(Zend_Controller_Request_Abstract $request) {
  14.    
  15.        $module = $request->getModuleName();
  16.            
  17.        if(!isset($this->config[$module])) {
  18.            
  19.            $array = array(
  20.            'layoutPath' => $this->config['default']['layoutPatch'],
  21.            'layout' => $this->config['default']['layout']
  22.            );
  23.            
  24.            $viewPatch = $this->config['default']['viewPatch'];
  25.            
  26.        } else {
  27.            
  28.            $array = array(
  29.            'layoutPath' => $this->config[$module]['layoutPatch'],
  30.            'layout' => $this->config[$module]['layout']
  31.            );
  32.            
  33.            $viewPatch = $this->config[$module]['viewPatch'];
  34.            
  35.        }    
  36.            
  37.        Zend_Layout::startMvc($array);
  38.            
  39.        $view = Zend_Layout::getMvcInstance()->getView();
  40.        $view->doctype('XHTML1_STRICT');
  41.        $view->addScriptPath($viewPatch);
  42.        
  43.    }
  44.    
  45. }
  46. ?>


Na moje potrzeby w zupełności wystarcza smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.