PDA

Zobacz pełną wersję : Rozbudowa komponentu helloworld



Pad19
15-01-2013, 11:24
Witam,
ucze się pisania komponentów bazując na tym tutorialu z joomla.org:
http://docs.joomla.org/Developing_a_Model-View-Controller_Component/2.5/Adding_backend_actions

W obecnej chwili wpisy/pola które zostają wysłane do bazy danych znajdują się w pliku: admin/models/forms/helloworld.xml
Skrypt pobiera z tego xmla pola i wpisuje je w kolumny w bazie danych zgodnie z deklaracją nazwy 'name' w xml.
Dopisując następne pozycje w pliku xml udało mi się zapisywać więcej danych do bazy danych, teraz chce jednak wysłać do bazy danych zmienną php. W xml to są tylkostatyczne pola których zawartość uzupełniam przez formularz, natomiast chce wysyłać do bazy dodatkową wartość, uzupełniać dodatkową kolumnę w bazie dynamicznie zmienną php, nie przez formularz.

Jak zmodyfikować kod aby wstrzyknąć swoją zmienną? Wydaje mi się że dane które zostaną dołączone do zapytania bazy danych są w zmiennej $data, lecz to tylko moje przypuszczenie i nie wiem nawet jak wstrzyknąć do niej swoją zmienną php.
$data = JFactory::getApplication()->getUserState('com_helloworld.edit.helloworld.data' , array());

Pozdrawiam

pawelSafiStudio
15-01-2013, 13:05
Możesz to zrobić na kilka sposobów. Albo przez tworzenie własnego obiektu dziedziczonego po JFormField (http://docs.joomla.org/Form_field), albo przez nadpisanie metody store/save w modelu/pliku table/controlerze. Jeśli skorzystasz z pierwszej opcji, pole dynamiczne będzie ładowane automatycznie do formularza. Jeśli z drugiej, musiałbyś napisać jeszcze metodę do pobierania danych dla tego pola i przekazać do widoku. Sposobów jest sporo. Wystarczy wybrać ten, który dla Ciebie będzie najwygodniejszy.

Tutaj masz przykład: http://wiki.joomla.pl/index.php/Tworzenie_w%C5%82asnych_typ%C3%B3w_p%C3%B3l_formul arza_XML

Pad19
15-01-2013, 15:59
wywołałem funkcje var_dump na zmiennej $data i otrzymałem coś takiego:




object(JObject)[47]
protected '_errors' =>
array
empty
public 'id' => string '10' (length=2)
public 'userid' => string 'dasdas' (length=6)



jak odwołać się do pola userid i go nadpisać?

pawelSafiStudio
15-01-2013, 16:09
Nie do końca rozumiem o co pytasz. Jeśli chodzi Ci o to jak nadpisać to w bazie danych, w necie jest bardzo dużo kursów na ten temat. Nie sądzę, żeby ktoś napisał pełny esej jak zapisywać dane w bazie danych z Twojego formularza.
Wszystko co trzeba masz tak naprawdę tutaj: http://docs.joomla.org/Developing_a_Model-View-Controller_%28MVC%29_Component_for_Joomla!2.5, łącznie z zapisywaniem do bazy danych.

Pad19
15-01-2013, 16:32
Wiem że tam "niby" wszystko jest bo sam wkleiłem ten link i właśnie z niego korzystam, nie mam własnego formularza tylko właśnie formularz jaki został napisany w tym tutorialu, korzystam z dokładnie komponentu napisanego w tym tutorialu. Piszę jednak tutaj bo nie mogę się połapać w tym wszyskim, ten kod jest dla mnie mało czytelny, nie czuje jeszcze tego co po czym się wykonuje między tymi plikami i klasami. Obecnie zamieniłem sobie tylko nazwę powa, w tutorialu jest greetings a u mnie userid. Po zatwierdzeniu formularza przyciskiem joomlowskim "zapisz i zamknij" nie mam pojęcia co się dalej dzieje, które plik są wykonywane, które metody, czyli tym samym nie mogę dojść gdzie jest kod odpowiedzialny za pobranie danych wpisanych w formularzu.

W poprzednim poście znalazłem zmienną $data do której są wczytywane pola formularza przy kliknięciu joomlowskiego przycisku 'dostosuj', jednakże w tej zmiennej siedzi obiekt i nie wiem jak się odwołać do pojedyńczego pola userid. Próbowałem $data->userid, $data[1], $data['userid'] nic z tego nie działa.

pawelSafiStudio
17-01-2013, 07:43
Niestety nie będę Ci w stanie pomóc. Piszesz, że znalazłeś zmienną $data. Ale wiesz czy w ogóle przekazujesz ją do widoku i co przekazujesz w tej zmiennej, czy po prostu znalazłeś w jakimś poście, że ktoś wykorzystał zmienną o nazwie $data?. Niestety aby pisać komponenty musisz zrozumieć MVC Joomla!. Aby wykorzystać zmienną w widoku, musisz ją pobrać i przekazać do niego. Możesz to zrobić np. wyciągając dane z bazy w modelu. Aby wytłumaczyć to wszystko, tak jak wspominałem wcześniej, trzeba by było napisać niezły esej. W necie jest sporo kursów dodatkowych. Więc jest z czego korzystać.

Pad19
22-01-2013, 01:54
Kurcze na prawdę nie wiem jak można prościej wytłumaczyć co chce zrobić. Nie chce w kolejnym poście pisać po raz kolejny to samo.
Jednak napisze...

Piszesz, że znalazłeś zmienną $data. Ale wiesz czy w ogóle przekazujesz ją do widoku i co przekazujesz w tej zmiennej, czy po prostu znalazłeś w jakimś poście, że ktoś wykorzystał zmienną o nazwie $data?. Niestety aby pisać komponenty musisz zrozumieć MVC Joomla!.
JA NIC NIE MODYFIKOWAŁEM W TYM KOMPONENCIE! Nic jeszcze nie pisze. Mówię po raz n-ty, odpalam komponent z tego tutorialu który jest do pobrania z linku: https://github.com/downloads/rvsjoen/joomla-tutorials/com_helloworld-part12.zip


czy po prostu znalazłeś w jakimś poście, że ktoś wykorzystał zmienną o nazwie $data?.

wywołałem funkcje var_dump na zmiennej $data i otrzymałem coś takiego:




object(JObject)[47]
protected '_errors' =>
array
empty
public 'id' => string '10' (length=2)
public 'userid' => string 'dasdas' (length=6)



jak odwołać się do pola userid i go nadpisać?
Chyba jednoznacznie z tego wynika co zrobiłem.
Jaka zmienna $data?
Pierwszy link z mojego pierwszego postu:
http://docs.joomla.org/Developing_a_Model-View-Controller_Component/2.5/Adding_backend_actions

Po wyszukaniu na tej stronie "$data":


$data = JFactory::getApplication()->getUserState('com_helloworld.edit.helloworld.data' , array());

pawelSafiStudio
22-01-2013, 07:29
Jak zmodyfikować kod aby wstrzyknąć swoją zmienną?
Przejdź do pliku zarządzającego widokiem (view.html.php). Pobierz w nim swoje dane dynamiczne przy pomocy akcji:


$my_data = $this->get('MyData');
$this->assignRef('my_data',$my_data);

Następnie przejdź do modelu, który wykorzystujesz i dopisz w nim funkcję:


public function getMyData(){
return array('mojedane');
}

Ostatni krok to dopisanie danych do formularza w pliku widoku:


<select name="jform[nazwa_zmiennej]">
<?php foreach(this->my_data as $data): ?>
<option value="<?php echo $data; ?>"><?php echo $data; ?></option>
<?php endforeach; ?>

Pamiętaj aby także w modelu obiektu uwzględnić wykorzystanie tej zmiennej podczas zapisu do bazy danych (możesz to też uwzględnić w pliku opisującego tabelę - w katalogu tables).

Czy o takie coś Ci chodzi ?

pawelSafiStudio
22-01-2013, 08:03
Btw:

$data = JFactory::getApplication()->getUserState('com_helloworld.edit.helloworld.data' , array());

Ten kod pobiera dane z sesji użytkownika. Wykorzystane np. podczas próby zapisu formularza i wywołania błędu. Wówczas użytkownik widzi dane, które wpisał i nie musi po raz kolejny wypełniać formularza. Zwróć uwagę, że gdy $data jest pusta, skrypt próbuje wczytać dane z bazy danych ($this->getItem).