Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZF] Przekazanie ścieżki do kontrolera
Forum PHP.pl > Forum > PHP > Frameworki
Wolfie
Witam,

Mam oto taki kod widoku index.phtml

  1. <?php echo $this->headLink()->appendStylesheet($this->baseUrl().'/ext/resources/css/ext-all.css') ?>
  2. <?php echo $this->headLink()->appendStylesheet($this->baseUrl().'/ext/resources/css/xtheme-gray.css') ?>
  3.  
  4. <?php echo $this->headScript()->setFile($this->baseUrl().'/ext/adapter/ext/ext-base.js') ?>
  5. <?php echo $this->headScript()->setFile($this->baseUrl().'/ext/ext-all-debug.js') ?>
  6. <?php echo $this->headScript()->setFile($this->baseUrl().'/ext_grid.js') ?>
  7.  
  8. <script type="text/javascript">
  9. basePath("<?php echo $this->baseUrl(); ?>");
  10. </script>
  11.  
  12. <div id="container">
  13. </div>


Załączam sobie bibliotekę ext js, ostatni z załączników to plik js który korzysta z biblioteki ext js, w nim tez znajduje się funkcja basePath którą widać w znacznikach <script> i tam chcę przekazać sobie scieżkę do kontrolera, niestety $this->baseUrl przekazuje mi tam ścieżkę do katalogu public, w jaki sposob mam skonfigurować zenda zebym w base url mógł się odwołać do kontrolera

Chciałbym żeby wyglądało to np tak :

$this->baseUrl()."/kontroler/akcja

czyli chciałbym w $this->baseUrl mieć ścieżkę do application/controllers nie zas do pubic

Edit--------------------


Zrobiłem sobie helper który wygląda tak :

  1. class Zend_View_Helper_BaseUrl{
  2.  
  3. function baseUrl(){
  4.  
  5. return Zend_Controller_Front::getInstance()->getControllerDirectory('default');
  6.  
  7. }
  8.  
  9. }


No i teraz jako $this->baseUrl() mam cos takiego :

Cytat
"C:\Program Files (x86)\Zend\Apache2\htdocs\Zend_Ext_prj\application/controllers"


Ale po pewnych testach i debugach aplikacji doszedlem do wniosku ze tak na prawdę potrzbuję zwrócić taki string :

Cytat
/Zend_ext_prj/application/controllers


gdzie Zend_ext_prj to nazwa mojego projektu z zendem, wiadomo o co chodzi winksmiley.jpg

Czy ktoś może mnie naprowadzić jak to zwrócić ?
zend
Zupełnie nie rozumiem czemu chcesz ujawnić strukturę swojej aplikacji. Wszystko poza public nie powinno byś widoczne. W tymże katalogu tworzysz katalogi odpowiadające kontrolerom i akcją, nadpisujesz helper url tak aby usuwał "index.php" - o ile będzie to konieczne.
  1. echo str_replace('/index.php' , '' , $this -> url(array('controller' => 'ss' , 'action' => 'yy') , 'my route' , true));


Jeśli już chcesz używać swojej metody skorzystaj ze stałej DIRECTORY_SEPARATOR a na windowsie bedziesz mial \ a na serwerze /
Wolfie
Cytat(zend @ 20.06.2010, 00:48:58 ) *
nadpisujesz helper url tak aby usuwał "index.php" - o ile będzie to konieczne.
  1. echo str_replace('/index.php' , '' , $this -> url(array('controller' => 'ss' , 'action' => 'yy') , 'my route' , true));



nie rozumiem w którym miejscu mam użyć powyższej linijki?

Gdy wsawiam ją do widoku index.phtml wtedy dostaje komunikat serwera :

Cytat
The server encountered an internal error or misconfiguration and was unable to complete your request.


Jestem zielony jeśli chodzi o zenda, prosiłbym o łopatologiczne wytłumaczenie,

poprostu potrzebuję w widoku ścieżkę do danego wybranego przeze mnie kontrolera i to cała filozofia, ale szperam i szperam i ciągle jakieś błędy lub właśnie komunikaty takie jak powyższe

Może ktos krok po kroku mi powiedzieć jakie elementy powinienem posiadać (jakie klasy powinienem uzupełnić w zendzie) aby moje zamierzenie sie udało ? nie chodzi o dokładną odpowiedz lecz jakie elementy składowe są niezbędne do zakończenia operacji sukcesem ? winksmiley.jpg
zend
Tak spróbuj, bardziej łopatologicznie się już nie da blink.gif
  1. echo str_replace('/index.php' , '' , $this -> url(array('controller' => 'ss' , 'action' => 'yy') , null , true));


Albo w kontrolerze
  1. echo str_replace('/index.php' , '' , $this -> view -> url(array('controller' => 'ss' , 'action' => 'yy') , null , true));
Wolfie
Użyłem Twojego rozwiązania w ten sposob w pliku index.phtml

  1. <?php echo $this->headLink()->appendStylesheet($this->baseUrl().'/ext/resources/css/ext-all.css') ?>
  2. <?php echo $this->headLink()->appendStylesheet($this->baseUrl().'/ext/resources/css/xtheme-gray.css') ?>
  3.  
  4. <?php echo $this->headScript()->setFile($this->baseUrl().'/ext/adapter/ext/ext-base.js') ?>
  5. <?php echo $this->headScript()->setFile($this->baseUrl().'/ext/ext-all-debug.js') ?>
  6. <?php echo $this->headScript()->setFile($this->baseUrl().'/ext_grid.js') ?>
  7.  
  8.  
  9.  
  10. <script type="text/javascript">
  11. basePath("<?php echo $this -> url(array('controller' => 'index' , 'action' => 'data') , null , true); ?>");
  12. </script>
  13.  
  14. <div id="container">
  15. </div>


Ale ścieżka którą dostaje znowu prowadzi do katalogu public ! nie zaś do kontrolera, więc jak w końcu to działa bo czegoś tutaj nie rozumiem, myślałem że to zwróci mi ścieżkę do kontrolera bezpośrednio, czyli mniej wiecej tak

Zend_Ext_prj/application/controllers/controller/action bo czegoś takiego potrzebuję, potrzebuję sie odwołać do konkretniego kontrolera z poziomu pliku ext_grid.js który wygląda tak :

[JAVASCRIPT] pobierz, plaintext
  1. function basePath(base_path)
  2. {
  3. this.base = base_path
  4. }
  5. Ext.onReady(function(){
  6.  
  7. //Ext.Msg.alert('Status', 'Ext configured successfully.');
  8.  
  9. var store = new Ext.data.JsonStore({
  10. url: this.base,
  11. baseParams: {
  12. method : 'POST'
  13. },
  14. fields: [
  15. {name: 'id'},
  16. {name: 'name'},
  17. {name: 'author'},
  18. {name: 'descr'},
  19. {name: 'type'}
  20. ],
  21. remoteSort: false
  22. });
  23.  
  24. var colModel = new Ext.grid.ColumnModel([
  25. {id: 'id', header: 'Id', dataIndex: 'id', hidden: true },
  26. {id: 'name', header: 'Name', dataIndex: 'name', sortable: true, width: 100},
  27. {id: 'author', header: 'Author', dataIndex: 'author', sortable: true, width: 150},
  28. {id: 'descr', header: 'Description', dataIndex: 'descr', sortable: true},
  29. {id: 'type', header: 'Type', dataIndex: 'type', sortable: true}
  30. ]);
  31.  
  32. var grid = new Ext.grid.GridPanel({
  33. store: store,
  34. cm: colModel,
  35. title: 'Grid',
  36. autoExpandColumn: 'descr',
  37. autoHeight: true
  38. })
  39.  
  40. store.load();
  41. grid.render('container');
  42. });
[JAVASCRIPT] pobierz, plaintext


metoda basePath wywolywana w pliku index.phtml ma przekazać scieżkę i usatwić zmienną this.base

następnie this.base uzyta w tym kawalku kodu :

[JAVASCRIPT] pobierz, plaintext
  1. var store = new Ext.data.JsonStore({
  2. url: this.base,
  3. baseParams: {
  4. method : 'POST'
  5. },
[JAVASCRIPT] pobierz, plaintext


ma pobrac dane z kontrolera

Albo ja czegoś nie kumam albo Ty.....

EDIT ----------------------------------------------------------------------------------

Są pewne postępy ale niestety jeszcze nie działa snitch.gif

Przy podanym przez Ciebie rozwiązaniu przekazuje mi się taka ścieżka :

Cytat
/Zend_ext_prj/public/index/data


Ale w odpowiedzi na request który idzie postem poprzez Ext js dostaję taki komunikat w firebugu:

Cytat
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /Zend_Ext_prj/public/index.php was not found on this server.</p>
<p>Additionally, a 404 Not Found
error was encountered while trying to use an ErrorDocument to handle the request.</p>
</body></html>


Eleganco wyświetla sie javascript ale przez powyzszy komunikat nie dostaje on zadnych danych z kontrolera.....

W firebugu sciezka do szukanego pliku wyglada tak :

Cytat


Dlatego właśnie nie znajduje pliku, więc jak teraz mam przekierowac tego posta zeby dostawal dane z kontrolera ?

zend
Przecież w błędzie jest jasno napisane czemu nie działa... A kliknięcie na link działa?
Wolfie
Jasne ze klikniecie na link zwraca ten sam błąd, przeciez w publicu nie ma takiego katalogu ani pliku, przeciez index to ma byc kontroler a data to ma byc akcja....
zend
Cytat(Wolfie @ 21.06.2010, 21:04:39 ) *
Jasne ze klikniecie na link zwraca ten sam błąd, przeciez w publicu nie ma takiego katalogu ani pliku, przeciez index to ma byc kontroler a data to ma byc akcja....

Trzeba było nie usuwać .htaccess'a! Masz jakiekolwiek pojęcie jak wykonywane są zapytania?? Pewnie nie, więc odpowiem, lecą do public/index.php, a on wywołuje stosowne kontrolery, bo jak już zapewne zuważyłeś instancje kontrolerów nie są tworzone w w plikach z definicjami. Więc jeszcze raz, co chcesz? Fizyczną ścieżkę do kontrolera? Czy adres url? Jeśli już nie masz zamiaru przywracać .htaccess'a, to odwołuj się przez .../public/index.php (w pasku przeglądarki żeby była jasność)
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.