Kilka pól w elemencie select

Pewnie intensywnie korzystasz z $this->Model->find(“list”), który zwraca Ci tablicę, z której automatycznie  możesz wygenerować rozwijanego selecta z odpowiednimi kluczami i wartościami.

Jeśli szukasz sposobu w jaki sposób w nazwach opcji umieścić kilka wartości (nawet z innych modeli), to zaraz podam Ci rozwiązanie.

To jest “trik”, na który trafiłem dość dawno temu, ale wydaje mi się, że nie łatwo znaleźć to w dokumentacji. Dlatego postanowiłem wrzucić co nieco na ten temat na bloga (także po to, żeby to następnym razem szybko znaleźć).

Wyobraź sobie, że mamy model User, z polami imie, nazwisko, pesel. Chcemy w widoku mieć pole select z wyborem User’a, na którym będziemy widzieć:

Imię Nazwisko (PESEL)

Przede wszystkim musisz porzucić find(“list”) – służy on do generowania tylko prostych list.

W kontrolerze:


$users = $User->find("all");

$usersList = Set::combine($users, "{n}.User.id", array("{0} {1} ({2})", "{n}.User.imie", "{n}.User.nazwisko", "{n}.User.pesel") );

Pierwszy parament metody Set::combine to dane, z których chcesz wydłubać listę. Drugi to ścieżka do id czyli value, które będzie przekazywane w formularzu. W naszym wypadku interesuje nas id User’a. Trzeci parametr określa co ma być wyświetlane użytkownikowi w rozwijanej liście.
Możemy podać tam tylko ścieżkę “{n}.User.nazwisko” – otrzymamy wtedy listę nazwisk.

My chcemy w bardziej złożony sposób skomponować te wartości, dlatego wrzucamy tam tablicę, której pierwszy element
“{0} {1} ({2})” określa regułę jak poszczególne wartości mają być złączone. W naszym przypadku:
“element zerowy, potem spacja, potem pierwszy element, spacja, znak otwarcia nawiasu, drugi element i znak zamknięcia nawiasu”.
Kolejne elementy przekazanej tablicy to ścieżki do wartości.

Oczywiście, jeśli np. User belongsTo Company i twój find zwrócił dane dla tego powiązania – możesz użyć takiej ścieżki: “{n}.Company.name”, aby w liście miec nazwę firmy dla tego nazwiska.
Mało tego. Możesz ja wrzucić jako czwarty parametr dla Set::combine(…) – zobacz sam co się stanie ;) [zdaje się, że to działa dopiero od cake1.2]

Obszerniejsza dyskusja na ten temat na grupie: http://groups.google.com/group/cake-php/browse_thread/thread/77ce83191ecc7894/b8308e1ad82783f6?lnk=gst&q=Grzegorz+Pawlik#b8308e1ad82783f6

Share Button

One thought on “Kilka pól w elemencie select

  1. Dzięki wielkie za ten wpis! zaoszczędziłem wiele czasu bo niewiele jest na ten temat w dokumentacji. Pozdrawiam!

Leave a Reply

Your email address will not be published. Required fields are marked *