ti-enxame.com

O que usar, simplexml_load_file ou JForm :: getInstance ou?

Preciso obter o valor do atributo de campo do templateDetails xml. Este é o campo e eu preciso do atributo 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>

atualmente estou fazendo isso

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

seria JForm :: getInstance

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

Apenas olhando o código JForm :: getInstance parece mais rápido, mas por algum motivo parece que o desempenho é mais lento e acho que foi porque eu estava quebrando o loop assim que encontrei o nome do atributo e Jform :: getInstance pode estar repetindo no final .

Observe que eu não posso obtê-lo no db ou em qualquer outro lugar, pois no db ou no params-> get eu recebo o valor atribuído e preciso do atributo node com todos os estilos disponíveis.

O que você acha? Existe uma maneira melhor/mais rápida de obter o atributo do mencionado acima?

Qualquer hep é apreciado. Obrigado!

Solução: Ótimo exemplo de David me levou a seguir a correção de código, conforme recomendado aqui

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 isso ajude você!

6
Dan

JForm realmente faz as mesmas coisas que seu código mais padrão PHP. Se você pular para a definição de JForm em libraries/joomla/form/form.php) e examinar as funções, você verá simplexml_load_file() e um loop na função findFields() que corresponde à sua consulta.

E você está certo de que provavelmente obterá um aumento de desempenho a partir do primeiro código. Há duas razões para isso. O maior é provavelmente que você quebra depois de encontrar o valor que precisa. O outro é que JForm adicionará algum processamento extra para verificar os caminhos no xml para carregar os campos e de tal forma que você realmente não precisa, mas adiciona trabalho extra ao processo.


Só consigo pensar em um possível aumento de desempenho, que seria pular completamente o loop e usar o xpath para obter o valor exato que você deseja. Eu não sou o melhor no xpath, então você pode querer ler um pouco mais sobre isso se quiser experimentá-lo: http://msdn.Microsoft.com/en-us/library/ms256086 (v = vs.110) .aspx

Eu testei isso um pouco com os dados do formulário, e isso deve ser uma alternativa:

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

O xpath retorna uma matriz, da qual eu pego a única instância e a forço a ser uma string. Então eu explodo como você estava.

6
David Fritsch

usar simplexml_load_file
JForm - é a classe para criação de formulários e basicamente a camada entre você e simplexml, portanto será mais lenta do que apenas simplexml_load_file

mas seu código pode ser mais simples, consulte SimpleXMLElement :: xpath para encontrar um campo e em SimpleXMLElement :: attribute para obter todos os atributos ou apenas use (string) $field_that_you_found['style']

3
Fedik