Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]CakePHP edycja pozycji., CakePHP problem z edycją pozycji.
shuwax
post 19.02.2016, 20:41:53
Post #1





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 19.02.2016

Ostrzeżenie: (0%)
-----


Witam, mam problem z edycją danych w cakephp, mianowicie, próbuje stworzyć prosty system aktywnych miejsc w sali. Podczas tworzenie sali wybieramy ilość rzędów i miejsc w tym rzędzie, po czym tworzy nam się kwadrat o podanych proporcjach(wypełnienie tabeli seats danymi domyślnie status = 1, czyli miejsce dostępne). Następnie ustawiamy, które miejsca mają być zablokowane poprzez odznaczenie tych miejsc(checkbox zmiana status z 1 na 0), wszystko było by dobrze, gdyby nie fakt że zapisuje tylko ostatnią pozycje z edytowanego miejsca.


Controller sali
  1. var $uses = array('Hall', 'Seat');
  2.  
  3. public function add()
  4. {
  5. if($this->request->is('post'))
  6. {
  7. $this->Hall->create();
  8. if($this->Hall->save($this->request->data))
  9. {
  10. $id = $this->Hall->id;
  11. $this->Seat->create();
  12. $rzedy = $this->request->data('Hall.count_rows');
  13. $miejsca = $this->request->data('Hall.count_seats');
  14. $ilosczapisow= 0;
  15. for($i = 1 ; $i <= $rzedy ; $i++)
  16. {
  17. for($j = 1 ; $j <= $miejsca ; $j++)
  18. {
  19. $this->Seat->set('num_rown',$rzedy);
  20. $this->Seat->set('num_seat',$miejsca);
  21. $this->Seat->set('Halls_id',$id);
  22. $this->Seat->set('status',1);
  23. if($this->Seat->save())
  24. $ilosczapisow ++;
  25. if($i != $rzedy || $j != $miejsca)
  26. $this->Seat->create();
  27. }
  28. }
  29.  
  30. $this->Flash->success(' OK ');
  31. $this->redirect('test/'.$id);
  32. }
  33. else
  34. {
  35. $this->Flash->error('Error');
  36. }
  37. }
  38.  
  39. }
  40.  
  41.  
  42. // Funkcja do edycji miejsc
  43. public function test($id = null) {
  44. $hall_seat = $this->Seat->find('all', array(
  45. 'conditions' => array('Seat.halls_id' => array($id))));
  46. $this->set('seats',$hall_seat);
  47.  
  48. if($this->request->is(array('put')))
  49. {
  50. if($this->Seat->saveAll($this->data))
  51. {
  52. $this->Flash->success('Data saved');
  53. $this->redirect('test/'.$id);
  54. }
  55. else
  56. $this->Flash->error('Error');
  57. }
  58.  


Widok test

  1. echo $this->Form->create('Seat', array('type' => 'put'));
  2. foreach($seats as $seat) {
  3. if($seat['Seat']['status'] == 1 )
  4. echo $this->Form->checkbox('Seat.status', array("checked" =>
  5. "checked"));
  6. else
  7. echo $this->Form->checkbox('Seat.status');
  8.  
  9. echo $this->Form->input('id', array('value' => $seat['Seat']['id']));
  10. }
  11. echo $this->Form->end('Save');



Baza danych wygląda nast:

Halls (id,name,count_rows,count_seat),
Seats(id,num_rown,num_seat,Halls_id,status) gdzie
  1.  
  2. public $belongsTo = array(
  3. 'Halls' => array(
  4. 'className' => 'Halls',
  5. 'foreignKey' => 'Halls_id',)

Jestem dopiero początkujący w tym temacie ,więc miłą widziana wyrozumiałość jeśli to będzie jakaś trywialna rzecz.
Go to the top of the page
+Quote Post
kicaj
post 20.02.2016, 20:46:25
Post #2





Grupa: Zarejestrowani
Postów: 1 640
Pomógł: 28
Dołączył: 13.02.2003
Skąd: Międzyrzecz/Poznań

Ostrzeżenie: (0%)
-----


Wszystkie Twoje checkbox'y mają tę samą nazwę i ten sam ID..., czyli się nadpisują, stąd ostatni tylko tak naprawdę istnieje.


--------------------
PHP Developer

"Nadmiar wiedzy jest równie szkodliwy jak jej brak" Émile Zola
Go to the top of the page
+Quote Post
shuwax
post 20.02.2016, 21:11:22
Post #3





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 19.02.2016

Ostrzeżenie: (0%)
-----


Dzięki za odpowiedź, zrobiłem debuga jak wygląda tablica przed zapisem i jakoś rozwiązałem ten problem:
View:
  1. echo $this->Form->create('Seat', array('type' => 'put'));
  2. foreach($seats as $seat) {
  3. if($seat['Seat']['status'] == 1)
  4. {
  5. if($enter == $miejsca)
  6. {
  7. echo $this->Form->checkbox('Seat.'.$i.'.status', array("checked" => "checked"), array("empty" => 0));
  8. $enter=1;
  9. }
  10. else
  11. echo "<ul>".$this->Form->checkbox('Seat.'.$i.'.status', array("checked" => "checked"), array("empty" => 0))."</ul>";
  12. }
  13. else
  14. {
  15. if($enter==$miejsca)
  16. {
  17. echo $this->Form->checkbox('Seat.'.$i.'.status', array("empty" => 0))."</ul>";
  18. $enter=1;
  19. }
  20. else
  21. echo "<ul>".$this->Form->checkbox('Seat.'.$i.'.status', array("empty" => 0))."</ul>";
  22. }
  23. echo $this->Form->input('Seat.'.$i.'.id', array('value' => $seat['Seat']['id'],'hidden' => true));
  24. $i++;
  25. $enter++;
  26. };
  27. echo $this->Form->end('Save');



Natomiast w controllerze użyłem combine do ustawienia tablicy w taki sposób aby zgadzałą się ze wzorem saveAll
  1. if($this->request->is(array('put')))
  2. {
  3.  
  4. if(!empty($this->data))
  5. {
  6. if($this->Seat->saveAll($this->data['Seat']))
  7. {
  8. $this->Flash->success('Hall zedytowana.');
  9. $this->redirect('test/'.$id);
  10. }
  11. else
  12. {
  13. $this->Flash->error('Hall zedytowana.');
  14. }
  15. //CakeLog::write('debug', 'myArray'.print_r($this->data['Seat'], true) );
  16. }
  17. else
  18. {
  19. $this->data['Seat'] = Set::combine($this->Profile->find('all'), '{n}.Seat.id', '{n}.Seat');
  20. //CakeLog::write('debug', 'myArray'.print_r($this->data['Seat'], true) );
  21. }
  22. }
  23.  

Może komuś się to przyda w przyszłości.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 22.05.2024 - 01:36