Joomla PHP:Checkbox不会取消选中

Gis*_*sto 3 php joomla joomla1.6 joomla1.7 joomla2.5

制作一个简单的组件.如果我在选中此框的情况下保存新记录,则可以保存.如果我返回并取消选中之前检查的项目,它将恢复为已检查.我认为它与隐藏的字段有关,玩的是手动放置其中一个,但是没有解决它,所以把它取出来.

这是我在的地方:一个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>
Run Code Online (Sandbox Code Playgroud)

edit.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>
Run Code Online (Sandbox Code Playgroud)

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

<input type="hidden" name="task" id="task" value="completion.edit" />
Run Code Online (Sandbox Code Playgroud)

我尝试删除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;
    }
}
Run Code Online (Sandbox Code Playgroud)

和表:

<?php 
defined ( '_JEXEC' ) or die;

class AssessTableCompletion extends JTable
{
    public function __construct(&$db)
    {
        parent::__construct('#__tablename_completions', 'completion_id', $db);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

参考文献: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

Dav*_*sch 5

所以这是一种奇怪的情况,因为你列出的文档似乎你不必编写任何代码来处理复选框(因为你指出一个复选框不同然后复选框).但由于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;
    }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您需要在xml字段文件中保留"value = 1".

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