Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZendFramework]layout.phtml i powtarzające się skrypty i arkusze css w źródle strony
Forum PHP.pl > Forum > PHP > Frameworki
darko
Witam. Mam następujący problem: podzieliłem aplikację na moduły i wprowadziłem layout, w którym załączam skrypty js i arkusze css w następujący sposób (fragment pliku layout.phtml):

  1. <?php echo $this->doctype()."\n" ?>

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl">
<head>
  1. <?php
  2. echo $this->headMeta()."\n";
  3. echo $this->headTitle()."\n";
  4. echo $this->headLink()->prependStylesheet($this->baseUrl()."POPRAWNA_SCIEZKA/skrypt.css")."\n";
  5. echo $this->headScript()->appendFile($this->BaseUrl() . 'POPRAWNA_SCIEZKA/skrypt.js')."\n";
  6. ?>

</head><body>
Jednak ku mojemu zaskoczeniu te same skrypty i arkusze są dołączane kilka razy, tak, że wychodzi na to, że zamiast ok. 13-stu pozycji mam... 66 (!) i dość poważny problem. Jak zakomentuję linie, w których dodaję te skrypty i arkusze, to w ogóle ani jednego nie dołączy.
I teraz pytanie: Jak/co zrobić, aby te skrypty dołączały się tylko raz i nie powtarzały w źródle strony?

To wrzucę jeszcze fragment Bootstrap.php:
  1. protected function _initViewHelpers() {
  2.  
  3. $this->bootstrap("layout");
  4. $layout = $this->getResource("layout");
  5. $view = $layout->getView();
  6.  
  7. $view->doctype("XHTML1_TRANSITIONAL");
  8. $view->headMeta()->appendHttpEquiv('Content-Type','text/html; charset=UTF-8');
  9. $view->headMeta()->appendHttpEquiv('Content-Language','pl-PL')
  10. // read from SEO table(?):
  11. ->appendName("description","Login page");
  12.  
  13. $view->headTitle()->setSeparator(" - ");
  14. $view->headTitle("TEST");
  15.  
  16. $navContainerConfig = new Zend_Config_Xml(APPLICATION_PATH."/configs/navigation.xml", "nav");
  17. $navContainer = new Zend_Navigation($navContainerConfig);
  18. $view->navigation($navContainer)->setAcl($this->_acl)->setRole(Zend_Registry::get("role"));
  19. }
batman
Podobny problem miałem, gdy korzystałem z _forward w kontrolerze. Przy czym u mnie duplikowała się zawartość znacznika title. Niestety nie znalazłem eleganckiego rozwiązania tego problemu. W moim przypadku pomogło wyczyszczenie title i wstawienie wszystkiego od nowa.
Pokaż cały kod pliku z layoutem, cały główny bootstrap i bootstrapy modułów (jeśli coś w nich jest), application.ini oraz metodę init i akcję kontrolera, w którym treść jest zduplikowana.
darko
layout.phtml:
  1. <?php echo $this->doctype()."\n" ?>
  2. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl">
  3. <head>
  4. <?php
  5. echo $this->headMeta()."\n";
  6. echo $this->headTitle()."\n";
  7.  
  8. echo $this->headLink()->prependStylesheet($this->baseUrl()."/application/modules/default/views/css/style.css")."\n";
  9. echo $this->headLink()->prependStylesheet($this->BaseUrl().'/application/modules/default/views/css/jscal2/jscal2.css')."\n";
  10. echo $this->headLink()->prependStylesheet($this->BaseUrl().'/application/modules/default/views/css/jscal2/border-radius.css')."\n";
  11. echo $this->headLink()->prependStylesheet($this->BaseUrl().'/application/modules/default/views/css/jscal2/steel.css')."\n";
  12.  
  13. echo $this->headScript()->appendFile($this->BaseUrl() . '/application/modules/default/views/js/jscal2/jscal2.js')."\n";
  14. echo $this->headScript()->appendFile($this->BaseUrl() . '/application/modules/default/views/js/jscal2/lang/en.js')."\n";
  15.  
  16. echo $this->headScript()->appendFile($this->BaseUrl() . '/application/modules/default/views/js/ckeditor/ckeditor.js')."\n";
  17. echo $this->headScript()->appendFile($this->BaseUrl() . '/application/modules/default/views/js/ckeditor/_samples/sample.js')."\n";
  18.  
  19. echo $this->headLink()->prependStylesheet($this->BaseUrl().'/application/modules/default/views/css/ckeditor/_samples/sample.css')."\n";
  20. echo $this->headLink()->prependStylesheet($this->BaseUrl()."/application/modules/default/views/css/prettyPhoto.css", "screen,projection")."\n";
  21. echo $this->headLink()->prependStylesheet($this->BaseUrl() . "/application/modules/default/views/js/pagination/css/jq.css", "screen,projection")."\n";
  22. echo $this->headLink()->prependStylesheet($this->BaseUrl() . "/application/modules/default/views/js/pagination/themes/blue/style.css", "screen,projection")."\n";
  23. echo $this->headLink()->prependStylesheet($this->BaseUrl() . "/application/modules/default/views/js/slide_menu/jqueryslidemenu.css", "screen,projection")."\n";
  24. echo $this->headScript()->appendFile($this->BaseUrl() . '/application/modules/default/views/js/slide_menu/jquery.min.js')."\n";
  25. echo $this->headScript()->appendFile($this->BaseUrl() . '/application/modules/default/views/js/slide_menu/jqueryslidemenu.js')."\n";
  26. // echo $this->headStyle();
  27. // echo $this->headScript()."\n";
  28. ?>
  29. <script type="text/javascript">
  30. $(function() {
  31. $("table")
  32. .tablesorter({widthFixed: true, widgets: ['zebra']})
  33. .tablesorterPager({container: $("#pager")});
  34. });
  35. </script>
  36. </head>
  37. <body>
  38. <div id="myslidemenu" class="jqueryslidemenu">
  39. <?php echo $this->navigation(); ?>
  40. </div>
  41. <div id="content">
  42. <?php echo $this->layout()->content; ?>
  43. </div>
  44. </body>
  45. </html>


Bootstrap.php (główny, te w modułach są puste, więc nie ma sensu ich pokazywać)
  1. class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
  2. {
  3. private $_acl = null;
  4.  
  5. protected function _initAutoload()
  6. {
  7. Zend_Loader_Autoloader::getInstance()->suppressNotFoundWarnings(false);
  8. $autoloader = new Zend_Application_Module_Autoloader(array(
  9. 'namespace' => '',
  10. 'basePath' => APPLICATION_PATH . '/modules/default'
  11. ));
  12.  
  13. if(Zend_Auth::getInstance()->hasIdentity()) {
  14. Zend_Registry::set("role", Zend_Auth::getInstance()->getStorage()->read()->role);
  15. } else {
  16. Zend_Registry::set("role", "guest");
  17. }
  18.  
  19. $this->_acl = new Model_Acl();
  20.  
  21. $fc = Zend_Controller_Front::getInstance();
  22. $fc->registerPlugin(new Plugin_AccessCheck($this->_acl));
  23. $fc->registerPlugin(new Plugin_RegisterSettings("settings"));
  24.  
  25. return $autoloader;
  26. }
  27.  
  28. protected function _initViewHelpers() {
  29.  
  30. $this->bootstrap("layout");
  31. $layout = $this->getResource("layout");
  32. $view = $layout->getView();
  33.  
  34. $view->doctype("XHTML1_TRANSITIONAL");
  35. $view->headMeta()
  36. ->appendHttpEquiv('Content-Type','text/html; charset=UTF-8')
  37. ->appendHttpEquiv('Content-Language','pl-PL')
  38. ->appendName("description","Login page");
  39.  
  40. $view->headTitle()->setSeparator(" - ");
  41. $view->headTitle("TEST");
  42.  
  43. $navContainerConfig = new Zend_Config_Xml(APPLICATION_PATH."/configs/navigation.xml", "nav");
  44. $navContainer = new Zend_Navigation($navContainerConfig);
  45. $view->navigation($navContainer)->setAcl($this->_acl)->setRole(Zend_Registry::get("role"));
  46. }
  47.  
  48. }


application.ini
[production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
;includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
resources.modules = ""

resources.db.adapter = pdo_mysql
resources.db.params.host = localhost

resources.db.params.username = HAHA
resources.db.params.password = HEHE
resources.db.params.dbname = HIHI

resources.layout.layoutpath = APPLICATION_PATH "/layouts"

[staging : production]

[testing : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1

[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1

IndexController.php
  1. class IndexController extends Zend_Controller_Action
  2. {
  3.  
  4. private $_user = null;
  5. private $_role = null;
  6. private $_login = null;
  7.  
  8. public function init()
  9. {
  10. $this->_user = Zend_Auth::getInstance()->getStorage()->read();
  11. $this->_role = $this->_user->role;
  12. $this->_login = $this->_user->login;
  13. }
  14.  
  15. public function indexAction()
  16. {
  17. if(Zend_Auth::getInstance()->getIdentity()->account_status == 0) {
  18. Zend_Auth::getInstance()->clearIdentity();
  19. $this->_redirect('authenticate/login/blocked/1');
  20. }
  21. }
  22.  
  23. }
batman
Sprawa wydaje się prosta. Opiszę w punktach co powinno pomóc. Potem napiszę kilka uwag, a na koniec wyjaśnię potencjalną przyczynę problemów.

1. Usuń z pliku layout.phtml wszystkie headLink i headScript i zamiast tego wstaw
  1. echo $this->headLink();
  2. echo $this->headScript();


2. W pliku bootstrap dodaj metodę np _initHtml, a w niej:
  1. protected function _initHtml()
  2. {
  3. $this->bootstrap('view');
  4. $view = $this->getResource('view');
  5.  
  6. $view->headLink()->appendStylesheet('/css/plik1.css');
  7. $view->headLink()->appendStylesheet('/css/plik2.css');
  8. $view->headLink()->appendStylesheet('/css/plik3.css');
  9.  
  10. $view->headScript()->appendFile('/js/plik1.css');
  11. $view->headScript()->appendFile('/js/plik2.css');
  12. $view->headScript()->appendFile('/js/plik3.css');
  13. }

Oczywiście pamiętaj o ustawieniu popranych ścieżek.

Co do uwag, to jest taki zasób jak View i możesz nie musisz wyciągać obiektu widoku z layoutu. Metodę _initViewHelpers podzieliłbym na dwie. Elementy odpowiedzialne za treść html (tytuł, meta, itp) przeniósł do jednej metody (np _initHtml), a nawigację do np _initNavigation. Podobnie z resztą można zrobić w puginami. Nie pasują do _initAutoload.

A teraz dlaczego tak się działo. Każdy wiersz:
  1. echo $this->headLink()->prependStylesheet($this->baseUrl()."/application/modules/default/views/css/style.css")."\n";
wywołuje helper widoku headLink. Do każdego wywołania dokładasz kolejny plik i go wywołujesz. Po którymś z kolei wywołaniu tego helpera i dołożenia kolejnego pliku, masz pokaźne stadko plików do dołączenia. Tak to przynajmniej wygląda na sucho.
darko
ok działa, dzięki ~batman
Ja tylko dodam, co zrobiłem:

Bootstrap.php

  1. protected function _initHtml() {
  2. $this->bootstrap("layout");
  3. $layout = $this->getResource("layout");
  4. $view = $layout->getView();
  5. $url = '/test';
  6. // css
  7. $view->headLink()->appendStylesheet($url."/application/modules/default/views/css/style.css");
  8. $view->headLink()->appendStylesheet($url.'/application/modules/default/views/css/jscal2/jscal2.css');
  9. $view->headLink()->appendStylesheet($url.'/application/modules/default/views/css/jscal2/border-radius.css');
  10. $view->headLink()->appendStylesheet($url.'/application/modules/default/views/css/jscal2/steel.css');
  11. $view->headLink()->appendStylesheet($url.'/application/modules/default/views/css/ckeditor/_samples/sample.css');
  12. $view->headLink()->appendStylesheet($url."/application/modules/default/views/css/prettyPhoto.css");
  13. $view->headLink()->appendStylesheet($url . "/application/modules/default/views/js/pagination/css/jq.css");
  14. $view->headLink()->appendStylesheet($url . "/application/modules/default/views/js/pagination/themes/blue/style.css");
  15. $view->headLink()->appendStylesheet($url . "/application/modules/default/views/js/slide_menu/jqueryslidemenu.css");
  16. // js
  17. $view->headScript()->appendFile($url . '/application/modules/default/views/js/jscal2/jscal2.js');
  18. $view->headScript()->appendFile($url . '/application/modules/default/views/js/jscal2/lang/en.js');
  19. $view->headScript()->appendFile($url . '/application/modules/default/views/js/ckeditor/ckeditor.js');
  20. $view->headScript()->appendFile($url . '/application/modules/default/views/js/ckeditor/_samples/sample.js');
  21. $view->headScript()->appendFile($url . '/application/modules/default/views/js/slide_menu/jquery.min.js');
  22. $view->headScript()->appendFile($url . '/application/modules/default/views/js/slide_menu/jqueryslidemenu.js');
  23. }


layout.phtml:
  1. <?php echo $this->doctype()."\n" ?>
  2. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl">
  3. <head>
  4. <?php
  5. echo $this->headMeta()."\n";
  6. echo $this->headTitle()."\n";
  7. echo $this->headLink()."\n";
  8. echo $this->headScript()."\n";
  9. ?>


i... guitar.gif
Na marginesie: dziwne, że w Bootstrap.php jak w miejsce $url wstawię Zend_Controller_Front::getInstance()->getBaseUrl(); to nie działa (pusto)
// edit
nie dziwota, Front_Controller jeszcze nie istnieje, w końcu jesteśmy dopiero w Bootstrap
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.