写入joomla组件中的多个表?

l_r*_*l_r 10 database joomla components joomla2.5

我正在尝试创建一个使用多个表的组件(前端).我发现1或2个帖子部分回答了这个问题,但没有一个确实如此.对于知道如何做到这一点的人来说,这一点似乎总是很简单明了,但从未真正解释过(或者我错过了正确的帖子).

在我的组件中,用户在一个视图中输入需要存储在两个表中的数据:标准的Joomla User表,即#__users用于存储未包含在Joomla中的数据的附加表,即#__users_complements

我是初学者,所以也许我错了,但我明白joomla的标准功能只能在一个表中保存表单的结果.就我而言,我想我必须覆盖模型中的标准函数:com_component/model/my_model.php.

1)我很困惑,因为我真的不明白哪个函数必须被覆盖:save()?商店()?其他?

2)假设我重写了save()函数,我应该重写所有代码来保存数据(爆炸数据数组并创建所有更新查询),还是应该创建2个标准表对象.

在这种情况下,(2个对象)每次将整个数据数组发送到父函数似乎很奇怪,因为我知道一个部分用于表1而另一部分用于表2.我应该能够在分开之前拆分我呢?

3)当我从表单中获取数据并调用模型的保存功能时,是否应该创建2个模型并从我的控制器管理这些模型?

你能帮我澄清一下如何在多个表中保存吗?我们非常感谢代码示例.谢谢

l_r*_*l_r 19

我终于做到了.因为我花了很多时间在这上面,发现有很多人在寻找答案,这就是我的表现.

我想您知道如何使用标准MVC结构创建组件:

  1. 组件入口点
  2. 组件控制器
  3. 最终组件路由器
  4. 组件视图
  5. 组件模型
  6. 组件控制器

在模型组件\ my_component\models\my_model.php中创建自己的保存功能

public function save($data)
{
    // Initialise variables.
    $userId = (!empty($data['id'])) ? $data['id'] : (int)$this->getState('user.id');
    $user = JFactory::getUser();

    $table_one = $this->getTable('TableOne', 'MyComponentTable', array());
    $table_two = $this->getTable('TableTwo', 'MyComponentTable', array());

    // Bind the data.
    if (!$table_one->bind($data))
    {
        $this->setError(JText::sprintf('USERS PROFILE BIND FAILED', $user->getError()));
        return false;
    }

    if (!$table_two->bind($data))
    {
        $this->setError(JText::sprintf('USERS PROFILE BIND FAILED', $user->getError()));
        return false;
    }

    // Store the data.
    if (!$table_one->save($data))
    {
        $this->setError($user->getError());
        return false;
    }

    if (!$table_two->save($data))
    {
        $this->setError($user->getError());
        return false;
    }

    return $user->id;
}
Run Code Online (Sandbox Code Playgroud)

当然,您需要在save函数中调用getTable函数

public function getTable($type = 'TableOne', $prefix = 'MyComponentTable', $config = array())
{
    // call the administrator\components\com_mycomponent\tables\__tablename__.php
    $this->addTablePath(JPATH_COMPONENT_ADMINISTRATOR . '/tables');
    return JTable::getInstance($type, $prefix, $config);
}
Run Code Online (Sandbox Code Playgroud)

它的工作原理!很简单!当然,正如我在我的问题中所说的那样,整个$ data被发送到父save()函数,以及table_one或table_two不需要的数据.它以标准的joomla结构(在代码中没有hack或直接查询)的方式工作.

希望能帮助到你.

  • 在Joomla 3 JTable的save方法里面使用bind($data),所以在使用save方法之前不需要绑定数据。 (2认同)