[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