Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [Symfony] Pobieranie wartości z powiązanej tabeli (?)
Virti
post
Post #1





Grupa: Zarejestrowani
Postów: 115
Pomógł: 12
Dołączył: 11.01.2005
Skąd: Zduńska Wola

Ostrzeżenie: (0%)
-----


Witam. Przepraszam za być może zbyt ogólny tytuł, ale nawet nie wiem, jak inaczej miałem nazwać ten wątek.

Mam następujący problem. Podążam sobie za screencastem o generowaniu panelu administracyjnego, z tym, że podstawiam własne dane itp. Jednak natknąłem się na problem, mam sobie (no właśnie, co? (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) w każdym razie wchodzę tam poprzez adres kivi/backend_dev.php/photo/list). W tabeli photo mam kolumnę author_id, która powiązana jest z kolumną id z tabeli author. Chciałbym teraz, aby przy wyświetlaniu listy zdjęć (photo/list) zamiast ID autora, była wyświetlana wartość kolumny name. Podążając więc za screencastem utworzyłem w modelu Author metodę __toString(){return $this -> getName(); }, następnie w generator.yml dodałem do display "%%author%%". Wynikiem moich kombinacji jest niezbyt uroczy komunikat o błędzie:

Fatal error: Call to undefined method Photo::getAuthor() in C:\xampp\htdocs\kivi\cache\backend\dev\modules\autoPhoto\templates\_list_td_stacked.php on line 5

Jako, że może się przydać, dołączę również definicje obydwu tabel z schema.xml:

Kod
<table name="photo">
     <column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true" />
     <column name="title" type="varchar" size="32" />
     <column name="description" type="longvarchar" />
     <column name="author_id" type="integer" />
     <foregin-key foreginTable="author">
         <reference local="author_id" foregin="id" />
     </foregin-key>
     <column name="category_id" type="integer" />
     <foregin-key foreginTable="category">
         <reference local="category_id" foregin="id" />
     </foregin-key>
     <column name="position" type="integer" />
 </table>
 <table name="author">
     <column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true" />
     <column name="name" type="varchar" size="16" />
     <column name="login" type="varchar" size="16" />
     <column name="password" type="varchar" size="40" />
     <column name="watermark" type="varchar" size="32" />
 </table>


oraz zawartośc pliku generator.yml:

Kod
generator:
  class:              sfPropelAdminGenerator
  param:
    model_class:      Photo
    theme:            default 
    
    fields:
      title: { name: "Tytuł" }
      description: { name: "Opis" }
      author_id: { name: "Autor zdjęcia" }
      category_id: { name: "Kategoria" }
      position: { name: "Pozycja" }
      
    list:
      title: Zdjęcia
      display: [title,category_id,author_id,position]
      layout: stacked
      params: %%=title%%<br /><em>w %%category_id%% przez %%author%% na pozycji %%position%%</em>



Szukałem co nieco na ten temat w sieci, jednak mnie nie udało się niczego znaleźć, proszę więc o pomoc Szanownych Kolegów (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Pozdrawiam,

Virti.

Ten post edytował Virti 8.08.2008, 21:55:37
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 12)
Cysiaczek
post
Post #2





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




W modelu Author dodaj metodę
  1. <?php
  2. public function __toString()
  3. {
  4. return $this->getName();
  5. }
  6. ?>


Pozdrawiam.
Go to the top of the page
+Quote Post
Virti
post
Post #3





Grupa: Zarejestrowani
Postów: 115
Pomógł: 12
Dołączył: 11.01.2005
Skąd: Zduńska Wola

Ostrzeżenie: (0%)
-----


Cytat
Podążając więc za screencastem utworzyłem w modelu Author metodę __toString(){return $this -> getName(); }

Metodę utworzyłem, oto kod:
  1. <?php
  2.  
  3. /**
  4.  * Subclass for representing a row from the 'author' table.
  5.  *
  6.  * 
  7.  *
  8.  * @package lib.model
  9.  */ 
  10. class Author extends BaseAuthor
  11. {
  12. public function __toString()
  13. {
  14. return $this -> getName();
  15. }
  16. }
  17. ?>


plik lib/model/Author.php

Zapomniałem dodać, korzystam z Symfony 1.1

EDIT: dodam również, że ja w przeciwieństwie do Pana prowadzącego screencast przy dodawaniu zdjęć nie mogę wybrać sobie autora (muszę wpisywać ID).

Więc... POMOCY (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Pozdrawiam,
Virti

Ten post edytował Virti 9.08.2008, 13:28:54
Go to the top of the page
+Quote Post
-=Peter=-
post
Post #4





Grupa: Zarejestrowani
Postów: 304
Pomógł: 51
Dołączył: 4.02.2005
Skąd: Kraków

Ostrzeżenie: (0%)
-----


w tym przypadku musisz skorzystać z partiala, nie wiem czemu ale w akcji "list" metoda __toString nie daje tego efektu, co w akcji "edit/create"...
Go to the top of the page
+Quote Post
Virti
post
Post #5





Grupa: Zarejestrowani
Postów: 115
Pomógł: 12
Dołączył: 11.01.2005
Skąd: Zduńska Wola

Ostrzeżenie: (0%)
-----


Mógłbyś jakoś uściślić swoją wypowiedź? Jestem początkującym użytkownikiem Symfony, tworzę teraz swój pierwszy projekt. Czym są partiale? Oraz jak włączyć te select listy w create/edit, tak by przy tworzeniu bądź edycji zdjęć możabyło wybrać autora, kategorię?

Pozdrawiam,

Virti

EDIT: Ok, doczytałem w dokumentacji symfony czym są te partiale. Jeśli dobrze zrozumiałem, są to powtarzalne kawałki kodu. Mam więc pytanie, jak dołączyć partiala to listy w adminie, jeżeli jest ona generowana automatycznie, z pliku generator.yml?

Ten post edytował Virti 10.08.2008, 11:30:37
Go to the top of the page
+Quote Post
-=Peter=-
post
Post #6





Grupa: Zarejestrowani
Postów: 304
Pomógł: 51
Dołączył: 4.02.2005
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Załóżmy że tworzysz moduł do modelu News w admin generator. Aby w akcji list wyświetliła Ci się nazwa autora, a nie jego id musisz stworzyć partial który będzie wyświetlał tą nazwę. Przykładowo tak to będzie wyglądać (nazwa pliku np. _authorname.php):

  1. <?php echo $news->getAuthor()->getName();
  2. ?>


W pliku generator.yml robisz tak:

  1. <?php
  2. //ciach
  3.  
  4. fields:
  5. authorname: {name: Autor}
  6.  
  7. //ciach
  8.  
  9. list:
  10. display: [id, _authorname, title]
  11.  
  12. //ciach
  13. ?>
Go to the top of the page
+Quote Post
Virti
post
Post #7





Grupa: Zarejestrowani
Postów: 115
Pomógł: 12
Dołączył: 11.01.2005
Skąd: Zduńska Wola

Ostrzeżenie: (0%)
-----


Problem w tym, że "$photo -> getAuthorId()" ani "$photo -> getAuthor()" nie zwracają obiektu, w wyniku czego dostaję błąd:
Kod
Fatal error: Call to a member function getName() on a non-object in C:\xampp\htdocs\kivi\apps\backend\modules\photo\templates\_author.php on line 2


Wychodzi na to, że będę musiał pobierać dane na podstawie otrzymanego ID... chyba, że jest jeszcze jakieś wyjście (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Jak tak, to będę wdzięczny za oświecenie mnie (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

I jeszcze pozostaje kwestia SELECTów w edit/create z nazwami autorów / kategorii.

EDIT:
Zrobiłem tego partiala, pobierając dane o autorze ręcznie:
  1. <?php
  2. $id = $photo -> getAuthorId();
  3.  
  4. $criteria = new Criteria();
  5. $criteria -> add(AuthorPeer::ID, $id);
  6.  
  7. $author = AuthorPeer::doSelect($criteria);
  8.  
  9. echo $author[0] -> getName();
  10. ?>


i wszystko jest ok, męczą mnie jednak te selecty, bo nie ukrywajmy, ale trudno jest dodać zdjęcie do kategorii po ID (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

EDIT2:
Mógłby mnie ktoś przy okazji oświecić, jak pobrać z bazy tylko jedno pole, np nazwę zamiast nazwy, opisu itd.? Z góry klikam "pomógł" (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

EDIT3 (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Co do tych selectów, wyszukałem w dokumentacji klasę sfWidgetFormPropelSelect. Niestety jakoś niespecjalnie mi ona pomogła (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) dodałem ją zamiast sfWidgetFormInput, jednak żadne zmiany nie zaszły. Po symfony cc również.


Pozdrawiam, Virti

Ten post edytował Virti 11.08.2008, 12:31:09
Go to the top of the page
+Quote Post
-=Peter=-
post
Post #8





Grupa: Zarejestrowani
Postów: 304
Pomógł: 51
Dołączył: 4.02.2005
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Cytat
Problem w tym, że "$photo -> getAuthorId" ani "$photo -> getAuthor" nie zwracają obiektu, w wyniku czego dostaję błąd:

Daj mi tępą łyżkę, a się potnę....

Nie $photo->getAuthorId, tylko $photo->getAuthorId(). Nie $photo->getAuthor, tylko $photo->getAuthor()...

Edit:
W partialu nie powineneś mieć żadnej logiki, jeśli chcesz logikę to do tego służy component.

Ten post edytował -=Peter=- 11.08.2008, 12:06:11
Go to the top of the page
+Quote Post
Virti
post
Post #9





Grupa: Zarejestrowani
Postów: 115
Pomógł: 12
Dołączył: 11.01.2005
Skąd: Zduńska Wola

Ostrzeżenie: (0%)
-----


Wpadłem na to, że to są metody. W poprzednim poście nie dodałem nawiasów przez nieuwagę.
Go to the top of the page
+Quote Post
-=Peter=-
post
Post #10





Grupa: Zarejestrowani
Postów: 304
Pomógł: 51
Dołączył: 4.02.2005
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Jedyne co mi do głowy przychodzi, to w jakimś zdjęciu nie masz podanego autora (wystarczy jeden taki rekord), więc obiekt nie jest zwracany. Nie masz pola author_id w tabeli photo ustawionego jako wymagane, więc być może w tym leży problem.

Sprawdź jeszcze czy masz metodę getAuthor() w klasie BasePhoto, jeśli nie to spróbuj wygenerować jeszcze raz model, ponieważ może przez nieuwagę generowałeś model gdy nie miałeś ostatecznej wersji pliku ze strukturą bazy danych.
Go to the top of the page
+Quote Post
Virti
post
Post #11





Grupa: Zarejestrowani
Postów: 115
Pomógł: 12
Dołączył: 11.01.2005
Skąd: Zduńska Wola

Ostrzeżenie: (0%)
-----


Metody getAuthor() w BasePhoto nie mam. Model generowałem na 100% z tego, co jest w pierwszym poście (tzn z tym fragmentem). ID autora również jest podane przy wszystkich zdjęciach.

Model mozna przebudować bez większych problemów jeszcze raz? (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Rozumiem, że w konsoli będę musiał wpisać to samo co wcześniej, czyli "symfony propel-build-model"?

Pozdrawiam,

Virti
Go to the top of the page
+Quote Post
-=Peter=-
post
Post #12





Grupa: Zarejestrowani
Postów: 304
Pomógł: 51
Dołączył: 4.02.2005
Skąd: Kraków

Ostrzeżenie: (0%)
-----


tak, możesz bez większych problemów przebudować model, i to zrób bo w klasie BasePhoto, jeśli author_id jest ustawione jako klucz obcy, musi być ta metoda.
Go to the top of the page
+Quote Post
Virti
post
Post #13





Grupa: Zarejestrowani
Postów: 115
Pomógł: 12
Dołączył: 11.01.2005
Skąd: Zduńska Wola

Ostrzeżenie: (0%)
-----


EDITED

ehh... fujara ze mnie (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) literówka w schema.xml :/

Wygenerowałem model tym razem metoda getAuthor() jest, problem w tym, że list jak nie było tak nie ma. Robiłem symfony cc, generowałem jeszcze raz formularze (symfony propel:build-forms) i nic. Mógłbyś mi coś doradzić, jak się teraz to tych list uśmiechnąć, tak by się pojawiły? (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

EDIT:
Ok, rozwiązane. W sumie nie wiem dlaczego po pierwszym symfony cc nie ruszyło. Ale wazne, że teraz śmiga. Dzięki wielkie za pomoc i okazaną cierpliwość (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

Pozdrawiam,
Virti

Ten post edytował Virti 13.08.2008, 13:42:22
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 17:20