Witam
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..
$_value = trim($option->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;
}
Ten post edytował wNogachSpisz 17.03.2011, 17:57:05