0

私は現在、複雑なマルチレベル分類システムを行っています。

簡単にするために、理論的な例を提供して、私が達成しようとしていることを説明します。

グループテーブルがあります:

group id| group name
   1    |     A
   2    |     B
   3    |     C

そして私はサブグループテーブルを持っています:

subgroup id| group id| sub-group name
    1      |    1    | A-aaaa
    2      |    1    | A-bbbb
    3      |    1    | A-cccc
    4      |    2    | B-111111
    5      |    2    | B-222222
    6      |    3    | C-ONE
    7      |    3    | C-TWO

そして、これら2つのテーブルを参照として使用するモデルがあります:

class Model_ItemGrouping extends Model_Table {
   public $entity_code = 'items';

   function init() {
      parent::init();

      $this->addField('itemname')->caption('Item Description');

      $this->addField('group_id')->caption('Group Name')
         ->refModel('Model_Groups')->displayField('groupname');

      $this->addField('subgroup_id')->caption('Sub Group Name')
         ->refModel('Model_SubGroups')->displayField('subgroupname');
   }
}

ここで、このモデルを次のようにコードのフォームに適用します。

$form = $this->add('MVCForm');
$form->addSubmit();

$model=$form->setModel('ItemGrouping');

if($model->isInstanceLoaded())
   $form->getModel()->loadData(55); // force it to load item id #55

このフォームが読み込まれて表示されると、ユーザーはアイテムの別のグループや別のサブグループを編集して選択できるようになります。

しかし、私がやりたいのは、アイテムの現在の状態に応じてドロップダウンリストから選択できるオプションのセットを制限することです.

アイテム ID #55 が現在グループ 3 に属している場合、グループはグループ 3 にロックされ、サブグループ ドロップダウン リストにはグループ 3 のサブグループのみが含まれ、リスト全体は含まれません。

さて、より精巧で具体的な質問は次のとおりです。

アイテムの状態に基づいて、2 つの参照モデルを動的にロックする方法はありますか。

Model_Groupsフィールドによる参照group_id

Model_SubGroupsフィールドによる参照subgroup_id

フロントエンド JavaScript ではなく、フォームの$modelインスタンスとそれに対応するPHPaddConditionのメソッドを使用して、選択されたアイテムの特定のセットのみに?

私はこのようなものを想像します(私の以前のスニペットを変更します):

$form = $this->add('MVCForm');
$form->addSubmit();

$model=$form->setModel('ItemGrouping');

if($model->isInstanceLoaded()) {
   $form->getModel()->loadData(55); // force it to load item id #55

   // if item is of group #2, force references to show options for group #2
   $model->getFieldRefModel('group_id')->addCondition('id=',2);
   $model->getFieldRefModel('subgroup_id')->addCondition('group_id=',2);
}

注: はgetFieldRefModel存在せず、これはもちろん、静的な値を使用して概要を提供するためだけに簡略化されていますが、実際に設定する前に、項目 ID 番号を動的に渡し、項目の現在のグループ化状態を最初に調べる必要もあります。フィルター条件。

4

1 に答える 1

2

私があなたの要件を正しく理解していれば、代わりに

$model->getFieldRefModel('group_id')->addCondition('id=',2);
$model->getFieldRefModel('subgroup_id')->addCondition('group_id=',2);

あなたは書ける

$model->ref('group_id')->addCondition('id',2);
$model->ref('subgroup_id')->addCondition('group_id',2);

それはあなたが使っていないと思う最新のATK4バージョンです:(

実際、これらの条件は裏で自動的に追加されるので、簡単に記述できます。

$model->ref('group_id');
$model->ref('subgroup_id');

これらのフィールドを定義するには、Models init メソッドで hasOne、hasMany を使用することを忘れないでください。現在、これらのフィールドは「関係」ではないため、hasOne/hasMany でフィールドを定義していない場合、ref() は機能しません。

また、データ構造に欠陥があると思います。Item と SubGroup の間にどのような関係がありますか (1:n または n:1)?

于 2013-04-15T23:32:04.930 に答える