web-dev-qa-db-ja.com

Joomla 2.5とJFormFieldの3.xとの違い

私はプラグインを使用して、モジュールにパラメーターを追加できるようにしています。これを行うには、JFormを使用して、さまざまなプラグインに含まれているxmlファイルをロードします。

これは私が使用してきたもので、3.0以降で機能し、フィールドセットループから取得され、各「フィールド」は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>';
_

あなたが見ることができるように、それは_$field->name_がパブリックであると仮定して機能しましたが、2.5では保護されています(私を困惑させるのは3でもあり、どのバージョンの3でも機能しませんでした)。

2.5と3でJFormFieldの違いを確認しましたが、大きな違いがありますが、何らかの方法で_$field->name_プロパティにアクセスする必要があります($field->__get('name')(読み取り専用アクセスの場合)、JFormFieldの機能は無視できますが、下位互換性を追加するには生産性が少し高くなります。

Joomla 3には__set($name,$value)という関数がありますが、Joomla 2.5にはありません

Joomla 2.5でフィールド名(または他のプロパティ)をオーバーライドする「簡単な」方法はありますか?

5
Jordan Ramstad

私はこれに懸命に取り組んでおり、解決策を考え出しました。これは、他のモジュールと同じように行う「適切な」方法ですが、オブジェクトの複数のレイヤーの背後に隠れています(そのため、少しわかりにくいです)。

最初に問題はJFormFieldにあると思いましたが、実際にはありませんでした。これらのプロパティはフィールドを「解析」するだけなので、これらのプロパティにアクセスする必要はなく、直接制御することはできません。

だからここに私が持っている他のコードのビットがあります。

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>';
        }
    }

これは、フィールドセットの各フィールドをループし、JFormFieldのインスタンスを返します。実行する必要があるのは、JForm自体を介して実行する編集です。

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

2つのループを使用していることがわかるように、1つはパラメーターをフィールドに一致させることです(おそらく、実際の$ moduleParamsオブジェクトをループすることで改善できます)。もう1つは以前のものと同じです。データをフォームにバインドしてフィールドセット変数を「リセット」します(必要かどうかはわかりませんが、デバッグプロセスでは問題ありません。ただし、フォームの値をバインドしているため、これは$field->valueを正しく変更するだけです。なので、他の変数は引き続き保護されます。

だから私は名前の解決策を思いつきましたが、この質問は主にそれについてでした。 JFormは他のオブジェクトとの相互作用の基礎として使用するため、JFormはその名前にかなり厳格です。そのため、JFormがフォームを解析している間は触れないでください。

私が示した関数は「ヘルパー」の一部なので、これをその外に移動し、プラグイン自体の中に入れました。私はHTML文字列を作成しているので、正規表現を使用して検索/置換できます。

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

これにより、JFormオブジェクトがフィールドを解析しているときに名前を編集することで発生する可能性のある問題以外に、名前を変更することもできます。

1
Jordan Ramstad