2017-10-24 9 views
1

私はTYPO3バックエンドにレコードを追加したいと思います。そのために私は4つの異なるクラスを含むエクステンションを作った。ある特定のクラスのレコードをバックエンド経由でフォルダに追加する際に、別のクラスの列の項目から選択できるselectが必要です。 TYPO3 foreign_table:選択ドロップダウンメニューに特定の列を指定するにはどうすればよいですか?

'kundeuid' => array(
        'exclude' => 1, 
        'label' => 'LLL:EXT:icingaconfgen/Resources/Private/Language/locallang_db.xlf:tx_icingaconfgen_domain_model_appliance.kundeuid', 
        'config' => array(
            'type' => 'select', 
            'renderType' => 'selectSingle', 
            'foreign_table' => 'tx_icingaconfgen_domain_model_kunde', 
            'foreign_table_where' => 'ORDER BY tx_icingaconfgen_domain_model_kunde.kundeuid asc', 
            'items' => array(
                array('-- Select Kunde --', 0), 
            ), 
            'size' => 1, 
            'maxitems' => 1 
        ), 
      ), 

しかし、問題は、私は選択が決定した列のプロパティのみを含めるように指定することはできませんです。私は、このコードでは、このようなため foreign_tableを使用する必要があります知っています。代わりに、選択ドロップダウンメニューは最初の列のプロパティを使用しているようです。どのようにして 'kundeuid'プロパティの列を指定できますか?

編集:TCAフォルダー内の特定のPHPファイルでコードが使用されています。

+0

選択項目またはその値のラベルフィールドを外部レコードの「uid」以外の値に変更したいですか? –

+0

私はより具体的にしようとしています:クラス 'Kunde'は、プロパティ 'kundeuid'を持っています。同じプロパティ(基本的には外部キー)を持つバックエンドに 'Appliance'クラスのレコードを追加する際、このプロパティは、既存のすべてのオブジェクト/オブジェクトの 'kundeuid'値を含むselectドロップダウンによって設定する必要があります。クラス「クンデ」の記録。私はこれを行うには、特定のTCAのforeign_tableをクラス「アプライアンス」に使用します。上記のコードは 'Kunde'レコードのプロパティを読み込むこともありますが、間違った列/プロパティを使用するようです... – Mondblut

+0

'Kunde'レコードはTYPO3のプロパティ 'uid'を持っていますが、 "kundeuid"保存するには?私はクンデオブジェクトに基づいて選択からそのkundeuidを設定したいアプライアンスを追加した場合 –

答えて

0

あなたが選択ボックスのコンテンツを提供するPHPのメソッドを実装する場合は、あなたが好きで選択を埋めることができ、別のテーブル

のフィールド値からの選択を作成します。このためには、itemsProcFuncを使用する必要があります。

は、次のようになります。あなたの方法では

'kundeuid' => [ 
    'config' => [ 
     'type' => 'select', 
     'renderType' => 'selectSingle', 
     'itemsProcFunc' => 'Vendor\Ext\ItemsProcFunc\KundeUid->fetchItems', 
    ], 
] 

をあなたは、あなたのクンデテーブルから値を持つitems配列(データベースの中で自分自身を見て)埋めることができますことを

/** 
* Add two items to existing ones 
* 
* @param $params 
*/ 
public function fetchItems(&$params) 
{ 
    $params['items'][] = ['customer01 (label)', 'customer01']; 
    $params['items'][] = ['customer02 (label)', 'customer02']; 
} 

注意を$paramsは参照渡しであり、メソッドは何も返す必要はありません。また、TCAの設定で書き込むものはitemsにもあります。どのオプションを選択しても、そのオプションの値はyourdatabaseフィールドに格納されます。あなたは、あなたは常にあなたがない限り、あなたは(あなたのフィールドで選択したレコードのUIDを格納していることを意味WICH、外部テーブルとの関係を作成するあなたのTCA confの中'foreign_table'を使用する場合は関係

を作成

MMテーブルを使用して)。

TYPO3では、すべての記録はuidであり、データベースにはauto_incrementであり、したがって各テーブルで一意です。以下TCA構成

'kundeuid' => [ 
    'config' => [ 
     'type' => 'select', 
     'renderType' => 'selectSingle', 
     'foreign_table' => 'tx_icingaconfgen_domain_model_kunde', 
    ], 
] 

は、あなたが選択ボックスで、あなたのkundeレコードを選択し、フィールドkundeuidでそのuidを保存できるようになります。したがって

$appliance = $this->applianceRepository->findBySomething('something'); 
$kunde = $appliance->getKundeuid(); 
$kundeuid = $kunde->getKundeuid(); 

:あなたは、プロパティマッパー解決PHPコードでこの依存関係を聞かせて(あるいはあなたがリポジトリとドメインモデルを使用している場合extbaseは、あなたのためにそれをやらせる)であれば、あなたはこのようなものになってしまいますフィールドの名前を変更し、TCAの設定がclientのようになっていることをお勧めします。これにより、PHPコードが少し混乱するようになります。あなたはTCAでKundeレコードにctrlセクションでKundeの名前テーブルのフィールドにプロパティlabelを設定します

$appliance = $this->applianceRepository->findBySomething('something'); 
$client = $appliance->getClient(); 
$kundeuid = $client->getKundeuid(); 

+0

勘違いがあります:Kundeクラスのレコードを作成しているときに、値 'customer01'などで 'kundeuid'を設定するとします。次に、私はクラス 'アプライアンス'のレコードを作成します。それはまたkundeuidという名前のプロパティを持っています。クラスKundeのすべてのレコードから 'kundeuid'でいっぱいになるselectを使って設定したいのです。この選択の1つの選択肢は、私が作成したKundeの記録から 'customer01'です。私はそれを選択し、作成されたアプライアンスレコードのプロパティ 'kundeuid'も 'customer01'でなければなりません... これは私がしたいことです。 – Mondblut

+0

さて、itemsProcFuncに行くと、私は答えにそれを加えました – Daniel

+0

ありがとう、それは多くの助けになります。 – Mondblut

0

あなたはApplianceでも、それを見る必要があります。たぶん他のプロパティlabel_ *あなたに役立つでしょう。 ctrlドキュメントへのリンク:TCA reference

+0

ありがとうございました...私はこれをまだ見ていませんでした...私は今それをチェックしています。 – Mondblut

+0

おそらく私の側にミスがあるようです。別のユーザーが私にこの質問をしました: "選択項目またはその値のラベルフィールドを外部レコードの" uid "以外の値に変更したいだけですか? これはまさに私がやりたいことです。kundeuidの値を外国のレコードの "uid"以外の値に割り当てたいと思います。それは可能ですか? – Mondblut

+0

ここには2つのオプションがあると思います。データマップのフックの1つを使用して異なる値を保存するか、カスタムアイテムリストを 'itemsProcFunc'(TCA選択タイプのドキュメント)でレンダリングしてください –

関連する問題