Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [ZendFramework]layout.phtml i powtarzające się skrypty i arkusze css w źródle strony
darko
post 6.02.2010, 16:17:50
Post #1





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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. }


Ten post edytował darko 6.02.2010, 16:23:44


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
batman
post 6.02.2010, 17:04:22
Post #2





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




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.


--------------------
I would love to change the world, but they won't give me the source code.
My software never has bugs. It just develops random features.
Go to the top of the page
+Quote Post
darko
post 6.02.2010, 17:37:06
Post #3





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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. }


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
batman
post 6.02.2010, 18:13:14
Post #4





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




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.


--------------------
I would love to change the world, but they won't give me the source code.
My software never has bugs. It just develops random features.
Go to the top of the page
+Quote Post
darko
post 6.02.2010, 19:02:11
Post #5





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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

Ten post edytował darko 7.02.2010, 15:27:18


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 24.07.2025 - 17:52