it-swarm-id.com

Joomla 2.5 perbedaan dalam JFormField dari 3.x

Saya telah menggunakan plugin untuk membantu menambahkan parameter tambahan ke modul, untuk melakukan itu saya menggunakan JForm untuk memuat file xml yang disertakan dengan berbagai plugin.

Ini adalah apa yang telah saya gunakan dan bekerja di 3.0 dan ke atas, diambil dari loop fieldset dan setiap "field" adalah turunan dari JFormField.

$field->name = 'plg_form_settings['.$field->name.']';
$content .= '<div class="control-group">';
    $content .= '<div class="control-label">';
        $content .= $field->label;
    $content .= '</div>';
    $content .= '<div class="controls">';
        $content .= $field->input;
    $content .= '</div>';
$content .= '</div>';

Seperti yang Anda lihat itu berfungsi dengan asumsi bahwa $field->name Adalah publik, namun dalam 2.5 ia dilindungi (ada dalam 3 juga yang membingungkan saya, itu tidak pernah tidak berfungsi dalam versi 3).

Saya telah memeriksa perbedaan antara JFormField dalam 2.5 dan 3 dan ada perbedaan besar, meskipun dengan satu atau lain cara saya perlu mengakses properti $field->name (Saya melihat saya dapat melakukan $field->__get('name') untuk akses hanya baca), saya bisa mengabaikan fungsionalitas JFormField tapi itu agak kontra produktif untuk menambahkan kompatibilitas ke belakang.

Di Joomla 3 ada fungsi yang disebut __set($name,$value) namun tidak di Joomla 2.5

Apakah ada cara "sederhana" untuk mengganti nama bidang (atau properti lainnya) di Joomla 2.5?

5
Jordan Ramstad

Saya telah bekerja keras dalam hal ini dan memberikan solusi, ini adalah cara yang "tepat" untuk melakukannya yang dilakukan modul lain tetapi tersembunyi di balik beberapa lapisan objek (jadi agak sulit untuk dipikirkan).

Pertama saya berpikir bahwa masalahnya ada di JFormField tetapi sebenarnya tidak. Ia tidak perlu mengakses properti itu karena mereka hanya "mengurai" bidang tidak dibuat untuk memberikan kontrol langsung.

Jadi, inilah sedikit kode lain yang saya miliki.

if($form->loadFile($path.'/fields.xml')){
        $fieldset = $form->getFieldset();
        //SQL STUFF HERE TO GET $result
        $result = $db->loadObject();
        if(isset($result->params)){
            $moduleParams = json_decode($result->params);
        }else{
            $moduleParams = new stdClass;
        }
        foreach($fieldset as $index=>$field){
            $field->name = 'plg_form_settings['.$field->name.']';
            $content .= '<div class="control-group">';
                $content .= '<div class="control-label">';
                    $content .= $field->label;
                $content .= '</div>';
                $content .= '<div class="controls">';
                    $content .= $field->input;
                $content .= '</div>';
            $content .= '</div>';
        }
    }

Ini loop setiap bidang dalam fieldset dan mengembalikan turunan dari JFormField kelas baca saja. Yang harus dilakukan adalah pengeditan yang ingin Anda lakukan dilakukan melalui JForm itu sendiri.

if($form->loadFile($path.'/fields.xml')){
    $fieldset = $form->getFieldset();
    //SQL STUFF HERE TO GET $result
    $result = $db->loadObject();
    if(isset($result->params)){
        $moduleParams = json_decode($result->params);
    }else{
        $moduleParams = new stdClass;
    }
    $dataArray = array();
    //split the loop into 2, this way the data can be bound
    foreach($fieldset as $index=>$field){
        if($id!=0&&isset($moduleParams->{$index})){
            $dataArray[$index] = $moduleParams->{$index};
        }
    }
    //bind and reset to ensure it worked
    $form->bind($dataArray);
    $fieldset = $form->getFieldset();
    foreach($fieldset as $index=>$field){
        $output = '<div class="control-group">';
            $output .= '<div class="control-label">';
                $output .= $field->label;
            $output .= '</div>';
            $output .= '<div class="controls">';
                $output .= $field->input;
            $output .= '</div>';
        $output .= '</div>';
        $content .= $output;
    }
}

Seperti yang Anda lihat saya menggunakan 2 loop, satu hanya untuk mencocokkan parameter ke bidang (saya mungkin bisa memperbaikinya dengan mengulang objek $ moduleParams yang sebenarnya). Sementara yang lain sama dengan yang saya miliki sebelumnya. Di antara saya mengikat data untuk membentuk dan "mereset" variabel fieldset (tidak yakin apakah itu diperlukan tetapi tidak ada salahnya dalam proses debugging. Namun ini hanya akan mengubah $field->value saat Anda mengikat nilai formulir, maka variabel lainnya masih dilindungi.

Jadi saya datang dengan solusi untuk nama, yang pertanyaan utamanya adalah tentang. JForm cukup ketat pada namanya karena menggunakan itu sebagai dasar untuk interaksinya dengan objek lain, jadi sebaiknya jangan menyentuhnya saat JForm mem-parsing formulir, tetapi setelahnya.

Fungsi yang saya perlihatkan adalah bagian dari "pembantu" jadi saya memindahkannya di luar dan masuk ke plugin itu sendiri. Karena saya membuat string html saya bisa menggunakan regex untuk menemukan/mengganti.

$regex  = '/(?:name=")([^"]*)(?:")/';
//CALL HELPER TO GET $content
$content = '<input type="text" name="cc_field"/>'; //example of part of output from helper
$content = preg_replace($regex,"name=\"cc_settings[$1]\"",$content);

Ini seharusnya memungkinkan Anda untuk mengubah nama, di luar masalah yang dapat disebabkan dengan mengeditnya sementara objek JForm sedang menguraikan bidang.

1
Jordan Ramstad