11

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

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

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

1)我很困惑,因为我真的不明白必须重写哪个函数:save()?店铺 ()?其他?

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

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

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

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

4

2 回答 2

20

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

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

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

在 model 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 或直接查询)。

希望能帮助到你。

于 2013-02-09T16:38:13.370 回答
2

可能有些人不同意以下方法稍微破坏 MVC 结构的方式,但我发现它对我来说是最简单的。

通常,您有一个适合其中一张表的模型。在您将数据推送到用户表以及组件中的一个示例中,我会将以下内容添加到组件中表的模型中:

public function save($data) {
    if (!parent::save($data)) {
        return false;
    }

    // add necessary code to save to the users table, since there isn't a standard way to do this that I'm aware of

    // sometimes I will grab another model even
    require_once(JPATH_BASE . '/administrator/components/com_users/models/user.php');
    $other_model = $this->getInstance('user', 'UsersModel');
    $other_model->save($data);

    return true;
}

该函数的第一部分应该像往常一样将数据保存到组件表中。但是您可以将您需要的内容添加到组件的其余部分,以使您喜欢的任何事情发生。

我几乎可以保证有一种更好的链接模型的方法(我已经看到 Joomla 平台核心中发生的一些变化将在未来带来更好的方法),但这应该让你现在就开始。

此外,对于提示 3,如果您有时只需要保存一个表,有时需要同时保存两个表,我会在控制器中处理。我发现即使没有加载零件,保存功能也可以非常安全地运行,所以我通常让它运行。

于 2013-02-06T21:23:39.183 回答