2010-02-03 7 views
10

W moim pliku layout.phtml mam:Zend: Gdzie/jak mogę zarejestrować pomocników widoku niestandardowego?

<?php echo $this->Test(); ?> 

Stworzyłem widok Test pomocnika w application/views/helpers/Test.php

<?php 

class My_View_Helper_Test extends Zend_View_Helper_Abstract { 

    public function Test() { 
     return 'test'; 
    } 

} 

A mój plik konfiguracyjny @configs/application.ini:

resources.view[] = '' 
resources.view.helperPath = APPLICATION_PATH "/views/helpers" 

Błąd pojawia się:

Zend_Loader_PluginLoader_Exception: Wtyczka o nazwie "Test" nie została znaleziona w rejestrze; Używane ścieżki: Zend_View_Helper_: Zend/View/Helper /:./ views/pomocników/w /usr/share/php/Zend/Loader/PluginLoader.php on line 406

W podobnym tonie nie mogę zarejestrować moim zdaniem administracja pomocnika albo ..

resources.view.helperPath.Admin_View_Helper = APPLICATION_PATH "/modules/admin/views/helpers" 

My modules/admin/views/helpers/AdminPanel.php:

<?php 

class My_View_Helper_AdminPanel extends Zend_View_Helper_Abstract { 

public function AdminPanel() { return 'test'; } 

} 

Czy mam innego wyboru, jak zrobić jes s w Bootstrap z addHelperPath? Jeśli tak, to czy ktoś może pokazać, w jaki sposób wykorzystałbym moje ścieżki?

+0

w swojej pierwszej, ty chcieć wstawić przedrostek do tej helperPath ... 'resouces.view.helperPath.My_View_Helper =' – gnarf

+0

Również: 'resources.view [] = ''' nie ma sensu jako dyrektywa INI, może być z tobą wkurzająca ... – gnarf

Odpowiedz

13

Korzystanie application.ini jest prawdopodobnie najlepszym sposobem definiowania tych. I umieścić wszystkie moim zdaniem pomocników w moim folderze Library:

includePaths.library = APPLICATION_PATH "/../library" 
autoloadernamespaces.0 = "SNTrack_" 

; -- Note, these are the only resources.view lines I have... 
resources.view.doctype = "XHTML1_STRICT" 
resources.view.helperPath.SNTrack_View_Helper = APPLICATION_PATH "/../library/SNTrack/View/Helper" 

struktura katalogów:

/ 
    application/ 
    library/ 
    SNTrack/ 
     View/ 
     Helper/ 
      Test.php 

View:

$this->test('test') 

SNTrack/View/Helper/test.php:

class SNTrack_View_Helper_Test extends Zend_View_Helper_Abstract { 
    public function test($args) { return $args; } 
} 
+0

Próbowałem tego, co skomentowałeś, 'resources.view.helperPaths.My_View_Helper = APPLICATION_PATH"/views/helper "', ale nadal nie może znaleźć 'Test'. Czy masz ochotę opublikować swoją strukturę pracy, używając tylko pliku ini? –

+0

Wybieram to jako odpowiedź, ponieważ dostarczyłeś mi strukturę katalogów, chociaż sposób, w jaki to rozwiązałem, polegał na przeniesieniu funkcji ładowania początkowego, która dodała kodowanie/typ doctyku do widoku na początku, przed innymi metodami inicjowania i jakoś to naprawiłem. –

+0

@meder - Powinieneś być w stanie usunąć wszystkie pliki typu doctype/encoding/etc z bootstrapu łącznie, zastępując je odpowiednimi dyrektywami konfiguracyjnymi (które, jestem całkiem pewny, używają sztuczki '[]' nie działa w INI) - Jeśli zauważysz, że nie ładuje on twoich ustawień wystarczająco szybko '$ this-> boostrap ('view');' u góry twojej funkcji '_initApp()' w twoim bootstrapie powinno odczytać/ustawić wszystkie ustawienia . – gnarf

1

w moim bootstrap:

$view = new Zend_View(); 
$view->addHelperPath(DE_Config::get('DE_appDir').DIRECTORY_SEPARATOR.'lib'.DIRECTORY_SEPARATOR.'DE'.DIRECTORY_SEPARATOR.'View'.DIRECTORY_SEPARATOR.'Helper'.DIRECTORY_SEPARATOR, 'DE_View_Helper'); 
$viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer(); 
$viewRenderer->setView($view); 
Zend_Controller_Action_HelperBroker::addHelper($viewRenderer); 
+0

Stała DIRECTORY_SEPARATOR doskonale nadaje się do wywoływania ścieżek plików explode(), ale nie jest konieczna do określenia ścieżki dołączania. Ukośniki naprzód działają dobrze na platformach Windows i * nix. (Tylko FYI) – Sonny

1

Właśnie miałem ten dokładny problem, d zdałam sobie sprawę, że było to spowodowane problemem w moim bootstrapie: zdefiniowałem i użyłem nowego obiektu Zend_View w jednej z moich funkcji _init, które, jak sądzę, nadpisało wszystkie inne moje ustawienia widoku zarówno z pliku bootstrap, jak i mojego pliku application.ini (w tym moja resource.view.helperPath definicja).Kod naruszającym przepisy zostały ślepo kopiować z here, i umieszcza się w funkcji _initJQuery() w moim bootstrap, który wyglądał tak:

protected function _initJQuery() { 
    $view = new Zend_View(); 
    $view->addHelperPath('ZendX/JQuery/View/Helper/', 'ZendX_JQuery_View_Helper'); 

    $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer(); 
    $viewRenderer->setView($view); 
    Zend_Controller_Action_HelperBroker::addHelper($viewRenderer); 
} 

Rozwiązaniem było zastąpić pierwszy wiersz ($ view = new Zend_View()) z tego:

$this->bootstrap('view'); 
$view = $this->getResource('view'); 

Inną rzeczą, aby mieć na uwadze, dotyczące linii:

resources.view.helperPath = APPLICATION_PATH "/ views/pomocnicy"

Należy zauważyć, że rejestruje się tylko ścieżkę, a nie prefiks klasy, więc działa to tylko wtedy, gdy klasy pomocnicze mają domyślny prefiks klasy Zend Zend_View_Helper, tj. Zend_View_Helper_Test. Jeśli chcesz być My_View_Helper_Test klasa, to trzeba to zrobić:

resources.view.helperPath.My_View_Helper = APPLICATION_PATH "/ views/pomocnicy"

Powiązane problemy