2012-05-02 25 views
5

Zaczynam od rozwoju php i Joomla, a znalezienie Joomli sprawia, że ​​praca z nią jest dość prosta. Przeszedłem przez przykład Joomla MVC i Lyndę (i do tej pory zbudowaliśmy kilka prostych widoków).Joomla: wywołanie funkcji pomocnika z poziomu modelu?

Mam plik/klasę/funkcję pomocnika, która wyprowadza wszystkie identyfikatory, które istnieją w "ukończonej" tabeli, dzięki czemu mogę wyświetlić łącze dla nowego rekordu na podstawie tego użytkownika lub edytować rekord istniejącego użytkownika.

Z powodzeniem użyłem już innej funkcji w tym pliku pomocniczym w innej części komponentu (Joomla: Write and call a helper function in a component).

Kiedy robię to samo w modelu, otrzymuję to: "Błąd krytyczny: wywołanie metody chronionej JModel :: _ createFileName() z kontekstu" JView "w C: \ wamp \ www \ ilplocal \ library \ joomla \ application \ component \ view.php on line 773 ". Kiedy próbuję go w widoku, działa dobrze - ale potrzebuję wyjścia w modelu.

Kod:

lookups.php

abstract class LookupHelper { 

    public function other_functions($vars){ 
     ... 
    } 

    public function completions_exist() { 

     $db =& JFactory::getDBO();    
     $query = $db->getQuery(true); 

     $query->SELECT(' #__completed.completed_userid as UserID'); 
     $query->FROM (' #__completed'); 
     $query->GROUPBY (' #__completed.completed_userid '); 

     $db->setQuery($query);  
     $result = $db->loadResultArray(0); 

     return $result;       

    }   
} 

W modelu

$completions_exist = Jview::loadHelper('lookups'); 
$completions_exist = LookupHelper::completions_exist(); 

Linia ta jest rzucanie błąd: $completions_exist = Jview::loadHelper('lookups');

Znalazłem kilka naprawdę niejasne odniesienia do czegoś o nazwie JLoader :: register, aby pobrać funkcje pomocnicze bu Nie można znaleźć żadnej dobrej dokumentacji na ten temat w Joomli, chyba że wszyscy mówią, żeby po prostu z tego skorzystać. Więc próbowałem go używać tak:

JLoader::register('LookupHelper', dirname(JPATH_COMPONENT_ADMINISTRATOR).DS.'helpers'.DS.'lookups.php'); 
$completions_exist = LookupHelper::completions_exist(); 

który generuje ten błąd: „Fatal error: Class 'LookupHelper' nie został odnaleziony w katalogu C: \ wamp \ ścieżka \ do \ modelu \ nie \ do \ lookups.php. Próbowałem manipulować JLoader :: register (wszystko tutaj) i nie ma wpływu na ścieżkę komunikatu o błędzie

Myśli? Dlaczego działa w widoku, a nie w modelu? Jak korzystać z funkcji pomocnika w ramach modelu?

Dzięki!

##### EDIT

Dzięki @cppl wygląda na to, że jest to problem z drugim bitem kodu. Czytałem również, że .DS. notacja zostaną wycofane w przyszłych wersjach - więc kod, który działa jest:

JLoader::register('LookupHelper', JPATH_COMPONENT_ADMINISTRATOR.'/helpers/lookups.php'); 
$completions_exist = LookupHelper::completions_exist(); 

Odpowiedz

4

Umożliwia podzielenie go:

  1. w Joomla! plik pomocnika komponentów powinien znajdować się w `/mycomponent/helpers/lookup.php '

  2. JLoader:: to Joomla! sposób na zrobienie tego, ale równie dobrze możesz użyć PHP require_once np. require_once JPATH_COMPONENT_ADMINISTRATOR.'/helpers/myfunctions.php';

  3. Czy Twoja ścieżka jest właściwa? - dostarczasz dirname(JPATH_COMPONENT_ADMINISTRATOR).DS.'helpers'.DS.'lookups.php', ale zawinąłeś ścieżkę do swojego komponentu w dirname which will the parent element of the path only. Tak więc JLoader szuka w /administrator/helpers/lookups.php.

  4. JPATH_COMPONENT_ADMINISTRATOR zostaje zainicjowany w ramach Joomla! renderComponent() rozmowy w to JComponentHelper klasa jeśli stosuje dirname do niego, gdy nie jest to konfiguracja będzie wrócić kropkę (katalog bieżący tzn.), Więc w tym modelu można było by przekazywać ./helpers/lookups.php do połączenia JLoader.

+0

1) Sprawdź. 2) To było częściowe wywracanie z mojej strony - tak, działało 3) Ahhhhhh - nie wiedziałem, że to było wywołanie PHP, powtórzyłem ścieżkę i dostosowałem ją do momentu, kiedy było dobrze. Niesamowite! 4) ahh, rozumiem! Wszelkie pomysły, dlaczego 'Jview :: loadHelper ('lookups');' rzucił błąd? Myślałem, że tak to robisz, teraz nie jestem pewien, kiedy go użyć. Dziękuję bardzo! – Gisto

+1

Cieszę się, że mogę Ci pomóc. Błąd prawdopodobnie dlatego, że ścieżka zaczyna się od "." co jest równoznaczne z bieżącym katalogiem. – Craig

0

można wywołać pomocnika wewnątrz modelu poprzez następujący sposób:

JLoader::import('helpers.events', JPATH_COMPONENT);

ten obejmie pomocników pliku/events.php z katalogu komponentu.

$_helper = new EventsHelper(); echo $_helper->getAnyInsideMethod();exit;