Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZF] Jak uzyskać baseUrl w bootstrap
Forum PHP.pl > Forum > PHP > Frameworki
amii
Dopiero co zaczynam zabawę z Zend i mam taki problem. Jako placeholder chcę umieścić linki do skryptów i css w layout.phtm w tym celu napisałem sobie prostego helpera jest umieszczony w katalogu: my_project/application/views/helpers/BaseUrl.php
  1. <?php
  2. class Zend_view_Helper_BaseUrl {
  3.  
  4. function baseUrl() {
  5. $fc = Zend_controller_front::getInstance();
  6. return $fc->getBaseUrl();
  7. }
  8.  
  9. }

Następnie w layout.phtml umieszczam instrukcje
  1. <?php echo $this->headLink()->appendStylesheet($this->baseUrl().'/css/main.css') ? //działa>
  2. <?php echo $this->headScript()->prependFile($this->baseUrl().'/js/jquery-1.5.2.min.js'); ? //nie działa>

Próbowałem z bootstrap ale nie wiem jak tam wywołać funkcję zwracającą baseUrl
grOm
Po co piszesz własny helper jak istnieje zendowski ?
w layoucie wywołujesz go przez $this->baseUrl('sciezka/do/pliku')
a w bootstrapie po prostu Zend_Controller_Front::getInstance()->getBaseUrl() . 'sciezka/do/pliku'
Zwróć uwagę na wielkość liter masz :
class Zend_view_Helper_BaseUrl
$fc = Zend_controller_front::getInstance();
powinno byc :
class Zend_View_Helper_BaseUrl
darko
W Bootstrapie nie dobierzesz się do baseUrl z tego powodu, że aplikacja jeszcze nie "wystartowała". Można natomiast użyć odpowiedniego zapisu dirname(__FILE__).
amii
Niestety ani jeden ani drugi sposób nie działa. Aplikacja jest uruchamiana na lokalnym serwerze. Wygląda to tak jeśli dam w bootstrap.php
  1. $fc = Zend_Controller_Front::getInstance()->getBaseUrl();
  2.  
  3. $view->headScript()->prependFile(dirname(__FILE__).'/js/jquery-1.5.2.min.js'); //<script type="text/javascript" src="/home/piotr/public_html/zend/seoprecel/application/js/jquery-1.5.2.min.js"></script> sciezka niepoprawna dziala tylko na stronie glownej
  4.  
  5. $view->headScript()->prependFile($fc.'/js/jquery-ui.js'); //<script type="text/javascript" src="/js/jquery-ui.js"></script> sciezka niepoprawna dziala tylko na stronie glownej


Plik layout.phtml
  1. <?php echo $this->headLink()->appendStylesheet($this->baseUrl().'/css/main.css') ? //<link href="/piotr/zend/seoprecel/css/main.css" media="screen" rel="stylesheet" type="text/css" /> dziala poprawnie>
  2. <?php echo $this->headScript() ?>


Jak wywalę z bootstrap.php i dodam do layout.phtml dostaje
  1. <?php //echo $this->headScript() ?>
  2. <?php echo $this->headScript()->prependFile($this->baseUrl().'/js/jquery-1.5.2.min.js'); ?>
  3. <?php echo $this->headScript()->prependFile($this->baseUrl().'/js/jquery.ennui.contentslider.js'); ?>


Dostaje (skrypty nie działają nigdzie poza stroną główną po za tym nie mam pojęcia skąd to się wczytuje):
  1. <link href="/piotr/zend/seoprecel/css/main.css" media="screen" rel="stylesheet" type="text/css" /><link href="/piotr/zend/seoprecel/css/main.css" media="screen" rel="stylesheet" type="text/css" />
  2. <link href="/piotr/zend/seoprecel/css/jquery.ennui.contentslider.css" media="screen" rel="stylesheet" type="text/css" /><script type="text/javascript" src="/piotr/zend/seoprecel/js/jquery-1.5.2.min.js"></script>
  3. <script type="text/javascript" src="/js/admin.js"></script>
  4. <script type="text/javascript" src="/js/jquery.ennui.contentslider.js"></script>
  5. <script type="text/javascript" src="/js/jquery.ui.touch.js"></script>
  6.  
  7. <script type="text/javascript" src="/js/jquery-ui.js"></script>
  8. <script type="text/javascript" src="/home/piotr/public_html/zend/seoprecel/application/js/jquery-1.5.2.min.js"></script><script type="text/javascript" src="/piotr/zend/seoprecel/js/jquery.ennui.contentslider.js"></script>
  9. <script type="text/javascript" src="/piotr/zend/seoprecel/js/jquery-1.5.2.min.js"></script>
  10. <script type="text/javascript" src="/js/admin.js"></script>
  11. <script type="text/javascript" src="/js/jquery.ennui.contentslider.js"></script>
  12. <script type="text/javascript" src="/js/jquery.ui.touch.js"></script>
  13. <script type="text/javascript" src="/js/jquery-ui.js"></script>
  14. <script type="text/javascript" src="/home/piotr/public_html/zend/seoprecel/application/js/jquery-1.5.2.min.js"></script>
  15.  


Struktura katalogów wygląda tak:
Kod
/application/
        bootstrap.php

    /configs/
            application.ini

    /controllers/
            ErrorController.php
            IndexController.php

    /layouts/
            /scripts/
               layout.phtml

       /models/
            /views/
                 /helpers/
                 /scripts/
                      /error/
                      /index/
                              index.phtml
                              kontakt.phtml
                              mixer.phtml
                              program.phtml
                              user.phtml
/library/

/css/
  pliki css
/img/
  pliki zdjęć
/js/
  pliki ze skryptami js
/library/
/test/

index.php
.htaccess
.zfproject.xml
grOm
Hmm to z tym bootstrapem rzeczywiscie nie działa troche sie pośpieszyłem smile.gif
w layout zrób coś takiego :
  1. <?
  2. if ($this->jQuery()->isEnabled()) {
  3. $this->jQuery()
  4. ->setLocalPath($this->baseUrl('js/jquery/js/jquery-1.4.4.min.js'));
  5. if ($this->jQuery()->uiIsEnabled()) {
  6. $this->jQuery()
  7. ->setUiLocalPath($this->baseUrl('js/jquery/js/jquery-ui-1.8.9.custom.min.js'))
  8. ->addJavaScriptFile($this->baseUrl('js/jquery.ui.nestedSortable.js'))
  9. ->addJavaScriptFile($this->baseUrl('js/jquery/js/jquery-ui-timepicker-addon.min.js'))
  10. ->addJavaScriptFile($this->baseUrl('js/jquery/js/jquery.cleditor.min.js'))
  11. ->addStylesheet($this->baseUrl('js/jquery/css/start/jquery-ui-1.8.9.custom.css'))
  12. ->addStylesheet($this->baseUrl('js/jquery/css/jquery.cleditor.css'));
  13. }
  14. echo $this->jQuery();
  15. }
  16. ?>


i np w jakims controlerze chcesz miec jquery wywołujesz :
$this->view->jQuery()->enable();
a jak chcesz razem z ui: to
$this->view->jQuery()->enable();
$this->view->jQuery()->uiEnable();
i to działa na 100%

W bootstrapie hmm tak patrze na swoje projekty to ja korzystam w tym celu z pluginu ktory napisalem i zarejestrowalem w bootstrapie przez :
$this->bootstrap('layout');
$layout = $this->getResource('layout');
$view = $layout->getView();
$fc = Zend_Controller_Front::getInstance();
$fc->registerPlugin(new Plugin_ViewHelper($view));
..no i w srodku tego pluginu w zaleznosci od modulu ładuje skrypty/style poprzez
$this->_view->headLink()->appendStylesheet(Zend_Controller_Front::getInstance()->getBaseUrl().'/style/style.css');
$this->_view->headLink()->appendStylesheet(Zend_Controller_Front::getInstance()->getBaseUrl().'/style/shop_default.css');
i to działa tez na 100%
amii
grOm trochę zbyt zakręcone jak dla mnie ale dzięki za pomoc i szybkie odpowiedzi
Chyba udało mi się znaleźć rozwiązanie, które wygląda w miarę schludnie i przejrzyście oto one smile.gif
bootstrap.php
  1. protected function _initPlaceholders()
  2. {
  3. //set the front controller request to initilize baseUrl in bootstrap
  4. $this->bootstrap('FrontController');
  5. $front = $this->getResource('FrontController');
  6. $request = new Zend_Controller_Request_Http();
  7. $front->setRequest($request);
  8.  
  9. //grab the view and set the doctype:
  10. $this->bootstrap('view');
  11. $view = $this->getResource('view');
  12. $view->doctype('XHTML1_STRICT');
  13.  
  14. // Set the initial title and separator:
  15. $view->headTitle('Seo precel')
  16. ->setSeparator(' :: ');
  17.  
  18. // Set the initial stylesheet:
  19. $view->headLink()->appendStylesheet($this->view->baseUrl('css/main.css'));
  20. $view->headLink()->appendStylesheet($this->view->baseUrl('css/jquery.ennui.contentslider.css'));
  21.  
  22. // Set the initial JS to load:
  23. $view->headScript()->appendFile($this->view->baseUrl('js/jquery-1.5.2.min.js')); //w przypadku jQuery trzeba zachować właściwą kolejność plików
  24. $view->headScript()->appendFile($this->view->baseUrl('js/jquery-ui.js'));
  25. $view->headScript()->appendFile($this->view->baseUrl('js/jquery.ui.touch.js'));
  26. $view->headScript()->appendFile($this->view->baseUrl('js/jquery.ennui.contentslider.js'));
  27. $view->headScript()->appendFile($this->view->baseUrl('js/admin.js'));
  28. $view->headScript()->appendFile($this->view->baseUrl('js/jquery.easing.1.3.js'));
  29. }


layout.phtml wygląda dzięki temu bardzo przejrzyście a dodatkowe skrypty i style można doczepiać w kontrolerach i akcjach
  1. <?php echo $this->doctype() ?>
  2. <html xml:lang="pl" xmlns="http://www.w3.org/1999/xhtml" lang="pl">
  3.  
  4. <head>
  5. <meta name="Description" content="Seo precel to program do automatycznego pozycjonowania stron www. Robot umożliwia skuteczne pozycjonowanie w Google na własną rękę. Dodawarka w pełni automatycznie realizuje dodawanie do katalogów wordpress.">
  6. <meta name="Keywords" content="seo precel, dodawarka do wordpress, pozycjonowanie stron">
  7. <meta http-equiv="Content-type" content="text/html; charset=UTF-8">
  8.  
  9. <?php echo $this->headTitle() ?>
  10. <?php echo $this->headLink() ?>
  11. <?php echo $this->headScript() ?>
  12.  
  13. </head>
  14.  
  15. //some other code
  16.  
  17.  
  18. //warto zwrócić uwagę na to poniżej, bo skrypt bez poprawek nie wczytuje grafik co może sugerować, że nie ładuje się JS
  19. <!-- Site JavaScript -->
  20. <?php echo
  21. '<script type="text/javascript">
  22. $(function() {
  23. $(\'#top\').ContentSlider({
  24. leftBtn : \''.$this->baseUrl().'/img/slider_left_control.png\',
  25. rightBtn : \''.$this->baseUrl().'/img/slider_right_control.png\',
  26. width : \'360px\',
  27. height : \'200px\',
  28. speed : 600,
  29. easing : \'easeOutQuint\'
  30. });
  31. });
  32. </script>';
  33. ?>
KrzysiekWildfire
A ja się tak zastanawiam, czy trzeba bawić się z Base_Url - może spróbuj coś takiego:
  1. $view->headScript()->appendFile('/js/jquery-ui.js');

slash na początku powinien załatwić sprawę
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.