it-swarm.dev

カスタムコンポーネントでコンテンツの「ロック」はどのように処理されますか?

デフォルトのコアのcom_contentには、特定の記事がユーザーによって編集されているときに「ロック」される組み込みシステムがあり、他のユーザーが同時にそれを編集することはできません。ユーザーがウィンドウを閉じるか、記事を適切に閉じずにセッションを期限切れにした場合(「保存」または「キャンセル」をクリックするなど)、そのコンテンツは「チェック」され、その横のバックエンドにロックアイコンが表示されます。スーパー管理者がロックを解除する必要があります。

私の質問は:独自のコンテンツテーブルを持つカスタムコンポーネントにどのように追加されますか?私が見つけた限りでは、JTableを使用してそのコンテンツを操作している限り、それはそのクラスのメソッドの組み込み機能として提供されているように見えます...そうですか?または、JTableContentなどの他のものを使用する必要がありますか?コンテンツ(特定の列)を格納するために使用されるテーブルに何かを追加する必要がありますか?

7
Isidro Baquero

あなたは正しいですが、Joomlaの方法に従っていて、ビューコントローラのベースとしてJTableを使用している場合は、JControllerFormに下る必要はありません。

class MycomponentControllerMycontent extends JControllerForm {}

コンポーネントモデルのベースとしてJModelAdminを使用します。

class MycomponentModelMycontent extends JModelAdmin {}

JControllerFormを拡張すると、モデルとテーブルを設定する組み込みのedit()メソッドが提供され、問題のレコードへのアクセスと、テーブルがチェックアウトをサポートしているかどうかがチェックされます(列checked_outが存在すること)。存在する場合、モデルを介してレコードをcheckout()しようとします。

JModelAdminを拡張することで、getItem()checkIn()checkOut()メソッドを継承します。前述のように、モデルはcheckout()を呼び出し、JModelForm)を継承します。テーブルのchecked_out列にもchecked_out_timeという名前の列があります。

この時点で、これらの列のいずれかが存在しない場合、2つのことが起こります。JModelFormはそれを偽装し、trueを返します(ジョブが完了したことを示します)。それ以外の場合は、現在のユーザーを取得してから、最初にチェックアウトを試み、別のユーザーに既にチェックアウトされているかどうかを確認します。この時点で、最終的にcheckOut()JTable実装を呼び出した場合(J3では通常必要とされない独自のテーブル定義でオーバーライドしていない場合)。

JTableはまったく同じ列チェックを実行し、すべてが正常である(つまり、有効なIDを持っている)場合、編集中のレコードの列checked_outおよびchecked_out_timeを更新します。

補足として、アイテムをedit()すると、getItem()が呼び出され、JTableを介してレコードをロードします(つまり、getTable()の後にload($pk)(この時点で、JTableonBeforeLoadおよびonAfterLoadイベントもトリガーします。 is nice)

レコードはJModelAdminのバージョンに返され、ベースのstdClassオブジェクトに変換されます(以前はJObjectでした)。レコード(現在のオブジェクト)にparams列/属性が含まれている場合は、簡単にアクセスできるようにそれをJRegistryオブジェクトに変換します。

したがって、Joomlaの方法を使用すると、多くの便利なものが無料で手に入ります。 :)

3
Craig

あなたの仮定は正しいです。実行しようとしていることを実行するには、関連するロジックを設定したテーブルが必要です。

私はJoomla 3+を学習しているので、 Component Creator を使用して、単一のテーブルと、学習したいJoomla機能だけで非常にシンプルなコンポーネントを作成しています。生成されたコードは非常に優れており、インストールされている通常のコンポーネントのすべての複雑さなしに簡単に追跡できます。

2
GDP