it-swarm-vi.com

Sử dụng cái gì, Simplexml_load_file hoặc JForm :: getInstance hay?

Tôi cần nhận giá trị thuộc tính trường từ templateDetails xml. Đây là trường và tôi cần thuộc tính style

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

hiện tại tôi đang làm điều này

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

đây sẽ là cách JForm :: getInstance

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

Bằng cách chỉ nhìn vào mã JForm :: getInstance có vẻ nhanh hơn nhưng vì một số lý do có vẻ như hiệu suất chậm hơn và tôi nghĩ là vì tôi đã phá vỡ vòng lặp ngay khi tôi tìm thấy tên thuộc tính và Jform :: getInstance có thể lặp đi lặp lại .

Xin lưu ý rằng tôi không thể lấy nó từ db hoặc bất kỳ nơi nào khác vì trong db hoặc từ params-> get tôi nhận được giá trị được gán và tôi cần thuộc tính nút với tất cả các kiểu có sẵn.

Bạn nghĩ sao? Có cách nào tốt hơn/nhanh hơn để có được thuộc tính từ các đề cập ở trên?

Bất kỳ gan được đánh giá cao. Cảm ơn bạn!

Giải pháp: Ví dụ tuyệt vời của David đã cho tôi theo dõi sửa mã theo lời khuyên ở đây

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

hy vọng điều này sẽ giúp bạn!

6
Dan

JForm thực sự làm những điều tương tự như tiêu chuẩn hơn của bạn PHP. Nếu bạn nhảy vào định nghĩa cho JForm tại libraries/joomla/form/form.php và xem qua các hàm, bạn sẽ thấy simplexml_load_file() và một vòng lặp trong hàm findFields() phù hợp với truy vấn của bạn.

Và bạn đã đúng rằng bạn có thể sẽ tăng hiệu suất từ ​​mã đầu tiên. Có hai lý do cho việc này. Lớn nhất có lẽ là bạn phá vỡ một khi bạn tìm thấy giá trị mà bạn cần. Một điều nữa là JForm sẽ thêm một số xử lý bổ sung để kiểm tra các đường dẫn trong xml để tải các trường từ đó và do đó bạn không thực sự cần nhưng thêm công việc bổ sung để xử lý.


Tôi có thể nghĩ rằng chỉ có một khả năng tăng hiệu suất có thể, đó là bỏ qua hoàn toàn vòng lặp và sử dụng xpath để có được giá trị chính xác mà bạn muốn. Tôi không phải là người giỏi nhất về xpath, vì vậy bạn có thể muốn đọc thêm một chút về điều đó nếu bạn muốn dùng thử: http://msdn.Microsoft.com/en-us/l Library/ms256086 (v = vs.110) .aspx

Tôi đã kiểm tra điều này một chút với dữ liệu biểu mẫu của bạn và đây có thể là một giải pháp thay thế:

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

Xpath trả về một mảng, mà tôi lấy ví dụ duy nhất từ ​​đó và buộc nó là một chuỗi. Sau đó, tôi nổ tung nó như bạn.

6
David Fritsch

sử dụng simplexml_load_file
[.__.] JForm - đó là lớp để xây dựng biểu mẫu và về cơ bản nó là lớp giữa bạn và simplexml, vì vậy nó sẽ chậm hơn so với chỉ simplexml_load_file

nhưng mã của bạn có thể đơn giản hơn, hãy xem SimpleXMLEuity :: xpath để tìm trường và tại SimpleXMLEuity :: thuộc tính để lấy tất cả các thuộc tính hoặc chỉ sử dụng (string) $field_that_you_found['style']

3
Fedik