web-dev-qa-db-fra.com

Quoi utiliser, simplexml_load_file ou JForm :: getInstance ou?

J'ai besoin d'obtenir la valeur d'attribut de champ de templateDetails xml. Ceci est le champ et j'ai besoin de l'attribut styles

<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>

actuellement je le fais

$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']);

ce serait de la manière JForm :: getInstance

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

En regardant simplement le code, JForm :: getInstance semble plus rapide, mais pour une raison quelconque, les performances sont plus lentes et je pense que c’est parce que je rompais la boucle dès que j’ai trouvé le nom de l’attribut et que Jform :: getInstance était peut-être en boucle à la fin. .

Veuillez noter que je ne peux pas l'obtenir à partir de la base de données ou ailleurs car, dans la base de données ou depuis params-> get, j'obtiens la valeur assignée et j'ai besoin de l'attribut node avec tous les styles disponibles.

Qu'est-ce que tu penses? Existe-t-il un moyen meilleur/plus rapide d'obtenir l'attribut mentionné ci-dessus?

Tout hep est apprécié. Merci!

Solution: Un excellent exemple de David m'a permis de suivre la correction du code comme conseillé ici

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);

espérons que cela vous aide!

6
Dan

JForm fait vraiment les mêmes choses que votre code plus standard PHP. Si vous passez à la définition de JForm à libraries/joomla/form/form.php et regardez à travers les fonctions, vous verrez simplexml_load_file() et une boucle dans la fonction findFields() correspondant à votre requête.

Et vous avez raison, vous obtiendrez probablement une amélioration des performances dès le premier code. Il y a deux raisons à cela. Le plus important est probablement que vous casser une fois que vous avez trouvé la valeur dont vous avez besoin. L'autre est que JForm ajoutera un traitement supplémentaire pour vérifier les chemins dans le xml pour charger les champs et pour que vous n'ayez pas vraiment besoin, mais ajoute du travail supplémentaire à traiter.


Je ne peux penser qu'à un seul gain de performances possible, à savoir ignorer complètement la boucle et utiliser xpath pour obtenir la valeur exacte souhaitée. Je ne suis pas le meilleur chez xpath, vous pouvez donc en lire un peu plus à ce sujet si vous voulez l'essayer: http://msdn.Microsoft.com/en-us/library/ms256086 (v = vs.110) .aspx

Je l'ai un peu testé avec vos données de formulaire, ce qui devrait être une alternative:

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

Le xpath renvoie un tableau, dont je récupère la seule instance et le force à être une chaîne. Puis je l'explose comme toi.

6
David Fritsch

utilisation simplexml_load_file
JForm - c'est la classe pour la construction de formulaire et fondamentalement c'est le calque entre vous et simplexml, donc ce sera plus lent que simplexml_load_file

mais votre code peut être plus simple, regardez SimpleXMLElement :: xpath pour trouver un champ, et à SimpleXMLElement :: attributs pour obtenir tous les attributs ou utilisez simplement (string) $field_that_you_found['style']

3
Fedik