Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZendFramework] Bug w Zend_View_Helper_HeadScript?
Forum PHP.pl > Forum > PHP > Frameworki
nexis
Zauważyłem dziwne zachowanie funkcji headScript()->appendScript(), która według moich obserwacji dodaje dwukrotnie ten sam kod. Robię coś źle czy to faktycznie bug?

layouts/scripts/layout.phtml
  1. <?= $this->doctype() . PHP_EOL ?>
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3.  <head>
  4.    <?= $this->headScript() ?>
  5.  </head>
  6.  <body>
  7.  ...
  8.  </body>
  9. </html>


views/scripts/index/index.phtml
  1. <?php $this->headScript()->appendScript('alert("Jeden raz czy dwa razy?");'); ?>
LBO
A czy jak dodasz do views/scripts/index/index.phtml jakiś normalny (printowany) tekst to on sie powiela?
nexis
Cytat(LBO @ 16.01.2009, 11:51:14 ) *
A czy jak dodasz do views/scripts/index/index.phtml jakiś normalny (printowany) tekst to on sie powiela?


Nie, a na dodatek jak skorzystam z innej funkcji:

  1. <?php $this->headScript()->appendFile('/js/script.js'); ?>


to problem nie występuje.
qba_rox
dziwne, u mnie taki kod dziala poprawnie (a moze to nie jest dziwne winksmiley.jpg )
sprawdz czy nie wywolujesz <?= $this->headScript() ?> 2 razy, akcja nie jest wykonywana 2 razy albo czy twoj widok nie jest renderowany dwa razy smile.gif

edit

  1. <?php $this->headScript()->appendFile('/js/script.js'); ?>

metoda ta sprawdza cze wczesniej plik nie zostal dodany do stosu, wiec to musi dzialac tongue.gif
nexis
Cytat(qba_rox @ 16.01.2009, 13:04:39 ) *
sprawdz czy nie wywolujesz <?= $this->headScript() ?> 2 razy, akcja nie jest wykonywana 2 razy albo czy twoj widok nie jest renderowany dwa razy smile.gif

Zauważyłem, że problem występuje wtedy, gdy choć raz odwołam się do View Helper, który mam zdefiniowany następująco:

views/helpers/Acl.php
  1. <?php
  2. class Alt_View_Helper_Acl extends Zend_View_Helper_Abstract
  3. {
  4.   public function Acl($controller, $action)
  5.   {
  6.      $acl  = Zend_Registry::get('acl');
  7.      $auth = Zend_Auth::getInstance();
  8.      if (!$auth->hasIdentity()) return false;
  9.      $role = $auth->getStorage()->read()->role;
  10.      
  11.      return $acl->isAllowed($role, $controller, $action);
  12.   }
  13. }
  14. ?>


bootstrap.php
  1. <?php
  2. defined('APPLICATION_PATH')
  3.   or define('APPLICATION_PATH', dirname(__FILE__));
  4.  
  5. defined('APPLICATION_ENVIRONMENT')
  6.    or define('APPLICATION_ENVIRONMENT', 'development');
  7.  
  8. $frontController = Zend_Controller_Front::getInstance();
  9. $frontController->setControllerDirectory(APPLICATION_PATH . '/controllers');
  10. $frontController->setParam('env', APPLICATION_ENVIRONMENT);
  11.  
  12. Zend_Layout::startMvc(APPLICATION_PATH . '/layouts/scripts');
  13. $view = Zend_Layout::getMvcInstance()->getView();
  14. $view->doctype('XHTML1_STRICT');
  15. $view->addHelperPath('views/helpers/', 'Alt_View_Helper');
  16.  
  17. $configuration = new Zend_Config_Ini(APPLICATION_PATH . '/config/app.ini', APPLICATION_ENVIRONMENT);
  18.  
  19. $dbAdapter = Zend_Db::factory($configuration->database);
  20. $dbAdapter->query('SET NAMES utf8');
  21. Zend_Db_Table_Abstract::setDefaultAdapter($dbAdapter);
  22.  
  23. require_once APPLICATION_PATH . '/models/Acl.php';
  24. require_once APPLICATION_PATH . '/models/Auth.php';
  25. $auth = Zend_Auth::getInstance();
  26. $acl  = new Acl($auth);
  27. $frontController->registerPlugin(new Auth($auth, $acl))
  28.                ->setParam('auth', $auth);
  29.                
  30. $registry = Zend_Registry::getInstance();
  31. $registry->configuration = $configuration;
  32. $registry->dbAdapter     = $dbAdapter;
  33. $registry->acl           = $acl;
  34.  
  35. unset($frontController, $view, $configuration, $dbAdapter, $registry);
  36. ?>


Ktoś widzi przyczynę?
qba_rox
nie, podany kod helpera nie ma prawa generowac podwojnie twojego js'a
nexis
Cytat(qba_rox @ 17.01.2009, 02:17:20 ) *
nie, podany kod helpera nie ma prawa generowac podwojnie twojego js'a

Może masz zatem pomysł gdzie szukać przyczyny? Podaję niżej dokładniejsze zachowanie:

layouts/scripts/layout.phtml
  1. <head>
  2.   <?php $this->headScript()->prependFile('http://www.google.com/jsapi'); ?>
  3.   <?= $this->headScript() ?>
  4. </head>


views/scripts/index/index.phtml
  1. <?php $this->headScript()->appendScript('google.load("jquery", "1.2.6");'); ?>
  2. <?php $this->headScript()->appendFile('/js/index/index.js'); ?>


Kod wynikowy, gdy nie użyję nigdzie w widoku funkcji:
  1. <?php if($this->Acl('index', 'index')): ?><!-- cos --><?php endif; ?>


  1.   <script type="text/javascript" src="http://www.google.com/jsapi"></script>
  2.   <script type="text/javascript">
  3.      //<![CDATA[
  4.      google.load("jquery", "1.2.6");
  5.      //]]>
  6.   </script>
  7.   <script type="text/javascript" src="/js/index/index.js"></script>
  8. </head>


a tak, gdy użyję funkcję $this->Acl():

  1.   <script type="text/javascript" src="http://www.google.com/jsapi"></script>
  2.   <script type="text/javascript">
  3.      //<![CDATA[
  4.      google.load("jquery", "1.2.6");
  5.      //]]>
  6.   </script>
  7.   <script type="text/javascript" src="/js/index/index.js"></script>
  8.   <script type="text/javascript">
  9.      //<![CDATA[
  10.      google.load("jquery", "1.2.6");
  11.      //]]>
  12.   </script>
  13. </head>


Jakieś pomysły?
qba_rox
naprawde dziwna sprawa, bo to ma sia nijak do podwojnego generowania. jedyne co ci moge poradzic, to uzywaj zendX_JQuery.
w ustawieniach widoku:
  1. <?php
  2. $view->addHelperPath('ZendX/JQuery/View/Helper/', 'ZendX_JQuery_View_Helper');
  3. ?>

w layout:
  1. <?php $this->jQuery()->enable(); ?>
  2. <?php echo $this->jQuery(); ?>


dodaje js z googlowego CDN. a robiac ->uiEnable(); dodaje ci biblioteke jquery ui
nexis
Cytat(qba_rox @ 17.01.2009, 15:58:07 ) *
jedyne co ci moge poradzic, to uzywaj zendX_JQuery.

Korzystam jeszcze z innych modułów, które udostępnia Google (np. swfobject), a Zend ich nie wspiera. Poza tym nie jest to rozwiązanie, ponieważ ewidentnie gdzieś jest błąd.

EDIT
Zmiana init() na preDispatch() w kontrolerach rozwiązało problem.
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.