【问题标题】:Joomla PHP: Checkbox won't uncheckJoomla PHP:复选框不会取消选中
【发布时间】:2012-05-30 08:31:27
【问题描述】:

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

这是我所在的位置: 一个xml sn-p:

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

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>

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

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

我尝试删除 xml 中的 value="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

Tutorial code is not working any more in Joomla 2.5

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

【问题讨论】:

    标签: php joomla joomla1.7 joomla1.6 joomla2.5


    【解决方案1】:

    所以这是一种奇怪的情况,因为您列出的文档使您似乎不必编写任何代码来处理复选框(因为您指出复选框与复选框不同)。但由于 html 复选框的提交方式,情况似乎并非如此。

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

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

    解决此问题的另一种方法是在保存和覆盖元素期间处理表单数据。 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 数据中没有提交未选中的框,所以它不会覆盖数据库信息,因此不会保存。

    【讨论】:

    • 要在较新版本 (>1.7?) 中获取表单,请使用 $form = JFactory::getApplication()-&gt;input-&gt;get('jform', array(), 'array');(适用于 3.0)。
    【解决方案2】:

    由于您没有显示任何模型/表格代码,我认为您可能误解了JForm 的目的 - 它纯粹是为了呈现表单。您仍然必须在您的模型/表中拥有一些东西来处理为多值字段返回的数组。

    作为Sam Moffat put it:

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

    【讨论】:

    • 嗯,这是关于 checkboxES 的讨论(我认为产生了这个页面:docs.joomla.org/Checkboxes_form_field_type)。每个字段都有一个复选框。加上所有其他字段都在工作(第一次检查时它会保存,取消选中时它不会保存),如果没有任何耦合,它们不应该工作。上面更新了模型/表格。我还在学习,所以如果我对这些假设有误,请告诉我,谢谢!
    【解决方案3】:

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

    当未选中复选框时,不会在 $_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); 
        } 
    } 
    

    【讨论】:

    • 谢谢!不过,问题是,假设我有 50 个复选框,是否有一种简单的方法可以循环浏览 XML 并在不为每个字段编写此内容的情况下拉出复选框?似乎效率很低:/
    【解决方案4】:

    所以我有很多字段,并想在我的 edit.php 字段中简单地循环它们以保持干净。虽然提供的所有答案都是正确的,但它们并不容易实施——很快就变得非常混乱,难以让它工作,或者找不到更清洁的方法。我对此进行了一段时间的研究,然后今天发现基本上是field override

    关键:

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

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

    所以,我将 checkbox.php 复制到模型/字段。然后,在文件的末尾,我在复选框标记之前添加了空字段:

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

    现在,每当我需要一个复选框时,也会写入空字段。可能不是最有效的解决方案,但实施起来很简单,希望能对其他人有所帮助。

    [编辑]

    请注意,每次 Joomla 更新时,您可能都需要比较核心中的版本以防发生变化。

    【讨论】:

      【解决方案5】:

      我知道这是一个老问题,但官方的回答很啰嗦,我想我有更好的解决方案。

      尝试在您的 xml 中将复选框的默认值设置为 0 而不是 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 看不到任何价值,因此设置了默认值。

      【讨论】:

      • 选中复选框后,此功能将不起作用。在这种情况下,复选框甚至不会正确显示在表单数据中。 (并且不会设置默认值)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-10
      • 1970-01-01
      • 2014-07-09
      • 1970-01-01
      • 2014-05-28
      • 2019-01-28
      相关资源
      最近更新 更多