2014-11-04 62 views
3

我使用包含1:1和1:n關係的extbase擴展生成器的「擴展」擴展。它自動將字段類型設置爲'inline',並在後端顯示一個不錯的IRRE UI。TYPO3 extbase&IRRE:使用'foreign_selector'添加現有記錄

但是默認情況下,沒有辦法選擇現有記錄,只需創建新記錄。

enter image description here

我發現如何與「foreign_selector」來實現這一各種各樣的解釋,但他們都非常粗略。該功能本身應該工作,請參見https://forge.typo3.org/issues/43239

有人可以通過這個步驟或指向TER中的工作示例嗎?一旦我開始工作,我可以從示例中創建一個循序漸進的教程。

PS字段的由extension_builder產生TCA配置:

'myfield' => array(
    'exclude' => 1, 
    'label' => 'LLL:EXT:myextension/Resources/Private/Language/locallang_db.xlf:tx_myextension_domain_model_myitem.myfield', 
    'config' => array(
     'type' => 'inline', 
     'foreign_table' => 'tx_myextension_domain_model_myfield', 
     'foreign_field' => 'myitem', 
     'maxitems'  => 9999, 
     'appearance' => array(
      'collapseAll' => 0, 
      'levelLinksPosition' => 'top', 
      'showSynchronizationLink' => 1, 
      'showPossibleLocalizationRecords' => 1, 
      'showAllLocalizationLink' => 1 
     ), 
    ), 
), 
+0

請分享您當前的尊重領域的配置。我假設你認爲你認爲http://docs.typo3.org/typo3cms/TCAReference/Reference/Columns/Inline/Index.html#columns-inline-properties-foreign-selector – lorenz 2014-11-04 19:06:33

+0

:-) – Urs 2014-11-04 20:36:05

回答

7

的主要問題是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。

+0

真棒,洛倫茲,謝謝你非常,非常非常詳細的解釋和演示!我安裝了它,它開箱即用 – Urs 2014-11-05 09:21:28

+0

@lorenz我得到了第一個真正的答案...在typo3 v7中有什麼改變,現在它不再工作,但給出了一個錯誤500內部服務器錯誤 – webMan 2016-12-16 13:25:11

+0

@webMan有點晚了,但我修復了當前TYPO3版本的擴展。 – lorenz 2017-04-26 16:42:51