Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [ZF] Modyfikacja kontrolek/stanu kontrolek z kontrolera?
phpmack
post
Post #1





Grupa: Zarejestrowani
Postów: 55
Pomógł: 1
Dołączył: 11.06.2011

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


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?

Go to the top of the page
+Quote Post
snapshot
post
Post #2





Grupa: Zarejestrowani
Postów: 96
Pomógł: 6
Dołączył: 22.08.2007
Skąd: Wrocław

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


Spróbuj
  1. $this->view->check1->setChecked(true);
Go to the top of the page
+Quote Post
phpmack
post
Post #3





Grupa: Zarejestrowani
Postów: 55
Pomógł: 1
Dołączył: 11.06.2011

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


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??
Go to the top of the page
+Quote Post
IceManSpy
post
Post #4





Grupa: Zarejestrowani
Postów: 1 006
Pomógł: 111
Dołączył: 23.07.2010
Skąd: Kraków

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


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.
Go to the top of the page
+Quote Post
phpmack
post
Post #5





Grupa: Zarejestrowani
Postów: 55
Pomógł: 1
Dołączył: 11.06.2011

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


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.
Go to the top of the page
+Quote Post
Pilsener
post
Post #6





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

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


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.
Go to the top of the page
+Quote Post
phpmack
post
Post #7





Grupa: Zarejestrowani
Postów: 55
Pomógł: 1
Dołączył: 11.06.2011

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


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?
Go to the top of the page
+Quote Post
skowron-line
post
Post #8





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

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


Musisz do Form przekazać ile chceckboxów będziesz tworzył i tam wygenerować każdy z nich osobno.
Go to the top of the page
+Quote Post
phpmack
post
Post #9





Grupa: Zarejestrowani
Postów: 55
Pomógł: 1
Dołączył: 11.06.2011

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


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 (IMG:style_emoticons/default/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?

Ten post edytował phpmack 26.11.2011, 16:55:37
Go to the top of the page
+Quote Post
Pilsener
post
Post #10





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

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


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ł.
Go to the top of the page
+Quote Post
phpmack
post
Post #11





Grupa: Zarejestrowani
Postów: 55
Pomógł: 1
Dołączył: 11.06.2011

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


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ć(IMG:style_emoticons/default/questionmark.gif) ?

Ten post edytował phpmack 26.11.2011, 18:11:40
Go to the top of the page
+Quote Post
skowron-line
post
Post #12





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

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


  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;
Go to the top of the page
+Quote Post
Niktoś
post
Post #13





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


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.
Go to the top of the page
+Quote Post
skowron-line
post
Post #14





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

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


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ć (IMG:style_emoticons/default/questionmark.gif)
Go to the top of the page
+Quote Post
Niktoś
post
Post #15





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


O tym nie pisał,to taki autopost po kliknięciu na checkbox.
Go to the top of the page
+Quote Post
phpmack
post
Post #16





Grupa: Zarejestrowani
Postów: 55
Pomógł: 1
Dołączył: 11.06.2011

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


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ć?

Ten post edytował phpmack 26.11.2011, 22:16:14
Go to the top of the page
+Quote Post
skowron-line
post
Post #17





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

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


Dzieje się tak dlatego że masz ustawiony parametr action taki sam dla obu formularzy (zapewne pusty).
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 27.09.2025 - 08:13