database - 写入 joomla 组件中的多个表?

标签 database joomla components joomla2.5

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

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

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

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

2) 假设我覆盖了 save() 函数,我应该重写所有代码以保存数据(分解数据数组并创建所有更新查询)还是应该创建 2 个标准表对象。

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

3) 当我从表单取回数据并调用模型的保存函数时,我是否应该创建 2 个模型并从我的 Controller 管理这些模型?

你能帮我解释一下如何在多个表中进行这种保存吗? 非常感谢带有代码的示例。 谢谢

最佳答案

我终于成功了。我在这上面花了很多时间,发现很多人都在寻找答案,我就是这样做的。

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

  1. 组件入口点
  2. 组件 Controller
  3. 最终组件路由器
  4. 组件 View
  5. 组件模型
  6. 组件 Controller

在模型components\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;
}

当然需要在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);
}

而且有效!很简单! 当然,正如我在我的问题中所说,整个 $data 被发送到父 save() 函数,其中包含 table_one 或 table_two 不需要的数据。它以这种方式与标准的 joomla 结构一起工作(代码中没有 hack 或直接查询)。

希望对您有所帮助。

关于database - 写入 joomla 组件中的多个表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14738809/

相关文章:

database - 卸载 SQL Server 2012

mysql - mysql数据库规范化

css - 当我点击菜单时,某些模块在我的网站上向下移动?为什么?

php - MySQL - 错误 1118 行大小太大 (> 8126) - 无法访问 sql-config

sql - 由于外键约束问题而插入 A 错误

php - MAMP 和 DigitalOcean LAMP Ubuntu 14.04 服务器之间的区别弄乱了 Joomla 自定义表单字段

java - JFrame 仅在首次创建时显示组件

javascript - 将 Vuetify 日历从子/合作伙伴组件向前移动一?

seo - Joomla 成员(member)扩展

android - Android studio数据库中如何创建多个表