Temat: Checkboxy - hasMany

Cześć,

Znów zatrzymało mnie coś w drodze do poznania tego coraz bardziej kochanego i znienawidzonego frameworka :)

Mianowicie,

Jeśli Gallery hasMany Photo | Photo belongsTo Gallery, tabela wygląda tak:
id,name - galleries | id name path gallery_id - photos

Pytanie brzmi: Jak do &$^#%%%# utworzyć formularz, który utworzy listę select dla wyboru galerii, a pod spodem listę checkboxów, których można zaznaczyć wiele, i zostaną one dopisane do Photo.gallery_id ?

Walczę już 4 godziny z tym, miałem wiele wariantów już, że zapisywało każdy, nawet niezaznaczony, wcale, zapisywało jakieś rekordy w tabeli galleries itd... A tego właściwego nie.

Udało mi się wykonać koślawą akcję na updateAll, ale to zawsze updatowało wszystkie gallery_id...

Podejrzewam, że saveMany jest do tego, ale nie wiem jak ewentualnie pokazać cake'owi, co ma gdzie zapisac.

Dziękuję, za pomoc .
Marek.
Kamil Kosiński

Kamil Kosiński CTO w
DobryMechanik.pl

Temat: Checkboxy - hasMany

Ja bym zaczął od zastanowienia się czy na pewno hasMany/belongsTo jest dobrą relacją.
Chcesz mieć formularz na którym możesz zaznaczyć które zdjęcia znajdują się w galerii. Czy te same zdjęcia mogą znaleźć się w innej galerii? Jeśli tak to HABTM powinieneś mieć.

Nie do końca też wyobrażam sobie jak to ma działać :)
Zobacz swoje tabelki. Rekord ze zdjęciem zawiera gallery_id, czyli zdjęcie jest przypisywane do galerii już podczas tworzenia (wydaje mi się, że tak przynajmniej powinno być). A mam wrażenie, że ty masz bazę zdjęć dodanych w "magiczny" sposób ;) i chcesz je teraz przypisywać do galerii za pomocą jakiegoś fromularza, tak?

hasMany/belongsTo sprawdza się świetnie w tym co chcesz zrobić (galeria a w niej zdjęcia), ale realizacja powinna być trochę inna tzn (taka najprostsza):
1. dodawanie galerii (galleries/add; formularz z polem name; dodanie rekordu w galleries)
2. wchodzę do galerii (galleries/view/X; pokazanie danego rekordu)
3. dodawanie zdjęcia do galerii (gallery_photos/add/X; formularz z polami name, path; dodanie rekordu w gallery_photos wraz z ustawieniem gallery_id na odpowiednią wartość - wartość tę pobierasz sobie z X w urlu)

Temat: Checkboxy - hasMany

Dziękuję.

Co od hasMany, to na początku chciałem właśnie jedno zdjęcie w galerii.
Ale faktycznie przerobię na HABTM.

To co mnie zastanawia, to czy problem opisany przeze mnie jest do zrealizowania...

Już wiem, że updateAll na pewno nie.
Pozdrawiam.
Kamil Kosiński

Kamil Kosiński CTO w
DobryMechanik.pl

Temat: Checkboxy - hasMany

1. Chcesz zdjęcie w jednej galerii - zrób jak napisałem
2. Chcesz zdjęcie w wielu galeriach - habtm
3. Na pewno się da, ale niestety nie rozumiem jak (po co) ma to działać tak jak opisałeś. Skąd się wzięły zdjęcia, które chcesz przypisać do galerii. Chcesz wersję hasMany/belongsTo czy habtm? Jak dokładnie wygląda twój formularz? Jak wygląda akcja zapisu/wyświetlania formularza?

Temat: Checkboxy - hasMany

Tu jest właśnie problem.
Nie mam pojęcia jak skonstruować form, który wyświetli jak należy :
1.input select w wyborem tylko jednej galerii

a) próbowałem :

$this->loadModel('Gallery');
$this->set('galleries'.$this->Gallery->find('list);
$this->set('photos', $this->Gallery->Photo->find('list');
// widok
echo $this->Form->input('gallery_id'); // otrzymam select w wyborem galerii
echo $this->Form->input('photo_id',array('multiple'=>'checkbox') // da mi zdjęcia ( nazwy + checkbox ) - niby jak chcę


Teraz, nie wiem, co ma być w echo $this->Form->create (Gallery ? Photo ?);
Nie wiem czym zapisywać to w kontrolerze i jak - $this->Gallery->saveAll? $this->Photo->save() ? ...

Tak, jak widzisz, niby nie trudne, ale nie znam sposobu jak zapisywać w ten sposób do bazy - przy normalnym hasMany zapisałbym podczas tworzenia galerii jej nazwę do galleries i zdjęcia do Photo.gallery_id.

Ale w tym przypadku, chcę aby tabela galleries była nie ruszona, mają być tylko zapisane wiersze w Photo.gallery_id, które są zaznaczone w checkboxach.

Dzięki temu mogę utrzorzyć galerię, np: gallery id 1 i zdjęcia z photos z jej kluczem.

Wiem, że to nie trudne, ale z takim przypadkiem mam w cake 1 raz do czynienia.

PS:
otrzymuję taką tablicę jako $this->request ->data:

Array
(
[Gallery] => Array
(
[gallery] => 1
[photo] => Array
(
[0] => 136
[1] => 137
)

)

)
Ten post został edytowany przez Autora dnia 25.11.13 o godzinie 03:38

Temat: Checkboxy - hasMany

W takim formacie, zapisuje, ale koślawo, zamiast dodać dane do pól Photo.gallery_id, tworzy zawsze 1 nowy rekord w photos, z wartością gallery_id


Array
(
[Photo] => Array
(
[gallery_id] => 3
[Photo_id] => Array
(
[0] => 136
[1] => 137
[2] => 138
[3] => 139
)

)

)

Temat: Checkboxy - hasMany

Kamil K.:
1. Chcesz zdjęcie w jednej galerii - zrób jak napisałem
2. Chcesz zdjęcie w wielu galeriach - habtm
3. Na pewno się da, ale niestety nie rozumiem jak (po co) ma to działać tak jak opisałeś. Skąd się wzięły zdjęcia, które chcesz przypisać do galerii. Chcesz wersję hasMany/belongsTo czy habtm? Jak dokładnie wygląda twój formularz? Jak wygląda akcja zapisu/wyświetlania formularza?

Najpierw ładuję zdjęcia za pomocą zaawansowanego uploadera. W tej tabeli są min.
id path name i gallery_id ( gallery_id podczss ładowania zdjęć jest puste )

Potem, biorę dodaj_zdjęcie_do_galerii i:
wybieram z formularza galerię
wybieram, które zdjęcia mają być w tej galerii ( checkboxy ) czyli id path name będzie nie RUSZONE, a dopisane do photos będzie gallery_id.

Na koniec, wybieram z photos zdjęcia które mają np. gallery_id=1.

Na serio, jest co coś dla Cake nie do wykonania?
Kamil Kosiński

Kamil Kosiński CTO w
DobryMechanik.pl

Temat: Checkboxy - hasMany

1. Da się oczywiście
2. Nie wszystko da się załatwić $this->Form->input i $this->Model->save, czasami trzeba poprzerabiać dane (beforeSave, czy na chama foreachem przed save)
3. Będę miała czas w środę. Wtedy postaram się do tego zerknąć
4. Na razie proponuję żebyś zobaczył sobie (nie wiem czy dobrze pamiętam) jak powinny wyglądać dane dla save, saveMany, saveAll. Zobacz co dostajesz z formularza i tak przerób dane żeby dało się je zapisać.
5. W najgorszym wypadku, ale też najszybciej:
foreach ($this->request->data['Photo']['id] as $photoId) {
$this->Photo->id = $photoId;
$this->Photo->set(array(
'Photo' => array(
'gallery_id' => $this->request->data['Photo']['gallery_id']
)
));
$this->Photo->save(null);
}
przy założeniu że dane z formularza masz w postaci:
array(
'Photo' => array(
'id' => array(2,6,8,11),
'gallery_id' => 7
)
);
Powyższe pisane "na sucho", więc mogłem się walnąć.

Temat: Checkboxy - hasMany

Czy chamsko? Chyba nie, tym bardziej, że pokazujesz mi sztuczki, które prowadzą do pożądanego rezultatu, a programiści z Cake na pewno nie są wszechwiedzący, więc każda wiedza się przyda.

Powiem Ci, że Cake mnie wciągnął, napisałem już sobie dużo fajnych rzeczy, szybko, bo po to jest framework, i dziękuję za każdą sugestię, bo gdyby nie Ty, pozostał by tylko Stack Overflow, bo liczna ta nasza grupa, ale odpisujących mało, co poniekąd rozumiem, bo sam jestem w grupie, a pomóc za bardzo nikomu jeszcze nie potrafię, bo się uczę.
Dzięki
Kamil K.:
1. Da się oczywiście
2. Nie wszystko da się załatwić $this->Form->input i $this->Model->save, czasami trzeba poprzerabiać dane (beforeSave, czy na chama foreachem przed save)
3. Będę miała czas w środę. Wtedy postaram się do tego zerknąć
4. Na razie proponuję żebyś zobaczył sobie (nie wiem czy dobrze pamiętam) jak powinny wyglądać dane dla save, saveMany, saveAll. Zobacz co dostajesz z formularza i tak przerób dane żeby dało się je zapisać.
5. W najgorszym wypadku, ale też najszybciej:
foreach ($this->request->data['Photo']['id] as $photoId) {
$this->Photo->id = $photoId;
$this->Photo->set(array(
'Photo' => array(
'gallery_id' => $this->request->data['Photo']['gallery_id']
)
));
$this->Photo->save(null);
}
przy założeniu że dane z formularza masz w postaci:
array(
'Photo' => array(
'id' => array(2,6,8,11),
'gallery_id' => 7
)
);
Powyższe pisane "na sucho", więc mogłem się walnąć.

Temat: Checkboxy - hasMany

Zrobiłem w końcu na HABTM, też działa i to nieźle.
Dzięki.

Następna dyskusja:

Checkboxy i images




Wyślij zaproszenie do