Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [symfony]1.4 Doctrine - relacja 1:m
Forum PHP.pl > Forum > PHP > Frameworki
arturo23
Witam,

są sobie dwie tabele np.: Artykuły i Kategorie w relacji 1:m czyli kategoria ma wiele artykułów a artykuł ma jedna kategorie. Kiedy utworze CRUD w symfony wszystko działa jak powinno czyli kiedy chce dodać artykuł mam na rozwijanej liście kategorie.

Ale kiedy dodaje kategorie mam tylko możliwość dodania nazwy kategorii, a chciałbym żeby można było od razu przypisac nowo dodawana kategorie do istniejących artykułów. Podobnie z edycja - chce poza możliwością edycji nazwy kategorii wyedytowac przypisanie do artykułów...

Jak się za to zabrać...?
Valantir
Zrób sobie formularz, który będzie Ci generował krotki np typu checkbox lub innego i po wybraniu krotek, do których ma zostać przypisana kategoria klikasz np zapisz. To jeżeli chodzi o widok. Następnie w akcji w pętli dodajesz albo aktualizujesz wpisy odnośnie krotek, które zostały wybrane i wsio:)
arturo23
Witam, dziekuje za wskazowki...
pora przejsc od slow do czynow, i z tego co zrozumialem i wygooglowalem zrobilem tak:
  1. // --- schema.yml
  2. options:
  3. type: InnoDB
  4. collate: utf8_polish_ci
  5. charset: utf8
  6.  
  7. Article:
  8. columns:
  9. title: { type: string(255), notnull: true }
  10. content: { type: string }
  11. category_id: { type: integer }
  12. relations:
  13. Category:
  14. local: category_id
  15. foreign: id
  16. onDelete: CASCADE
  17. foreignAlias: Articles
  18.  
  19. Category:
  20. columns:
  21. title: { type: string(50), notnull: true }


Utworzylem plik w /lib/form/doctrine/EmbedArticleForm.class.php, ktory zawieral:
  1. <?php
  2. class EmbedArticleForm extends ArticleForm
  3. {
  4.  
  5. public function configure()
  6. {
  7. $this->useFields(array('title'));
  8. }
  9. }


W pliku /lib/form/doctrine/CategoryForm dalem:
  1. class CategoryForm extends BaseCategoryForm
  2. {
  3. public function configure()
  4. {
  5. $this->embedRelation('Articles','EmbedArticleForm');
  6. }
  7. }

... a w "formie" dla modelu Kategorii /frontend/modules/templates/_form.php mialem nadzieje spotkac biggrin.gif artyukuly i obsluzyc mniej wiecej tak:
  1. ...
  2. foreach ($form['Articles'] as $art): ?>
  3. questionmark.gif?
  4. <?php endforeach; ?>


ale nic z tego nie wyszlo :/ ?
tzn. wyszlo ale nie to czego oczekiwalem... chcialbym miec mozliwosc zaznaczania na checkboxach przynaleznosci a nie jednoczesnej edycji przypisanych artykulow :/
Bede wdzieczny za wskazowki.
Valantir
Nie pracowałem pod Doctrine... Raczej pod Propelem, więc w zawartości raczej nie pomogę.
Cytat
chcialbym miec mozliwosc zaznaczania na checkboxach przynaleznosci a nie jednoczesnej edycji przypisanych artykulow :/

Co masz na myśli? Może podaj przykład jakiś z życia wzięty np? Bo tak ciężko mi jest zrozumieć.
Wiem, że podczas wprowadzania kategorii chcesz zaznaczyć artykuły, które będą przypisane do tej kategorii. tak?
arturo23
Po godzinach googlowania doszedlem do tego:
Jak dodaje Artykul mam:

... to jest CRUD bez zmian i jest OK.

Teraz kiedy dodaje Kategorie:
Na razie doszedlem do tego...

I generalnie oto chodzi ale...

Jak zapisac teraz te dane ?
Rozumiem, ze mam nadpisac metode save() a w niej usunac przypisane do kategorii artykuly a pozniej w petli dodac spowrotem te zaznaczone ?
Pytanie jak i gdzie ?

Drugie pytanie to wydaje mi sie, ze malo elegancko dodalem te artykuly bo zrobilem tak:
  1. class CategoryForm extends BaseCategoryForm
  2. {
  3. public function configure()
  4. {
  5. $this->widgetSchema['article_list'] = new sfWidgetFormDoctrineChoice(array(
  6. 'model' => 'Article',
  7. 'multiple' => true,
  8. 'expanded' => true
  9. ));
  10.  
  11. $q = Doctrine_Query::create()->select('a.id')->from('Article a')->where('a.category_id = ?', $this->getObject()->getId());
  12. $ret = $q->fetchArray();
  13. $z = null;
  14. foreach ($ret as $r) {
  15. $z[] = $r['id'];
  16. }
  17. $this->setDefault('article_list',$z);
  18.  
  19. $this->validatorSchema->setOption('allow_extra_fields', true); // na razie bez walidacji...
  20. }
  21. }

co prawda dziala ale pisane to troche na wyczucie i po omacku - a zalezy mi aby zrobic to "zgodnie ze sztuka"... wiec jesli by ktos na to spojrzal i ewentualnie poprawil lub wskazal droge...


Valantir
Z tego co wiem, to metoda save() powinna załatwić to za Ciebie. Zaznaczasz i wciskasz przycisk. A metoda save() sama sprawdza czy taki rekord istnieje w bazie czy nie. Jeżeli tak, to update, jeżeli nie, to insert.
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.