Zobacz pełną wersję : Dodatkowy model w widoku, problem z drugim modelem
Witam wszystkich!
Napisałem swego czasu komponent dla Joomla 1.5.x (1.5.26). Teraz pojawiła się potrzeba w kilku miejscach dopisania paru rzeczy i unowocześnienia komponentu pod joomla 2.5/3.x.
Jednak zanim nastąpi unowocześnienie potrzebna jest funkcjonalność zaszyta w jednym z modeli.
Niestety próby ładowania modelu innego niż nazwa widoku nie udaje się
Dla uproszczenia posłużę się tylko wersjami uproszczonymi kodu
Model:
defined('_JEXEC') or die();
jimport( 'joomla.application.component.model' );
class KomponentModelObliczenia extends JModel {
function cos(){
$test="Coś";
return $test;
}
// --- cut ---
}// koniec JModel
W modelu w tej wersji nie ma nic wartego powielenia jednak prawdziwy model wykonuje cały proces biznesowy oczywiście można by do każdego modelu używającego wklepać całe 5000 linii kodu tylko po co. Również pielęgnacja takiego czegoś jest uciążliwa i stosunkowo drogie w utrzymaniu. Joomla oferuje taką usługę czyli import istniejącego modelu niestety u mnie coś nie wychodzi i nie bardzo wiem dlaczego.
Widok:
defined( '_JEXEC' ) or die( 'Restricted access' );
jimport( 'joomla.application.component.view');
class KomponentViewPrezentacja extends JView
{
function display($tpl = null)
{
global $mainframe;
$model =& $this->getModel(); // natywny model - działa
var_dump($model); // zwraca obiekt jest ok.
$model_zewnetrzny =& $this->getModel("Obliczenia");// w var_dump zwraca NULL
// $model_zewnetrzny =& $this->getModel( 'Obliczenia', 'KomponentModel' );
var_dump($model_zewnetrzny);// zwraca NULL
parent::display($tpl);
}
}// koniec JView
Jakieś jeszcze pomysły na wywołanie modelu Obliczenia z widoku Prezentacja?
W kontrolerze w którym wywołujesz widok "Prezentacja", musisz do tego widoku dodać model "Obliczenia" poprzez metodę setModel:
$view->setModel($model);
i później w widoku pobierasz model tak jak napisałeś:
$model = $this->getModel("Obliczenia");
Dla uproszczenia została metoda display
defined( '_JEXEC' ) or die( 'Restricted access' );
jimport('joomla.application.component.controller') ;
/**
* Controller
*/
class Komponent extends JController {
function display()
{
$view = $this->getView ( 'prezentacja', 'html' );
$view->setModel('Obliczenia');
parent::display();
}
}// koniec
Niestety takie uruchomienie daje w wyniku białą stronę.
Masz może jakis mały przykład typu helloworld z dwoma modelami tak najszybciej uda się rozwikłać problem.
Hmm... dopiero teraz zauważyłem że pytasz o J 1.5, więc chciałbym Ci pomóc lecz ona już jest niewspierana.
Lecz jeżeli to jest błąd w temacie lub zmieniłeś wersję Joomla to włącz wyświetlanie błędów w konfiguracji globalnej.
Powodem białej strony może być Fatal Error.
Wersja obecna to j 1.5 musze to zakończyć jednak całość komponentu będę przepisywał na j 2.5 - 3.x. Aby móc również wspieranie j 1.5 muszę wykonać ostatni kawałek tak aby był funkcjonalny a ja będę mógł zająć się przesiadką na J 2 lub 3. Pozostawanie na J.5 nie jest już bezpieczne. W wersji dla 2.5-3.x będę musiał również użyć tego w podobny sposób.
Sprawdź czy klasa JView posiada metodę setModel i jakie parametry do niej przekazuje.
Sprawdź również czy dobry widok Ci pobiera za pomocą getView, może zwraca Ci false, że nie może takiego widoku odnaleźć.
Niestety nie mam żadnej wersji 1.5 aby Ci pomóc to sprawdzić.
A wersję dla joomla 2.5 lub wyżej masz?
Tak mam. W tych wersjach znajdują się metody getView() i setModel(). Sprawdź czy Ci pobiera dobry widok.
widok jest ok zaraz wrzuce var_dumpa
Jeżeli uważasz że jest ok i metoda zwraca instancje klasy JView, która Ciebie ma interesować to to można odrzucić jako problem.
Chyba że model podpinasz pod zły widok.
Popatrz w JController w metodzie display() jak ona pobiera widok i zrób tak samo :)
Biała strona: Fatal Error z modelu dodatkowego czyli non-object
widok jak widać pobrał
(teraz eksperymenty lecą na com_test)
czyli widok Test z komponentu test : TestViewTest extend JView
object(TestViewTest)#222 (13) {
["_name"]=>
string(4) "test"
["_models"]=>
array(1) {
["test"]=>
&object(TestModelTest)#223 (4) {
["_name"]=>
string(4) "test"
["_db"]=>
&object(JDatabaseMySQL)#11 (18) {
["name"]=>
string(5) "mysql"
["_nullDate"]=>
string(19) "0000-00-00 00:00:00"
["_nameQuote"]=>
string(1) "`"
["_sql"]=>
string(111) "SELECT template FROM jos_templates_menu WHERE client_id = 0 AND (menuid = 0 OR menuid = 0) ORDER BY menuid DESC"
["_errorNum"]=>
int(0)
["_errorMsg"]=>
string(0) ""
["_table_prefix"]=>
string(4) "jos_"
["_resource"]=>
resource(24) of type (mysql link)
["_cursor"]=>
resource(93) of type (Unknown)
["_debug"]=>
int(0)
["_limit"]=>
int(1)
["_offset"]=>
int(0)
["_ticker"]=>
int(0)
["_log"]=>
array(0) {
}
["_utf"]=>
bool(true)
["_quoted"]=>
array(0) {
}
["_hasQuoted"]=>
bool(false)
["_errors"]=>
array(0) {
}
}
["_state"]=>
object(JObject)#224 (2) {
["_errors"]=>
array(0) {
}
["task"]=>
string(0) ""
}
["_errors"]=>
array(0) {
}
}
}
["_basePath"]=>
string(76) "/var/www/sites/*/subdomains/www/html/components/com_test"
["_defaultModel"]=>
string(4) "test"
["_layout"]=>
string(7) "default"
["_layoutExt"]=>
string(3) "php"
["_path"]=>
array(2) {
["template"]=>
array(2) {
[0]=>
string(96) "/var/www/sites/*/subdomains/www/html/templates/mbc_smart/html/com_test/test/"
[1]=>
string(93) "/var/www/sites/*/subdomains/www/html/components/com_test/views/test/tmpl/"
}
["helper"]=>
array(1) {
[0]=>
string(85) "/var/www/sites/*/subdomains/www/html/components/com_test/helpers/"
}
}
["_template"]=>
NULL
["_output"]=>
NULL
["_escape"]=>
string(16) "htmlspecialchars"
["_charset"]=>
string(5) "UTF-8"
["_errors"]=>
array(0) {
}
["baseurl"]=>
string(0) ""
}
Przeczytaj jeszcze mojego wcześniejszego posta, ponieważ go poprawiłem.
Hmm.. proszę też abyś na następny raz stosował tą samą nomenklaturę czyli jak pobieramy widok "Prezentacja" to niech będzie ten widok a nie nagle "Test"
Popatrz w JController w metodzie display() jak ona pobiera widok i zrób tak samo
tego akurat nie kumam
ps. co do test to błędy i inne tego typu kwiatki w pracującej aplikacji powodowały problemy nie do zniesienia na dłuższą metę przez użytkownikow
stąd pomysł zrobienia pustego komponentu z dwoma modelami celem prowadzenia eksperymentów.
Hmm... nie żartuj że testowałeś/rozwijałeś aplikację na "żywym organizmie".
Przyjrzałem się dokładnie Twoim Linijkom kodu.
$view = $this->getView ( 'prezentacja', 'html' );
$view->setModel('Obliczenia');
parent::display();
Do setModel() wprowadzasz instancję modelu a nie jego nazwę.
Czyli pierwsze musisz pobrać moduł, jeżeli model pobierasz w kontrolerze:
$model = $this->getModel('nazwa_module');
$view->setModel($model);
Niestety w tym wypadku to okoliczność "specjalna" cykl życia tej wersji uznałem za zamknięty juz akiś czas temu i nie miałem zamiaru jej rozwijać pod J1.5. Życie okazało się jednak bardziej przewrotne i zostałem zmuszony do dopisania pewnych funkcjonalności ktore potrzebują funkcjonalnosci ktore już są i zeby nie dublować kodu postanowilem użyc modelu który już mam ( obliczenia to tak naprawdę kalkulator płać netto/brutto z rozbiciem na poszczególne elementy i obliczające całkowity koszt pracy czyli CKP reasumując brutto powiększone o składniki kosztów ponoszonych przez pracodawce (większe o ok 21% od brutto)
Zeby nie komplikować:
Zmienię nazwę komponentu testowego na prezentacja (widok domyślny i model tak będą się teraz nazywały) czyli tak jak się nazywa to w oryginale tylko widok domyśny tam ma inną nazwę. Obliczenia zostaną obliczeniami. Chyba zaczynam łapać na czym polegał mój błąd.
Zastanawia mnie czemu nie mogłeś zrobić kopii serwisu i wrzucić ją sobie na localhosta. Dzięki temu mógłbyś sobie edytować to jak chcesz bez narażania użytkowników.
Życzę powodzenia w pisaniu komponentu.
Też warto kod dawać w znaczniki php na forum.
Jeśli chodzi o kopie to przeróbkę zaczynałem po 15 więc nikt nie pracował w tym czasie. Zrobiłem kopie bazy i całej reszty na serwerze zeby bylo na wrazie gdyby. Jak wspomniałem ten komponent jest właśnie przepisywany na joomle 3.1 z kompatybilnością dla joomla 2.5 więc wydawało się, nie ma konieczności rekonfiguracji środowiska do starej joomli i robilem to przez shella.
Co do znaczników php do je daję dla kodu php dla var_dumpa dałem code ale jak widać nie koloruje i nie wyróżnia tekstu przez co wygląda on jak bym nie dał znaczników.
Obecnie zrobiłem subdomene do celów działania i włączyłem wyświetlanie wszystkich błędów.
vBulletin® v4.2.5, Prawa przedruku © 2024 vBulletin Solutions, Inc. Wszystkie prawa zastrzeżone.
Tłumaczenie: Polskie Centrum Joomla!