Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony] Pobieranie wartości z powiązanej tabeli (?)
Forum PHP.pl > Forum > PHP > Frameworki
Virti
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? 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 smile.gif

Pozdrawiam,

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


Pozdrawiam.
Virti
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 smile.gif

Pozdrawiam,
Virti
-=Peter=-
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"...
Virti
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?
-=Peter=-
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. ?>
Virti
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 winksmiley.jpg Jak tak, to będę wdzięczny za oświecenie mnie 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 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ł" smile.gif

EDIT3 winksmiley.jpg
Co do tych selectów, wyszukałem w dokumentacji klasę sfWidgetFormPropelSelect. Niestety jakoś niespecjalnie mi ona pomogła winksmiley.jpg dodałem ją zamiast sfWidgetFormInput, jednak żadne zmiany nie zaszły. Po symfony cc również.


Pozdrawiam, Virti
-=Peter=-
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.
Virti
Wpadłem na to, że to są metody. W poprzednim poście nie dodałem nawiasów przez nieuwagę.
-=Peter=-
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.
Virti
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? winksmiley.jpg Rozumiem, że w konsoli będę musiał wpisać to samo co wcześniej, czyli "symfony propel-build-model"?

Pozdrawiam,

Virti
-=Peter=-
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.
Virti
EDITED

ehh... fujara ze mnie 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? 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ść winksmiley.jpg

Pozdrawiam,
Virti
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.