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

Zdravim, chtel bych se zeptat, co delam spatne. Delam import xml a nedari se mi do cache ulozit zparsovany XMLko.

$url = 'example.com/export.xml';
if ($xml = file_get_contents($url)){
   $data = simplexml_load_string($xml);
   $cache = Environment::getCache();
   $cache->save('data', $data, array(
      'expire' => time() + 60 * 5,
   ));
   print_r($cache['data']);
}

vraci warning

SimpleXMLElement Object
Warning: print_r() [function.print-r]: Node no longer exists....

Editoval o5 (7. 8. 2009 9:57)

Ondřej Mirtes
Člen | 1536
+
0
-

Tento problém jsem před nějakou dobou taky řešil, háček byl v tom, že objekt tohoto typu použil David ve své knihovně Twitter for PHP. A v PHP nejde serializovat pouze typ resource a právě SimpleXMLElement. Ale pro něj alespoň existuje malý trik. Použití:

private function serializeXml($xml) {
    return str_replace(
      array('O:16:"SimpleXMLElement":0:{}', 'O:16:"SimpleXMLElement":'),
      array('s:0:"";', 'O:8:"stdClass":'),
      serialize($xml)
    );
}

private function unserializeXml($xml) {
    return unserialize(str_replace(array('O:16:"SimpleXMLElement":0:{}', 'O:16:"SimpleXMLElement":'), array('s:0:"";', 'O:8:"stdClass":'), $xml));
}

A poté v nějaké render metodě:

$cache = Environment::getCache();

//caching
if (!isset($cache['twitter'])) $cache->save('twitter', $this->serializeXml($model->load(false)), array(
        'expire' => time() + Environment::getConfig('twitter')->expire,
));

$template->tweets = $this->unserializeXml($cache['twitter']);
o5
Člen | 416
+
0
-

Uffffff…no ale diky, zkusim.

Cifro
Člen | 245
+
0
-

Keď sme už pri tom SimpleXMLElement Object, tak by som doplnil, že to sa nedá predať do {foreach } {/foreach} cyklu vo CurlyBracketsfiltru.
Musí sa to obíjsť cez normálne php <?php foreach(): ?> <?php endforeach; ?>.

David Grudl
Nette Core | 8229
+
0
-

Spíš bych doporučoval serializovat pomocí return $xml->asXml()

ad iterování: SimpleXMLElement neimplementuje rozhraní Iterator nebo IteratorAggregate a využívá nějaký systémový hack, takže nad ním nelze iterovat přes SmartCachingIterator. Řešením jen nahradit SimpleXMLElement za potomka SimpleXMLIterator.