Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] MVC dobre praktyki - Code igniter
Forum PHP.pl > Forum > Przedszkole
pr4ktykant
Mam formularz który dodaje rekordy do bazy. W nim prawie 80 pól z których każde jest inne więc trzeba je ponazywać, dopisać do widoku i umieścić jeszcze w widoku edycji. Sam plik ma ponad 1 000 linijek i gdy próbuję coś zmienić muszę edytować na raz 2 pliki (dodawanie i edycja). Myślę więc jak to powinno się najlepiej rozwiązać. Zrobić jeden widok dla dodawania i edycji i w nim warunki czy zostawić to tak jak jest ?
Gdybym miał drugi widok musiałbym
* zrobić tablice z pustymi wartościami z wszystkich pól które będą zapisane (żeby nie wywaliło w widoku że zmienna nie istnieje)
* zrobić warunki na akcje formularza (add/edit) oraz na submit formularza (dodaj/zapisz zmiany)
tylko czy to jest dobry pomysł takie faszerowanie widoku pustymi zmiennymi oraz warunkami ? Niby bym miał łatwiej ale plik będzie bardziej zamotany chyba. Jak wy to robicie dla takich dużych formularzy ?
Turson
Cytat
Zrobić jeden widok dla dodawania i edycji i w nim warunki

Dokładnie tak
pr4ktykant
a co robicie z pustymi zmiennymi ? isset czy generowanie ich masowo w controler'ach. Probuje znalezc najlepszy sposob a jak sie czegos naucze pozniej nawykow trudno jest sie pozbyc wiec najlepiej nabyc ich jak najlepszych wink.gif
markuz
Te 80 pól różni się od siebie bardzo? Mógłbyś podać jakieś przykłady?
Turson
W samym frameworku powinien istnieć sposób na to, że albo wartość jest pusta (dodawanie), albo pobiera ją z bazy jeżeli istnieje (istnieje). Wydaje mi się, że CI powinno mieć coś takiego.
pr4ktykant
@markuz baza wyglada mniej wiecej tak (sory ze w screenie):


@Turson o to chodzi ze ucze się Code Igniter i właśnie szukam na to rozwiązania bo nie wiem jak to zrobić :/ nie natknąłem się nigdzie na takie rozwiązanie, ale jak dam zmienną która nie istnieje to oczywiście jest błąd.
markuz
  1. # Przykładowy kontroler
  2.  
  3. class TestController extends CI_Controller {
  4.  
  5. private $fields = array(
  6. 'label' => 'Nazwa',
  7. 'field' => 'name',
  8. 'rules' => 'required|trim|xss_clean',
  9. 'value' => NULL,
  10. 'type' => 'input'
  11. ),
  12. 'label' => 'Lokalizacja tekstu?',
  13. 'field' => 'location_text',
  14. 'rules' => 'required|trim|xss_clean',
  15. 'value' => NULL,
  16. 'type' => 'textarea'
  17. ),
  18. 'label' => 'Is comm',
  19. 'field' => 'is_comm',
  20. 'rules' => 'required|trim|xss_clean',
  21. 'value' => NULL,
  22. 'type' => 'checkbox'
  23. ),
  24. );
  25.  
  26. public function add()
  27. {
  28. foreach($this->fields as $field)
  29. {
  30. $this->form_validation->set_rules($field['label'], $field['field'], $field['rules']);
  31. }
  32.  
  33. if($this->form_validation->run() == TRUE)
  34. {
  35. foreach($this->fields as $key => $field)
  36. {
  37. $this->fields[$key]['value'] = $this->input->post($field['field']);
  38. }
  39.  
  40. $this->ExampleModel->insert($this->fields);
  41. }
  42.  
  43. $this->load->view('add', array(
  44. 'fields' => $this->fields,
  45. ));
  46. }
  47.  
  48. public function edit($id)
  49. {
  50. foreach($this->fields as $field)
  51. {
  52. $this->form_validation->set_rules($field['label'], $field['field'], $field['rules']);
  53. }
  54.  
  55. if($this->form_validation->run() == TRUE)
  56. {
  57. foreach($this->fields as $key => $field)
  58. {
  59. $this->fields[$key]['value'] = $this->input->post($field['field']);
  60. }
  61.  
  62. $this->ExampleModel->update($this->fields, $id);
  63. }
  64.  
  65. $this->load->view('update', array(
  66. 'fields' => $this->fields,
  67. ));
  68. }
  69.  
  70. }
  71.  
  72. # Widok add.php
  73.  
  74. foreach($fields as $field)
  75. {
  76. switch($field['type'])
  77. {
  78. case 'textarea':
  79. echo form_textarea($field['field'], set_value($field['field']));
  80. break;
  81.  
  82. case 'checkbox':
  83. echo form_checkbox($field['field'], set_value($field['field']));
  84. break;
  85.  
  86. default:
  87. echo form_input($field['field'], set_value($field['field']));
  88. break;
  89. }
  90.  
  91. }
  92. echo form_submit('submit');
  93.  
  94. # Widok edit.php
  95.  
  96. foreach($fields as $field)
  97. {
  98. switch($field['type'])
  99. {
  100. case 'textarea':
  101. echo form_textarea($field['field'], set_value($field['field'], $field['value']));
  102. break;
  103.  
  104. case 'checkbox':
  105. echo form_checkbox($field['field'], set_value($field['field'], $field['value']));
  106. break;
  107.  
  108. default:
  109. echo form_input($field['field'], set_value($field['field'], $field['value']));
  110. break;
  111. }
  112. }
  113. echo form_submit('submit');


CI to bardzo oporny framework, pracuję na nim już od 2 lat i czasami trzeba wymyśleć coś po swojemu żeby sobie zaoszczędzić pracy. Nie wiem czy kod jest prawidłowy bo pisałem z palca i nie sprawdzałem aczkolwiek myślę, że ogólny sens zrozumiałeś wink.gif
pr4ktykant
Dziękuję za kod, później go jeszcze dokładniej przeanalizuję z verification, sporo się z niego nauczę. Nie rozumiem jednak jednego. Po co to set_value skoro 2 parametr dla np. input i tak przyjmuje wartosc "value" wiec nwaet jak sie da bez set_value to bedzie to samo ...

Nie jestem pewien czy dobrze zrozumiałem ale w Twoim kodzie chyba i tak jest podzielone na 2 pliki widok add/edit a mam tam już ponad 1 000 linijek razem z foundation posegregowanych w tabulatory i zmienianie tego na tym etapie to prawie jak pisanie tego od nowa sad.gif

Zazwyczaj używam trochę inaczej form_helper'a bo muszę dać więcej opcji więc przykładowo wygląda u mnie to tak:
  1. <?=form_label('Name', 'name')?>
  2. <?=form_input(array('name'=>'name', 'id'=>'name', 'placeholder'=>'Obiect name', 'value'=> $object['name'] ))?>

i myślę czy nie szybciej w tym momencie byłoby w widoku dać jakiś isset albo przynajmniej cos w stylu:
  1. ($object['name'] != '' ? $object['name'] : '')

ale jak do tablicy dodać takie cos ?
Mogę dla każdego z 80 elementów dać dodatkowa zmienna np.:
  1. ($object['name'] != '' ? $element_name = $object['name'] : $element_name = '')

ale pisać to znów 80 razy ?

markuz
Cytat
Dziękuję za kod, później go jeszcze dokładniej przeanalizuję z verification, sporo się z niego nauczę. Nie rozumiem jednak jednego. Po co to set_value skoro 2 parametr dla np. input i tak przyjmuje wartosc "value" wiec nwaet jak sie da bez set_value to bedzie to samo ...

Drugi parametr dla input to jego value. Jak go nie podasz to value = "". Jak dodasz do tego set_value('pole') to wtedy value = $_POST['pole']. Jak zrobisz set_value('pole', 'pole2') wtedy jeśli $_POST['pole'] jest puste to pobiera pole2 (w moim przypadku pobierze go z modelu).
Cytat
Zazwyczaj używam trochę inaczej form_helper'a bo muszę dać więcej opcji

Równie dobrze możesz w tablicy fields dodać elementy takie jak placeholder czy id i wyświetlać je jeśli element != NULL

Dodałem widoki edit i add bo takie rozwiązanie jest według mnie lepsze. Ogólnie chciałem Ci przedstawić koncepcję a jeśli chodzi o wykonanie to już twoja sprawa wink.gif Nie chcesz poprawiać - nie musisz. To zależy jak dużo zmian będziesz musiał potem wprowadzać i co zajmie Ci więcej czasu.
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.