mirror of https://github.com/FriendsOfTYPO3/tea.git synced 2024-12-22 13:06:11 +01:00

[FEATURE] Add a TeaType model and a relation to it.

This commit is contained in:
Oliver Klee 2013-11-01 20:51:53 +01:00
parent c51c06715d
commit c74c26029a
15 changed files with 467 additions and 21 deletions

View file

@ -32,15 +32,17 @@ namespace OliverKlee\Tea\Domain\Model;
*/
class TeaBeverage extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity {
/**
* size
*
* @var \float
*/
protected $size = 0.0;
/**
* Returns the size
*
* @var \OliverKlee\Tea\Domain\Model\TeaType
* @lazy
*/
protected $type = NULL;
/**
* @return \float $size
*/
public function getSize() {
@ -48,13 +50,28 @@ class TeaBeverage extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity {
}
/**
* Sets the size
*
* @param \float $size
*
* @return void
*/
public function setSize($size) {
$this->size = $size;
}
/**
* @return \OliverKlee\Tea\Domain\Model\TeaType $type
*/
public function getType() {
return $this->type;
}
/**
* @param \OliverKlee\Tea\Domain\Model\TeaType $type
*
* @return void
*/
public function setType(\OliverKlee\Tea\Domain\Model\TeaType $type) {
$this->type = $type;
}
}
?>

View file

@ -0,0 +1,84 @@
<?php
namespace OliverKlee\Tea\Domain\Model;
/***************************************************************
* Copyright notice
*
* (c) 2013 Oliver Klee <typo3-coding@oliverklee.de>, oliverklee.de
*
* All rights reserved
*
* This script is part of the TYPO3 project. The TYPO3 project is
* free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* The GNU General Public License can be found at
* http://www.gnu.org/copyleft/gpl.html.
*
* This script is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* This copyright notice MUST APPEAR in all copies of the script!
***************************************************************/
/**
* This model represents a tea type like "Earl Grey", "Gunpowder" or "Chamomile".
*
* @author Oliver Klee <typo3-coding@oliverklee.de>
*/
class TeaType extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity {
/**
* @var \string
* @validate NotEmpty
*/
protected $title = '';
/**
* @var boolean
*/
protected $caffeinated = FALSE;
/**
* @return \string $title
*/
public function getTitle() {
return $this->title;
}
/**
* @param \string $title
*
* @return void
*/
public function setTitle($title) {
$this->title = $title;
}
/**
* @return boolean $caffeinated
*/
public function getCaffeinated() {
return $this->caffeinated;
}
/**
* @param boolean $caffeinated
*
* @return void
*/
public function setCaffeinated($caffeinated) {
$this->caffeinated = $caffeinated;
}
/**
* @return boolean
*/
public function isCaffeinated() {
return $this->getCaffeinated();
}
}
?>

View file

@ -6,16 +6,15 @@ if (!defined ('TYPO3_MODE')) {
$TCA['tx_tea_domain_model_teabeverage'] = array(
'ctrl' => $TCA['tx_tea_domain_model_teabeverage']['ctrl'],
'interface' => array(
'showRecordFieldList' => 'sys_language_uid, l10n_parent, l10n_diffsource, hidden, size',
'showRecordFieldList' => 'sys_language_uid, l10n_parent, l10n_diffsource, hidden, size, type',
),
'types' => array(
'1' => array('showitem' => 'sys_language_uid;;;;1-1-1, l10n_parent, l10n_diffsource, hidden;;1, size,--div--;LLL:EXT:cms/locallang_ttc.xlf:tabs.access,starttime, endtime'),
'1' => array('showitem' => 'sys_language_uid;;;;1-1-1, l10n_parent, l10n_diffsource, hidden;;1, size, type,--div--;LLL:EXT:cms/locallang_ttc.xlf:tabs.access,starttime, endtime'),
),
'palettes' => array(
'1' => array('showitem' => ''),
),
'columns' => array(
'sys_language_uid' => array(
'exclude' => 1,
'label' => 'LLL:EXT:lang/locallang_general.xlf:LGL.language',
@ -47,7 +46,6 @@ $TCA['tx_tea_domain_model_teabeverage'] = array(
'type' => 'passthrough',
),
),
't3ver_label' => array(
'label' => 'LLL:EXT:lang/locallang_general.xlf:LGL.versionLabel',
'config' => array(
@ -56,7 +54,6 @@ $TCA['tx_tea_domain_model_teabeverage'] = array(
'max' => 255,
)
),
'hidden' => array(
'exclude' => 1,
'label' => 'LLL:EXT:lang/locallang_general.xlf:LGL.hidden',
@ -105,6 +102,16 @@ $TCA['tx_tea_domain_model_teabeverage'] = array(
'eval' => 'double2',
),
),
'type' => array(
'exclude' => 0,
'label' => 'LLL:EXT:tea/Resources/Private/Language/locallang_db.xlf:tx_tea_domain_model_teabeverage.type',
'config' => array(
'type' => 'select',
'foreign_table' => 'tx_tea_domain_model_teatype',
'minitems' => 0,
'maxitems' => 1,
),
),
),
);
?>

View file

@ -0,0 +1,115 @@
<?php
if (!defined ('TYPO3_MODE')) {
die ('Access denied.');
}
$TCA['tx_tea_domain_model_teatype'] = array(
'ctrl' => $TCA['tx_tea_domain_model_teatype']['ctrl'],
'interface' => array(
'showRecordFieldList' => 'sys_language_uid, l10n_parent, l10n_diffsource, hidden, title, caffeinated',
),
'types' => array(
'1' => array('showitem' => 'sys_language_uid;;;;1-1-1, l10n_parent, l10n_diffsource, hidden;;1, title, caffeinated,--div--;LLL:EXT:cms/locallang_ttc.xlf:tabs.access,starttime, endtime'),
),
'palettes' => array(
'1' => array('showitem' => ''),
),
'columns' => array(
'sys_language_uid' => array(
'exclude' => 1,
'label' => 'LLL:EXT:lang/locallang_general.xlf:LGL.language',
'config' => array(
'type' => 'select',
'foreign_table' => 'sys_language',
'foreign_table_where' => 'ORDER BY sys_language.title',
'items' => array(
array('LLL:EXT:lang/locallang_general.xlf:LGL.allLanguages', -1),
array('LLL:EXT:lang/locallang_general.xlf:LGL.default_value', 0),
),
),
),
'l10n_parent' => array(
'displayCond' => 'FIELD:sys_language_uid:>:0',
'exclude' => 1,
'label' => 'LLL:EXT:lang/locallang_general.xlf:LGL.l18n_parent',
'config' => array(
'type' => 'select',
'items' => array(
array('', 0),
),
'foreign_table' => 'tx_tea_domain_model_teatype',
'foreign_table_where' => 'AND tx_tea_domain_model_teatype.pid=###CURRENT_PID### AND tx_tea_domain_model_teatype.sys_language_uid IN (-1,0)',
),
),
'l10n_diffsource' => array(
'config' => array(
'type' => 'passthrough',
),
),
't3ver_label' => array(
'label' => 'LLL:EXT:lang/locallang_general.xlf:LGL.versionLabel',
'config' => array(
'type' => 'input',
'size' => 30,
'max' => 255,
)
),
'hidden' => array(
'exclude' => 1,
'label' => 'LLL:EXT:lang/locallang_general.xlf:LGL.hidden',
'config' => array(
'type' => 'check',
),
),
'starttime' => array(
'exclude' => 1,
'l10n_mode' => 'mergeIfNotBlank',
'label' => 'LLL:EXT:lang/locallang_general.xlf:LGL.starttime',
'config' => array(
'type' => 'input',
'size' => 13,
'max' => 20,
'eval' => 'datetime',
'checkbox' => 0,
'default' => 0,
'range' => array(
'lower' => mktime(0, 0, 0, date('m'), date('d'), date('Y')),
),
),
),
'endtime' => array(
'exclude' => 1,
'l10n_mode' => 'mergeIfNotBlank',
'label' => 'LLL:EXT:lang/locallang_general.xlf:LGL.endtime',
'config' => array(
'type' => 'input',
'size' => 13,
'max' => 20,
'eval' => 'datetime',
'checkbox' => 0,
'default' => 0,
'range' => array(
'lower' => mktime(0, 0, 0, date('m'), date('d'), date('Y')),
),
),
),
'title' => array(
'exclude' => 0,
'label' => 'LLL:EXT:tea/Resources/Private/Language/locallang_db.xlf:tx_tea_domain_model_teatype.title',
'config' => array(
'type' => 'input',
'size' => 30,
'eval' => 'trim,required',
),
),
'caffeinated' => array(
'exclude' => 0,
'label' => 'LLL:EXT:tea/Resources/Private/Language/locallang_db.xlf:tx_tea_domain_model_teatype.caffeinated',
'config' => array(
'type' => 'check',
'default' => 0,
),
),
),
);
?>

View file

@ -1 +1 @@
{"modules":[{"config":{"position":[40,138]},"name":"New Model Object","value":{"actionGroup":{"_default0_list":false,"_default1_show":false,"_default2_new_create":false,"_default3_edit_update":false,"_default4_delete":false,"customActions":[]},"name":"TeaBeverage","objectsettings":{"aggregateRoot":true,"description":"Tea beverage","mapToTable":"","parentClass":"","sorting":false,"type":"Entity","uid":"264022070620"},"propertyGroup":{"properties":[{"propertyDescription":"size","propertyIsExcludeField":false,"propertyIsRequired":false,"propertyName":"size","propertyType":"Float","uid":"686745089204"}]},"relationGroup":{"relations":[]}}}],"properties":{"backendModules":[],"description":"This extension serves as an example on how to unit-test different data types and relation types in TYPO3 extensions.","emConf":{"category":"plugin","custom_category":"","dependsOn":"extbase => 6.0\nfluid => 6.0\ntypo3 => 6.0\n","disableLocalization":false,"disableVersioning":false,"priority":"","shy":false,"state":"alpha","targetVersion":"6.0","version":""},"extensionKey":"tea","name":"Tea example","originalExtensionKey":"","persons":[{"company":"oliverklee.de","email":"typo3-coding@oliverklee.de","name":"Oliver Klee","role":"Developer"}],"plugins":[],"vendorName":"OliverKlee"},"wires":[],"log":{"last_modified":"2013-11-01 07:54","extension_builder_version":"2.5.2","be_user":"Oliver Klee (1)"}}
{"modules":[{"config":{"position":[40,138]},"name":"New Model Object","value":{"actionGroup":{"_default0_list":false,"_default1_show":false,"_default2_new_create":false,"_default3_edit_update":false,"_default4_delete":false,"customActions":[]},"name":"TeaBeverage","objectsettings":{"aggregateRoot":true,"description":"Tea beverage","mapToTable":"","parentClass":"","sorting":false,"type":"Entity","uid":"264022070620"},"propertyGroup":{"properties":[{"propertyDescription":"size","propertyIsExcludeField":false,"propertyIsRequired":false,"propertyName":"size","propertyType":"Float","uid":"686745089204"}]},"relationGroup":{"relations":[{"foreignRelationClass":"","lazyLoading":true,"propertyIsExcludeField":false,"relationDescription":"type","relationName":"type","relationType":"manyToOne","relationWire":"[wired]","uid":"381688624164"}]}}},{"config":{"position":[756,159]},"name":"New Model Object","value":{"actionGroup":{"_default0_list":false,"_default1_show":false,"_default2_new_create":false,"_default3_edit_update":false,"_default4_delete":false,"customActions":[]},"name":"TeaType","objectsettings":{"aggregateRoot":false,"description":"Tea type","mapToTable":"","parentClass":"","sorting":false,"type":"Entity","uid":"1351448414985"},"propertyGroup":{"properties":[{"propertyDescription":"title","propertyIsExcludeField":false,"propertyIsRequired":true,"propertyName":"title","propertyType":"String","uid":"514346914201"},{"propertyDescription":"caffeinated","propertyIsExcludeField":false,"propertyIsRequired":false,"propertyName":"caffeinated","propertyType":"Boolean","uid":"314036724989"}]},"relationGroup":{"relations":[]}}}],"properties":{"backendModules":[],"description":"This extension serves as an example on how to unit-test different data types and relation types in TYPO3 extensions.","emConf":{"category":"plugin","custom_category":"","dependsOn":"extbase => 6.0\nfluid => 6.0\ntypo3 => 6.0\n","disableLocalization":false,"disableVersioning":false,"priority":"","shy":false,"state":"alpha","targetVersion":"6.0","version":""},"extensionKey":"tea","name":"Tea example","originalExtensionKey":"tea","persons":[{"company":"oliverklee.de","email":"typo3-coding@oliverklee.de","name":"Oliver Klee","role":"Developer"}],"plugins":[],"vendorName":"OliverKlee"},"wires":[{"src":{"moduleId":0,"terminal":"relationWire_0","uid":"381688624164"},"tgt":{"moduleId":1,"terminal":"SOURCES","uid":"1351448414985"}}],"log":{"last_modified":"2013-11-01 08:34","extension_builder_version":"2.5.2","be_user":"Oliver Klee (1)"}}

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<xliff version="1.0">
<file source-language="en" datatype="plaintext" original="messages" date="2013-11-01T19:54:17Z" product-name="tea">
<file source-language="en" datatype="plaintext" original="messages" date="2013-11-01T20:34:29Z" product-name="tea">
<header/>
<body>
<trans-unit id="tx_tea_domain_model_teabeverage">
@ -9,6 +9,18 @@
<trans-unit id="tx_tea_domain_model_teabeverage.size">
<source>size</source>
</trans-unit>
<trans-unit id="tx_tea_domain_model_teabeverage.type">
<source>type</source>
</trans-unit>
<trans-unit id="tx_tea_domain_model_teatype">
<source>Tea type</source>
</trans-unit>
<trans-unit id="tx_tea_domain_model_teatype.title">
<source>title</source>
</trans-unit>
<trans-unit id="tx_tea_domain_model_teatype.caffeinated">
<source>caffeinated</source>
</trans-unit>
</body>
</file>
</xliff>

View file

@ -1,11 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<xliff version="1.0">
<file source-language="en" datatype="plaintext" original="messages" date="2013-11-01T19:54:17Z" product-name="tea">
<file source-language="en" datatype="plaintext" original="messages" date="2013-11-01T20:34:29Z" product-name="tea">
<header/>
<body>
<trans-unit id="size.description">
<source>size</source>
</trans-unit>
<trans-unit id="type.description">
<source>type</source>
</trans-unit>
</body>
</file>
</xliff>

View file

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<xliff version="1.0">
<file source-language="en" datatype="plaintext" original="messages" date="2013-11-01T20:34:29Z" product-name="tea">
<header/>
<body>
<trans-unit id="title.description">
<source>title</source>
</trans-unit>
<trans-unit id="caffeinated.description">
<source>caffeinated</source>
</trans-unit>
</body>
</file>
</xliff>

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<xliff version="1.0">
<file source-language="en" datatype="plaintext" original="messages" date="2013-11-01T19:54:17Z" product-name="tea">
<file source-language="en" datatype="plaintext" original="messages" date="2013-11-01T20:34:29Z" product-name="tea">
<header/>
<body>
<trans-unit id="tx_tea_domain_model_teabeverage">
@ -9,6 +9,18 @@
<trans-unit id="tx_tea_domain_model_teabeverage.size">
<source>Size</source>
</trans-unit>
<trans-unit id="tx_tea_domain_model_teabeverage.type">
<source>Type</source>
</trans-unit>
<trans-unit id="tx_tea_domain_model_teatype">
<source>Tea Type</source>
</trans-unit>
<trans-unit id="tx_tea_domain_model_teatype.title">
<source>Title</source>
</trans-unit>
<trans-unit id="tx_tea_domain_model_teatype.caffeinated">
<source>Caffeinated</source>
</trans-unit>
</body>
</file>
</xliff>

Binary file not shown.

After

Width:  |  Height:  |  Size: 230 B

View file

@ -66,5 +66,27 @@ class TeaBeverageTest extends \TYPO3\CMS\Extbase\Tests\Unit\BaseTestCase {
$this->fixture->getSize()
);
}
/**
* @test
*/
public function getTypeInitiallyReturnsNull() {
$this->assertNull(
$this->fixture->getType()
);
}
/**
* @test
*/
public function setTypeSetsType() {
$type = new \OliverKlee\Tea\Domain\Model\TeaType();
$this->fixture->setType($type);
$this->assertSame(
$type,
$this->fixture->getType()
);
}
}
?>

View file

@ -0,0 +1,91 @@
<?php
namespace OliverKlee\Tea\Tests;
/***************************************************************
* Copyright notice
*
* (c) 2013 Oliver Klee <typo3-coding@oliverklee.de>, oliverklee.de
*
* All rights reserved
*
* This script is part of the TYPO3 project. The TYPO3 project is
* free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* The GNU General Public License can be found at
* http://www.gnu.org/copyleft/gpl.html.
*
* This script is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* This copyright notice MUST APPEAR in all copies of the script!
***************************************************************/
/**
* Test case.
*
* @author Oliver Klee <typo3-coding@oliverklee.de>
*/
class TeaTypeTest extends \TYPO3\CMS\Extbase\Tests\Unit\BaseTestCase {
/**
* @var \OliverKlee\Tea\Domain\Model\TeaType
*/
protected $fixture;
public function setUp() {
$this->fixture = new \OliverKlee\Tea\Domain\Model\TeaType();
}
public function tearDown() {
unset($this->fixture);
}
/**
* @test
*/
public function getTitleInitiallyReturnsEmptyString() {
$this->assertSame(
'',
$this->fixture->getTitle()
);
}
/**
* @test
*/
public function setTitleSetsTitle() {
$this->fixture->setTitle('foo bar');
$this->assertSame(
'foo bar',
$this->fixture->getTitle()
);
}
/**
* @test
*/
public function getCaffeinatedInitiallyReturnsFalse() {
$this->assertSame(
FALSE,
$this->fixture->getCaffeinated()
);
}
/**
* @test
*/
public function setCaffeinatedSetsCaffeinated() {
$this->fixture->setCaffeinated(TRUE);
$this->assertSame(
TRUE,
$this->fixture->getCaffeinated()
);
}
}
?>

View file

@ -30,9 +30,9 @@ $EM_CONF[$_EXTKEY] = array(
'version' => '',
'constraints' => array(
'depends' => array(
'fluid' => '6.0-6.2.99',
'fluid' => '6.0-6.2.99',
'fluid' => '6.0-6.2.99',
'extbase' => '6.0',
'fluid' => '6.0',
'typo3' => '6.0',
),
'conflicts' => array(
),

View file

@ -30,10 +30,41 @@ $TCA['tx_tea_domain_model_teabeverage'] = array(
'starttime' => 'starttime',
'endtime' => 'endtime',
),
'searchFields' => 'size,',
'searchFields' => 'size,type,',
'dynamicConfigFile' => \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath($_EXTKEY) . 'Configuration/TCA/TeaBeverage.php',
'iconfile' => \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extRelPath($_EXTKEY) . 'Resources/Public/Icons/tx_tea_domain_model_teabeverage.gif'
),
);
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addLLrefForTCAdescr('tx_tea_domain_model_teatype', 'EXT:tea/Resources/Private/Language/locallang_csh_tx_tea_domain_model_teatype.xlf');
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::allowTableOnStandardPages('tx_tea_domain_model_teatype');
$TCA['tx_tea_domain_model_teatype'] = array(
'ctrl' => array(
'title' => 'LLL:EXT:tea/Resources/Private/Language/locallang_db.xlf:tx_tea_domain_model_teatype',
'label' => 'title',
'tstamp' => 'tstamp',
'crdate' => 'crdate',
'cruser_id' => 'cruser_id',
'dividers2tabs' => TRUE,
'versioningWS' => 2,
'versioning_followPages' => TRUE,
'origUid' => 't3_origuid',
'languageField' => 'sys_language_uid',
'transOrigPointerField' => 'l10n_parent',
'transOrigDiffSourceField' => 'l10n_diffsource',
'delete' => 'deleted',
'enablecolumns' => array(
'disabled' => 'hidden',
'starttime' => 'starttime',
'endtime' => 'endtime',
),
'searchFields' => 'title,caffeinated,',
'dynamicConfigFile' => \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath($_EXTKEY) . 'Configuration/TCA/TeaType.php',
'iconfile' => \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extRelPath($_EXTKEY) . 'Resources/Public/Icons/tx_tea_domain_model_teatype.gif'
),
);
?>

View file

@ -2,11 +2,11 @@
# Table structure for table 'tx_tea_domain_model_teabeverage'
#
CREATE TABLE tx_tea_domain_model_teabeverage (
uid int(11) NOT NULL auto_increment,
pid int(11) DEFAULT '0' NOT NULL,
size double(11,2) DEFAULT '0.00' NOT NULL,
type int(11) unsigned DEFAULT '0',
tstamp int(11) unsigned DEFAULT '0' NOT NULL,
crdate int(11) unsigned DEFAULT '0' NOT NULL,
@ -34,6 +34,44 @@ CREATE TABLE tx_tea_domain_model_teabeverage (
PRIMARY KEY (uid),
KEY parent (pid),
KEY t3ver_oid (t3ver_oid,t3ver_wsid),
KEY language (l10n_parent,sys_language_uid)
KEY language (l10n_parent,sys_language_uid)
);
#
# Table structure for table 'tx_tea_domain_model_teatype'
#
CREATE TABLE tx_tea_domain_model_teatype (
uid int(11) NOT NULL auto_increment,
pid int(11) DEFAULT '0' NOT NULL,
title varchar(255) DEFAULT '' NOT NULL,
caffeinated tinyint(1) unsigned DEFAULT '0' NOT NULL,
tstamp int(11) unsigned DEFAULT '0' NOT NULL,
crdate int(11) unsigned DEFAULT '0' NOT NULL,
cruser_id int(11) unsigned DEFAULT '0' NOT NULL,
deleted tinyint(4) unsigned DEFAULT '0' NOT NULL,
hidden tinyint(4) unsigned DEFAULT '0' NOT NULL,
starttime int(11) unsigned DEFAULT '0' NOT NULL,
endtime int(11) unsigned DEFAULT '0' NOT NULL,
t3ver_oid int(11) DEFAULT '0' NOT NULL,
t3ver_id int(11) DEFAULT '0' NOT NULL,
t3ver_wsid int(11) DEFAULT '0' NOT NULL,
t3ver_label varchar(255) DEFAULT '' NOT NULL,
t3ver_state tinyint(4) DEFAULT '0' NOT NULL,
t3ver_stage int(11) DEFAULT '0' NOT NULL,
t3ver_count int(11) DEFAULT '0' NOT NULL,
t3ver_tstamp int(11) DEFAULT '0' NOT NULL,
t3ver_move_id int(11) DEFAULT '0' NOT NULL,
t3_origuid int(11) DEFAULT '0' NOT NULL,
sys_language_uid int(11) DEFAULT '0' NOT NULL,
l10n_parent int(11) DEFAULT '0' NOT NULL,
l10n_diffsource mediumblob,
PRIMARY KEY (uid),
KEY parent (pid),
KEY t3ver_oid (t3ver_oid,t3ver_wsid),
KEY language (l10n_parent,sys_language_uid)
);