3

現在、ACL サポートを含めるようにコンポーネントを変更しています。#_assets作成されたすべてのカテゴリ/アイテムに対して正しい行を作成したいと思います。lft階層を尊重し、rght値を再計算するための正しい手順は何ですか?

例:
コンポーネント

  • カテゴリ (lft:0 rght:1)
    • アイテム (左:2 右:3)
  • カテゴリ (左:4 右:5)
    • アイテム (左:6 右:7)
    • 新品 (lft:? rght:?)
  • カテゴリ (左:8、右:9)
4

2 に答える 2

2

通常、チュートリアルに示されているように ACL サポートを追加し、各項目が保存されると ACL が更新されるように、#_assets通常は直接書き込みません。

コンポーネントに ACL ルールを追加する方法については、この記事もお読みください。

最後に、既存のレコードを処理して ACL を追加することについて話している場合、最も一般的なアプローチは、更新されたモデル (ACL をサポートするようになった) を使用して各レコードを処理し、それらを再保存することです。これにより、#_assetsテーブルを更新するだけでなく、ACL が適切に適用されます。

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

....

ここでは、セクション アイテムをコンポーネントのアイテム (記事、バナー、ウェブリンクなど) と呼びます。

コンポーネント アイテム テーブルには、列 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 がリダイレクトするドキュメントを読むことを強くお勧めします。

于 2013-03-13T04:09:33.963 に答える