Joomla 3 使用 JTable 将表单数据保存到数据库

Posted

技术标签:

【中文标题】Joomla 3 使用 JTable 将表单数据保存到数据库【英文标题】:Joomla 3 save form data to database with JTable 【发布时间】:2014-11-08 03:29:34 【问题描述】:

我在使用 JTable 将数据保存到数据库时遇到问题。我遵循标准的 joomla 文档来创建组件。我有数据库表testsidtitledescriptioncreated_by 列。我能够创建带有标题、描述的表单,并使用标准保存功能(未编辑)将 thouse 值保存到数据库中。但是我想将用户ID插入created_by列,但不知道该怎么做。

不知道我是否可以在edit.php视图tmpl中定义<input type="hidden">,或者我应该以某种方式编辑控制器或表格文件?

无法弄清楚 joomla 如何使用 JTable 解析表单数据以将它们保存到数据库中。

【问题讨论】:

如果不共享有问题的代码部分,将很难调试。 我更可能需要帮助来了解它是如何工作的......但我会发布我的代码...... 【参考方案1】:

这是我用于测试视图的edit.php tmpl:

<?php
// No direct access
defined('_JEXEC') or die('Restricted access');
Jhtml::_('behavior.tooltip');
?>
<form action="<?php echo JRoute::_('index.php?option=com_etesty&layout=edit&id='.(int) $this->item->id); ?>" method="post" name="adminForm" id="adminForm">
<div class="form-horizontal">
    <fieldset class="adminform">
        <legend><?php echo JText::_( 'COM_ETESTY_TEST_DETAILS' ); ?></legend>
        <div class="row-fluid">
            <div class="span6">
                <?php foreach ($this->form->getFieldset() as $field): ?>
                    <div class="control-group">
                        <div class="control-label"><?php echo $field->label; ?></div>
                        <div class="controls"><?php echo $field->input; ?></div>
                    </div>
                <?php endforeach; ?>
            </div>
        </div>
    </fieldset>
</div>
<div>
<?php


    $user = JFactory::getUser();
    $user_id = $user->id;
    echo '<input type="text" name="jform[created_by]" value="' . $user_id . '" />';
    ?>




    <input type="hidden" name="task" value="test.edit" />
    <?php echo JHtml::_('form.token'); ?>
</div>
</form>

这是我的模型test.php:

<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// import Joomla modelform library
jimport('joomla.application.component.modeladmin');

/**
 * Test Model
 */
class ETestyModelTest extends JModelAdmin

/**
 * Returns a reference to the a Table object, always creating it.
 *
 * @param   type    The table type to instantiate
 * @param   string  A prefix for the table class name. Optional.
 * @param   array   Configuration array for model. Optional.
 * @return  JTable  A database object
 * @since   1.6
 */
public function getTable($type = 'Test', $prefix = 'ETestyTable', $config = array()) 

    $table = JTable::getInstance($type, $prefix, $config);
    return $table;

/**
 * Method to get the record form.
 *
 * @param   array   $data       Data for the form.
 * @param   boolean $loadData   True if the form is to load its own data (default case), false if not.
 * @return  mixed   A JForm object on success, false on failure
 * @since   1.6
 */
public function getForm($data = array(), $loadData = true) 

    // Get the form.
    $form = $this->loadForm('com_etesty.test', 'test', array('control' => 'jform', 'load_data' => $loadData));
    if (empty($form)) 
    
        return false;
    
    return $form;

/**
 * Method to get the data that should be injected in the form.
 *
 * @return  mixed   The data for the form.
 * @since   1.6
 */
protected function loadFormData() 

    // Check the session for previously entered form data.
    $data = JFactory::getApplication()->getUserState('com_etesty.edit.test.data', array());
    if (empty($data)) 
    
        $data = $this->getItem();
    
    return $data;


这是component/tables/test.php中的表格

<?php
// No direct access
defined('_JEXEC') or die('Restricted access');

// import Joomla table library
jimport('joomla.database.table');

/**
 * Test Table class
 */
class ETestyTableTest extends JTable

/**
 * Constructor
 *
 * @param object Database connector object
 */
function __construct(&$db) 

    parent::__construct('#__etesty_test', 'id', $db);


还有我在 component/models/forms/test.xml 中的表单

<?xml version="1.0" encoding="utf-8"?>
<form>
<fieldset>
    <field
        name="id"
        type="hidden"
    />
    <field
        name="nazev"
        type="textarea"
        label="COM_ETESTY_TEST_NAZEV_LABEL"
        description="COM_ETESTY_TEST_NAZEV_DESC"
        class="text_area"
        default=""
    />
    <field
        name="popis"
        type="text"
        label="COM_ETESTY_TEST_POPIS_LABEL"
        description="COM_ETESTY_TEST_POPIS_DESC"
        size="255"
        class="inputbox"
        default=""
    />
    <field
        name="tema"
        type="modal_temata"
        label="COM_ETESTY_TEMA_LABEL"
        description="COM_ETESTY_TEMA_DESC"
    />
</fieldset>
</form>

它在捷克语中 nazev = 标题,popis = 描述。我需要进入那里的用户 ID 以将其保存到我创建列 created_by 的数据库中。

【讨论】:

【参考方案2】:

在您的控制器文件中添加这些代码。不要在表单中添加 created_by。

$user = JFactory::getUser();

$data['created_by'] = $user->id;

$model = $this->getModel('yourmodel');

$model->store($data);

【讨论】:

以上是关于Joomla 3 使用 JTable 将表单数据保存到数据库的主要内容,如果未能解决你的问题,请参考以下文章

在joomla中通过JTable手动设置表格行的id

通过 MVC 传递表单数据 - Joomla

joomla 3 - 将数据存储到不同的表

使用 joomla 用户数据自动填充独立表单

在 joomla 3.0 中使用单个模型从表单写入多个表

在 Joomla 中添加命中计数器