simplexml a iterátor šablon v Nette
- met
- Člen | 5
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
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
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>');