web-dev-qa-db-ja.com

simplexml_load_fileまたはJForm :: getInstanceまたは何を使用しますか?

TemplateDetails xmlからフィールド属性値を取得する必要があります。これはフィールドであり、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>

現在私はこれをやっています

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

これはJForm :: getInstanceの方法になります

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

コードを見るだけでJForm :: getInstanceはより高速に見えますが、何らかの理由でパフォーマンスが低下しているように見えます。属性名が見つかり、Jform :: getInstanceが最後までループする可能性があるとすぐにループを中断していたためと考えられます。 。

dbまたはparams-> getから割り当てられた値を取得し、使用可能なすべてのスタイルのノード属性が必要なため、dbまたは他の場所からは取得できないことに注意してください。

どう思いますか?上記から属性を取得するより良い/より速い方法はありますか?

どんなhepもありがたいです。ありがとうございました!

解決策:Davidの素晴らしい例により、ここでアドバイスされているようにコードを修正することができました

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

これがお役に立てば幸いです。

6
Dan

JFormは、より標準的なPHPコードと実際に同じことを行います。JFormの定義に_libraries/joomla/form/form.php_でジャンプして、関数の場合、simplexml_load_file()と、クエリに一致する関数findFields()のループが表示されます。

そして、あなたはおそらく最初のコードからパフォーマンスの向上を得るでしょう。これには2つの理由があります。最大のものはおそらく、必要な値を見つけたら中断することです。もう1つは、JFormがフィールドをロードするためのxmlのパスをチェックするためにいくつかの追加の処理を追加することであり、実際には必要ありませんが、処理に追加の作業を追加します。


考えられるパフォーマンスブーストは1つだけです。ループを完全にスキップし、xpathを使用して必要な正確な値を取得することです。私はxpathが得意ではないので、試してみたい場合は、そのことについてもう少し詳しく読むことをお勧めします。 http://msdn.Microsoft.com/en-us/library/ms256086(v = vs.110).aspx

私はあなたのフォームデータでこれを少しテストしました、そしてこれは代わりになるはずです:

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

Xpathは配列を返します。この配列から唯一のインスタンスを取得し、強制的に文字列にします。それから、あなたのようにそれを爆発させます。

6
David Fritsch

simplexml_load_fileを使用
JForm-これはフォーム構築用のクラスであり、基本的にはあなたとsimplexmlの間のレイヤーなので、単にsimplexml_load_fileよりも遅くなります

しかし、コードはより単純になる可能性があります。フィールドを見つけるには SimpleXMLElement :: xpath を、すべての属性を取得するには SimpleXMLElement :: attributes を参照するか、単に(string) $field_that_you_found['style']を使用します。

3
Fedik