$this->repository->add verlangt sys_language_uid [Gelöst]

  • BlackPixel BlackPixe...
    Sternenflotten-Admiral
    0 x
    230 Beiträge
    3 Hilfreiche Beiträge
    06. 07. 2011, 16:01

    Hallo Leute,

    habe mein eigenes Object via TS auf tt_news gemappt. Nun möchte ich einen neuen Datensatz anlegen und benutze dafür die extbase Repository Methode add():

    1. $article = t3lib_div::makeInstance(Tx_Mrxmlinterface_Domain_Model_Article);
    2. $article->setTitle("test");
    3. $article->setSys_language_uid(0);
    4. $this->articleRepository->add($article);

    Ich habe im Model versucht mit und ohne getter/setter zu arbeiten, bekomme aber jedes mal die folgende exception geworfen:

    #1247602160: Column 'sys_language_uid' cannot be null: UPDATE tt_news SET title='test', tstamp='1309960820', sys_language_uid=NULL WHERE uid='39'

    Interessanterweise bekomme ich einen Datensatz in die DB geschrieben, allerdings sind alle werte bis auf crdate und timestamp leer. Sprich INSERT rennt irgendwie, aber das eigentliche Objekt wird nicht geschrieben.

    Weshalb? Erkennt extbase die sys_language_uid nicht automatisch sofern die Tabelle dafür aktiviert ist? Und warum gehts Manuell nicht?

    Gruß Manfred

    TYPO3 Slider Revolution: https://www.rutschmann.biz/extensions/typo3-slider-revolution/
    TYPO3 Layerslider Extension: http://www.rutschmann.biz/extensions/typo3-layerslider/
    TYPO3 Responsive Flipbook Extension: http://www.rutschmann.biz/extensions/typo3-responsive-flipbook/
    TYPO3 PayPal Download Checkout: http://www.rutschmann.biz/extensions/typo3-paypal-download/

    http://www.rutschmann.biz/
    ----------------------------------------------------
    Extbase, Fluid, HTML & CSS Development


  • 1
  • BlackPixel BlackPixe...
    Sternenflotten-Admiral
    0 x
    230 Beiträge
    3 Hilfreiche Beiträge
    07. 07. 2011, 12:03

    Also aus irgendeinem Grund wird sys_language_uid nicht genommen. Man kann die Sprache allerdings über einen eigenen setter/getter steuern:

    1. /**
    2. * _languageUid
    3. * @var int
    4. * @validate NotEmpty
    5. */
    6. protected $_languageUid;
    7.  
    8. /**
    9. * @param int $_languageUid
    10. * @return void
    11. */
    12. public function set_languageUid($_languageUid) {
    13. $this->_languageUid = $_languageUid;
    14. }
    15.  
    16. /**
    17. * @return int
    18. */
    19. public function get_languageUid() {
    20. return $this->_languageUid;
    21. }

    TYPO3 Slider Revolution: https://www.rutschmann.biz/extensions/typo3-slider-revolution/
    TYPO3 Layerslider Extension: http://www.rutschmann.biz/extensions/typo3-layerslider/
    TYPO3 Responsive Flipbook Extension: http://www.rutschmann.biz/extensions/typo3-responsive-flipbook/
    TYPO3 PayPal Download Checkout: http://www.rutschmann.biz/extensions/typo3-paypal-download/

    http://www.rutschmann.biz/
    ----------------------------------------------------
    Extbase, Fluid, HTML & CSS Development

  • typonewbe typonewbe
    Sternenflotten-Admiral
    0 x
    188 Beiträge
    3 Hilfreiche Beiträge
    07. 07. 2011, 16:58

    Hallo BlackPixel,

    soweit ich weiß gehört im Model zu jeder Variable/Eigenschaft eine Setter u. Getter Funktion, die mit set Kleingeschrieben beginnt und jedes weitere Wort groß nun sind deine Methoden bissl ungünstig geschrieben oder was ist die Großvariante zu _ ?

    probiere es doch mal so.

    Die Spalte lautet sys_language_uid

    die Eigenschaft dazu

    1. /**
    2. * sysLanguageUid
    3. * @var int
    4. * @validate NotEmpty
    5. */
    6. var $sysLanguageUid
    7.  
    8. /**
    9. * @param int $sysLanguageUid
    10. * @return void
    11. */
    12. public function setSysLanguageUid($sysLanguageUid) {
    13. $this->sysLanguageUid = $sysLanguageUid;
    14. }
    15.  
    16. /**
    17. * @return int
    18. */
    19. public function getSysLanguageUid() {
    20. return $this->sysLanguageUid;
    21. }

    Das hilft eventuell.
    PS: @validate NotEmpty sagt ja das diese Eigenschaft nicht leer sein darf das kannste mal wegnehmen.

    Gruß typonewbe

  • BlackPixel BlackPixe...
    Sternenflotten-Admiral
    0 x
    230 Beiträge
    3 Hilfreiche Beiträge
    08. 07. 2011, 13:51

    Das die Spalte sys_language_uid lautet ist mir schon klar. Allerdings macht extbase in diesem Fall eine Ausnahme. Und zwar folgendermaßen (extbase 1.3.0, /Classes/Persistence/Backend.php):

    Nachdem der Dummysatz von der Persistenzschicht angelegt ist, wird das Objekt gefüllt und in die DB geschrieben. Hier die funktion aus extbase dazu:

    1. /**
    2. * Updates a given object in the storage
    3. *
    4. * @param Tx_Extbase_DomainObject_DomainObjectInterface $object The object to be insterted in the storage
    5. * @param Tx_Extbase_DomainObject_AbstractEntity|NULL $parentObject The parent object (if any)
    6. * @param string|NULL $parentPropertyName The name of the property
    7. * @param array $row The $row
    8. */
    9. protected function updateObject(Tx_Extbase_DomainObject_DomainObjectInterface $object, array $row) {
    10. $dataMap = $this->dataMapper->getDataMap(get_class($object));
    11. $this->addCommonFieldsToRow($object, $row);
    12. $row['uid'] = $object->getUid();
    13. if($dataMap->getLanguageIdColumnName() !== NULL) {
    14. $row[$dataMap->getLanguageIdColumnName()] = $object->_getProperty('_languageUid');
    15. if ($object->_getProperty('_localizedUid') !== NULL) {
    16. $row['uid'] = $object->_getProperty('_localizedUid');
    17. }
    18. }
    19. $res = $this->storageBackend->updateRow(
    20. $dataMap->getTableName(),
    21. $row
    22. );
    23. $frameworkConfiguration = $this->configurationManager->getConfiguration(Tx_Extbase_Configuration_ConfigurationManagerInterface::CONFIGURATION_TYPE_FRAMEWORK);
    24. if ($frameworkConfiguration['persistence']['updateReferenceIndex'] === '1') {
    25. $this->referenceIndex->updateRefIndexTable($dataMap->getTableName(), $row['uid']);
    26. }
    27. return $res;
    28. }

    $dataMap->getLanguageIdColumnName()

    löst aus der tca das Sprachfeld auf, für tt_news wäre es sys_language_uid. Ich schätze mal, es könnte variabel innerhalb von T3 sein, es muss also nicht so heissen. Egal. Wenn es auf jeden Fall ein Feld gibt das die Sprache angibt, wird aus dem aktuellen Object die _languageUid geholt:

    $row[$dataMap->getLanguageIdColumnName()] = $object->_getProperty('_languageUid');

    Ich schätze das ganze kommt aus FLOW3 und wurde so nach Extbase transportiert. Wie Du siehst hast du mit einem sys_language_uid getter/setter keine Chance was zu machen, egal ob CamelCase oder nicht. Hat mich gestern einiges an Zeit gekostet das ganze so durchzuforsten...

    Gruß Manfred

    TYPO3 Slider Revolution: https://www.rutschmann.biz/extensions/typo3-slider-revolution/
    TYPO3 Layerslider Extension: http://www.rutschmann.biz/extensions/typo3-layerslider/
    TYPO3 Responsive Flipbook Extension: http://www.rutschmann.biz/extensions/typo3-responsive-flipbook/
    TYPO3 PayPal Download Checkout: http://www.rutschmann.biz/extensions/typo3-paypal-download/

    http://www.rutschmann.biz/
    ----------------------------------------------------
    Extbase, Fluid, HTML & CSS Development

  • typonewbe typonewbe
    Sternenflotten-Admiral
    0 x
    188 Beiträge
    3 Hilfreiche Beiträge
    10. 04. 2013, 17:57

    Hi,

    konntest du schon eine Lösung finden?

    Ich hab gerade mal das Buch "Zukunftssichere TYPO3 Extensions mit Extbase & Fluid" angesehen und bin in Kapitel 9 Seite 225 auf einen interessanten Beitrag gestoßen. Wenn ich das richtig verstehe musst du zwar per SQL also ext_tables.sql die Spalten mit anlegen und auch im TCA aber nicht im Model (uid machste ja auch net im Model) und es reicht aus wenn du deinen Language Parameter bei uns immer L mit angibst

    also sowas wie index.php?id=22&tx_deine_ext_pi1[controller]=DeinController&tx_deine_ext_pi1[action]=deineAction&L=deineSprachId

    Ich würde jetzt mal die setter und getter aus dem Model entfernen und so wie oben beschrieben umsetzen.

    Hoffe das hilft.

    Gruß typonewbe

  • 1