PDA

Zobacz pełną wersję : Dodatkowy model w widoku, problem z drugim modelem



seeb
21-10-2013, 10:44
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?

KES
21-10-2013, 11:02
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");

seeb
30-10-2013, 14:39
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.

KES
30-10-2013, 16:11
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.

seeb
30-10-2013, 16:45
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.

KES
30-10-2013, 22:05
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ć.

seeb
30-10-2013, 22:35
A wersję dla joomla 2.5 lub wyżej masz?

KES
30-10-2013, 22:57
Tak mam. W tych wersjach znajdują się metody getView() i setModel(). Sprawdź czy Ci pobiera dobry widok.

seeb
30-10-2013, 23:03
widok jest ok zaraz wrzuce var_dumpa

KES
30-10-2013, 23:10
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 :)

seeb
30-10-2013, 23:11
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) ""
}

KES
30-10-2013, 23:18
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"

seeb
30-10-2013, 23:37
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.

KES
31-10-2013, 00:13
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);

seeb
31-10-2013, 00:30
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.

KES
31-10-2013, 10:19
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.

seeb
31-10-2013, 12:37
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.