Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony]Klucze obce i panel admina
Forum PHP.pl > Forum > PHP > Frameworki
athabus
Witam, może ktoś miał już podobny problem. Mam tabelkę w bazie
id_marki | id_kategorii | opis

gdzie id_marki i id_kategorii to zarazem klucz tabeli i klucze obce w dwóch innych tabelach. Problem polega na tym, że wygenerowany panel admina w symfony nie wyświetla mi id_marki ani id_kategorii podczas edycji - wyświetla się tylko opis.

Ogólnie symfony nie wyświetla kluczy obcych podczas edycji, ale w tym przypadku muszę mieć możliwość ich edycji bo nie są to wartości autoincrement - jeśli ich nie podam, to nawet nie mogę wstawić wiersza do bazy.

Aby wyświetlić te pola próbowałem już chyb wszystkiego co mi przyszło do głowy.

Jedyne rozwiązanie jakie przychodzi mi do głowy to ręczne stworzenie partiali z tymi dwoma polami, ale przecież musi być jakaś możliwość wyświetlenia tych pól z automatu.

Będę wdzięczny za pomoc. (ps. display: [id_marki, id_kategorii, opis] oczywiście nie działa)
Cysiaczek
Ten generator to dla mnie jeszcze czarna magia, ale mogę Ci poradzić, żebyś zobaczył, jaką metodą pobierane są rekordy. Jeśli masz zdefiniowane klucze obce, to tabela w której definiowałeś ma metody podobne to tej:
  1. <?php
  2. doSelectJoinInnaTabela()
  3. // zamiast
  4. doSelect()
  5. ?>


Pozdrawiam.
destroyerr
Napisz jeszcze, z którego modelu korzystasz w generatorze, marki, kategorii czy jednak tego, którego tabele tutaj podałeś. winksmiley.jpg
athabus
Witam,

wydaje mi się, że przyczyna nie leży w metodzie pobierania danych, tylko w sposobie budowania panelu admina - po prostu pola, które są kluczami podstawowymi tabeli domyślnie nie są edytowalne - jest to nawet napisane w książce, tyle tylko, że nie napisali (a przynajmniej nie mogę znaleźć) jak je odblokować do edycji. Pokaże może nad czym konkretnie się głowie.

To jest moja tabelka. Jak widać są tam 2 klucze obce, które razem dają mi klucz podstawowy tabeli. Gdyby był to klucz autoincrement, to nie ma problemu, bo sam by się ustawiał, ale w moim przypadku tak nie jest i muszę go móc ustawić ręcznie.
  1.      <table name="BrandContextDescription" phpName="BrandContextDescription">
  2.            <column name="brand_id" type="integer" required="true" primaryKey="true" autoIncrement="false"/>
  3.            <column name="shop_menu_position_id" type="integer" required="true" primaryKey="true" autoIncrement="false" />
  4.            <column name="description" type="longvarchar" required="true" />
  5.            <foreign-key foreignTable="Brand">
  6.                  <reference local="brand_id" foreign="brand_id" />
  7.            </foreign-key>
  8.            <foreign-key foreignTable="ShopMenuPosition">
  9.                  <reference local="shop_menu_position_id" foreign="position_id" />
  10.            </foreign-key>
  11.      </table>


Tymczasem mój panel admina dla tej tabelki wygląda tak:
http://athabus.wrzuta.pl/obraz/hYsfRYqAZA/zrzut
Czyli w ogóle nie są wyświetlane pola składające się na klucz podstaowy.

Próbowałem zmusić symfony do wyświetlania tych pól w config.yml, tak jak poniżej, ale nic to nie daje...
Cytat
generator:
class: sfPropelAdminGenerator
param:
model_class: BrandContextDescription
theme: default

edit:
display: [brand_id, shop_menu_position_id, description]
fields:
brand_id:{ params: disabled=false }



@destroyerr - w generatorze mam model do każdej tabeli, także to raczej nie to.

Może ktoś ma jakieś pomysły, bo już na głowę z tym dostaje.
Cysiaczek
no ba! Ja też odpadam ;p
Mam podobny problem, tylko ja chcę wyświetlić nazwy dostepnych kategori zamiast ich ID przy edycji (select tag)
Mam metodę getCategoryName(), założone klucze obce etc i ni cholery nie umiem zmusić tego do działania.

Pozdrawiam
athabus
a próbowałeś dodać metodę __toString w modelu. Jeśli masz klucze obce to w tym "obcym" obiekcie dodaj się metodę __toString() i powinno śmigać, jeśli dobrze rozumiem twój problem.
Cysiaczek
Dzięki, rzeczywiście od razu zadziałało ;p
destroyerr
Ok, dobra. Problem zrozumiałem, ale nie wiedziałem, w którym kontrolerze chcesz to edytować winksmiley.jpg Jest dokładnie tak jak napisałeś, nie da się nic zrobić z primary key, ale... No właśnie, zawsze możesz sam trochę przerobić generator, a konkretnie plik: data/symfony/generator/sfPropeAdmin/default/template/templates/_edit_form.php, od 15 linijki.

Uważam, że lepiej byłoby dodać pole id. Może Cię przekona: http://ruby-rails.pl/rails-10-przykazan/#schemat_2
athabus
Dzięki destroyerr,

właśnie tego chciałem uniknąć, ale się poddałem, dołożyłem pole id, stary klucz zmieniłem na unique. Trochę mi się nie podoba to rozwiązanie, ale taki urok ORM'ów i frameworków w ogóle.

Wymyśliłem / znalazłem jeszcze kilka rozwiązań, może kiedyś się komuś przydadzą:
- można stworzyć partiale z odpowiednimi formularzami i nadpisać metodę updateFromRequest
- można dodać "fikcyjne metody" będące nakładkami na właściwe metody w modelu typu setCustomBrandId() i wymusić ich stosowanie w generatorze
- znalazłem też to o zmianie templata o czym pisał destroyerr
- ktoś na forum symfony poradził mi, abym zastosował CRUD - pewnie tam można edytować klucze, ale nie sprawdzałem, bo w moim przypadku CRUD będzie miał zbyt małą funkcjonalność

Wszystkie wyżej opisane metody są niezbyt eleganckie i chyba jednak najmniejszym złem będzie utworzenie osobnego pola dla klucza.
Mimo wszystko ograniczenie co do wyświetlania pola z kluczem podstawowym wydaje mi się co najmniej dziwne, bo technicznie nic nie stoi na przeszkodzie edycji takiego pola jeśli nie jest on automatycznie inkrementowane - dla mnie jest to ewidentny bug.
mazur83
Cytat(athabus @ 7.03.2008, 10:36:46 ) *
a próbowałeś dodać metodę __toString w modelu. Jeśli masz klucze obce to w tym "obcym" obiekcie dodaj się metodę __toString() i powinno śmigać, jeśli dobrze rozumiem twój problem.


jest też inna możliwość.

w admin generatorze:

Kod
pole_id:   { type: select_tag, params: text_method=getName }


w zwykłym formularzu:

Kod
<?php echo object_select_tag($obiekt, 'getPoleId', array (
   'text_method' => 'getName',
   'related_class' => 'klasa',
   'include_blank' => true,
)) ?>
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.