2016-03-31 5 views
1

多分私の質問はちょっと奇妙に聞こえるかもしれません。ここに詳細があります:TYPO3のインラインフィールドのようにTCAマルチセレクトを処理するにはどうしたらいいですか?

"Position"と "Step"という2つのクラスを作成しました。さらに、すべてのステップにポジションを含めることができます。私のテーブルと関連するフィールドは以下のようになります。

CREATE TABLE tx_foxexample_domain_model_step (
    ... 
    positions int(11) unsigned DEFAULT '0' NOT NULL, 
    ... 
); 

CREATE TABLE tx_foxexample_domain_model_position (
    ... 
    step int(11) unsigned DEFAULT '0' NOT NULL, 
    ... 
); 

私はそれが通常の1だと思う:nの関係、各ステップは、n-位置を保存することができ、すべての位置は一段階の一部である可能性があるため。

私のクラスと関連するプロパティは、以下のようになります。

class Step extends AbstractEntity 
{ 
    ... 
    /** 
    * Positions 
    * 
    * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Fox\FoxExample\Domain\Model\Position> 
    * @cascade remove 
    */ 
    protected $positions = null; 
    ... 
} 

class Position extends AbstractEntity 
{ 
    ... 
    /** 
    * Stores the relation to step 
    * 
    * @var \Fox\FoxExample\Domain\Model\Step 
    */ 
    protected $step = null; 
    ... 
} 

ステップ店オブジェクトの保存性のn位置と位置がちょうどステップのプロパティに関連するステップを格納します。

は、これまでのところ、私は、インラインフィールド経由で直接インラインステップの位置またはいくつかの位置を作成している、私のステップのためのTCAは、次のようなものだった:

... 
'positions' => array(
    'exclude' => 1, 
    'label' => '...', 
    'config' => array(
     'type' => 'inline', 
     'foreign_table' => 'tx_foxexample_domain_model_position', 
     'foreign_field' => 'step', 
     'maxitems' => 50, 
     'appearance' => array(
      'collapseAll' => 1, 
      'levelLinksPosition' => 'top', 
      'showSynchronizationLink' => 1, 
      'showPossibleLocalizationRecords' => 1, 
      'showAllLocalizationLink' => 1 
     ), 
    ), 
), 
... 

ので、位置やステップの関係が正しく保存されました何らかの理由で私は多くの変更があり、位置が既に存在し、ユーザが必要な位置を選択しなければならないため、ステップ内の位置を作成する必要はもうありません。ユーザが各ステップに関連する位置を選択することができます変更しますが、私は、データベースのテーブルを見てみるならば、私はそのステップのフィールドを見ることができます。これにより

'positions' => array(
    'exclude' => 1, 
    'label' => '...', 
    'config' => array(
     'type' => 'select', 
     'foreign_table' => 'tx_foxexample_domain_model_position', 
     'foreign_table_where' => 'ORDER BY title ASC', 
     'minitems' => 0, 
     'maxitems' => 50, 
    ), 
), 

:だから私は、マルチ選択フィールドに、インラインタイプを変更しました私のポジションテーブルは常に0で、ステップテーブルのポジションフィールドは現在ポジションuidを保持しています。

私はマルチ選択フィールドに 'foreign_field'を定義することができないので、私はいくつかの問題にぶつかるので、ポジションテーブルとの関係はなくなりました。さらに、1つの位置だけが保存されるため、1つの位置だけを追加できます。これは、1つのuidだけが保存されるため、選択された他の位置は無視されます。保存した後 enter image description here

:保存する前に

要するに enter image description here

私は、マルチ選択フィールドのインラインフィールドの動作を維持したいです。複数選択フィールドのインラインフィールド動作を維持するにはどうすればよいですか?

答えて

0

ステップには複数の位置があり、複数のステップで位置を割り当てることができるため、おそらくMMテーブルが必要です。私はテーブルtx_foxexample_step_position_mmを導入することをお勧めしたい:

CREATE TABLE tx_foxexample_step_position_mm (
    uid_local int(11) DEFAULT '0' NOT NULL, 
    uid_foreign int(11) DEFAULT '0' NOT NULL, 
    sorting int(11) DEFAULT '0' NOT NULL, 

    KEY uid_local (uid_local), 
    KEY uid_foreign (uid_foreign) 
); 

あなたはそれを使用するようにTCAを教えて(残りは同じまま):

'positions' => array(
    'config' => array(
     'MM' => 'tx_foxexample_step_position_mm' 
    ), 
), 

は今、あなたは新しい構造に既存のデータを移行する必要があります。私は現在のリレーションでMMテーブルに値を設定するCommandControllerを書くことをお勧めします。

+0

ありがとう、私はできるだけ早くそれをテストします。 – Fox

+0

これはmmテーブルで動作しますが、位置が複数のステップで使用されることを避ける方法はありますか?私はポジションが別のステップで再利用されることを望んでいないからです。私は、 "AND step = 0 ORDER BY title ASC"のように 'foreign_table_where'を拡張することができると考えましたが、このフィールドは常にゼロです。 – Fox

+0

だから私はmultiselectフィールドとの1:n関係がこれは不可能ですか? – Fox

関連する問題