Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZF] problem z modul/kontroler/akcja
Forum PHP.pl > Forum > PHP > Frameworki
phpion
Hejka,
mam kolejny problem z ZF, walczyłem wczoraj do 1 w nocy no i dziś do teraz, w końcu się poddałem. Zamierzenie mam takie:
http://localhost/
odpala modul 'frontend', kontroler 'index' oraz akcję 'index' (aktualnie działa również http://localhost/frontend, http://localhost/frontend/index, http://localhost/frontend/index/index więc tu jest OK).
Równocześnie chciałbym aby wejście w:
http://localhost/admin
odpalało moduł 'admin', kontroler 'index' oraz akcję 'index' co niestety aktualnie się nie dzieje :/ Pomimo usilnych prób print_r($frontController->getRequest()) zawsze pokazje admina jako akcję, a nie moduł. W manualu znalazłem przykład:
  1. <?php
  2. // Assuming the following:
  3. $ctrl->setControllerDirectory(
  4. 'default' => '/path/to/default/controllers',
  5. 'news' => '/path/to/blog/controllers',
  6. 'blog' => '/path/to/blog/controllers'
  7. )
  8. );
  9. ...
  10. Module + controller + action + params:
  11. <a href="http://example/blog/archive/list/sort/alpha/date/desc" target="_blank">http://example/blog/archive/list/sort/alpha/date/desc</a>
  12. module  == blog
  13. controller == archive
  14. action  == list
  15. sort  == alpha
  16. date  == desc
  17. ?>

czyli dokładnie to, czego potrzebuję jednak nie bardzo chce to działać sad.gif Robię to tak:
index.php
  1. <?php
  2. require_once('../config.php');
  3. require_once('../__autoload.php');
  4.  
  5. $db = Zend_Db::factory('Pdo_'.DB_TYPE, array('host' => DB_HOST, 'username' => DB_USER, 'password' => DB_PASS, 'dbname' => DB_BASE));
  6. $db->setFetchMode(1);
  7. $ctrls = array(
  8. 'frontend' => PATH_MODULES.'/frontend/controllers',
  9. 'admin' => PATH_MODULES.'/admin/controllers'
  10. );
  11.  
  12. $frontController = Zend_Controller_Front::getInstance();
  13. $frontController->setControllerDirectory($ctrls);
  14. $frontController->setDefaultModule('frontend');
  15. $frontController->setParam('db', $db);
  16.  
  17. Zend_Controller_Front::run(array(PATH_MODULES.'/admin/controllers', PATH_MODULES.'/frontend/controllers'));
  18.  
  19. echo '<pre>';
  20. print_r($frontController->getRequest());
  21. ?>

Zauważyłem, że jeśli zmienię kolejność w tablicy przekazywanej do Zend_Controller_Fron::run() to zawsze używany jest ten ostatni moduł.
Reasumując: w jaki sposób zmusić ZF aby:
http://localhost/ (+ ew. parametry) ładowało dane z 'frontend' <- myślałem, że osiągnę to przez $frontController->setDefaultModule('frontend');
http://localhost/admin (+ ew. parametry) ładowało dane z 'admin'.
Uproszczona struktura moich katalogów:
  1. /
  2. --- app
  3. ------ admin
  4. --------- controllers
  5. --------- models
  6. --------- views
  7. ------ frontend
  8. --------- controllers
  9. --------- models
  10. --------- views
  11. --- www
  12. ------ .htaccess
  13. ------ index.php
  14. --- __autoload.php
  15. --- config.php

Proszę o pomoc bo nie wiem jak to ugryźć :/
wolditm
Primo
po co 2 razy robić to samo czyli
  1. <?php
  2. Zend_Controller_Front::run( $params );
  3. ?>

jak wystarczy
  1. <?php
  2. $frontController = Zend_Controller_Front::getInstance();
  3. $frontController->setControllerDirectory($ctrls);
  4. $frontController->setDefaultModule('frontend');
  5. $frontController->setParam('db', $db);
  6. $frontController->dispatch();
  7. ?>


na przyszłość:
Zend_Controller_Front::run() robi to co wyżej miałes w kodzie czyli getInstance()+setModules+dispatch

Duo:
Jeżeli zrobiłeś coś takiego:
  1. <?php
  2. $ctrls = array(
  3. 'frontend' => PATH_MODULES.'/frontend/controllers',
  4. 'admin' => PATH_MODULES.'/admin/controllers'
  5. );
  6. ?>


to twoje controllery powinny wyglądać tak*:
  1. <?php
  2. class Admin_IndexController extends Zend_Controller_Action
  3.  {
  4. // reszta
  5.  }
  6. ?>


//czyli wzór jest
class MODUŁ_NAZWAController extends
-----
* wzór jest do modułów innych niż default czyli u Ciebie przy Frontend robisz standardowo IndexController
phpion
Serdeczne dzieki za pomoc! 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.