it-swarm-id.com

Apa yang digunakan, simplexml_load_file atau JForm :: getInstance atau?

Saya perlu mendapatkan nilai atribut bidang dari templateDetails xml. Ini adalah bidang dan saya memerlukan atribut 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>

saat ini saya sedang melakukan ini

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

ini akan menjadi cara JForm :: getInstance

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

Dengan hanya melihat kode JForm :: getInstance tampaknya lebih cepat tetapi untuk beberapa alasan sepertinya kinerja lebih lambat dan saya pikir karena saya memutus perulangan begitu saya menemukan nama atribut dan Jform :: getInstance mungkin perulangan melalui akhir .

Harap dicatat bahwa saya tidak bisa mendapatkannya dari db atau di mana pun karena di db atau dari params-> dapatkan saya mendapatkan nilai yang diberikan dan saya perlu atribut simpul dengan semua gaya yang tersedia.

Apa yang kamu pikirkan? Apakah ada cara yang lebih baik/lebih cepat untuk mendapatkan atribut dari yang disebutkan di atas?

Setiap hep dihargai. Terima kasih!

Solusi: Contoh yang bagus dari David membuat saya mengikuti koreksi kode seperti yang disarankan di sini

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

semoga ini membantu anda!

6
Dan

JForm benar-benar melakukan hal yang sama dengan standar Anda yang lebih PHP kode. Jika Anda melompat ke definisi untuk JForm di libraries/joomla/form/form.php dan melihat-lihat fungsi, Anda akan melihat simplexml_load_file() dan loop dalam fungsi findFields() yang cocok dengan permintaan Anda.

Dan Anda benar bahwa Anda mungkin akan mendapatkan peningkatan kinerja dari kode pertama. Ada dua alasan untuk ini. Yang terbesar mungkin Anda hancurkan begitu Anda menemukan nilai yang Anda butuhkan. Yang lainnya adalah JForm akan menambahkan beberapa pemrosesan tambahan untuk memeriksa jalur di xml untuk memuat bidang dari dan sedemikian rupa sehingga Anda tidak benar-benar membutuhkan tetapi menambahkan pekerjaan tambahan untuk diproses.


Saya dapat memikirkan hanya satu peningkatan kinerja yang mungkin, yang akan melewatkan seluruh loop dan menggunakan xpath untuk mendapatkan nilai tepat yang Anda inginkan. Saya bukan yang terbaik di xpath, jadi Anda mungkin ingin membaca sedikit lebih banyak tentang itu jika Anda ingin mencobanya: http://msdn.Microsoft.com/en-us/library/ms256086 (v = vs.110) .aspx

Saya menguji ini sedikit dengan data formulir Anda, dan ini harus menjadi alternatif:

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

Xpath mengembalikan sebuah array, yang saya ambil satu-satunya instance dari dan memaksanya menjadi string. Lalu aku meledak seperti kamu.

6
David Fritsch

gunakan simplexml_load_file
JForm - itu kelas untuk form building dan pada dasarnya itu adalah lapisan antara Anda dan simplexml, jadi itu akan lebih lambat dari hanya simplexml_load_file

tetapi kode Anda bisa lebih sederhana, lihat SimpleXMLElement :: xpath untuk menemukan bidang, dan di SimpleXMLElement :: atribut untuk mendapatkan semua atribut atau cukup gunakan (string) $field_that_you_found['style']

3
Fedik