simplexml a iterátor šablon v Nette

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
met
Člen | 5
+
0
-

Ahoj,

zkoušel jsem dnes použít SimpleXML spolu se šablonami z Nette a nedařilo se mi klasickou kolekci nodů ze SimpleXML použít pro foreach iterátor uvnitř šablon. Přitom v klasickém foreach v PHP to jako iterátor použít lze.

Zvolil jsem nakonec manévrovací strategii, vyřešil to obchvatem přes PHP iterátor a do šablon jsem dorazil s již předpřipraveným vstupem.

Nevím, kde je zakopaný pes (natož elePHPant!), ani zda je to řešitelné na straně Nette, ale přímá podpora SimpleXML v Nette šablonách by byla jistě milá 8-)

Pěkný den Davídkovi i všem ostatním

Ondřej Mirtes
Člen | 1536
+
0
-

foreach v Nette šablonách využívá SmartCachingIterator (potomek CachingIterator z SPL), tak bych se po nekompatibilitě rozhlížel tam.

David Grudl
Nette Core | 8228
+
0
-

To je regulérní vada PHP, totiž SimpleXMLElement neimplementuje Iterator a tudíž se nad ním „nedá“ iterovat. Ale PHP nad ním nějak magicky iterovat umí, uživatelským třídám v Nette už to dovoleno není. PHP zavádí další třídu, SimpleXMLIterator, nad kterou už iterovat lze. Bordel, bordel.

Tudíž řešením by mělo být nahradit

$xml = new SimpleXMLElement('http://example.com/feed.rss', NULL, TRUE);
// nebo alternativní zápis
$xml = simplexml_load_file('http://example.com/feed.rss');

za

$xml = new SimpleXMLIterator('http://example.com/feed.rss', NULL, TRUE);

Respektive:

$xml = new SimpleXMLElement('<xml><item>...</item></xml>');
// nebo alternativní zápis
$xml = simplexml_load_string('<xml><item>...</item></xml>');

za

$xml = new SimpleXMLIterator('<xml><item>...</item></xml>');
met
Člen | 5
+
0
-

Ha super!

Díky Davide, potvrzuji funkčnost. Se SimpleXMLIterator vše funguje dle očekávání.