我目前正在修改组件以包含ACL支持。
我想为每个创建的类别/项创建正确的#_assets
行。
尊重层次结构并重新计算lft
和rght
值的正确程序是什么?
例:
成分
答案 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重定向到您的文档。