[TYPO3-german] extbase: Custom Query für erweiterte tt_news-Tabelle
Christian Essl
essl at incert.at
Thu Dec 1 12:08:06 CET 2011
Ich habe in meiner Extension tt_news um eine Tabelle 'tags' erweitert, die in einer mm-Relation zu einer extbase Tabelle "tx_myext_domain_model_tag" steht.
Hier die ext_tables.php:
--------------------------------------------------------------
$tempColumns = array(
'tags' => array(
'exclude' => 1,
'label' => 'LLL:EXT:incert_blackboard/Resources/Private/Language/locallang_db.xml:tx_ myext _domain_model_post.tags',
'config' => array(
'type' => 'select',
'foreign_table' => 'tx_myext_domain_model_tag',
'MM' => 'tx_ myext _ttnews_tag_mm',
'size' => 10,
'autoSizeMax' => 30,
'maxitems' => 9999,
'multiple' => 0,
'wizards' => array(
'_PADDING' => 1,
'_VERTICAL' => 1,
'edit' => array(
'type' => 'popup',
'title' => 'Edit',
'script' => 'wizard_edit.php',
'icon' => 'edit2.gif',
'popup_onlyOpenIfSelected' => 1,
'JSopenParams' => 'height=350,width=580,status=0,menubar=0,scrollbars=1',
),
'add' => Array(
'type' => 'script',
'title' => 'Create new',
'icon' => 'add.gif',
'params' => array(
'table' => 'tx_ myext _domain_model_tag',
'pid' => '###CURRENT_PID###',
'setValue' => 'prepend'
),
'script' => 'wizard_add.php',
),
),
),
),
);
--------------------------------------------------------------
t3lib_div::loadTCA('tt_news');
t3lib_extMgm::addTCAcolumns('tt_news', $tempColumns, 1);
t3lib_extMgm::addToAllTCAtypes('tt_news', 'tags;;;;1-1-1');
Die tt_news-Tabelle mappe ich im TS auf eine eigene Tabelle:
--------------------------------------------------------------
persistence.classes {
Tx_MyExt_Domain_Model_TTNews {
mapping {
tableName = tt_news
recordType = Tx_MyExt_Domain_Model_TTNews
columns {
tags.mapOnProperty = tags
}
}
}
}
--------------------------------------------------------------
Das Model enthält alles, was für die mm-Relation von $tags notwendig sein sollte:
--------------------------------------------------------------
class Tx_MyExt_Domain_Model_TTNews extends Tx_Extbase_DomainObject_AbstractEntity {
/**
* @var string
*/
protected $title;
/**
* Tags
*
* @var Tx_Extbase_Persistence_ObjectStorage<Tx_ MyExt _Domain_Model_Tag>
*/
protected $tags;
/**
* __construct
*
* @return void
*/
public function __construct() {
//Do not remove the next line: It would break the functionality
$this->initStorageObjects();
}
/**
* Initializes all Tx_Extbase_Persistence_ObjectStorage properties.
*
* @return void
*/
protected function initStorageObjects() {
/**
* Do not modify this method!
* It will be rewritten on each save in the extension builder
* You may modify the constructor of this class instead
*/
$this->tags = new Tx_Extbase_Persistence_ObjectStorage();
}
/**
* Sets the title
*
* @param string $title
* @return void
* @api
*/
public function setTitle($title) {
$this->title = $title;
}
/**
* Returns the title value
*
* @return string
* @api
*/
public function getTitle() {
return $this->title;
}
/**
* Adds a Tag
*
* @param Tx_ MyExt _Domain_Model_Tag $tag
* @return void
*/
public function addTag(Tx_ MyExt _Domain_Model_Tag $tag) {
$this->tags->attach($tag);
}
/**
* Removes a Tag
*
* @param Tx_ MyExt _Domain_Model_Tag $tagToRemove The Tag to be removed
* @return void
*/
public function removeTag(Tx_ MyExt _Domain_Model_Tag $tagToRemove) {
$this->tags->detach($tagToRemove);
}
/**
* Returns the tags
*
* @return Tx_Extbase_Persistence_ObjectStorage<Tx_ MyExt _Domain_Model_Tag> $tags
*/
public function getTags() {
return $this->tags;
}
/**
* Sets the tags
*
* @param Tx_Extbase_Persistence_ObjectStorage<Tx_ MyExt _Domain_Model_Tag> $tags
* @return void
*/
public function setTags(Tx_Extbase_Persistence_ObjectStorage $tags) {
$this->tags = $tags;
}
}
?>
--------------------------------------------------------------
Im Repository füge ich nun eine eigene Funktion ein, mit der alle News mit einem bestimmten Tag ausgelesen werden sollen:
--------------------------------------------------------------
/*
* Create and alter the query object
* @return Tx_Extbase_Persistence_QueryInterface
*/
public function createQuery() {
$query = parent::createQuery();
$query->getQuerySettings()->setRespectSysLanguage(FALSE);
$query->getQuerySettings()->setRespectStoragePage(FALSE);
return $query;
}
public function findByTag(Tx_MyExt_Domain_Model_Tag $tag)
{
$query = $this->createQuery();
$query->matching($query->contains('tags', $tag));
return $query->execute();
}
--------------------------------------------------------------
Lese ich testweise einen einzelnen Newseintrag mit findOneByUid(), wird er mir nun schön in <f:debug> angezeigt.
Wenn ich aber über die eigene findByTag()-Methode ein valides Tag-Objekt auslesen möchte, zeigt extbase ein seltsames Verhalten. - Das Einbinden des <f:debug>-ViewHelpers zur Ausgabe des news-Objekt führt zu einer weißen Seite.
Gebe ich nun mit var_dump() das News-Objekt im Controller aus, bekomme ich eine ewig lange Ausgabe, die mit "object(Tx_Extbase_Persistence_QueryResult)#453 (5) anfängt und nichts mit meinem erwünschten QueryResult zu tun hat.
Ein kleiner Ausschnitt:
--------------------------------------------------------------
object(Tx_Extbase_Persistence_QueryResult)#453 (5) {
["warning":"Tx_Extbase_Persistence_QueryResult":private]=>
string(206) "You should never see this warning. If you do, you probably used PHP array functions like current() on the Tx_Extbase_Persistence_QueryResult. To retrieve the first result, you can use the getFirst() method."
["dataMapper":protected]=>
object(Tx_Extbase_Persistence_Mapper_DataMapper)#185 (11) {
["identityMap":protected]=>
object(Tx_Extbase_Persistence_IdentityMap)#187 (2) {
["objectMap":protected]=>
object(Tx_Extbase_Persistence_ObjectStorage)#188 (3) {
["warning":"Tx_Extbase_Persistence_ObjectStorage":private]=>
string(221) "You should never see this warning. If you do, you probably used PHP array functions like current() on the Tx_Extbase_Persistence_ObjectStorage. To retrieve the first result, you can use the rewind() and current() methods."
["storage":protected]=>
array(1) {
["000000003928a2ee00000000338ccbb9"]=>
array(2) {
["obj"]=>
object(Tx_MyExt_Domain_Model_Tag)#393 (8) {
["title":protected]=>
string(8) "Test-Tag"
["description":protected]=>
string(14) "Tag zum Testen"
["uid":protected]=>
int(1)
["_localizedUid":protected]=>
int(1)
["_languageUid":protected]=>
int(0)
["pid":protected]=>
int(141)
["_isClone":"Tx_Extbase_DomainObject_AbstractDomainObject":private]=>
bool(false)
["_cleanProperties":"Tx_Extbase_DomainObject_AbstractDomainObject":private]=>
array(4) {
["title"]=>
string(8) "Test-Tag"
["description"]=>
string(14) "Tag zum Testen"
["uid"]=>
int(1)
["pid"]=>
int(141)
}
}
["inf"]=>
string(1) "1"
}
}
["isModified":protected]=>
bool(true)
}
.
.
.
.
--------------------------------------------------------------
Was hat das zu bedeuten? Warum stopft mir extbase mein Query-Ergebnis mit einer riesig langen Ausgabe von extbase-spezifischen Arrays und Objekten voll?
Und vor allem: Wie soll ich sinnvoll Custom Querys debuggen? Momentan fühlt sich das eher wie Trial & Error an.
Gruß,
Christian
More information about the TYPO3-german
mailing list