制作一个简单的组件。如果我在选中此框的情况下保存新记录,则可以保存。如果我返回并取消选中之前检查的项目,它将恢复为已检查。我认为它与隐藏的字段有关,玩的是手动放入其中一个,但是没有解决它,所以把它取出来。
这是我在的地方: 一个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>
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中的值=“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);
}
}
======================================
答案 0 :(得分:5)
所以这是一种奇怪的情况,因为你列出的文档似乎你不必编写任何代码来处理复选框(因为你指出一个复选框不同然后复选框)。但由于html复选框的提交方式,情况似乎并非如此。
可以在此处找到此问题的简要概述和解决方案:http://planetozh.com/blog/2008/09/posting-unchecked-checkboxes-in-html-forms/。
要使用此功能,您需要从$ field变量中获取字段名称(我不确定它是否易于访问)然后将<input type=hidden name='name' value=0>
放在{{1}之前}。
解决此问题的另一种方法是在保存和覆盖元素期间处理表单数据。 Joomla有一个prepareTable函数,您可以将其添加到模型中,以便在保存期间根据需要编辑数据。以下示例假定您的表单元素包装在jform数组中。 (通过查看生成的html中的名称字段来确认这一点,它们应该是'jform [checkbox1]')
<?php echo $field->input; ?>
在这种情况下,您需要在xml字段文件中保留“value = 1”。
问题最终是Joomla在保存期间从数据库加载当前数据,然后将发布的数据绑定在其顶部。由于未在发布数据中提交未选中的框,因此不会覆盖数据库信息,因此不会保存。
答案 1 :(得分:1)
由于您没有显示任何模型/表格代码,我认为您可能会误认为JForm
的目的 - 它纯粹是为了呈现表单。您仍然需要在模型/表中处理为多值字段返回的数组。
用于呈现数据的表单定义与用于保存数据的表单结构之间没有耦合
答案 2 :(得分:1)
虽然文档说明您不必对复选框进行任何手动操作,但事实并非如此。
由于未选中复选框时$ _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);
}
}
答案 3 :(得分:1)
所以我有很多字段,想在我的edit.php字段中简单地遍历它们以保持其清洁。虽然提供的所有答案都是正确的,但它们并不容易实现 - 真的很快就弄得很乱,无法让它工作,或者无法找到更清晰的方法。我咀嚼了一段时间,然后今天遇到的基本上是field override。
关键:
标准表单字段类型位于 的Joomla /库/的Joomla /形式/场/。你不应该存储自定义 那里的字段,你也不必在你自己的代码中使用这个路径, 但标准类型通常是很好的例子。
通常是属于您的组件的自定义字段类型 位于管理员/组件//模型/字段中。您可以在您的指定中指定此路径或其他路径 代码
所以,我将checkbox.php复制到模型/字段。然后,在文件的末尾,我在复选框标记之前添加了空字段:
<input type="hidden" name="'.$this->name.'" id="'.$this->id.'" value="0" /><input type="checkbox" .....
现在,每当我需要一个复选框时,也会写入空字段。可能不是最有效的解决方案,但实施起来很简单,可以帮助其他人。
[编辑]
作为一个注释,对于每个Joomla更新,您可能需要比较核心中的版本以防发生更改。
答案 4 :(得分:1)
我知道这是一个老问题,但官方的答案是冗长的,我认为我有更好的解决方案。
尝试将复选框的默认值设置为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没有看到任何值,因此设置了默认值。