Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Odczyt atrybutu z przestrzenią nazw
Forum PHP.pl > Forum > PHP
WebCM
Jest sporo problemów z analizą XHTML w PHP przez funkcje XML. Kilka już rozwiązałem, stosując różne tricki i obejścia. Jednak jest kolejny - jak pobrać wartość atrybutu z przestrzenią nazw? Wprawdzie można zrezygnować z namespace, lecz lepiej zaznaczyć w kodzie XHTML, że znacznik lub atrybut należy do dziedziny F3.
  1. <input type="checkbox" id="something" f3:var="config.item" />

  1. <?php
  2. foreach(xpath('//input[@id="ms"]') as $item) echo $item['f3:var'];
  3. ?>
Niestety, nie działa. Nawet $f3->item['var'].

A może zastosowanie funkcji preg_* i str_* lepiej nadaje się do analizy kodu XHTML? Właściwie operacje na XML-u wykonuję tylko po to, aby odczytać wartości paru atrybutów, np. f3:var, z tym że:
- jeśli znajdzie się w <form>, trzeba przejechać wszystkie pola: checkbox, radio i select i odczytać ich nazwy
- gdy znajdzie się w tych polach - dotyczy tylko tych pól
Trzeba potem jeszcze wstawić instrukcję warunkową. Za pomocą SimpleXML tylko pobieram kod pola do zamiany przez str_replace(), bo w XML-u tego raczej nie zrobię. Przykładowy wynik:
Kod
<input type="checkbox" id="something" <?php if($config['item']) echo 'checked="checked" ';?>/>
LUB:
<?php if($config['item']) echo '<input type="checkbox" id="something" checked="checked" />'; else echo '<input type="checkbox" id="something" />'; ?>

Właściwie zaletą parsera XML jest to, że wyrzuci błąd, gdy jakiś znacznik jest niezamknięty, lecz uruchamiam go dopiero wtedy, gdy znajduje się w szablonie choć 1 znacznik <form>. Może nie ma to nawet sensu?
Strzałek
Cytat(WebCM @ 25.04.2008, 17:43:25 ) *
Jest sporo problemów z analizą XHTML w PHP przez funkcje XML. Kilka już rozwiązałem, stosując różne tricki i obejścia. Jednak jest kolejny - jak pobrać wartość atrybutu z przestrzenią nazw? Wprawdzie można zrezygnować z namespace, lecz lepiej zaznaczyć w kodzie XHTML, że znacznik lub atrybut należy do dziedziny F3.



Śliska sprawa z tym parsowaniem. Otóż tak jak napisałeś. Są 2 drogi - pierwsza potraktować że dokument (X)HTML jest dokumentem xml, albo przeparsować dokument wyrażeniami regularnymi. Pierwsze rozwiązanie jest lepsze ale bardzo kłopotliwe. Otóż wystarczy że ktoś nieopatrznie da <br> zamiast <br /> i już sypie nam że dokument ma nie zamknięty tag. Jeżeli chodzi o drugie rozwiązanie to nie ma problemu z nie zamkniętymi tagami typu <br> jednak jest trochę zabawy z samym parsowaniem (której ja osobiście nie lubię.

Podsumowując, XML jest lepszym i wygodniejszym rozwiązaniem. Możesz sobie ładnie użyć DOM'a, SimpleXML'a czy czego tam sobie zapragniesz. Jednak, decydując się na to rozwiązanie musisz mieć pewność że twój dokument będzie można potraktować jako XML. Głównym zagrożeniem są dane "od ludzi". Dane które pan Jan Kowalski wrzuca używając jakiegoś tam panelu administracyjnego. Pan Jan HTML może i zna. Ale wirtuozem to on nie jest i nie liczył bym że będzie wrzucał poprawny XHTML w treść np.: newsów. Z tym można poradzić sobie używając rozszerzenia Tidy, które za nas "posprząta" kod.


Nie wiem do końca co chcesz zrobić. Jednak skojarzyło mi się to z pewnym rozwiązaniem które jest w Agavi. Mianowicie FormPopulationFilter. Jego zadania to wypełniać inputy itp. jeżeli ich wartość "siedzi w POST" oraz jeżeli wystąpił błąd validatora Agavi dodawać do elementów formularza class="error"
dr_bonzo
  1. <?php
  2. $str= '<root xmlns:foo="http://gdzies.t.am/def">
  3. <child foo:bar="qwerty" foo:aaa="BBB">i am the child</child>
  4. </root>';
  5. $xml = new SimpleXMLElement($str);
  6. $child = $xml->child;
  7. $nss = $xml->getDocNamespaces();
  8. $attributes = $child->attributes( $nss['foo']);
  9. foreach ( $attributes as $k => $v )
  10. {
  11. printf( "[%s] == %s<br />", $k, $v );
  12. }
  13. print_r( $nss );
  14. ?>


1. google
2. http://www.sitepoint.com/blogs/2005/10/20/...and-namespaces/
3. manual smile.gif
?>
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.