【问题标题】:Write to multiple tables in joomla component?写入joomla组件中的多个表?
【发布时间】:2013-01-22 05:25:34
【问题描述】:

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

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

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

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

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

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

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

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

【问题讨论】:

    标签: database joomla components joomla2.5


    【解决方案1】:

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

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

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

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

    希望对你有帮助。

    【讨论】:

    • 不错。这确实有利于在保存任何内容之前检查您是否可以绑定到两个表。
    • 在Joomla 3 JTable中使用了bind($data)的save方法,所以在使用save方法之前不需要绑定数据。
    • 出于某种奇怪的原因,这个完全相同的代码不会将其保存到我的数据库中。你知道为什么吗?
    【解决方案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,如果您有时只需要保存一个表,有时需要同时保存两个,我会在控制器中处理。我发现保存功能在没有加载部件的情况下运行也很安全,所以我通常让它运行。

    【讨论】:

    • 谢谢大卫,我更喜欢另一种方法(见我自己的答案)。
    猜你喜欢
    • 2015-07-09
    • 1970-01-01
    • 2017-11-15
    • 2013-12-01
    • 2013-04-12
    • 2023-03-15
    • 2013-01-09
    • 2012-06-17
    • 2014-06-12
    相关资源
    最近更新 更多