Joomla PHP:复选框不会取消选中


Joomla PHP: Checkbox won't uncheck

制作一个简单的组件。 如果我在选中该框的情况下保存新记录,则保存正常。 如果我返回并取消选中以前选中的项目,它将恢复为选中状态。 我认为它与隐藏字段有关,玩手动放入其中一个,但这也没有解决它,所以把它拿出来了。

这是我所在的地方: 一个 xml 代码段:

<fieldset name="checks">
  <field name="checkbox1"
    type="checkbox"
    label="First Checkbox"
    value="1"
    filter="intval"         
  /> 
   <field name="checkbox2"
    type="checkbox"
    label="Second Checkbox"
    value="1"
    filter="intval"         
  /> 
 ...
</fieldset>

编辑.php文件:

<div class="width-45 fltlft">
  <fieldset class="adminform">
    <legend>Checkboxes</legend>
    <ul class="adminformlist">
      <?php foreach ($this->form->getFieldset('checks') as $field): ?>
        <li>
          <?php echo $field->label; ?>
          <?php echo $field->input; ?>
        </li>
      <?php endforeach ?>
    </ul>
  </fieldset>
</div>

还在 form.token 之前添加了这个:

<input type="hidden" name="task" id="task" value="completion.edit" />

我尝试删除 xml 中的值="1",但后来我遇到了相反的问题,检查根本不会保存。

有什么想法吗?

谢谢!

====

===============================

编辑:

型:

<?php
defined( '_JEXEC' ) or die;
jimport('joomla.application.component.modeladmin');
class AssessModelCompletion extends JModelAdmin
{
//tells it what kind of record and the prefix
    public function getTable($type = 'Completion', $prefix = 'AssessTable', $config = array())
    {
        return JTable::getInstance($type, $prefix, $config);
    }
    //Load the data into the edit form
    protected function loadFormData()
    {
        $data = JFactory::getApplication()->getUserState('com_assess.edit.completion.data', array()); //first try to get the data from the session, not db
        if (empty($data)) {
            $data = $this->getItem(); //this gets the data
        }
        return $data;
    }
    //Stores data in a session in case a field is missed
    public function getForm($data = array(), $loadData = true)
    {
        $form = $this->loadForm('com_assess.completion', 'completion', array('control' => 'jform', 'load_data' => $loadData));
        return $form;
    }
}

和表:

<?php 
defined ( '_JEXEC' ) or die;
class AssessTableCompletion extends JTable
{
    public function __construct(&$db)
    {
        parent::__construct('#__tablename_completions', 'completion_id', $db);
    }
}

====

=====================================

引用:https://stackoverflow.com/questions/6964333/joomla-1-6-admin-form-processing-grouped-checkboxes-in-form

教程代码在Joomla 2.5中不再起作用

http://docs.joomla.org/Developing_a_Model-View-Controller_%28MVC%29_Component_for_Joomla!1.7_-_Part_09#Adding_a_toolbar

所以这是一种

奇怪的情况,因为你列出的文档使你似乎不必编写代码来处理复选框(因为正如你指出的那样,复选框与复选框不同(。但由于提交 html 复选框的方式,情况似乎并非如此。

可以在此处找到此问题的快速概述和一个解决方案:http://planetozh.com/blog/2008/09/posting-unchecked-checkboxes-in-html-forms/。

要使用它,您需要从 $field 变量中获取字段的名称(我不确定它是否易于访问(,然后将<input type=hidden name='name' value=0>放在 <?php echo $field->input; ?> 之前。

解决此问题的另一种方法是在保存和覆盖元素期间处理表单数据。Joomla有一个prepareTable函数,你可以把它添加到你的模型中,以便在保存期间根据需要编辑数据。以下示例假定表单元素包装在 jform 数组中。(通过查看生成的 html 中的名称字段来确认这一点,它们应该是"jform[checkbox1]"(

protected function prepareTable(&$table)
{
    $jform = JRequest::getVar('jform'); // load all submitted data
    if (!isset($jform['checkbox1'])) { // see if the checkbox has been submitted
        $table->checkbox1 = 0; // if it has not been submitted, mark the field unchecked
    }
    if (!isset($jform['checkbox2'])) { // likewise for other checkboxes
        $table->checkbox2 = 0;
    }
}

在这种情况下,您可能希望在 xml 字段文件中保留"value=1"。

最终的问题在于Joomla在保存期间从数据库中加载当前数据,然后将发布的数据绑定到其顶部。由于未选中的框未在发布数据中提交,因此不会覆盖数据库信息,因此不会保存。

尽管文档指出您不必对复选框进行任何手动处理,但事实并非如此。

由于未选中复选框时不会在 $_POST 数组中发送任何值,因此不会覆盖该值,因此不会保存,因此无法取消选中该复选框。要解决此问题,您必须为表bind((函数中的复选框编写特殊处理,如下所示:

class YourcomponentTableYourview extends JTable 
{ 
    /** 
     * Constructor 
     * 
     * @param JDatabase A database connector object 
     */ 
    public function __construct(&$db) 
    { 
        parent::__construct('#__your_table_name', 'id', $db); 
    } 
    public function bind($array, $ignore = '') 
    { 
        if (!isset($array['name_of_field'])) 
                    $array['name_of_field'] = 0 ; 
        return parent::bind($array, $ignore); 
    } 
} 

由于您没有显示任何模型/表格代码,我认为您可能误会了JForm的目的 - 它纯粹是为了渲染表单。您仍然必须在模型/表中具有某些内容来处理为多值字段返回的数组。

正如山姆·莫法特(Sam Moffat(所说:

用于呈现数据的表单定义与用于持久保存数据的模型和表结构之间没有耦合

所以我

有很多字段,并希望在我的编辑.php字段中简单地循环访问它们以保持干净。 虽然提供的所有答案都是正确的,但它们并不容易实施 - 很快就变得非常混乱,难以使其工作,或者无法找到更干净的解决方法。 我咀嚼了一段时间,然后今天遇到了基本上是字段覆盖的东西。

关键:

标准表单字段类型位于 joomla/libraries/joomla/form/fields/.您不应该存储自定义 字段,也不必在自己的代码中使用此路径, 但标准类型通常是很好的例子。

属于您的组件的自定义字段类型通常是 位于管理员/组件//模型/字段中。您可以在您的 法典

因此,我将复选框.php复制到模型/字段。 然后,在文件末尾,我在复选框标签之前添加了空字段:

<input type="hidden" name="'.$this->name.'" id="'.$this->id.'" value="0" /><input type="checkbox" .....

现在,每当我需要复选框时,也会写入空字段。可能不是最有效的解决方案,但易于实施,有望帮助其他人。

[编辑]

请注意,对于每个Joomla更新,您可能需要比较核心中的版本,以防发生更改。

我知道

这是一个老问题,但官方答案很长,我想我有更好的解决方案。

尝试将复选框的默认值设置为 0,而不是像这样在 xml 中1

<fieldset name="checks">
  <field name="checkbox1"
    type="checkbox"
    label="First Checkbox"
    value="0"
    filter="intval"         
  /> 
   <field name="checkbox2"
    type="checkbox"
    label="Second Checkbox"
    value="0"
    filter="intval"         
  /> 
 ...
</fieldset>

我刚刚遇到了您的问题并尝试将其设置为 0,因为我不想篡改核心,嘿,它可以工作。

我的猜测是Joomla看不到任何值,因此设置了默认值。