it-swarm-es.tech

¿Qué usar, simplexml_load_file o JForm :: getInstance o?

Necesito obtener el valor del atributo de campo de templateDetails xml. Este es el campo y necesito el atributo estilos

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

actualmente estoy haciendo esto

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

esto sería JForm :: forma getInstance

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

Simplemente mirando el código JForm :: getInstance parece más rápido, pero por alguna razón parece que el rendimiento es más lento y creo que es porque estaba rompiendo el ciclo tan pronto como encontré el nombre del atributo y Jform :: getInstance podría estar pasando por el final .

Tenga en cuenta que no puedo obtenerlo de db o de ningún otro lugar ya que en db o de params-> get obtengo el valor asignado y necesito el atributo de nodo con todos los estilos disponibles.

¿Qué piensas? ¿Existe una forma mejor/más rápida de obtener el atributo de lo mencionado anteriormente?

Cualquier hep es apreciado. ¡Gracias!

Solución: Gran ejemplo de David me llevó a seguir la corrección del código como se recomienda aquí

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

¡Espero que esto te ayude!

6
Dan

JForm realmente hace lo mismo que su estándar más PHP. Si salta a la definición de JForm en libraries/joomla/form/form.php y mira las funciones, verá simplexml_load_file() y un bucle en la función findFields() que coincide con su consulta.

Y tiene razón en que probablemente obtendrá un aumento de rendimiento desde el primer código. Hay dos razones para esto. Lo más probable es que se rompa una vez que encuentre el valor que necesita. La otra es que JForm agregará un procesamiento adicional para verificar las rutas en el xml para cargar campos y de tal manera que realmente no necesite pero agregue trabajo adicional para procesar.


Solo puedo pensar en un posible aumento de rendimiento, que sería omitir el bucle por completo y usar xpath para obtener el valor exacto que desea. No soy el mejor en xpath, por lo que es posible que desee leer un poco más sobre eso si desea probarlo: http://msdn.Microsoft.com/en-us/library/ms256086 (v = vs.110) .aspx

Probé esto un poco con sus datos de formulario, y esta debería ser una alternativa:

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

El xpath devuelve una matriz, de la que tomo la única instancia y la fuerzo a ser una cadena. Luego exploto como si fueras tú.

6
David Fritsch

utilizar simplexml_load_file
JForm: es la clase para la creación de formularios y, básicamente, es la capa entre usted y simplexml, por lo que será más lenta que solo simplexml_load_file

pero su código puede ser más simple, mire SimpleXMLElement :: xpath para encontrar un campo, y en SimpleXMLElement :: atributos para obtener todos los atributos o simplemente use (string) $field_that_you_found['style']

3
Fedik