3

我目前正在修改一个组件以包含 ACL 支持。我想为创建的#_assets每个类别/项目创建正确的行。lft尊重等级、重新计算和rght价值观的正确程序是什么?

示例:
组件

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

2 回答 2

2

通常,您不会直接写入,#_assets通常会添加 ACL 支持,如教程中所示,然后在保存每个项目时更新 acl。

您可能还想阅读这篇文章,了解如何将 ACL 规则添加到您的组件中。

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

于 2012-09-10T21:55:06.180 回答
1

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

我假设您已经添加了带有部分组件、类别和项目的文件 access.xml,如下所示:

……

**<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>**

……

这里我将section item称为组件的item(即一篇文章、一个banner、一个weblink等)

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

Jtable class

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

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

JTable->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->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,你必须在你的组件的item表单中实现了ACL规则,并且在保存之前绑定了这些规则。

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

于 2013-03-13T04:09:33.963 回答