的主要問題是1型的IRRE關係:N功是這樣的:一個孩子記錄持有其母公司的UID。所以你的表tx_myext_domain_model_city保存你的(虛構)tx_myext_domain_model_address的UID。
因此,使用默認配置,您將無法多次選擇一個城市,因爲它只能有一個父母。
因此,您需要爲該字段使用關係表。此表需要包含一個UID場兩個地址(uid_address)和城市(uid_city):
CREATE TABLE tx_irreforeignselectordemo_address_city_mm (
uid int(11) NOT NULL auto_increment,
pid int(11) DEFAULT '0' NOT NULL,
uid_address int(11) unsigned DEFAULT '0' NOT NULL,
uid_city int(11) unsigned DEFAULT '0' NOT NULL,
sorting int(11) unsigned DEFAULT '0' NOT NULL,
PRIMARY KEY (uid),
KEY parent (pid)
);
,它需要對這些字段TCA配置(而表本身可以被隱藏):
return array(
'ctrl' => array(
'title' => 'Relation table',
'hideTable' => TRUE,
'sortby' => 'sorting',
),
'columns' => array(
'uid_address' => Array(
'label' => 'Address',
'config' => Array(
'type' => 'select',
'foreign_table' => 'tx_irreforeignselectordemo_domain_model_address',
'size' => 1,
'minitems' => 0,
'maxitems' => 1,
),
),
'uid_city' => Array(
'label' => 'City',
'config' => Array(
'type' => 'select',
'foreign_table' => 'tx_irreforeignselectordemo_domain_model_city',
'foreign_table_where' => ' AND sys_language_uid IN (0,-1)',
'size' => 1,
'minitems' => 0,
'maxitems' => 1,
),
),
),
'types' => array(
'0' => array('showitem' => 'uid_address,uid_city')
),
'palettes' => array()
);
然後你可以配置你的地址的TCA使它成爲IRRE場:
'type' => 'inline',
'foreign_table' => 'tx_yourext_address_city_mm',
'foreign_field' => 'uid_address',
'foreign_label' => 'uid_city',
'foreign_selector' => 'uid_city',
'foreign_unique' => 'uid_city',
'foreign_sortby' => 'sorting',
注意foreign_unique
告訴TYPO3,一個城市只能選擇一次。
而且你需要定義從對方的關係(從你的城市TCA):
'addresses' => array(
'exclude' => 1,
'label' => 'Addresses',
'config' => array(
'type' => 'inline',
'foreign_table' => 'tx_irreforeignselectordemo_address_city_mm',
'foreign_field' => 'uid_city',
'foreign_label' => 'uid_address',
),
),
一旦配置完成後,您將能夠在後端使用此。
由於這是一個非標準的MM關係,因此默認情況下Extbase將無法處理它。但是,我們可以比較這到在TYPO3 6於是引入我們必須建立一個Extbase模型與性能的「地址」和「城市」和地圖這個模型我們毫米表CityRelation的sys_file_reference表:
config.tx_extbase.persistence.classes {
Visol\Irreforeignselectordemo\Domain\Model\CityRelation {
mapping {
tableName = tx_irreforeignselectordemo_address_city_mm
columns {
uid_address.mapOnProperty = address
uid_city.mapOnProperty = city
}
}
}
}
現在,在我們的地址模型中,我們定義了城市(或城市 - 您允許多個選擇)類型CityRelation的ObjectStorage:
/**
* Cities
*
* @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Visol\Irreforeignselectordemo\Domain\Model\CityRelation>
*/
protected $cities = NULL;
我們現在有一個包含所有引用的屬性「城市」選定的城市。你可以遍歷它們,並使用它們:
<f:for each="{address.cities}" as="cityRelation">
<li>{cityRelation.city.name}</li>
</f:for>
因爲我無法找到這所有功能於一身的演示,併爲感興趣的話題,我創建了一個演示擴展,它做什麼,我剛纔所描述的 - 基於核心和兩個處理該主題的擴展:https://github.com/lorenzulrich/irreforeignselectordemo
無論如何,解決方案是一個m:而不是「城市」。雖然這可能對選擇城市沒有意義(正如您的文章所建議的那樣),但這對其他機會也許是有意義的。隨意用「城市」替換「城市」,並將內聯配置中的maxItems設置爲1 - 那麼你有1:n。
請分享您當前的尊重領域的配置。我假設你認爲你認爲http://docs.typo3.org/typo3cms/TCAReference/Reference/Columns/Inline/Index.html#columns-inline-properties-foreign-selector – lorenz 2014-11-04 19:06:33
:-) – Urs 2014-11-04 20:36:05