簡體   English   中英

XML中的自定義字段未在數據庫中保存參數

[英]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中。 怎么了

幾個問題。

HTML和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將如下所示:

原始復選框

在提交時,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)

Joomla問題

  1. 使用$query = $db->getQuery(true);行創建一個JDatabaseQuery對象$query = $db->getQuery(true); ,然后立即通過用SQL字符串覆蓋來銷毀它。
  2. 您的表名和列名未正確引用,引號有助於防止注入風險和保留字沖突。 由於基礎數據庫的報價可能會有所不同,因此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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM