it-swarm.dev

Cosa usare, simplexml_load_file o JForm :: getInstance o?

Devo ottenere il valore dell'attributo del campo da templateDetails xml. Questo è il campo e ho bisogno dell'attributo stili

<field name="get_styles" type="yjsglist" default="blue|007ebd" styles="blue==007ebd|red==121212">
    <option value="blue|007ebd">Blue</option>
    <option value="red|ff0000">Mesh</option>
</field>

attualmente lo sto facendo

$get_xml        = simplexml_load_file('templateDetails.xml');
$get_styles     = $get_xml->config->fields->fieldset[1];
$load_styles    ='';
foreach ($get_styles as $attribute){
    if($attribute['name'] == 'get_styles'){
        $load_styles        = get_object_vars($attribute);
        break;
    }
}
$mystyles               = explode('|',$attribute['styles']);

questo sarebbe JForm :: getInstance

$get_xml            = JForm::getInstance('template-settings','templateDetails.xml');
$getStyles          = $get_xml->getFieldAttribute('get_styles','styles' ,'default', 'params');
$mystyles           = explode('|',$getStyles);

Osservando semplicemente il codice JForm :: getInstance sembra più veloce ma per qualche motivo sembra che le prestazioni siano più lente e penso sia perché stavo interrompendo il ciclo non appena ho trovato il nome dell'attributo e Jform :: getInstance potrebbe essere in loop fino alla fine .

Nota che non posso ottenerlo da db o da nessun'altra parte poiché in db o da params-> get ottengo il valore assegnato e ho bisogno dell'attributo del nodo con tutti gli stili disponibili.

Cosa pensi? Esiste un modo migliore/più veloce per ottenere l'attributo da quanto sopra menzionato?

Ogni hep è apprezzato. Grazie!

Soluzione: Un grande esempio di David mi ha portato a seguire la correzione del codice come consigliato qui

http://www.dimuthu.org/blog/2008/09/30/xpath-in-simplexml/

$get_xml = simplexml_load_file('templateDetails.xml');
$styles = $get_xml->xpath('//@styles');
$style = (string)$styles[0];
$mystyles = explode('|',$style);

spero che questo ti aiuti!

6
Dan

JForm fa davvero le stesse cose del tuo più standard PHP. Se salti nella definizione di JForm in libraries/joomla/form/form.php e guardi attraverso le funzioni, vedrai simplexml_load_file() e un loop nella funzione findFields() che corrisponde alla tua query.

E hai ragione sul fatto che probabilmente otterrai un aumento delle prestazioni dal primo codice. Ci sono due ragioni per questo. Il più grande è probabilmente che ti rompi una volta trovato il valore di cui hai bisogno. L'altro è che JForm aggiungerà un po 'di elaborazione in più per verificare i percorsi nel file XML da cui caricare i campi e tali da non essere realmente necessari ma aggiungono ulteriore lavoro da elaborare.


Mi viene in mente solo un possibile aumento delle prestazioni, che sarebbe quello di saltare completamente il loop e usare xpath per ottenere il valore esatto che desideri. Non sono il migliore su xpath, quindi potresti voler leggere un po 'di più a riguardo se vuoi provarlo: http://msdn.Microsoft.com/en-us/library/ms256086 (v = vs.110) aspx

L'ho provato un po 'con i tuoi dati del modulo e questa dovrebbe essere un'alternativa:

$get_xml = simplexml_load_file('templateDetails.xml');
$styles = $get_xml->xpath("//field[@name='get_styles']/@styles");
$style = (string)$styles[0];
$mystyles = explode('|',$style);

L'xpath restituisce un array, dal quale prendo l'unica istanza e la costringo a essere una stringa. Poi lo esplodo come eri.

6
David Fritsch

uso simplexml_load_file
JForm - è la classe per la creazione di moduli e sostanzialmente lo strato tra te e simplexml, quindi sarà più lento di un semplice simplexml_load_file

ma il tuo codice può essere più semplice, guarda SimpleXMLElement :: xpath per trovare un campo e SimpleXMLElement :: attributi per ottenere tutti gli attributi o usa semplicemente (string) $field_that_you_found['style']

3
Fedik