[英]Custom field in XML is not saving parametars in DB
这是创建自定义字段的代码:
<?php
defined('_JEXEC') or die('Restricted access');
class JFormFieldCustom extends JFormField {
protected $type = 'Custom';
protected function getInput() {
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query = 'SELECT id, title FROM #__content';
$db->setQuery($query);
$rows = $db->loadObjectList();
$result = '';
foreach ($rows as $row) {
$result .= '<label>' . $row->title . '</label><input type=checkbox name=article value="' . $row->id .'"/>';
}
return $result;
}
}
?>
并将代码转换成XML文件:
<field name="checkboxes" type="custom" default="" label="Articles" description="" />
问题是什么都没有作为参数保存到DB中。 怎么了
几个问题。
如果我们使用一些伪数据来分解您的for循环,则会得到以下结果:
<label>My Article Title 1</label><input type=checkbox name=article value="1" />
<label>My Article Title 2</label><input type=checkbox name=article value="2" />
<label>My Article Title 3</label><input type=checkbox name=article value="3" />
<label>My Article Title 4</label><input type=checkbox name=article value="4" />
因此,最明显的问题是您将复选框作为单个值(均具有相同的名称)传递回去,其中代码表示您确实需要数组。
该HTML将如下所示:
在提交时,PHP会这样感知:
var_dump($_POST);
array (size=1)
'article' => string '3' (length=1)
因此,要在PHP中获取表单元素的数组,您需要在名称的末尾附加[]
,即article[]
,以使显示垂直,我还在每个复选框后添加了<br>
引用<input>
的属性。 这使我们得到:
<label>My Article Title 1</label><input type="checkbox" name="articles[]" value="1" /><br>
<label>My Article Title 2</label><input type="checkbox" name="articles[]" value="2" /><br>
<label>My Article Title 3</label><input type="checkbox" name="articles[]" value="3" /><br>
<label>My Article Title 4</label><input type="checkbox" name="articles[]" value="4" /><br>
提交后,我们可以看到PHP see的所有检查选项:
var_dump($_POST);
array (size=1)
'articles' =>
array (size=2)
0 => string '1' (length=1)
1 => string '3' (length=1)
$query = $db->getQuery(true);
行创建一个JDatabaseQuery
对象$query = $db->getQuery(true);
,然后立即通过用SQL字符串覆盖来销毁它。 JDatabase
提供了一系列有用的函数来使您的SQL可跨其支持的各种DB移植,因此您的查询可以重写为: $query = $db->getQuery(true);
$query->select(array($db->quoteName('id'), $db->quoteName('title')));
$db->setQuery($query);
$rows = $db->loadObjectList();
3.我建议不要使用通用类型的“自定义”(我意识到很多教程都使用了它,但它们只是示例),为避免冲突,请尝试使用更具描述性的内容(例如ArticleCheckboxes
。 因此,您的PHP最终更像这样:
class JFormFieldArticlesCheckboxes extends JFormField
{
protected $type = 'ArticlesCheckboxes';
protected function getInput()
{
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select(array($db->quoteName('id'), $db->quoteName('title')));
$db->setQuery($query);
$rows = $db->loadObjectList();
$result = '';
foreach ($rows as $row)
{
$result .= '<label>' . $row->title . '</label><input type="checkbox" name="articles[]" value="' . $row->id . '"/>';
}
return $result;
}
}
4.我认为这是初步的SQL,因为现在这将撤回网站上的每篇文章 ,无论是否发表,过期甚至被丢弃。 您可能要考虑对文章ContentModelArticles
使用com_content
模型,这将为您提供使用JModelList
对象的所有优点,例如过滤,以及getItems()
,该对象返回可以使用的文章列表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.