我目前正在修改一个组件以包含 ACL 支持。我想为创建的#_assets
每个类别/项目创建正确的行。lft
尊重等级、重新计算和rght
价值观的正确程序是什么?
示例:
组件
- 类别 (lft:0 右:1)
- 项目 (lft:2 右:3)
- 类别 (lft:4 右:5)
- 项目 (lft:6 右:7)
- 新项目 (lft:? rght:?)
- 类别 (lft:8 右:9)
通常,您不会直接写入,#_assets
通常会添加 ACL 支持,如教程中所示,然后在保存每个项目时更新 acl。
您可能还想阅读这篇文章,了解如何将 ACL 规则添加到您的组件中。
最后,如果您正在谈论处理现有记录以添加 ACL,那么最常见的方法是使用更新的模型(现在具有 ACL 支持)处理每条记录以重新保存它们。这将导致正确应用 ACL,而不仅仅是更新#_assets
表。
如果要将组件的项目添加到资产表中:
我假设您已经添加了带有部分组件、类别和项目的文件 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 将您重定向到的文档。