Commit 836e1253 authored by Matthias Adrowski's avatar Matthias Adrowski
Browse files

[TASK] ECS Fixes

parent 987c8b83
......@@ -28,8 +28,8 @@ namespace SGalinski\DfTabs\Controller;
use SGalinski\DfTabs\DataProvider\AbstractBaseDataProvider;
use SGalinski\DfTabs\Domain\Repository\TabRepository;
use SGalinski\DfTabs\Service\ConfigurationService;
use SGalinski\DfTabs\View\TypoScriptView;
use SGalinski\DfTabs\View\FluidView;
use SGalinski\DfTabs\View\TypoScriptView;
use TYPO3\CMS\Core\Page\PageRenderer;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer;
......@@ -77,7 +77,7 @@ class PluginController extends AbstractPlugin {
*
* @var array
*/
protected $pluginConfiguration = array();
protected $pluginConfiguration = [];
/**
* Returns an instance of the renderer
......@@ -86,7 +86,7 @@ class PluginController extends AbstractPlugin {
* @return FluidView
*/
protected function getRenderer($tabId) {
$renderer = null;
$renderer = NULL;
/** @var TypoScriptFrontendController $tsfe */
$tsfe = $GLOBALS['TSFE'];
......@@ -99,7 +99,7 @@ class PluginController extends AbstractPlugin {
$repository = $this->getTabRepository();
$records = $repository->getRecords();
$renderer->addInlineJavaScriptCode($records, $this->pluginConfiguration['mode'], $tabId);
} else if ($this->pluginConfiguration['renderer'] === 'Fluid') {
} elseif ($this->pluginConfiguration['renderer'] === 'Fluid') {
/** @var $renderer FluidView */
$renderer = GeneralUtility::makeInstance(FluidView::class);
}
......@@ -159,7 +159,6 @@ class PluginController extends AbstractPlugin {
$records = $repository->getRecords();
$tabElements = $repository->buildTabElements($this->pluginConfiguration['titles'] ?? [], $records);
$content .= $renderer->renderTabs($tabElements, $tabId);
} catch (\Exception $exception) {
$content = $exception->getMessage();
}
......@@ -168,5 +167,3 @@ class PluginController extends AbstractPlugin {
return $this->pi_wrapInBaseClass($content);
}
}
?>
......@@ -75,7 +75,9 @@ abstract class AbstractDataBaseDataProvider extends AbstractBaseDataProvider {
) {
if ($this->table !== 'pages') {
$row = $typoscriptController->sys_page->getRecordOverlay(
$this->table, $row, $sysLanguageContent,
$this->table,
$row,
$sysLanguageContent,
$sysLanguageContentOl
);
} else {
......
......@@ -54,5 +54,3 @@ interface InterfaceDataProvider {
*/
public function getLinkData($uid);
}
?>
......@@ -37,7 +37,8 @@ class TypoScriptDataProvider extends AbstractBaseDataProvider {
*/
public function getTabContent($uid) {
return $this->contentObject->stdWrap(
'', $this->pluginConfiguration['stdWrap.']['typoscriptData.']['tab' . $uid . '.']
'',
$this->pluginConfiguration['stdWrap.']['typoscriptData.']['tab' . $uid . '.']
);
}
......@@ -59,7 +60,8 @@ class TypoScriptDataProvider extends AbstractBaseDataProvider {
*/
public function getLinkData($uid) {
return $this->contentObject->stdWrap(
'', $this->pluginConfiguration['stdWrap.']['typoscriptLinks.']['tab' . $uid . '.']
'',
$this->pluginConfiguration['stdWrap.']['typoscriptLinks.']['tab' . $uid . '.']
);
}
}
......@@ -73,7 +73,9 @@ class TabRepository {
*/
protected function getDataProvider($type) {
return FactoryDataProvider::getDataProvider(
$type, $this->pluginConfiguration, $this->contentObject
$type,
$this->pluginConfiguration,
$this->contentObject
);
}
......
......@@ -32,13 +32,16 @@ use TYPO3\CMS\Fluid\View\StandaloneView;
* @package SGalinski\DfTabs\Hooks\PageLayoutView
*/
class PluginRenderer implements \TYPO3\CMS\Backend\View\PageLayoutViewDrawItemHookInterface {
/**
* @inheritDoc
* @noinspection ReferencingObjectsInspection
*/
public function preProcess(
PageLayoutView &$parentObject, &$drawItem, &$headerContent, &$itemContent, array &$row
PageLayoutView &$parentObject,
&$drawItem,
&$headerContent,
&$itemContent,
array &$row
): void {
if ($row['list_type'] === 'df_tabs_plugin1') {
$drawItem = FALSE;
......@@ -54,10 +57,11 @@ class PluginRenderer implements \TYPO3\CMS\Backend\View\PageLayoutViewDrawItemHo
// Get available plugin settings and their values from flexform
$pluginConfiguration = GeneralUtility::xml2array(
$row['pi_flexform'], 'T3DataStructure'
$row['pi_flexform'],
'T3DataStructure'
)['data']['sDEF']['lDEF'];
$tabElements = GeneralUtility::trimExplode(',',$pluginConfiguration['data']['vDEF'], TRUE);
$tabElements = GeneralUtility::trimExplode(',', $pluginConfiguration['data']['vDEF'], TRUE);
$tabs = [];
foreach ($tabElements as $tabElement) {
......@@ -65,7 +69,7 @@ class PluginRenderer implements \TYPO3\CMS\Backend\View\PageLayoutViewDrawItemHo
$recordTable = substr($tabElement, 0, strrpos($tabElement, '_'));
$recordId = substr($tabElement, strrpos($tabElement, '_') + 1);
if ($recordTable === 'pages'){
if ($recordTable === 'pages') {
$recordTitle = BackendUtility::getRecord($recordTable, $recordId, 'title')['title'];
$recordType = 'page';
} elseif ($recordTable === 'tt_content') {
......@@ -83,7 +87,7 @@ class PluginRenderer implements \TYPO3\CMS\Backend\View\PageLayoutViewDrawItemHo
];
}
$titles = GeneralUtility::trimExplode("\n",$pluginConfiguration['titles']['vDEF']);
$titles = GeneralUtility::trimExplode("\n", $pluginConfiguration['titles']['vDEF']);
// Remove first item if it is empty to mimic what is actually saved to the DB and frontend behaviour.
// This gets done automatically on a second save of the plugin anyways but it should happen every time.
if ($titles[0] === '') {
......@@ -115,8 +119,9 @@ class PluginRenderer implements \TYPO3\CMS\Backend\View\PageLayoutViewDrawItemHo
*/
protected function adaptPluginHeaderContent(&$headerContent, $row): void {
$headerContent = '<h4>' . $this->getPluginNameForHeaderContent(
(int) $row['pid'], $row['list_type']
) . $headerContent . '</h4>';
(int) $row['pid'],
$row['list_type']
) . $headerContent . '</h4>';
}
/**
......@@ -132,7 +137,10 @@ class PluginRenderer implements \TYPO3\CMS\Backend\View\PageLayoutViewDrawItemHo
$pluginName = $languageService->sL(
BackendUtility::getLabelFromItemListMerged(
$pid, 'tt_content', 'list_type', $listType
$pid,
'tt_content',
'list_type',
$listType
)
);
return '<span class="label label-primary">' . $pluginName . '</span>&nbsp;';
......
......@@ -121,7 +121,7 @@ class ConfigurationService {
* @return array
*/
protected function getFlexformConfiguration() {
$data =& $this->controllerContext->cObj->data['pi_flexform'];
$data = &$this->controllerContext->cObj->data['pi_flexform'];
$configuration = [];
$value = \trim($this->controllerContext->pi_getFFvalue($data, 'enableAutoPlay'));
......
......@@ -32,7 +32,6 @@ use TYPO3\CMS\Core\Utility\GeneralUtility;
* Renders the content
*/
class FluidView implements SingletonInterface {
/**
* Renders the tabs
*
......@@ -49,5 +48,4 @@ class FluidView implements SingletonInterface {
$fluidView->assign('tabElements', $tabElements);
return $fluidView->render();
}
}
......@@ -175,7 +175,8 @@ class TypoScriptView implements SingletonInterface {
$config = &$this->pluginConfiguration[$tabId];
if (!\count($tabElements)) {
return LocalizationUtility::translate(
'df_tabs', 'LLL:EXT:df_tabs/Resources/Private/Language/locallang.xlf:noContentFound'
'df_tabs',
'LLL:EXT:df_tabs/Resources/Private/Language/locallang.xlf:noContentFound'
);
}
......@@ -226,14 +227,16 @@ class TypoScriptView implements SingletonInterface {
$typolink = $target = '';
if (\strpos($menuEntry, '###LINK###') !== FALSE) {
$typolink = $this->contentObject->typoLink(
'', [
'',
[
'parameter' => $tabElement->getLink(),
'returnLast' => 'url'
]
);
$target = $this->contentObject->typoLink(
'', [
'',
[
'parameter' => $tabElement->getLink(),
'returnLast' => 'target'
]
......@@ -247,7 +250,8 @@ class TypoScriptView implements SingletonInterface {
$GLOBALS['TSFE']->config['baseURL'] !== ''
) {
$linkAnchor = $this->contentObject->typoLink(
'', [
'',
[
'parameter' => $GLOBALS['TSFE']->id,
'section' => $linkId,
'returnLast' => 'url'
......
......@@ -26,5 +26,7 @@
// add static typoscript template
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addStaticFile(
'df_tabs', 'Configuration/TypoScript/', 'df_tabs'
'df_tabs',
'Configuration/TypoScript/',
'df_tabs'
);
......@@ -42,5 +42,6 @@ $GLOBALS['TCA']['tt_content']['types']['list']['subtypes_excludelist']['df_tabs_
// add flexform configuration
$GLOBALS['TCA']['tt_content']['types']['list']['subtypes_addlist']['df_tabs_plugin1'] = 'pi_flexform';
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPiFlexFormValue(
'df_tabs_plugin1', 'FILE:EXT:df_tabs/Configuration/FlexForms/flexform.xml'
'df_tabs_plugin1',
'FILE:EXT:df_tabs/Configuration/FlexForms/flexform.xml'
);
......@@ -45,12 +45,22 @@ abstract class Tx_DfTabs_BaseTestCase extends tx_phpunit_testcase {
* @api
*/
protected function getAccessibleMock(
$originalClassName, $methods = array(), array $arguments = array(), $mockClassName = '',
$callOriginalConstructor = TRUE, $callOriginalClone = TRUE, $callAutoload = TRUE
$originalClassName,
$methods = [],
array $arguments = [],
$mockClassName = '',
$callOriginalConstructor = TRUE,
$callOriginalClone = TRUE,
$callAutoload = TRUE
) {
return $this->getMock(
$this->buildAccessibleProxy($originalClassName), $methods, $arguments, $mockClassName,
$callOriginalConstructor, $callOriginalClone, $callAutoload
$this->buildAccessibleProxy($originalClassName),
$methods,
$arguments,
$mockClassName,
$callOriginalConstructor,
$callOriginalClone,
$callAutoload
);
}
......@@ -100,5 +110,3 @@ abstract class Tx_DfTabs_BaseTestCase extends tx_phpunit_testcase {
return $accessibleClassName;
}
}
?>
......@@ -42,7 +42,7 @@ class Tx_DfTabs_DataProvider_AbstractBaseDataProviderTest extends Tx_DfTabs_Base
public function setUp() {
$this->fixture = $this->getAccessibleMock(
'Tx_DfTabs_DataProvider_AbstractBaseDataProvider',
array('getLinkData', 'getTabContent', 'getTitle')
['getLinkData', 'getTabContent', 'getTitle']
);
}
......@@ -58,7 +58,7 @@ class Tx_DfTabs_DataProvider_AbstractBaseDataProviderTest extends Tx_DfTabs_Base
* @return void
*/
public function pluginConfigurationCanBeInjected() {
$configuration = array('foo');
$configuration = ['foo'];
$this->fixture->injectPluginConfiguration($configuration);
/** @noinspection PhpUndefinedMethodInspection */
......@@ -70,12 +70,10 @@ class Tx_DfTabs_DataProvider_AbstractBaseDataProviderTest extends Tx_DfTabs_Base
* @return void
*/
public function contentObjectCanBeInjected() {
$contentObject = new tslib_cObj;
$contentObject = new tslib_cObj();
$this->fixture->injectContentObject($contentObject);
/** @noinspection PhpUndefinedMethodInspection */
$this->assertSame($contentObject, $this->fixture->_get('contentObject'));
}
}
?>
......@@ -59,7 +59,8 @@ class Tx_DfTabs_DataProvider_AbstractDataBaseDataProviderTest extends Tx_DfTabs_
$GLOBALS['TYPO3_DB'] = $this->database = $this->getMock('t3lib_DB');
$this->fixture = $this->getAccessibleMock(
'Tx_DfTabs_DataProvider_AbstractDataBaseDataProvider', array('dummy')
'Tx_DfTabs_DataProvider_AbstractDataBaseDataProvider',
['dummy']
);
$this->contentObject = $this->getMock('tslib_cObj');
$this->fixture->injectContentObject($this->contentObject);
......@@ -78,11 +79,11 @@ class Tx_DfTabs_DataProvider_AbstractDataBaseDataProviderTest extends Tx_DfTabs_
* @return void
*/
public function getTabContentCallsContentObjectsRecordsMethodWithoutOwnRecordsConfiguration() {
$configuration = array(
$configuration = [
'tables' => 'tt_content',
'source' => '10',
'dontCheckPid' => 1,
);
];
/** @noinspection PhpUndefinedMethodInspection */
$this->contentObject->expects($this->once())->method('RECORDS')
......@@ -97,21 +98,21 @@ class Tx_DfTabs_DataProvider_AbstractDataBaseDataProviderTest extends Tx_DfTabs_
* @return void
*/
public function getTabContentCallsContentObjectsRecordsMethodWithCustomRecordsConfiguration() {
$pluginConfiguration = array('records.' => array('source' => 15));
$pluginConfiguration = ['records.' => ['source' => 15]];
$this->fixture->injectPluginConfiguration($pluginConfiguration);
$configuration = array(
$configuration = [
'tables' => 'tt_content',
'source' => '15',
'dontCheckPid' => 1,
);
];
/** @noinspection PhpUndefinedMethodInspection */
$this->contentObject->expects($this->once())->method('RECORDS')
->with($configuration)->will($this->returnValue('Foo'));
/** @noinspection PhpUndefinedMethodInspection */
$this->assertSame('Foo', $this->fixture->_call('getTabContent', array(12, 13)));
$this->assertSame('Foo', $this->fixture->_call('getTabContent', [12, 13]));
}
/**
......@@ -122,12 +123,12 @@ class Tx_DfTabs_DataProvider_AbstractDataBaseDataProviderTest extends Tx_DfTabs_
/** @noinspection PhpUndefinedMethodInspection */
$this->fixture->_set('table', 'pages');
$pluginConfiguration = array('pages.' => array('titleField' => 'title'));
$pluginConfiguration = ['pages.' => ['titleField' => 'title']];
$this->fixture->injectPluginConfiguration($pluginConfiguration);
/** @noinspection PhpUndefinedMethodInspection */
$this->database->expects($this->once())->method('exec_SELECTgetSingleRow')
->with('*', 'pages', 'uid = 1')->will($this->returnValue(array('title' => 'Foo')));
->with('*', 'pages', 'uid = 1')->will($this->returnValue(['title' => 'Foo']));
$this->assertSame('Foo', $this->fixture->getTitle(1));
}
......@@ -139,12 +140,12 @@ class Tx_DfTabs_DataProvider_AbstractDataBaseDataProviderTest extends Tx_DfTabs_
/** @noinspection PhpUndefinedMethodInspection */
$this->fixture->_set('table', 'tt_content');
$pluginConfiguration = array('tt_content.' => array('linkField' => 'header_link'));
$pluginConfiguration = ['tt_content.' => ['linkField' => 'header_link']];
$this->fixture->injectPluginConfiguration($pluginConfiguration);
/** @noinspection PhpUndefinedMethodInspection */
$this->database->expects($this->once())->method('exec_SELECTgetSingleRow')
->with('*', 'tt_content', 'uid = 1')->will($this->returnValue(array('header_link' => 'Foo')));
->with('*', 'tt_content', 'uid = 1')->will($this->returnValue(['header_link' => 'Foo']));
$this->assertSame('Foo', $this->fixture->getLinkData(1));
}
......@@ -156,16 +157,14 @@ class Tx_DfTabs_DataProvider_AbstractDataBaseDataProviderTest extends Tx_DfTabs_
/** @noinspection PhpUndefinedMethodInspection */
$this->fixture->_set('table', 'pages');
$pluginConfiguration = array('pages.' => array('titleField' => 'title', 'linkField' => 'header_link'));
$pluginConfiguration = ['pages.' => ['titleField' => 'title', 'linkField' => 'header_link']];
$this->fixture->injectPluginConfiguration($pluginConfiguration);
/** @noinspection PhpUndefinedMethodInspection */
$this->database->expects($this->once())->method('exec_SELECTgetSingleRow')
->with('*', 'pages', 'uid = 1')->will($this->returnValue(array('title' => 'Foo', 'header_link' => 'Bar')));
->with('*', 'pages', 'uid = 1')->will($this->returnValue(['title' => 'Foo', 'header_link' => 'Bar']));
$this->assertSame('Foo', $this->fixture->getTitle(1));
$this->assertSame('Bar', $this->fixture->getLinkData(1));
}
}
?>
......@@ -35,17 +35,17 @@ class Tx_DfTabs_DataProvider_FactoryDataProviderTest extends Tx_DfTabs_BaseTestC
* @return array
*/
public function getDataProviderReturnsProviderBasedOnModeDataProvider() {
return array(
'content' => array(
return [
'content' => [
'tt_content', 'Tx_DfTabs_DataProvider_ContentDataProvider'
),
'pages' => array(
],
'pages' => [
'pages', 'Tx_DfTabs_DataProvider_PagesDataProvider'
),
'typoscript' => array(
],
'typoscript' => [
'typoscript', 'Tx_DfTabs_DataProvider_TypoScriptDataProvider'
),
);
],
];
}
/**
......@@ -58,7 +58,9 @@ class Tx_DfTabs_DataProvider_FactoryDataProviderTest extends Tx_DfTabs_BaseTestC
public function getDataProviderReturnsProviderBasedOnMode($mode, $expectedDataProvider) {
$contentObject = new tslib_cObj();
$dataProvider = Tx_DfTabs_DataProvider_FactoryDataProvider::getDataProvider(
$mode, array('mode' => $mode), $contentObject
$mode,
['mode' => $mode],
$contentObject
);
$this->assertInstanceOf($expectedDataProvider, $dataProvider);
}
......@@ -70,8 +72,6 @@ class Tx_DfTabs_DataProvider_FactoryDataProviderTest extends Tx_DfTabs_BaseTestC
*/
public function getDataProviderThrowsExceptionIfNoValidMatchIsAvailable() {
$contentObject = new tslib_cObj();
Tx_DfTabs_DataProvider_FactoryDataProvider::getDataProvider('foo', array('mode' => 'foo'), $contentObject);
Tx_DfTabs_DataProvider_FactoryDataProvider::getDataProvider('foo', ['mode' => 'foo'], $contentObject);
}
}
?>
......@@ -53,7 +53,6 @@ class Tx_DfTabs_DataProvider_PagesDataProviderTest extends Tx_DfTabs_BaseTestCas
$this->backupDatabase = $GLOBALS['TYPO3_DB'];
$GLOBALS['TYPO3_DB'] = $this->database = $this->getMock('t3lib_DB');
$this->fixture = new Tx_DfTabs_DataProvider_PagesDataProvider();
}
/**
......@@ -75,10 +74,8 @@ class Tx_DfTabs_DataProvider_PagesDataProviderTest extends Tx_DfTabs_BaseTestCas
/** @noinspection PhpUndefinedMethodInspection */
$this->database->expects($this->once())->method('exec_SELECTgetRows')
->will($this->returnValue(array(12 => array(), 14 => array())));
->will($this->returnValue([12 => [], 14 => []]));
$this->assertSame(array(12, 14), $this->fixture->getContentUids(2));
$this->assertSame([12, 14], $this->fixture->getContentUids(2));
}
}
?>
......@@ -64,20 +64,20 @@ class Tx_DfTabs_DataProvider_TypoScriptDataProviderTest extends Tx_DfTabs_BaseTe
* @return void
*/
public function getTabContentReturnsTheResultsOfDedicatedStandardWraps() {
$pluginConfiguration = array(
'stdWrap.' => array(
'typoscriptData.' => array(
'tab1.' => array(
$pluginConfiguration = [
'stdWrap.' => [
'typoscriptData.' => [
'tab1.' => [
'foo' => 'bar',
),
),
),
);
],
],
],
];
$this->fixture->injectPluginConfiguration($pluginConfiguration);
/** @noinspection PhpUndefinedMethodInspection */
$this->contentObject->expects($this->once())->method('stdWrap')
->with('', array('foo' => 'bar'))->will($this->returnValue('Foo'));
->with('', ['foo' => 'bar'])->will($this->returnValue('Foo'));
$this->assertSame('Foo', $this->fixture->getTabContent(1));
}
......@@ -87,24 +87,21 @@ class Tx_DfTabs_DataProvider_TypoScriptDataProviderTest extends Tx_DfTabs_BaseTe
* @return void
*/
public function getLinkDataReturnsTheResultsOfDedicatedStandardWraps() {
$pluginConfiguration = array(
'stdWrap.' => array(
'typoscriptLinks.' => array(
'tab1.' => array(
$pluginConfiguration = [
'stdWrap.' => [
'typoscriptLinks.' => [
'tab1.' => [
'foo' => 'bar',
),
),
),
);
],
],
],
];
$this->fixture->injectPluginConfiguration($pluginConfiguration);
/** @noinspection PhpUndefinedMethodInspection */
$this->contentObject->expects($this->once())->method('stdWrap')
->with('', array('foo' => 'bar'))->will($this->returnValue('Foo'));
->with('', ['foo' => 'bar'])->will($this->returnValue('Foo'));
$this->assertSame('Foo', $this->fixture->getLinkData(1));
}
}
?>
......@@ -84,9 +84,7 @@ class Tx_DfTabs_Domain_Model_LinkCheckTest extends Tx_DfTabs_BaseTestCase {
* @return void
*/
public function setContentWorks() {
$this->fixture->setContent(array('FooBar'));
$this->assertSame(array('FooBar'), $this->fixture->getContent());
$this->fixture->setContent(['FooBar']);
$this->assertSame(['FooBar'], $this->fixture->getContent());
}
}
?>
......@@ -41,7 +41,8 @@ class Tx_DfTabs_Domain_Repository_TabRepositoryTest extends Tx_DfTabs_BaseTestCa
*/
public function setUp() {
$this->fixture = $this->getAccessibleMock(
'Tx_DfTabs_Domain_Repository_TabRepository', array('getDataProvider')
'Tx_DfTabs_Domain_Repository_TabRepository',
['getDataProvider']
);
}
......@@ -57,7 +58,7 @@ class Tx_DfTabs_Domain_Repository_TabRepositoryTest extends Tx_DfTabs_BaseTestCa
* @return void
*/
public function pluginConfigurationCanBeInjected() {
$configuration = array('foo');
$configuration = ['foo'];
$this->fixture->injectPluginConfiguration($configuration);
/** @noinspection PhpUndefinedMethodInspection */
$this->assertSame($configuration, $this->fixture->_get('pluginConfiguration'));
......@@ -68,7 +69,7 @@ class Tx_DfTabs_Domain_Repository_TabRepositoryTest extends Tx_DfTabs_BaseTestCa
* @return void
*/
public function contentObjectCanBeInjected() {
$contentObject = new tslib_cObj;
$contentObject = new tslib_cObj();
$this->fixture->injectContentObject($contentObject);
/** @noinspection PhpUndefinedMethodInspection */
$this->assertSame($contentObject, $this->fixture->_get('contentObject'));
......@@ -79,7 +80,7 @@ class Tx_DfTabs_Domain_Repository_TabRepositoryTest extends Tx_DfTabs_BaseTestCa
* @return void
*/
public function buildTabElementsReturnsATabElementCollectionWithPreferredAndDefaultTitle() {
$this->fixture->injectPluginConfiguration(array('defaultTabTitle' => 'Title2'));
$this->fixture->injectPluginConfiguration(['defaultTabTitle' => 'Title2']);
$dataProvider = $this->getMock('Tx_DfTabs_DataProvider_AbstractBaseDataProvider');
/** @noinspection PhpUndefinedMethodInspection */
......@@ -94,8 +95,8 @@ class Tx_DfTabs_Domain_Repository_TabRepositoryTest extends Tx_DfTabs_BaseTestCa
$tab2 = new Tx_DfTabs_Domain_Model_Tab('Title2', 2);