web-dev-qa-db-fra.com

Comment travailler avec le type de champ Cases à cocher (pas de case à cocher)

Mon composant doit enregistrer plusieurs options, et je n'arrive pas à comprendre comment le faire. En ce qui concerne type de champ du formulaire Cases à cocher , je ne suis pas sûr de la façon dont Joomla compte enregistrer les options sélectionnées par l'utilisateur.

Mise à jour: Pour être clair, je me réfère au pluriel checkboxes type de champ, pas checkbox.

Voici le code XML que j'utilise :

<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 résultant

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

Et l'entrée résultante :

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

Dans mon monde parfait, il s'agirait de concaténer toute la valeur et de la stocker dans une colonne, mais je ne m'attendais pas à ce que Joomla fasse par défaut. Sinon, comment spécifier les valeurs qui vont à tel que Joomla puisse plus tard comprendre comment récupérer les valeurs. Je suis sûr qu'il me manque quelque chose d'évident, mais je suis coincé.

Quelqu'un peut-il expliquer comment Joomla gère cela, ou me donner un exemple de base qui le fait?

Conclusion: Il semble que ce type de champ soit simplement une méthode simpliste permettant de créer facilement plusieurs cases à cocher, qui ont le problème inhérent de ne rien soumettre si rien n'est fait. Comme ils sont soumis sous forme de tableau, cela semble assez pratique tant que vous ne traitez que sur la base des valeurs soumises, mais cela semble être un travail inutile si vous avez besoin de les récupérer. ( Juste mon avis, je peux me tromper)

Nouvelle réalisation (à la base du top de la documentation!):

Le type de champ de formulaire de cases à cocher fournit un ensemble de cases à cocher. Remarque: contrairement à la plupart des types de champs de formulaire standard, tels que les champs de texte ou les cases à cocher, ce champ n'est pas une solution "prête à l'emploi". Il créera des cases à cocher pour vous et soumettra ses valeurs sous forme de tableau, mais il ne les stockera pas dans la base de données .

5
GDP

Ma première offre, alors s'il vous plaît ne me tire pas dessus. Je me bats depuis un moment contre celui-ci et j'ai finalement trouvé une solution qui fonctionne bien. En espérant aider les autres à éviter ce cauchemar.

La pièce clé qui me manquait est que le jform soumettait le champ de cases à cocher sous forme de tableau (duh) afin d'accéder à jform['whatever'] n'a pas donné les résultats escomptés.

Le PO a déclaré:

Dans mon monde parfait, il serait concaténer toute la valeur et les stocker dans une colonne

OUI! Vous pouvez le faire avec des cases à cocher. Cela fonctionne très bien.

Voici ce que j'ai fait.

Dans le admin/models/forms/myform.xml j'ai un champ de cases à cocher:

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

Dans le champ de formulaire admin/views/myview/edit.php , je viens d'utiliser:

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

Dans le admin/models/myview.php , j'ai ajouté une fonction:

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

Il stocke les données sous forme de valeurs séparées par des virgules dans la colonne. Il enregistre un blanc si les cases à cocher ne sont pas cochées. OUAIS!

Comme ma forme est également modifiée au début, j’ai fait presque la même chose au début. Le champ de formulaire et le formulaire sont les mêmes.

Comme je surchargais déjà la fonction de sauvegarde dans le contrôleur, je viens d'ajouter ceci (avec mon autre code également):

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

Je suis sûr que j'aurais pu normaliser davantage ce code. Mais pour le moment, je suis simplement heureux que cela fonctionne.

Documentation pertinente: https://docs.joomla.org/Checkboxes_form_field_type

4
Deleyna

Il me semble que vous souhaitez enregistrer tous les résultats dans un tableau, puis enregistrer ce tableau au format JSON dans un seul champ.

Exemple de champ .. consultez votre base de données, la table #__content, voir le champ attribs pour voir comment joomla stocke plusieurs informations dans un champ en tant que JSON.

Ensuite, il suffit de regarder comment les modèles et le contrôleur com_content fonctionnent pour le bien de l’ingénierie inverse!

3
MOLEDesign

C'est moins ce que Joomla fait autant que le HTML. Les cases à cocher ne sont envoyées que si elles sont cochées. Ceux qui ne sont pas cochés ne sont pas envoyés. C'est comme s'ils n'existaient pas.

Le résultat obtenu est donc conforme aux normes HTML.

Personnellement, j'évite autant que possible d'utiliser les cases à cocher pour les options. Ils agissent juste trop pour être pris au sérieux :-)

2
Bakual

Dans Users/Mass Mail (administrateur/composants/com_users/models/forms/mail.xml), vous pouvez consulter un exemple d'utilisation. Chaque case à cocher est définie dans son propre champ, au lieu de cela pour gérer un tableau de valeurs:

<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