Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZF][ZendFramework]Zend Form + jQuery problem z niektorymi polami
Forum PHP.pl > Forum > PHP > Frameworki
Skyline
Witam

Mam problem z wypelnieniem pola typu select (wygenerowanego przez zend_form) za pomoca jQuery.

Jesli mam element typu textarea:

  1. $this->addElement('textarea', 'address', array(
  2. 'label' => 'Adres:',
  3. 'required' => true,
  4. 'filters' => array('StringTrim')
  5. ));


Wyglądający w html'u tak:

  1. <dt id="address-label">
  2. <label for="address" class="required">Adres:</label>
  3. </dt>
  4. <dd id="address-element">
  5. <textarea name="address" id="address" rows="24" cols="80"></textarea>
  6. </dd>


To spokojnie moge go wypelnic treścią za pomocą jQuery:

  1. $('#address').html('Tresc ktora pojawi sie w textarea');


Natomiast nie moge wypelnic elementu:

  1. $company = $this->createElement('select', 'company', array('label' => 'Firma:'));
  2. $company->setRequired(false);
  3. $company->addMultiOption('0', '-- wybierz --');
  4. $this->addElement($company);


kodem:

  1. $('#company').html('<option value="1" label="1">Pierwsza firma</option>');


Natomiast jesli recznie w pliku szablonu wpisze kod ktory generuje zend form dla elementu select (czyli sam sobie recznie takiego selecta utworze) to moge go wypelnic za pomoca tej skladni jQuery.

Czy ktos z was jest w stanie okreslic, gdzie lezy problem?
batman
Pokaż źródło wygenerowanego select-a.
Spróbuj użyć funkcji append w jQuery do dodania opcji.
Skyline
  1. <dt id="company-label">
  2. <label for="company" class="required">Firma:</label>
  3. </dt>
  4. <dd id="company-element">
  5. <select id="company"></select>
  6. </dd>


Jak wkleje to recznie w plik widoku to dziala, jak generowane przez zend form <?= $this->form->company; ?> to nie działa.
batman
Sprawdziłeś, czy działa append? Jeśli nie, to sprawdź.
Następnie sprawdź takie coś:
[JAVASCRIPT] pobierz, plaintext
  1. alert($("#company").length);
[JAVASCRIPT] pobierz, plaintext
a na koniec sprawdź, czy nie masz nic w konsoli błędów.
Skyline
  1. alert($("#company").length);
wyswietla 0, append nie dziala :/
batman
Skoro wyświetla 0, to znaczy, że nie ma takiego elementu. Sprawdź czy nie masz jakichś błędów w konsoli oraz czy wykonujesz kod javascript po wyświetleniu select-a lub w zdarzeniu ready.
Skyline
Bledow w konsoli nie ma. Dodawanie options odbywa sie po wyswietleniu formularza, za pomoca zdarzenia onkeyup przy jednym z pol formularza.
seth-kk
pokaz calosc - wtedy bedziemy mogli znalezc blad zamiast zgadywac gdzie moze byc
Skyline
Kod php formularza:

  1. class Infolinia_Form_ClientAdd extends Zend_Form
  2. {
  3. public function __construct()
  4. {
  5. parent::__construct();
  6. $this->init();
  7. }
  8.  
  9. public function init()
  10. {
  11. $this->setMethod('post');
  12. $this->setAttrib('id', 'AddForm');
  13. $this->addElementPrefixPath('BB_Validate', 'BB/Validate/', 'validate');
  14.  
  15. $this->addElement('text', 'name', array(
  16. 'label' => 'Imię:',
  17. 'required' => true,
  18. 'filters' => array('StringTrim'),
  19. ));
  20.  
  21. $this->addElement('text', 'surname', array(
  22. 'label' => 'Nazwisko:',
  23. 'required' => true,
  24. 'filters' => array('StringTrim'),
  25. 'attribs' => array('onkeyup' => 'lookup();')
  26. ));
  27.  
  28. $this->addElement('text', 'companyname', array(
  29. 'label' => 'Nazwa firmy:',
  30. 'required' => false,
  31. 'filters' => array('StringTrim'),
  32. 'attribs' => array('onkeyup' => 'lookupCompany();')
  33. ));
  34.  
  35. $company = $this->createElement('select', 'company', array('label' => 'Firma:'));
  36. $company->setRequired(false);
  37. $company->addMultiOption('0', '-- wybierz --');
  38. $this->addElement($company);
  39.  
  40. $this->addElement('submit', 'submit', array(
  41. 'ignore' => true,
  42. 'label' => 'Dalej',
  43. ));
  44. }
  45. }



Wygenerowany kod formularza wygląda tak:

  1. <form id="LoginForm" enctype="application/x-www-form-urlencoded" method="post" action="">
  2. <dl class="zend_form">
  3. <dt id="companyname-label">
  4. <label for="companyname" class="optional">Nazwa firmy:</label>
  5. </dt>
  6. <dd id="companyname-element">
  7. <input type="text" name="companyname" id="companyname" value="" onkeyup="lookupCompany();" />
  8. </dd>
  9. <dt id="company-label">
  10. <label for="company" class="optional">Firma:</label>
  11. </dt>
  12. <dd id="company-element">
  13. <select name="company" id="company">
  14. <option value="0" label="-- wybierz --">-- wybierz --</option>
  15. </select>
  16. </dd>
  17. <dt id="name-label">
  18. <label for="name" class="required">Imię:</label>
  19. </dt>
  20. <dd id="name-element">
  21. <input type="text" name="name" id="name" value="" />
  22. </dd>
  23. <dt id="surname-label">
  24. <label for="surname" class="required">Nazwisko:</label>
  25. </dt>
  26. <dd id="surname-element">
  27. <input type="text" name="surname" id="surname" value="" onkeyup="lookup();" />
  28. </dd>
  29. <dt id="submit-label">&nbsp;</dt>
  30. <dd id="submit-element">
  31. <input type="submit" name="submit" id="submit" value="Dalej" />
  32. </dd>
  33. </dl>
  34. </form>
  35.  


Funkcja odpowiedzialna za dodanie <options>:

  1. function lookupCompany()
  2. {
  3. $('#company').html('<option value="1" label="1">Pierwsza firma</option>');
  4. } // lookup
batman
Na początek wywal z Twojej klasy to:
  1. public function __construct()
  2. {
  3. parent::__construct();
  4. $this->init();
  5. }
Powinno pomóc.
Skyline
Nic to nie zmienia...
batman
Jeśli to nie pomogło, to nie wiem gdzie może być problem. Wrzuć stronę na jakiś hosting, by można było zobaczyć to na żywo.
xajart
Może przeprowadz sobie wstępną diagnostykę, na początek podgląd drzewa DOM. Potem za pomocą alertu wyświetlić wartość jaka zostaje wybrana z selecta. Choćby po to by sprawdzić czy poprawnie się do niego odwołujesz. A potem wprowadz nową wartość do selecta i sprawdz na drzewku DOM co się dzieje. 

poza tym pisząc w ten sposób:

Kod
$('#company').html('<option value="1" label="1">Pierwsza firma</option>');


zastępujesz już istniejący wpis o wartości 0. 
jak kolega wcześniej pisał należy użyć append by dodać kolejną:
Kod
$('#company').append('<option value="1" label="1">Pierwsza firma</option>');



Na czystym HTML + JS to działą bez problemu, zaś na kodzie frameworka który masz podany wyżej nie sprawdzałem - bo teraz nia mam na to czasu. Może wieczorem jak wróce to sprawdze. 

Sprawdz sobie skrypt pod kątem identyfikatorów oraz pod katem innych plików JS czy nie ma jakiś konfliktów.
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.