Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][DOM] DOMDocument, pobieranie node
Forum PHP.pl > Forum > Przedszkole
Agape
Witam. Podpowiedzcie mi bo już zbyt długo sie z tym męczę ;/. Chce pobrac wszystkie inputy z formy ze strony a później chce mieć w tablicy wszystkie opcje wszystkich select. Korzystam wiec z DOMDocument i mam takie coś:
  1. $html = new DOMDocument();
  2. @$html->loadHTML($form_code);
  3. $forms = $html->getElementsByTagName('form');
  4.  
  5. foreach ($forms as $form) {
  6. if($form->getAttribute('id')=='mojaforma'){
  7. $selects = $form->getElementsByTagName('select');
  8. foreach ($selects as $select){
  9. $select_name[] = $select->getAttribute('name');
  10. }
  11. $options = $form->getElementsByTagName('select');
  12. foreach ($options as $option){
  13. $option->getElementsByTagName('option');
  14. foreach($option as $opcja){
  15. $selecty[] = $option->getAttribute('name');
  16. }
  17. }
  18. }
  19. }


Za nic w świecie nie mogę dojść jak dla tych selectów pobrać odpowiadające im node (option). Próbowałem na różne sposoby ;/
print_r($selecty) nic nie wyswietla ;/ a niestety dokumentacja jest uboga ;/
wNogachSpisz
Duże brawa za wybór prawidłowego narzędzia do tego zadania smile.gif
Jak widze tych walczących z wyrażeniami regularnymi to nie wiem czy śmiać się czy płakać...

  1. $selectList = $form->getElementsByTagName('select');
  2. $select = $selectList->item(0);
  3. $optionList = $select->getElementsByTagName('option');
  4. for ( $i = 0, $j = $optionList->length; $i < $j; $i++ ) {
  5. $option = $optionList->item($i);
  6. echo 'name => '.$option->getAttribute('name');
  7. }



Piszę trochę w ciemno, bo nie wiem co chcesz koniec końcow osiągnąć, ale jeśli chodzi o pobranie całego formularza, to może przyda Ci się moja funkcja:

  1. function dom_form_params(&$form) {
  2. $params = array();
  3.  
  4. $inputList = $form->getElementsByTagName('input');
  5. for ( $i = 0; $i < $inputList->length; $i++ ) {
  6. $input = $inputList->item($i);
  7. if ( '' === $name = $input->getAttribute('name')) {
  8. continue;
  9. }
  10. $type = $input->getAttribute('type');
  11. $value = $input->getAttribute('value');
  12.  
  13. if ( 'button' === $type ) {
  14. continue;
  15. }
  16. if ( 'submit' === $type ) { // tylko chwilowo.........
  17. continue;
  18. }
  19.  
  20. if ( 'checkbox' === $type ) {
  21. if ( true !== $input->hasAttribute('checked')) { // input nie jest zaznaczony, pomijamy..
  22. continue;
  23. }
  24. if ( true !== $input->hasAttribute('value')) {
  25. //TODO: sprawdzić czy hasAttribute działa dla róznych wielkości znaków nazwy atrybutu..
  26. $value = 'on';
  27. }
  28. }
  29. else if ( 'radio' === $type ) {
  30. // Jeśli więcej niż jeden input o tej samej nazwie jest checked, interesuje nas ostatni w kolejności..
  31. $checked = $input->hasAttribute('checked');
  32. if ( true !== $checked ) {
  33. continue;
  34. }
  35. if ( true !== $input->hasAttribute('value')) {
  36. $value = 'on';
  37. }
  38. }
  39. $params[] = "{$name}=".urlencode($value);
  40. }
  41.  
  42. $selectList = $form->getElementsByTagName('select');
  43. for ( $i = 0; $i < $selectList->length; $i++ ) {
  44. $select = $selectList->item($i);
  45. $name = $select->getAttribute('name');
  46. $optionList = $select->getElementsByTagName('option');
  47. for ( $j = 0; $j < $optionList->length; $j++ ) {
  48. $option = $optionList->item($j);
  49. $selected = $option->hasAttribute('selected');
  50.  
  51. $_value = $option->getAttribute('value');
  52. if ( ! $option->hasAttribute('value')) { // jeżeli element nie ma value, value to jego nodeValue..
  53. $_value = trim($option->nodeValue);
  54. }
  55. if ( 0 === $j ) { // jeśli żaden option nie jest selected, to formularz przesyła 'value' pierwszego w kolejności elementu 'option'
  56. $value = $_value;
  57. continue;
  58. }
  59. if ( true !== $selected ) {
  60. continue;
  61. }
  62. $value = $_value;
  63. }
  64. $params[] = "{$name}=".urlencode($value);
  65. }
  66.  
  67. $textareaList = $form->getElementsByTagName('textarea');
  68. for ( $i = 0; $i < $textareaList->length; $i++ ) {
  69. $textarea = $textareaList->item($i);
  70. if ( '' === $name = $textarea->getAttribute('name')) {
  71. continue;
  72. }
  73. $value = $textarea->nodeValue;
  74. $params[] = "{$name}=".urlencode($value);
  75. }
  76.  
  77. $string = implode('&', $params);
  78. $output = array();
  79. parse_str($string, $output);
  80.  
  81. return $output;
  82. }


Nie jest jeszcze idealna, nie działa np. z elementami BUTTON, ale radzi sobie z 99% formularzy..
Agape
Dzięki za pomoc, (fajny i bardzo przemyslany) skrypt i pochwałę korzystania z DOM smile.gif.

Nie rozumiem w nim tylko 2 rzeczy. Co oznacza & przed zmienna, oraz nawiasy klamrowe w {$name}. Nie rozumiem tego zapisu, dla czego nie $name.'costam costam' albo '{'.$name.'}costam costam'. To skrócony zapis ?

Nie widziałem też czegoś takiego nigdy
Kod
'' === $name = $textarea->getAttribute('name')

to oznacza jesli $name ktore rowna sie $textarea->getAttribute('name') jest '' => true ?
rozumiem ze gdybym napisal
Kod
$name = $textarea->getAttribute('name') === ''

byloby to samo ?
wNogachSpisz
Cytat(Agape @ 25.05.2011, 23:17:43 ) *
Co oznacza & przed zmienna

http://php.net/manual/en/language.references.pass.php
Przy czym akurat w tym przypadku jest to całkowicie zbędne.. ale niech sobie zostanie smile.gif

Cytat(Agape @ 25.05.2011, 23:17:43 ) *
nawiasy klamrowe w {$name}. Nie rozumiem tego zapisu, dla czego nie $name.'costam costam' albo '{'.$name.'}costam costam'. To skrócony zapis ?

To jest w sumie to samo.

Cytat(Agape @ 25.05.2011, 23:17:43 ) *
Kod
'' === $name = $textarea->getAttribute('name')

to oznacza jesli $name ktore rowna sie $textarea->getAttribute('name') jest '' => true ?
rozumiem ze gdybym napisal
Kod
$name = $textarea->getAttribute('name') === ''

byloby to samo ?

Nie wiem, nie chce mi się myśleć smile.gif sprawdź, ja tylko skróciłem kod o jedną liniję, zamiast pisać:
  1. $name = $input->getAttribute('name');
  2. if ( '' === $name ) {
  3. continue;
  4. }
Agape
Super. Dzięki bardzo za wyjaśnienia.
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.