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);
これがお役に立てば幸いです。
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は配列を返します。この配列から唯一のインスタンスを取得し、強制的に文字列にします。それから、あなたのようにそれを爆発させます。
simplexml_load_file
を使用JForm
-これはフォーム構築用のクラスであり、基本的にはあなたとsimplexml
の間のレイヤーなので、単にsimplexml_load_file
よりも遅くなります
しかし、コードはより単純になる可能性があります。フィールドを見つけるには SimpleXMLElement :: xpath を、すべての属性を取得するには SimpleXMLElement :: attributes を参照するか、単に(string) $field_that_you_found['style']
を使用します。