Chciałbym przy pomocy PHP-DOM wydobyć pola formularza..
Czyli przerobić wszystkie jego inputy do postaci tablicy, takiej jaką otrzymam w $_POST po jego wysłaniu...
Miałem szczerą nadzieję, że znajde taki skrypcik w komentarzach na php.net, niestety bez powodzenia..
Przy tworzeniu takie skryptu trzeba zadbać o szereg rzeczy:
- jeśli value inputa nie zostało ustawione przy typie checkbox, to value będzie 'on'
- jeśli nazwa inputa jest pusta lub jego 'name' to '[]', lub '[foo]', lub '[]foo', to taki input nie znajdzie swojej reprezentacji w tablicy wynikowej..
- jeżeli pole 'value' elementu 'select' nie zostało ustalone, to jako value bierzemy innerHTML elementu option, wycinająć tagi HTML.
- jeżli nazwa elementu to np. 'boo[][][][foo][][][]', to jego reprezentacja w tablicy wynikowej będzie głęboką, wielowymiarową tablicą.
- i wiele, wiele innych....
Generalnie roboty na tydzień.
Nie opuszcza mnie przeczucie, ze ktoś kiedyś czegoś takiego potrzebował, napisał i upublicznił, tylko nie udaje mi się tego znaleść.
Pomocy.
------------------------------------------------
Czasami spacer i papieros dobrze robi...
Zamiast marwić się o te niuanse, robi to za mnie funkcja parse_str
Gotowy kod wygląda tak:
function dom_form_params(&$form) { $inputList = $form->getElementsByTagName('input'); for ( $i = 0; $i < $inputList->length; $i++ ) { $input = $inputList->item($i); if ( '' === $name = $input->getAttribute('name')) { continue; } $type = $input->getAttribute('type'); $value = $input->getAttribute('value'); if ( 'checkbox' === $type ) { if ( true !== $input->hasAttribute('checked')) { // input nie jest zaznaczony, pomijamy.. continue; } if ( true !== $input->hasAttribute('value')) { //TODO: sprawdzić czy hasAttribute działa dla róznych wielkości znaków nazwy atrybutu.. $value = 'on'; } } else if ( 'radio' === $type ) { // Jeśli więcej niż jeden input o tej samej nazwie jest checked, interesuje nas ostatni w kolejności.. $checked = $input->hasAttribute('checked'); if ( true !== $checked ) { continue; } if ( true !== $input->hasAttribute('value')) { $value = 'on'; } } } $selectList = $form->getElementsByTagName('select'); for ( $i = 0; $i < $selectList->length; $i++ ) { $select = $selectList->item($i); $name = $select->getAttribute('name'); $optionList = $select->getElementsByTagName('option'); for ( $j = 0; $j < $optionList->length; $j++ ) { $option = $optionList->item($j); $selected = $option->hasAttribute('selected'); $_value = $option->getAttribute('value'); if ( ! $option->hasAttribute('value')) { // jeżeli element nie ma value, value to jego nodeValue.. } if ( 0 === $j ) { // jeśli żaden option nie jest selected, to formularz przesyła 'value' pierwszego w kolejności elementu 'option' $value = $_value; continue; } if ( true !== $selected ) { continue; } $value = $_value; } } $textareaList = $form->getElementsByTagName('textarea'); for ( $i = 0; $i < $textareaList->length; $i++ ) { $textarea = $textareaList->item($i); if ( '' === $name = $textarea->getAttribute('name')) { continue; } $value = $textarea->nodeValue; } return $output; }