現在、ACL サポートを含めるようにコンポーネントを変更しています。#_assets
作成されたすべてのカテゴリ/アイテムに対して正しい行を作成したいと思います。lft
階層を尊重し、rght
値を再計算するための正しい手順は何ですか?
例:
コンポーネント
- カテゴリ (lft:0 rght:1)
- アイテム (左:2 右:3)
- カテゴリ (左:4 右:5)
- アイテム (左:6 右:7)
- 新品 (lft:? rght:?)
- カテゴリ (左:8、右:9)
通常、チュートリアルに示されているように ACL サポートを追加し、各項目が保存されると ACL が更新されるように、#_assets
通常は直接書き込みません。
コンポーネントに ACL ルールを追加する方法については、この記事もお読みください。
最後に、既存のレコードを処理して ACL を追加することについて話している場合、最も一般的なアプローチは、更新されたモデル (ACL をサポートするようになった) を使用して各レコードを処理し、それらを再保存することです。これにより、#_assets
テーブルを更新するだけでなく、ACL が適切に適用されます。
コンポーネントのアイテムをアセット テーブルに追加する場合:
次のように、セクション コンポーネント、カテゴリ、アイテムを含むファイル 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>**
....
ここでは、セクション アイテムをコンポーネントのアイテム (記事、バナー、ウェブリンクなど) と呼びます。
コンポーネント アイテム テーブルには、列 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->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 で更新します。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 のように、ACL ルールをコンポーネントのアイテム フォームに実装し、保存する前にこれらをバインドしておく必要があります。
cppl がリダイレクトするドキュメントを読むことを強くお勧めします。