写入joomla资产表的正确模式是什么?

时间:2012-09-10 16:44:19

标签: php joomla

我目前正在修改组件以包含ACL支持。 我想为每个创建的类别/项创建正确的#_assets行。 尊重层次结构并重新计算lftrght值的正确程序是什么?

例:
成分

  • 类别(lft:0 rght:1)
    • 项目(lft:2 rght:3)
  • 类别(lft:4 rght:5)
    • 项目(lft:6 rght:7)
    • 新项目(lft:?rght:?)
  • 类别(lft:8 rght:9)

2 个答案:

答案 0 :(得分:1)

一般情况下,您不会直接写#_assets通常会add ACL support as shown in the tutorial,然后在保存每个项目时更新acl。

您可能也希望在adding ACL rules to your component上阅读本文。

最后,如果您正在讨论处理现有记录以添加ACL,那么最常见的方法是使用您更新的模型(现在具有ACL支持)处理每条记录以重新保存它们。这将导致ACL正确应用,而不仅仅是更新#_assets表。

答案 1 :(得分:1)

如果要将组件的项目添加到资产表:

我假设你添加了文件access.xml w / sections组件,类别和 item ,如下所示:

    ....

**<section name="item">
    <action name="core.delete" title="JACTION_DELETE" description="COM_CONTENT_ACCESS_DELETE_DESC" />
    <action name="core.edit" title="JACTION_EDIT" description="COM_CONTENT_ACCESS_EDIT_DESC" />
    <action name="core.edit.state" title="JACTION_EDITSTATE" description="COM_CONTENT_ACCESS_EDITSTATE_DESC" />
</section>**

...

在这里,我将部分项目称为组件的项目(即文章,横幅,网络链接等)

您的组件项目表必须具有列asset_id ,因为此字段的存在会触发将此项目保存到#__assets表

Jtable class

 ... __construct()
{
...
        if (property_exists($this, 'asset_id'))
        {
            $this->_trackAssets = true;
        }
...
}

如果您正在关注joomla的组件开发和文件结构指南,那么您的ComponentTableItem store()方法将调用parent::store();父类JTable->store()中的资源插入资产表发生了。如果项目记录已成功保存到其表中,则该类将继续检查是否存在asset_id字段。

JTable-&gt; store()检查

    // If the table is not set to track assets return true.
    if (!$this->_trackAssets)
    {
        return true;
    }

如果存在,则代码继续执行获取资产父ID,将记录添加到表中时使用的资产名称以及此项目的标题。

看看JOOMLA_ROOT / libraries / joomla / database / table.php并搜索方法store(),代码摘录:

$parentId = $this->_getAssetParentId();
$name = $this->_getAssetName();
$title = $this->_getAssetTitle();

如果要控制资产名称的记录方式,例如com_yourComponent。 item.12 或com_yourComponent。 event.14 ,或com_yourComponent。 YOURITEM.ID ,(查看您的joomla数据库,表#__assets以更好地理解我所指的内容,即资产名称的结构)您可以或可能需要重写方法_getAssetParentID()组件表类中的_getAssetName()和_getAssetTitle()。

假设一个新项目,一旦记录到#__assets表,该方法将使用相应的资产ID更新最近添加的项目记录,即# assets.id =# _yourComponent_item.asset_id。来自JTable-&gt; store()续:

    if (empty($this->asset_id))
    {
        // Update the asset_id field in this table.
        $this->asset_id = (int) $asset->id;

        $query = $this->_db->getQuery(true);
        $query->update($this->_db->quoteName($this->_tbl));
        $query->set('asset_id = ' . (int) $this->asset_id);
        $query->where($this->_db->quoteName($k) . ' = ' . (int) $this->$k);
        $this->_db->setQuery($query);

        if (!$this->_db->query())
        {
            $e = new JException(JText::sprintf('JLIB_DATABASE_ERROR_STORE_FAILED_UPDATE_ASSET_ID', $this->_db->getErrorMsg()));
            $this->setError($e);

            return false;
        }

    }

当然,正如上面提到的cppl,您必须在组件的项目表单中实现ACL规则,并在保存之前对其进行绑定。

我强烈建议您阅读cppl重定向到您的文档。