PDA

Zobacz pełną wersję : Problem z wywołaniem metody widoku



vego007
16-07-2008, 19:52
Mam problem z wywołaniem metody w widoku

Mam:
controller - com_mvc/controllers/list.php
Widok - com_mvc/views/list/view.html.php
com_mvc/views/tmpl/klienciform.php
model - com_mvc/models/list.php

I teraz jak chciałbym z controller.php metodą edit() wskazać, że widokiem tej metody ma zająć się metoda w view.html.php o nazwie display_edit() oraz ma otworzyć się template klienciform.php

Mam nadzieję, że dobrze to opisałem a jeśli nie to z chęcią udostępnię więcej informacji ;)

Dodam jeszcze, że chodzi o formularz do edycji. W chwili obecnej mam te same ikony (taskbar) w oknie wyświetlającym wszystkich klientów jak w formularzu edycji a dla formularza chcę mieć inne.

wojtekkk87
16-07-2008, 21:25
nie wiem czy dobrze rozumiem... w sumie to nie rozumiem ;P jeśli chcesz wybrać inny szablon to w adresie wpisujesz
index.php?option=com_twojkomponent&view=widok&layout=templatka2

gdzie templatka2 to nazwa pliku php z drugim szablonem w katalogu tmpl twojego widoku.

nie wiem o co Ci dokładnie chodzi z tymi samymi ikonami staraj się pisać konkretniej. poprostusz stwórz kolejny widok jeśli ma służyć do czegoś innego... ten sam możesz użyć gdy wygląd ma być taki sam tzn np dodawanie elementu i jego edycja...

vego007
16-07-2008, 21:38
Tzn layout wiem w sumie jak wczytać. Robię to za pomocą:


JRequest::setVar('view','list');
JRequest::setVar('layout','listlayout');

A chodzi mi o to:

Mam tabelę z klientami.

Tworzę toolbar (pasek z dodaj, edytuj itd.) kodem

Widok:


function display(){
JToolBarHelper::title("Widok listy");
JToolBarHelper::addNewX();
JToolBarHelper::editListX();
JToolBarHelper::deleteList();
JToolBarHelper::cancel( 'cancel', 'Close' );
......
}

I teraz mam drugą funkcję do edycji


function displayEdit()
{
JToolBarHelper::title("Edycja danych firmy");
JToolBarHelper::save('save','save');
parent::display();
}

I teraz jak wywołać i gdzie, żeby wyświetlały się ikony od displayEdit() a nie z display(). Z display mają zostać tylko w widoku z listą klientów.

Kontroler wygląda następująco


function display(){
JRequest::setVar('view','list');
JRequest::setVar('layout','listlayout');

parent::display();
}

function edit()
{
$cids = JRequest::getVar('cid', null, 'default', 'array' );
if($cids === null){
JError::raiseError(500, 'cid parameter missing from the request');
}
$greetingId = (int)$cids[0];
JRequest::setVar('view','list');
JRequest::setVar('layout','klienciform');
if ($model = & $this->getModel('greetings')) {
$view->setModel($model, true);
}

parent::display();
}

Trochę to długie ale może teraz będzie łatwiej zrozumieć o co mi chodzi :)

wojtekkk87
16-07-2008, 23:46
źle robisz... ty chcesz za pomocą jednego widoku wyświetlić najpierw listę wszystkich greatings (chyba gdzieś widziałem ten tutorial:P) a potem w tym samym widoku formularz?

Tak się nie robi! Tworzysz dodatkowy widok i tam wszystko ładnie wygląda... nie po to ktoś wymyślił MVC żeby pchać wszystko w jednym miejscu, chodzi również o to żeby zadania różne od siebie oddzielić, tak jak napisałem wcześniej w jednym widoku możesz sobie zrobić np dodawanie jakiegoś elementu oraz jego edycję, wtedy tylko rejestrujesz taski w kontrolerze...

p.s. kiedy wrzucasz na forum jakiś kod to wrzucaj go w tagach code lub php... troche przymiera to forum ale rób to dla siebie im lepiej i czytelniej przedstawisz sprawę tym szybciej dostaniesz dobrą odpowiedź.

vego007
17-07-2008, 07:41
To ma dokładnie wyglądać jak com_contact. Mam listę userów, biorę new lub edit i mam formularz. Wypełniam / modyfikuję i wciskam save, dzięki czemu dodaję/ aktualizuję bazę danych i wyświetlają mi się ponownie userzy.
A co do widoku, to jakie pliki muszę stworzyć, bo gdzieś czytałem, że dla jednego kontrolera może być tylko jeden widok nazwany view.html.php.

Narazie zrobiłem instrukcję switch do tasków. W przypadku taska 'edit' wyświetla mi sie toolbar z zapisem a w 'default' standardowy z dodaj, edytuj itd. Jeśli jednak to jest niezgodne z MVC to proszę o jakąś radę.
Nie wiem też jak pod JToolBarHelper podpiąć link do wybranego przeze mnie taska. Za wszelką pomoc będę wdzięczny :)

wojtekkk87
17-07-2008, 11:08
eh... te artykuły są dziwnie napisane i do wielu rzeczy trzeba dojść samemu... w kontrolerze nie rób switch tylko każdy task rób jako osobną funkcję w view zapisujesz to tak:

JToolBarHelper::save();

a w kontrolerze

function __construct( $default = array() )
{
parent::__construct( $default );
}
function save()
{
//tu co robi save
}
ew. jeśli chcesz zrobić jeszcze apply (zastosuj) które zachwouje się identycznie jak save (zapisuje coś) tylko nie wychodzi z edytora to w konstruktorze rejestrujesz ten task:

$this->registerTask( 'apply', 'save');a następnie wewnątrz funkcji save() pod koniec robisz sobie


switch($this->_task)
{
case 'applySite':
$link = 'index.php?option=com_component&task=editSite&cid[]='.$row->ID;
$msg = 'Dokonane zmiany zostały zapisane!';
break;
case 'saveSite':
default:
$link = 'index.php?option=com_component&task=sites';
$msg = 'Stronę zapisano!';
break;
}
$mainframe->redirect($link, $msg);
i masz różne przekierowania w zależności od tego czy to apply czy save. i jedna funkcja bez konieczności kopiowania;)
oczywiście żeby działało przekierowanie na początku musisz dodać

global $mainframe;

jak masz inny przycisk i inną funkcje to robisz analogicznie:

JToolBarHelper::mojaInnaFunkcja(); a w kontrolerze ją implementujesz
mojaInnaFunkcja(){
//treść;)
}

pozdrawiam,
Polecam książkę Mastering Joomla!

vego007
17-07-2008, 11:24
Ja robiłem tego switcha w widoku. Już się wogóle w tym pogubiłem. Zrobiłem tak jak mówiłeś i wtedy w toolbar są wszędzie te same ikony. :/ Mam 3 kontrolery i do tego 3 widoki i to okazało się już dla mnie za dużo. Może wysłałbym Ci na maila mój kod to byś zerknął w wolnej chwili i dał mi jakieś konstruktywne rady?

Dodam jeszcze, że jak wpisuję z palca w linku task=save to wykonuje się instrukcja save z kontrollera którego potrzebuję. Problem jest z tym, że przyciski z toolbara wywołują metody głównego kontrolera a nie kontrolera list znajdującego się w katalogi controllers.

wojtekkk87
17-07-2008, 13:25
hm... o to w sumie chodzi... na co komu tyle kontrolerów? ja zawsze robię tak że mam jeden główny kontroler, w którym są odpowiednie funkcje save() edit() list() itp itd.i te funkcje są wywoływane odpowiednio z każdego widoku;)

przyglądnij się jak po stronie admina zrobiony jest komponent com_weblinks tylko tam przyciski wrzucali do templatki a ja wole do view.html.php...i tam jest jeden kontroler ;) przyglądnij się na spokojnie a napewno załapiesz o co chodzi:)

vego007
17-07-2008, 13:28
Zrobiłem tyle kontrolerów bo gdzieś tam zalecali żeby tak robić. Mam oddzielny do wyswietlania klientów, główny i jeden pod który będę musiał jakoś podpiąć mój skrypt do generowania faktur. Przejrze tego weblinka, mam nadzieję, że pomoże. :)

wojtekkk87
17-07-2008, 13:31
wiem o którym mówisz tekscie też to czytałem kiedy się uczyłem ale tylko mnie to w błąd wprowadzało;/ naprawdę uwierz mi wygodniej jest zrobić ten jeden kontroler z wszystkimi funkcjami masz wszystko ładnie w jednym miejscu a widoki tylko rozdzielasz osobno i modele;)

vego007
17-07-2008, 16:47
dzieki wojtekkk87 za pomoc. Teraz działa tak jak chciałem. Teraz muszę jakoś zapisać dane do bazy i wczytywać je do formularza w przypadku edycji :) Kolejny ciężki wieczór :o

wojtekkk87
18-07-2008, 23:23
wystarczy wojtek ;) nie ma za co o ile mam troche wolnego czasu to sie polecam :) ja przy okazji sobie troche po utrwalam... o zapisie postaram się coś napisać w krótce może na weekendzie...więc czuwaj ;)

vego007
22-07-2008, 13:32
Powracam do tematu. Komponent jest już prawie skończony. Zostało mi tylko wykończenie i mam mały problem.
Po pierwsze:
Jak zrobić aby przycisk JToolBarHelper::cancel cofał mi zawsze o jedną pozycję do tyłu a nie do konkretnego taska?

Po drugie:
Jak, a może raczej gdzie dodać ikony, żeby były widoczne przez JToolBarHelper::custom

Z góry dziękuję za odpowiedź :)

wojtekkk87
22-07-2008, 13:42
ok tym razem tak szybko nie dostaniesz odpowiedzi ;P podpowiem Ci tyle że potrzebujesz JavaScript do cofania w tył... Musisz najpierw przechwycić kliknięcie a potem go obsłużyć...nie piszę nie dla tego że nie chcę ale poprostu nie pamiętam dokładnie... a jak poszukasz troche to na pewno znajdziesz;P

po googluj troche ;) na dobry początek coś w tym stylu:

http://www.google.pl/search?q=javascript+przycisk+wstecz&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:pl:official&client=firefox-a

;):P

a co do przycisków to nie miałem potrzeby wstawiania innych... po to są żeby wszystko w miarę zestandaryzowane było... wolnym czasem popatrzę...

vego007
22-07-2008, 13:49
Ok z javascript jakoś sobie poradze ;) Pozostaje tylko problem ikon :/ Dzięki za odpowiedź.
Mam jeszcze mały problem z użyciem funkcji modelu. Mam model o nazwie firma (nie jest domyślny) i chce w widoku wywołać metodę modelu o nazwie getData(). Robię to tak:



$model = & $this->getModel('firma');
$dane_firmy = $model->getData();


Po wywołaniu skryptu mam:

Fatal error: Call to a member function getData() on a non-object in /home/xan/workspace/joomla/administrator/components/com_mvc/views/pdf/view.html.php on line 33

Wie ktoś gdzie jest błąd?

wojtekkk87
26-07-2008, 02:11
Trudno powiedzieć kiedy nie widzę funkcji, ale... może Cię zdziwię ale spróbuj zmienić nazwę tej funkcji... U mnie zazwyczaj pomagało... Ale wcześniej sprawdź dokładnie nazwę :D bo literówki się zdarzają...sprawdź dokładnie nazwę klasy modelu czy jest dobrze skonstruowana i czy plik modelu jest dobrze nazwany to również powoduje błędy...

vego007
27-07-2008, 16:10
Narazie poradziłem sobie z tym poprzez include modelu i stworzenie go poprzez "new". Literówki sprawdzałem kilka razy, nazwy też zmieniałem i nic nie pomagało.