ti-enxame.com

Como trabalhar com o tipo de campo Caixas de seleção (não caixa de seleção)

Meu componente precisa salvar várias opções e parece que não consigo entender como fazê-lo. Referindo-se a Tipo de campo do formulário Checkboxes , não sei como o Joomla espera salvar as opções que o usuário selecionou.

Atualização: Para ser claro, estou me referindo ao plural checkboxes tipo de campo, não checkbox.

Aqui está o XML que estou usando :

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

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

E a entrada resultante :

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

No meu mundo perfeito, concatenaria todo o valor e os armazenaria em uma coluna, mas não espero que seja o que o Joomla faria por padrão. Caso contrário, como especificar quais valores vão para onde tal Joomla pode entender mais tarde como recuperar os valores. Tenho certeza de que estou perdendo algo óbvio, mas estou preso.

Alguém pode explicar como o Joomla lida com isso, ou me dar um exemplo central disso?

Conclusão: Parece que esse tipo de campo é apenas um método simples para criar facilmente várias caixas de seleção, todas elas tenha o problema inerente de não enviar nada se desmarcado. Como eles são enviados como uma matriz, parece útil o suficiente, desde que você esteja apenas processando com base nos valores enviados, mas parece muito trabalho desnecessário, se você precisar recuperá-los. ( Apenas minha opinião, eu posso estar errado)

Realização adicional (na parte top da documentação!):

O tipo de campo do formulário de caixas de seleção fornece um conjunto de caixas de seleção. Nota: ao contrário da maioria dos tipos de campos de formulário padrão, como campo de texto ou caixa de seleção, esse campo não é uma solução "pronta para uso". Ele criará caixas de seleção para você e enviará seus valores na forma de uma matriz, mas não os armazenará no banco de dados .

5
GDP

Minha primeira oferta, então por favor não atire em mim. Eu tenho lutado contra este por um tempo e finalmente encontrei uma solução que funciona bem. Na esperança de ajudar os outros a evitar esse pesadelo.

O ponto principal que estava faltando é que o jform estava enviando o campo de caixas de seleção como uma matriz (duh) para acessar jform['whatever'] não forneceu os resultados esperados.

O OP disse:

No meu mundo perfeito, concatenaria todo o valor e os armazenaria em uma coluna

SIM! Você pode fazer isso com caixas de seleção. Isso funciona muito bem.

Aqui está o que eu fiz.

No admin/models/forms/myform.xml , tenho um campo de caixas de seleção:

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

No admin/views/myview/edit.php campo de formulário, eu apenas uso:

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

No admin/models/myview.php eu adicionei uma função:

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

Ele armazena os dados como valores separados por vírgula na coluna. Ele armazena um espaço em branco se as caixas de seleção estiverem desmarcadas. SIM!

Como meu formulário também é editado no front end, fiz quase a mesma coisa no front end. O campo e o formulário são iguais.

Como eu já estava substituindo a função save no controlador, acabei de adicionar isso (com meu outro código também):

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

Tenho certeza de que poderia ter padronizado esse código ainda mais. Mas agora estou feliz por ter isso funcionando.

Documentação relevante: https://docs.joomla.org/Checkboxes_form_field_type

4
Deleyna

Parece-me que você deseja salvar todos os resultados como uma matriz e, em seguida, salve essa matriz como JSON em um único campo.

Exemplo de campo .. veja seu banco de dados, #__content table, veja o campo attribs, por exemplo, como o joomla armazena várias informações em um campo como JSON

Então, veja como os modelos e o controlador do com_content funcionam para obter algum benefício da engenharia reversa!

3
MOLEDesign

É menos o que o Joomla faz e muito mais o que o HTML faz. As caixas de seleção são enviadas apenas quando marcadas. Aqueles que não estão marcados não são enviados. É como se eles não existissem.

Portanto, o resultado obtido é realmente de acordo com os padrões HTML.

Pessoalmente, evito usar caixas de seleção para opções o máximo possível. Eles apenas agem de forma estranha para serem levados a sério :-)

2
Bakual

Em Usuários/Correio em Massa (administrador/components/com_users/models/forms/mail.xml), você pode verificar um exemplo de seu uso. Cada caixa de seleção é definida em seu próprio campo, em vez de gerenciar uma matriz de valores:

<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