Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZendFramework] Po podzieleniu na moduły (admin, default) nie chcą działać widoki.
Forum PHP.pl > Forum > PHP > Frameworki
Sajrox
Witam,

Wybaczcie że tak bombarduje to forum ale co rusz mam jakieś problemy z ZF sad.gif

Myślałem że już wszystko jest ok gdy nagle pojawił się problem, duży problem. Mimo skorzystania z manuala nie udało się go rozwiązać.

Otóż:
Podzieliłem aplikacje na moduły: admin i default. Tym samym musiałem użyć:
  1. $frontController->setControllerDirectory(...);

Do prawidłowego odnajdywania Kontrolerów. Jednak problem jest z widokami. Standardowo gdy miałem jeden moduł wystarczyło w application.ini dodać:
  1. ;Views
  2. resources.view.encoding = "UTF-8"
  3. resources.view.basePath = APPLICATION_PATH "/MODULES/views"


Teraz gdy moduły mam podzielone na admin i default drzewo prezentuje się mniej więcej tak (model okrojony):

/application
-- /MODULES
----- /admin
---------- /controllers
---------- /views
---------- /layouts
----- /default
---------- /controllers
---------- /views
---------- /layouts


W tym momencie dostaje błąd:
  1. Zend_View_Exception: script 'error/error.phtml' not found in path (\views\scripts\;C:\wamp\www\zend_quickstart\application\MODULES\scripts\) in C:\wamp\www\zend_quickstart\library\Zend\View\Abstract.php on line 926


gdy w application.ini na sztywno podam dobrą ścieżkę
  1. ...
  2. resources.view.basePath = APPLICATION_PATH "/MODULES/admin/views"
  3. ...

Wszystko jest ok. Tylko że ja muszę tą ścieżkę dynamicznie zmieniać wraz z modułem.

To samo tyczy się do Layout
  1. ;Layout
  2. resources.layout.layout = "layout"
  3. resources.layout.layoutPath = APPLICATION_PATH "/MODULES/layouts/scripts"


seth-kk
umm kozystasz ze standardowej organizacji plikow wiec dlaczego nie pozwolisz by sciezki organizowaly sie automatycznie?
nie musiales uzyc setControllerDirectory, wystarczyloby addModuleDirectory()
Sajrox
Masz rację co do tej funkcji ale z tego co widzę to niestety dalej nie widzi widoków bez podania bezpośredniej ściezki z nazwą modułu sad.gif

Może wkleje kod który stosuję:

  1. error_reporting(E_ALL|E_STRICT);
  2. ini_set('display_errors', true);
  3. date_default_timezone_set('Europe/Warsaw');
  4.  
  5. # =====>
  6. # Define path to application directory
  7. define('BASE_PATH', realpath(dirname(__FILE__) . '/../'));
  8. define('APPLICATION_PATH', BASE_PATH . '/application');
  9. # <=====
  10.  
  11.  
  12. # =====>
  13. # Include path
  14. '.'
  15. . PATH_SEPARATOR . BASE_PATH.'/library'
  16. . PATH_SEPARATOR . APPLICATION_PATH.'/assistant'
  17. . PATH_SEPARATOR . APPLICATION_PATH.'/db_models'
  18. . PATH_SEPARATOR . APPLICATION_PATH.'/db_models/db_classes'
  19. . PATH_SEPARATOR . APPLICATION_PATH.'/db_models/db_classes/generated'
  20. );
  21. # <=====
  22.  
  23.  
  24. # =====>
  25. # Define application environment
  26. defined('APPLICATION_ENV')
  27. || define('APPLICATION_ENV',
  28. (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV')
  29. : 'production'));
  30. # <=====
  31.  
  32.  
  33. # =====>
  34. # Załadowanie bibliotek
  35. require_once('Zend/Application.php');
  36. require_once('/../functions/php.php');
  37. require_once('Doctrine.php');
  38. # <=====
  39.  
  40.  
  41. # =====>
  42. # Załadowanie pluginów
  43. require_once('plugins/Doctrine.php');
  44. require_once('plugins/ModelDirectory.php');
  45. # <=====
  46.  
  47.  
  48. # =====>
  49. # Inicjacja Front Kontrolera
  50. $application = new Zend_Application(APPLICATION_ENV, 'main_configs/application.ini');
  51.  
  52. $frontController = Zend_Controller_Front::getInstance();
  53. $frontController->throwExceptions(true);
  54.  
  55. $frontController->setModuleControllerDirectoryName('controllers');
  56. $frontController->addModuleDirectory(APPLICATION_PATH.'/MODULES');
  57. $frontController->setParam('useDefaultControllerAlways', true);
  58.  
  59. $config = new Zend_Config_Ini('main_configs/routes.ini', null);
  60. $router = $frontController->getRouter();
  61. $router->addConfig($config, 'routes');
  62. $frontController->setRouter($router);
  63. # <=====
  64.  
  65.  
  66. # =====>
  67. # Inicjacja pluginów
  68. $frontController->registerPlugin(new Plugin_ModelDirectory());
  69. $frontController->registerPlugin(new Plugin_Doctrine());
  70. # <=====
  71.  
  72.  
  73. # =====>
  74. # Konfiguracja bazy danych
  75. $configDb = new Zend_Config_Ini('main_configs/db.ini', 'database'); // Ładuje ustawienia z pliku db.ini w sekcji [database]
  76. $connection = Plugin_Doctrine::connect($configDb); // Połaczenie z bazą
  77. # <=====
  78.  
  79.  
  80. # =====>
  81. # Start application
  82. $application->bootstrap();
  83. $application->run();
  84. # <=====


Bootstrap.php
  1. class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
  2. {
  3. protected function _initAutoload()
  4. {
  5. $autoloader = new Zend_Application_Module_Autoloader(array(
  6. 'namespace' => '',
  7. 'basePath' => APPLICATION_PATH,
  8. ));
  9.  
  10. return $autoloader;
  11. }
  12.  
  13. protected function _initDoctype()
  14. {
  15. Zend_Layout::startMvc();
  16. }
  17. }


application.ini
  1. [production]
  2. ;Debug output
  3. phpSettings.display_startup_errors = 0
  4. phpSettings.display_errors = 0
  5.  
  6. ;Include path
  7. ;includePaths.library = BASE_PATH "/library"
  8.  
  9. ;Bootstrap
  10. bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
  11. bootstrap.class = "Bootstrap"
  12.  
  13. ;Front Controller
  14. resources.frontController.moduleDirectory = APPLICATION_PATH "/MODULES"
  15. resources.frontController.controllerDirectory =
  16. resources.frontController.env = APPLICATION_ENV
  17.  
  18. ;Models DB
  19. resources.modules.modulesPath = APPLICATION_PATH "/db_models"
  20.  
  21. ;Views
  22. resources.view.encoding = "UTF-8"
  23. ;resources.view.basePath = APPLICATION_PATH "/MODULES/admin/views"
  24.  
  25. ;Session
  26. resources.session.save_path = APPLICATION_PATH "/../data/session"
  27. resources.session.remember_me_seconds = 864000
  28.  
  29. resources.navigation = "array()"


Błąd który otrzymuje
  1. Zend_View_Exception: script 'index/index.phtml' not found in path (\views\scripts\) in C:\wamp\www\zend_quickstart\library\Zend\View\Abstract.php on line 926


Pomożcie koledzy, już na łeb dostaje od tego :/
seth-kk
Nie widze tego wyzej ale czy tworzysz widok recznie i podajesz go layoutowi? Jesli tak to to sprawia problem i rozwiazaniem bedzie pozwolic stworzyc mu sie samodzielnie i dodac do niego zmiany albo recznie podac wszystkie sciezki ktorych potrzebuje (co na ogol jest przerostem formy nad trescia)
Btw co jest takiego fajnego w konfigach w plikach *.ini?
Sajrox
O w mordę exclamation.gif Wywalilem z Zend_Application plik application.ini i wszystko śmiga elegancko.


Co do widoków robię to tak:
1. Tworze widok np index/index.phtml
2. Umieszczam do w application/MODULES/admin/views/scripts/

I kontroler już am pobiera ten widok.

layout.phtml wygląda tak:
  1. <?= $this->doctype(); ?>
  2. <html lang="pl">
  3. <head>
  4. <?= $this->HeadMeta(); ?>
  5. <?= $this->headTitle(); ?>
  6. <?= $this->headLink() ?>
  7. <?= $this->headScript() ?>
  8. </head>
  9. <body>
  10. <div class="kontener">
  11. <div class="top">
  12. <div class="zalogowany_jako">
  13. Zalogowany jako:
  14. </div>
  15. <div class="logo">
  16. <img src="<?php echo $this->baseUrl() ?>/admin/images/logo.gif">
  17. </div>
  18. <div class="nawigacja">
  19. <? if (isset($this->navigation)) : ?>
  20. <? foreach ($this->navigation as $v) : ?>
  21. <? if ($v->active == true) : ?>
  22. <a href="<?= $v->getHref(); ?>" class="active"> <?= $v->label ?></a>
  23. <?php
  24. $subnavigation = $v->pages;
  25. ?>
  26. <? else : ?>
  27. <a href="<?= $v->getHref(); ?>"> <?= $v->label ?></a>
  28. <? endif; ?>
  29.  
  30. <? endforeach; ?>
  31. <? endif; ?>
  32. </div>
  33. <div class="subnawigacja">
  34. <? if (isset($subnavigation)) : ?>
  35. <? foreach ($subnavigation as $v) : ?>
  36. <a href="<?= $v->getHref(); ?>" <? if ($v->active == true) echo 'class="active"'; ?>><?= $v->label ?></a>
  37. <? endforeach; ?>
  38. <? endif; ?>
  39. </div>
  40. </div>
  41. <div class="zawartosc">
  42. <div class="margin">
  43. <?php echo $this->layout()->content ?>
  44. </div>
  45. </div>
  46. </div>
  47. </body>
  48. </html>


Ale skoro już działa to chyba to już nie jest istotne smile.gif

A jeszcze jedna prosba. Byłbyś w stanie pokazać swój plik index.php i Bootstrap.php questionmark.gif Na pewno się przyda winksmiley.jpg
Chciałbym zacząć już coś klepać w Zendzie ale jak na razie to 3 dni siedze nad konfiguracją i budową struktury :/
seth-kk
moj index.php (jesli chodzi o ten glowny na ktory kieruje .htaccess) to wyglada on mniejwiecej tak jak w manualu
co do bootstrapa to ciagle pracuje nad jego budowa i narazie jest zwyklym proceduralnym plikiem ktory zaczyna sie od konfiguracji autoloadu, dalej front controller, routery, layout, ewentualnie baza i helpery
Sajrox
Ja trochę zmodyfikwoałem kod:
Może się komuś przyda winksmiley.jpg

Moj index.php
  1. date_default_timezone_set('Europe/Warsaw');
  2.  
  3. # =====>
  4. # Define path to application directory
  5. define('BASE_PATH', realpath(dirname(__FILE__) . '/../'));
  6. define('APPLICATION_PATH', BASE_PATH . '/application');
  7. # <=====
  8.  
  9. # =====>
  10. # Include path
  11. '.'
  12. . PATH_SEPARATOR . BASE_PATH.'/library'
  13. . PATH_SEPARATOR . APPLICATION_PATH.'/assistant'
  14. . PATH_SEPARATOR . APPLICATION_PATH.'/db_models'
  15. . PATH_SEPARATOR . APPLICATION_PATH.'/db_models/db_classes'
  16. . PATH_SEPARATOR . APPLICATION_PATH.'/db_models/db_classes/generated'
  17. );
  18. # <=====
  19.  
  20. require_once APPLICATION_PATH."/Initializer.php";
  21. $init = new Initializer('test');
  22. $init->routeStartup();


Initializer.php
  1. # Załadowanie bibliotek
  2. require_once('Zend/Application.php');
  3. require_once('/../functions/php.php');
  4. require_once('Doctrine.php');
  5.  
  6. # Załadowanie pluginów
  7. require_once('plugins/Doctrine.php');
  8. require_once('plugins/ModelDirectory.php');
  9.  
  10. class Initializer extends Zend_Controller_Plugin_Abstract
  11. {
  12. protected $_config_id;
  13. protected $_config_routes;
  14. protected $_env;
  15. protected $_front;
  16. protected $_root_path;
  17. protected $_application_path;
  18. protected $_application_obj;
  19.  
  20. /**
  21.   * Przypisanie odpowiednich zmiennych ($_env, $_root_path, $_application_path)
  22.   * @param string $env
  23.   * @return void
  24.   */
  25. public function __construct($env=NULL)
  26. {
  27. $this->_env = $env;
  28. $this->_root_path = BASE_PATH;
  29. $this->_application_path = APPLICATION_PATH;
  30.  
  31. // Inicjacja aplikacji
  32. $this->initApplication();
  33.  
  34. // Ustawienie obsługi błędów
  35. if ($env == 'test')
  36. {
  37. error_reporting(E_ALL | E_STRICT);
  38. ini_set('display_startup_errors', 1);
  39. ini_set('display_errors', 1);
  40. $this->_front->throwExceptions(true);
  41. }
  42. else
  43. {
  44. ini_set('display_startup_errors', 0);
  45. ini_set('display_errors', 0);
  46. $this->_front->throwExceptions(false);
  47. }
  48. }
  49.  
  50. /**
  51.   * Inicjacja plików konfiguracyjnych ini
  52.   * @return void
  53.   */
  54. public function initConfigs()
  55. {
  56. $this->_config_db = new Zend_Config_Ini('main_configs/db.ini', 'database'); // baza danych
  57. $this->_config_routes = new Zend_Config_Ini('main_configs/routes.ini', 'routes'); // ścieżka ruteru
  58.  
  59. // Dodanie zmiennych konfiguracyjnych do rejestru
  60. Zend_Registry::set('config_db', $this->_config_db);
  61. Zend_Registry::set('config_routes', $this->_config_routes);
  62. }
  63.  
  64. /**
  65.   * Inicjacja i ustawienie Aplikacji oraz Fron kontrolera
  66.   * @return void
  67.   */
  68. public function initApplication()
  69. {
  70. $this->_application_obj = new Zend_Application($this->_env);
  71. $this->_front = Zend_Controller_Front::getInstance();
  72.  
  73. $this->_front->throwExceptions(true);
  74. $this->_front->setModuleControllerDirectoryName('controllers');
  75. $this->_front->addModuleDirectory($this->_application_path.'/MODULES');
  76. }
  77.  
  78. /**
  79.   * Inicjacja Sesji
  80.   * @return void
  81.   */
  82. public function initSession()
  83. {
  84. Zend_Session::start();
  85. new Zend_Session_Namespace('DEFAULT');
  86. new Zend_Session_Namespace('ADMIN');
  87. }
  88.  
  89. /**
  90.   * Inicjacja bazy danych
  91.   * @return void
  92.   */
  93. public function initDb()
  94. {
  95. $configDb = Zend_Registry::get('config_db');
  96. $connection = Plugin_Doctrine::connect($configDb);
  97. }
  98.  
  99. /**
  100.   * Inicjacja helperów
  101.   * @return void
  102.   */
  103. public function initHelpers()
  104. {
  105. // rejetracja domyślnego helpera
  106. Zend_Controller_Action_HelperBroker::addPath('../models/default/helpers', 'Zend_Controller_Action_Helper');
  107. }
  108.  
  109. /**
  110.   * Inicjacja widoków
  111.   * @return void
  112.   */
  113. public function initView()
  114. {
  115. // Bootstrap layouts
  116. $layout = Zend_Layout::startMvc(
  117. 'layout' => 'layout',
  118. 'layoutPath' => $this->_application_path.'/MODULES/admin/layouts',
  119. 'contentKey' => 'content'
  120. )
  121. );
  122.  
  123. Zend_Registry::set('layout', $layout);
  124. }
  125.  
  126. /**
  127.   * Inicjacja pluginów
  128.   * @return void
  129.   */
  130. public function initPlugins()
  131. {
  132. $this->_front->registerPlugin(new Plugin_ModelDirectory());
  133. $this->_front->registerPlugin(new Plugin_Doctrine());
  134. }
  135.  
  136. /**
  137.   * Inicjacja rutera
  138.   * @return void
  139.   */
  140. public function initRoutes()
  141. {
  142. $router = $this->_front->getRouter();
  143. $config = Zend_Registry::get('config_routes');
  144.  
  145. $router->addConfig($config);
  146. $this->_front->setRouter($router);
  147. }
  148.  
  149. /**
  150.   * Inicjacja ścieżki do kontrolerów
  151.   * @return void
  152.   */
  153. public function initControllers()
  154. {
  155. $this->_front->setControllerDirectory(array(
  156. 'default' => $this->_application_path.'/MODULES/default/controllers',
  157. 'admin' => $this->_application_path.'/MODULES/admin/controllers'
  158. ));
  159. }
  160.  
  161. /**
  162.   * Start aplikacji
  163.   * @return void
  164.   */
  165. public function routeStartup()
  166. {
  167. $this->initConfigs();
  168. $this->initRoutes();
  169.  
  170. $this->initSession();
  171. $this->initDb();
  172. $this->initHelpers();
  173. $this->initView();
  174. $this->initPlugins();
  175. $this->initControllers();
  176.  
  177. $this->_application_obj->bootstrap();
  178. $this->_application_obj->run();
  179. }
  180. }


Bootstrap.php
  1. class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
  2. {
  3. protected function _initAutoload()
  4. {
  5.  
  6. }
  7. }


Mam jeszcze Controller.php po którym dziedziczą wszystkiem inne kontrolery z danego modułu.
  1. abstract class Globals_Controller extends Zend_Controller_Action
  2. {
  3. /* -------------------------------------------------------------------------------------------------
  4.  * Metoda ta zostanie załadowana w każdym kontrolerze
  5.  * ------------------------------------------------------------------------------------------------- */
  6. public function init()
  7. {
  8. $layout = Zend_Registry::get('layout');
  9. $this->layout = $layout; //Przypisujemy $layout do właściwości głównego kontrolera $this->layout
  10. $this->view->assign('layout', $layout); //przypisujemy $layout do szablonu
  11.  
  12. // Ustawienie strony
  13. $this->view->doctype('XHTML1_STRICT');
  14. $this->view->headMeta()->appendHttpEquiv('Content-Type', 'text/html;charset=utf-8');
  15. $this->view->headTitle()->setSeparator(' - ');
  16. $this->view->headTitle('Panel administracyjny - asticPanel 2.0');
  17. $this->view->headLink()->appendStylesheet($this->_request->getBaseUrl().'/media/'.$this->_getParam('module').'/css/style.css');
  18.  
  19. // Zmienne pomocnicze
  20. $this->view->baseUrl = $this->_request->getBaseUrl();
  21.  
  22. // Załadowanie ustawień panelu administracyjnego
  23. $module_configs = new Zend_Config_Ini('main_configs/_'.$this->_getParam('module').'.ini');
  24. Zend_Registry::set('module_configs', $module_configs);
  25.  
  26. // Utworzenie nawigacji
  27. $this->view->navigation = $this->navigation();
  28. }
  29.  
  30. /* -------------------------------------------------------------------------------------------------
  31.  * Metoda ta zostanie załadowana w każdym kontrolerze
  32.  * @return Object Zend_Navigation
  33.  * ------------------------------------------------------------------------------------------------- */
  34. public function navigation()
  35. {
  36. # Kategorie
  37. # =====>
  38. $_page =
  39. 'label' => 'Kategorie',
  40. 'action' => 'index',
  41. 'controller' => 'kategorie',
  42. );
  43.  
  44. $_page['pages'] =
  45. 'label' => 'Dodaj kategorie',
  46. 'action' => 'dodaj',
  47. 'controller' => $_page['controller']
  48. ),
  49. 'label' => 'Lista kategorii',
  50. 'action' => 'index',
  51. 'controller' => $_page['controller']
  52. ),
  53. );
  54. $pages[] = $_page;
  55. # <=====
  56.  
  57. $container = new Zend_Navigation($pages);
  58. //pr($container->toArray());
  59. return $container;
  60. }
  61. }
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.