Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZF] Modyfikacja kontrolek/stanu kontrolek z kontrolera?
Forum PHP.pl > Forum > PHP > Frameworki
phpmack
Mama mały problem
Chodzi o taki przypadek gdzie w widoku generuje sobie jakieś kontrolki (nie korzystam z Zend_Form bo dekoratory doprowadzają mnie do białej gorączki) pola select, checkbox-y itd. i teraz po wybraniu/kliknięciu mogę uruchomić jakąś akcje + przesłać parametry do akcji ale co z tego skoro z poziomu akcji nie mogę zmodyfikować stanu tych kontrolek np. nowe elementy w "selekcie" odhaczenie checbox-a itd.
korzystając z
  1. $this->view->...
mogę dodać element ale nie mogę zmienić jego stanu/zmodyfikować go np.
  1. $this->view->check1->checked = 1
dostaję komunikat
Cytat
Notice: Indirect modification of overloaded property
co zrobić w takiej sytuacji? w jaki sposób można modyfikować stan kontrolek?

snapshot
Spróbuj
  1. $this->view->check1->setChecked(true);
phpmack
Cytat(snapshot @ 25.11.2011, 10:54:28 ) *
Spróbuj
  1. $this->view->check1->setChecked(true);

dostaje:
Cytat
Fatal error: Call to a member function setChecked() on a non-object


w jaki sposób inaczej można rozwiązać tego typu problem? czy może z poziomu kontrolera nie da się modyfikować kontrolek??
IceManSpy
Wydaje mi się, że tego nie zrobisz. Jak nie używasz Zend_Form, to nie będzie tak łatwo. Jedyne co mi przychodzi do głowy, to zrobić jakąś zmienną typu bool, którą będziesz przekazywać do widoku, a w widoku zrobisz if'a. Jeśli true, to robisz, że zaznaczone, jeśli nie, to nie.
phpmack
Tego się właśnie obawiałem:/ pozostaje jeszcze pokombinowanie z view helperem. Najłatwiej by było użyć Zend_Form ale nie znalazłem działającego sposobu aby uzyskać czysty element np. checkbox po wyrenderowaniu żeby wyglądał tak:
  1. <input type="checkbox" name="check1" />
może ktoś na forum się z tym już uporał? przez to obudowywanie elementów stosem niepotrzebnych mi tagów wszystko się rozjeżdża.
Pilsener
Cytat
nie korzystam z Zend_Form bo dekoratory doprowadzają mnie do białej gorączki


Nikt nie każe ich używać.

Użyj własnego widoku, w którym wykorzystasz formularz jako model danych, masz przecież metody typu ->getLabel więc nie widzę problemu by zrobić:
  1. //mój własny label
  2. <h2><?php echo $this->form->kontrolka->getLabel() ?></h1>


Inaczej będziesz musiał sam wszystko robić ręcznie.
phpmack
No ok szukam info o wykorzystaniu własnego "szablonu" przy tworzeniu formularza za pomocą Zend_Form na razie bez większych sukcesów, ale pojawił się inny problem mam taką formę z samym checkbox-em:
  1. <?php
  2. class Application_Form_Panel extends Zend_Form
  3. {
  4. public function init()
  5. {
  6.  
  7. $checkbox = new Zend_Form_Element_Checkbox('check');
  8.  
  9. $checkbox->removeDecorator('HtmlTag');
  10. $checkbox->removeDecorator('DtDdWrapper');
  11. $checkbox->removeDecorator('Label');
  12.  
  13. $this->addElements(array($checkbox));
  14.  
  15. }
  16. }
  17. ?>


teraz w kontrolerze tworze instancje formy i dodaje ją do widoku:
  1. $check = new Application_Form_Panel();
  2. $this->view->check = $check;


No i tutaj pojawiają się schody bo w widoku zależnie od sytuacji generuje w pętli odpowiednią ilość checkbox, tyle tylko że każdy będzie miał taką samą nazwę i id;/ czyli nie będę miał nad nimi kontroli.
Pomyślałem żaden problem wygeneruje tablicę checkbox w kontrolerze i przekaże ją do widoku - i znowu zonk nie nie mogę zmienić id i nazwy formy według potrzeb nawet przy jej tworzeniu w kontrolerze - dostaje elementy z tą samą nazwą "check" tak jak zdefiniowana w klasie Form. Jak podejść do takiego zagadnienia?
skowron-line
Musisz do Form przekazać ile chceckboxów będziesz tworzył i tam wygenerować każdy z nich osobno.
phpmack
Cytat(skowron-line @ 26.11.2011, 16:04:07 ) *
Musisz do Form przekazać ile chceckboxów będziesz tworzył i tam wygenerować każdy z nich osobno.

przy tworzeniu instancji klasy Form?? mówisz o czymś takim:
  1. $check = new Application_Form_Panel(10);

musiał bym przekazać ilość checkbox i ich nazwy....

coś takiego działa tylko nie wiem czy to ma sens??
  1. foreach($tab_devices as $dev){
  2.  
  3. $check = new Application_Form_Panel();
  4. $check->check->setName($dev->device_name);
  5. $tab_check[] = $check;
  6. $this->view->check = $tab_check;
  7.  
  8. }

czyli tworze w kontrolerze odpowiednią ilość form i przekazuje do widoku jako tablicę

Dobra jednak to niema sensu biggrin.gif kombinuje dalej..

No dobra mam coś takiego:
  1. foreach($tab_devices as $dev){
  2.  
  3. $check[$dev->device_name] = new Application_Form_Panel();
  4. $check[$dev->device_name]->check->setName($dev->device_name);
  5. //$tab_check[$dev->device_name] = $check;
  6. $this->view->check = $check;
  7.  
  8. }

Trochę dziwne toto ale działa tak że dostaje tablice Form "check", dostęp do poszczególnych obiektów (mimo że są identyczne i nazywają się "check") mam dzięki tablicy... co o tym myślicie? przekombinowałem?
Pilsener
Masz działać tak:
1. Utworzyć formularz
2. W kontrolerze go wywołać i obsłużyć, ewentualnie zmodyfikować (jeśli jest taka potrzeba, by formularz tworzyć dynamicznie)
3. Przekazać cały formularz do widoku
4. Użyć tego formularza w widoku, ale nie przez echo $this->form tylko rozbijając na poszczególne elementy tak, by uzyskać planowany efekt HTML

Czyli zacznij od wyświetlenia całego formularza przez echo $this->form a jeśli wszystko będzie działać jak należy to wystarczy Tobie zmodyfikować widok, w którym będziesz ten formularz wyświetlał.
phpmack
Jeszcze jedna sprawa, utworzyłem formularz w kontrolerze i przekazałem do widoku (formularz składa się jedynie z elementów checkbox) mogę go modyfikować sprawdzić stan "czy zaznaczony" itd. ale z braku "guziczka" submit nie jestem w stanie odebrać danych z tego formularza? mogę klikać te checkbox-y w nieskończoność ale one nie przesyłają żadnych danych, co z tym zrobićquestionmark.gif?
skowron-line
  1. public function __construct($ile, $options = null) {
  2. parent::__construct($options);
  3. // i tu twoje checkboxy w pętli i submit
  4. }

a w kontrolerze wywołujesz
  1. $form = new Application_Form_Panel(10);
  2. $this->view->form = $form;
Niktoś
Dodać do checkboxa onclick event:
  1. <input type="chceckbox " onclick="wysli()">
  2.  
  3.  
  4. <script type="text/javascript">
  5. function wysli(){
  6. document.forms["nazwaformularza"].submit();
  7. }


Nie wiem czy takie rozwiązanie Ciebie interesuje.
skowron-line
Cytat(Niktoś @ 26.11.2011, 18:25:36 ) *
Dodać do checkboxa onclick event:
  1. <input type="chceckbox " onclick="wysli()">
  2.  
  3.  
  4. <script type="text/javascript">
  5. function wysli(){
  6. document.forms["nazwaformularza"].submit();
  7. }


Nie wiem czy takie rozwiązanie Ciebie interesuje.

Bardzo głupie rozwiązanie. @phpmack chce mieć 10 checkbox ów i jak zaznaczy 1 to od razu mu wyśle formularz. A co jak będzie chciał więcej niż jeden zaznaczyć questionmark.gif
Niktoś
O tym nie pisał,to taki autopost po kliknięciu na checkbox.
phpmack
Cytat(skowron-line @ 26.11.2011, 18:23:28 ) *
  1. public function __construct($ile, $options = null) {
  2. parent::__construct($options);
  3. // i tu twoje checkboxy w pętli i submit
  4. }

a w kontrolerze wywołujesz
  1. $form = new Application_Form_Panel(10);
  2. $this->view->form = $form;


Skorzystałem z tego pomysłu i generuje sobie elementy formy na podstawie przekazanej tablicy elementów od razu ustawiam nazwy poszczególnych checkbox itd. rewela ale dlaczego gdy na stronie wyświetlane są jednoczenie dwa formularze to po kliknięciu na jakikolwiek "submit" wysyła mi wszystkie formularze?

Nadałem elementom "submit" w formularzach unikalne nazwy i teraz w akcji sprawdzam który został użyty:
  1. if ($this->_request->getPost('check_submit'))

ale to zabezpiecza tylko przed przedwczesną walidacją bo dalej gdy odbieram dane z POST to po wykonaniu:
  1. $this->getRequest()->getPost();

czyści mi dane ze wszystkich jednocześnie wyświetlanych formularzy

Może jeszcze opisze mój problem;) A więc jeden formularz z checkbox-ami wyświetlam na stronie cały czas używam go do aktywowania urządzeń czyli generuje sobie listę urządzeń a za pomocą pól chechbox włączam lub wyłączam urządzenia. Wszystko ok do momentu kiedy na stronie pojawi się drugi formularz np. dodawanie nowego urządzenia do bazy bo po wykonaniu go kasuje mi wszystkie checkbox-y.
Można coś z tym zrobić?
skowron-line
Dzieje się tak dlatego że masz ustawiony parametr action taki sam dla obu formularzy (zapewne pusty).
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.