XML中的自定义字段不保存DB中的参数

时间:2013-12-04 11:12:50

标签: xml joomla joomla3.0

这是创建自定义字段的代码:

<?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中。这有什么不对?

1 个答案:

答案 0 :(得分:3)

有几个问题。

HTML&amp; PHP表单

如果我们用一些伪数据解开你的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会像这样呈现:

Original Checkboxes

当提交PHP时会认为它是这样的:

var_dump($_POST);

array (size=1)
  'article' => string '3' (length=1)

因此,要获得array of a form element in PHP,您需要将[]附加到名称的末尾,即article[],以使显示垂直,我还添加了{{} 1}}在每个复选框之后并正确引用<br>的属性。这让我们明白了:

<input>

提交时,我们可以看到PHP的所有检查选项:

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

Joomla问题

  1. 使用行var_dump($_POST); array (size=1) 'articles' => array (size=2) 0 => string '1' (length=1) 1 => string '3' (length=1) 创建一个JDatabaseQuery对象,然后通过用一串SQL覆盖来立即销毁它。
  2. 您的表名和列名未被适当引用,引用有助于防止注入风险和保留字冲突。由于引用可能因底层数据库而异,$query = $db->getQuery(true);提供了一系列有用的功能,使您的SQL可以在其支持的各种数据库中移植,因此您的查询可以重写为:
  3. JDatabase

    3。我建议不要使用泛型类型的“自定义”(我意识到很多教程都使用它,但它们只是示例),为避免冲突,请尝试更具描述性的$query = $db->getQuery(true); $query->select(array($db->quoteName('id'), $db->quoteName('title'))); $db->setQuery($query); $rows = $db->loadObjectList(); 。所以你的PHP最终会更像这样:

    ArticleCheckboxes

    4。我认为这是初步的SQL,因为现在这将拉回网站上的每篇文章,无论是否已发布,甚至已过期和删除。您可能需要考虑使用文章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; } } 的{​​{1}}模型,它将为您提供使用com_content对象(如过滤)和ContentModelArticles返回列表的所有优势您可以使用的文章。