web-dev-qa-db-ja.com

フィールドタイプチェックボックス(チェックボックスではない)の操作方法

私のコンポーネントは複数のオプションを保存する必要があり、その方法に頭を悩ませているようには見えません。 チェックボックスフォームフィールドタイプ を参照すると、Joomlaがユーザーが選択したオプションをどのように保存することを期待しているかはわかりません。

更新:明確にするために、checkboxesではなく、複数のcheckboxフィールドタイプを参照しています。

これが私が使用しているXMLです

<field name="content_subrating"
    label="Content Subrating"
    type="checkboxes"
    >
    <option value="D">Suggestive Dialog</option>
    <option value="L">Course Language</option>
    <option value="S">Sexual Content</option>
    <option value="V">Violence</option>
</field>

結果のHTML

<fieldset class="checkboxes" id="jform_content_subrating">
    <ul>
        <li>
            <input type="checkbox" checked="" value="D" name="jform[content_subrating][]" id="jform_content_subrating0">
            <label for="jform_content_subrating0" aria-invalid="false">Suggestive Dialog</label>
        </li>
        <li>
            <input type="checkbox" value="L" name="jform[content_subrating][]" id="jform_content_subrating1">
            <label for="jform_content_subrating1">Course Language</label>
        </li>
        <li>
            <input type="checkbox" value="S" name="jform[content_subrating][]" id="jform_content_subrating2">
            <label for="jform_content_subrating2">Sexual Content</label>
        </li>
        <li>
            <input type="checkbox" value="V" name="jform[content_subrating][]" id="jform_content_subrating3">
            <label for="jform_content_subrating3">Violence</label>
        </li>
    </ul>
</fieldset>

そして結果の入力

JRequest::getVar('jform')['content_subrating']) =>
Array
(
    [0] => L
    [1] => V
)

私の完璧な世界では、すべての値が連結されて1つの列に格納されますが、Joomlaがデフォルトでそれを実行するとは思いません。そうでない場合、Joomlaが後で値を取得する方法を理解できるように、どの値をどこに移動するかをどのように指定しますか。明らかな何かが欠けていると確信していますが、行き詰まっています。

誰かがJoomlaがこれをどのように処理するかを説明できますか?

結論:このフィールドタイプは、複数のチェックボックスを簡単に作成する簡単な方法にすぎないようです。チェックしないと何も提出しないという固有の問題があります。これらは配列として送信されるため、送信される値に基づいて処理するだけであれば十分に便利ですが、取得する必要がある場合は不要な作業のように見えます。 (ちょうど私の意見、私は間違っている可能性があります

さらなる実現(ドキュメントの最上部で!):

チェックボックスフォームフィールドタイプは、チェックボックスのセットを提供します。注:テキストフィールドやチェックボックスなど、ほとんどの標準フォームフィールドタイプとは異なり、このフィールドは「すぐに使える」ソリューションではありません。チェックボックスが作成され、その値が配列の形式で送信されますが、データベースに保存されません

5
GDP

私の最初の供物なので、私を撃たないでください。私はこれとしばらく戦っていましたが、最終的にはうまくいく解決策を見つけました。他の人がこの悪夢を回避できるように願っています。

私が欠けていた重要な部分は、jformがチェックボックスフィールドを配列(duh)として送信していたため、jform['whatever']にアクセスしても予期した結果が得られなかったことです。

OPは言った:

私の完璧な世界では、すべての値を連結して1つの列に格納します

はい!チェックボックスでこれを行うことができます。それは素晴らしい働きをします。

これが私がしたことです。

admin/models/forms/myform.xmlには、チェックボックスフィールドがあります。

<field
        type="checkboxes"
        label="myfield"
        name="myfield"
        default="none"
        multiple="true">
        <option value="something">something</option>
...
        <option value="something else">something else</option>
</field>

admin/views/myview/edit.phpフォームフィールドでは、次のように使用します:

<?php echo $field->label; echo $field->input;?>

admin/models/myview.phpに関数を追加しました:

protected function prepareTable($table)
{
    // Fix the checkboxes data
    $form = JFactory::getApplication()->input->get('jform', array(), 'array');
    $myfield = $form['myfield'][0];

    if (!isset($myfield))
    {
        $myfield = "";
        $table->myfield= $myfield;
    } 
    else 
    {
        $checkbox_options = $table->myfield;
        $table->myfield = implode(",", $checkbox_options);
    }
}

列にカンマ区切り値としてデータを保存します。チェックボックスがオフの場合は、空白が格納されます。うん!

フォームもフロントエンドで編集されるため、フロントエンドでもほぼ同じことを行いました。フォームフィールドとフォームは同じです。

コントローラーの保存機能を既にオーバーライドしているので、これを(他のコードも含めて)追加しました:

public function save() 
{
    $data = JFactory::getApplication()->input->get('jform', array(), 'array');
    $myfield = $data['myfield'][0];

    if (!isset($myfield))
    {
        $myfield = "";
        $data['myfield'] = $myfield;
    } 
    else 
    {
        $checkbox_options = $data['myfield'];
        $data['myfield'] = implode(",", $checkbox_options);
    }
}

そのコードをさらに標準化できたはずです。しかし、今、私はこれがうまくいくことを嬉しく思っています。

関連ドキュメント: https://docs.joomla.org/Checkboxes_form_field_type

4
Deleyna

すべての結果を配列として保存し、その配列を単一のフィールドにJSONとして保存したいようです。

フィールドの例..データベースを見てください#__contentテーブル、joomlaが1つのフィールドに複数の情報をJSONとして格納する方法の例については、attribsフィールドを参照してください

次に、com_contentモデルとコントローラーがリバースエンジニアリングの優れた点でどのように機能するかを確認します。

3
MOLEDesign

Joomlaが行うことは、HTMLが行うことよりもはるかに少ないです。チェックボックスは、チェックされている場合にのみ送信されます。チェックされていないものは送信されません。彼らは存在しないようです。

したがって、実際に得られる結果は、HTML標準に準拠しています。

個人的には、オプションのチェックボックスをできるだけ使用しないようにします。彼らは真面目に取られるために奇妙な行動をとるだけです:-)

2
Bakual

Users/Mass Mail(administrator/components/com_users/models/forms/mail.xml)で、その使用例を確認できます。各チェックボックスは、値の配列を管理する代わりに、独自のフィールドで定義されます。

<field name="recurse" type="checkbox"
    description="COM_USERS_MAIL_FIELD_RECURSE_DESC"
    label="COM_USERS_MAIL_FIELD_RECURSE_LABEL"
    value="1"
/>

<field name="mode" type="checkbox"
    description="COM_USERS_MAIL_FIELD_SEND_IN_HTML_MODE_DESC"
    label="COM_USERS_MAIL_FIELD_SEND_IN_HTML_MODE_LABEL"
    value="1"
/>

<field name="disabled" type="checkbox"
    description="COM_USERS_MAIL_FIELD_EMAIL_DISABLED_USERS_DESC"
    label="COM_USERS_MAIL_FIELD_EMAIL_DISABLED_USERS_LABEL"
    value="1"
/>
1
Anibal