Fehler nach Update

  • MajPay MajPay
    Jedi-Meister
    0 x
    345 Beiträge
    2 Hilfreiche Beiträge
    04. 09. 2012, 10:28

    Hallo,

    Nachdem ich in meinem Testprojekt auf die Beta1 (von Alpha3) aktualisiert habe bekomme ich einen Fehler.

    Der Fehler:
    #1231178878: Given property name is not of type string. (More information)

    ObjectAccess erwartet auf jeden Fall einen String als $propertyName, da ich aber in einem Form ein Object per select ausgeben lasse (Eine Optionlist) waren meine Keys ein index und die value die uid der Datensätze, der Post kommt am Webserver wie folgt an:

    1. array(1) {
    2. ["tx_testcompany_companies"]=>
    3. array(3) {
    4. ["__referrer"]=>
    5. array(3) {
    6. ["extensionName"]=>
    7. string(11) "TestCompany"
    8. ["controllerName"]=>
    9. string(8-) "Location"
    10. ["actionName"]=>
    11. string(3) "new"
    12. }
    13. ["__hmac"]=>
    14. string(231) "a:4:{s:8:\"location\";a:4:{s:7:\"address\";i:1;s:7:\"zipcode\";i:1;s:7:\"country\";i:1;s:8:\"branches\";a:2:{i:0;i:1;i:1;i:1;}}s:7:\"company\";i:1;s:6:\"action\";i:1;s:10:\"controller\";i:1;}383f73d16488d282f421ee104bf6ed7f62b0c75e"
    15. ["location"]=>
    16. array(4) {
    17. ["address"]=>
    18. string(8-) "Am Weg 2"
    19. ["zipcode"]=>
    20. string(4) "9020"
    21. ["country"]=>
    22. string(10) "Klagenfurt"
    23. ["branches"]=>
    24. array(1) {
    25. [0]=>
    26. string(1) "2"
    27. }
    28. }
    29. }
    30. }

    Der fehler kommt vom tx_testcompany_companies[location][branches][0]=2

    Im Location Model sieht das so aus:

    1. /**
    2.  * @var Tx_Extbase_Persistence_ObjectStorage<Tx_TestCompany_Domain_Model_Branch>
    3.  */
    4. protected $branches;

    Template:

    1. <f:form.select property="branches" options="{branches}" multiple="multiple" optionLabelField="name"></f:form.select>

    Ich habe keine Lust hier irgendwas rumzuwurschteln, so wie hier gebaut erscheint es mir logisch.

    Muss man nun alle keys (auch in solchen Selects) zb als branch0 benennen oder ist das ein Bug im aktuellen Extbase?


  • MajPay MajPay
    Jedi-Meister
    0 x
    345 Beiträge
    2 Hilfreiche Beiträge
    05. 09. 2012, 14:59

    Hat jemand eine Idee? Nach stundenlangem durchforsten von Extbase und meiner Extension stehe ich nach wie vor am selben Punkt.

    Meiner Meinung nach kommen die Werte wie geplant am Server an:

    1. (
    2. [tx_testcompany_companies] => Array
    3. (
    4. [location] => Array
    5. (
    6. [__identity] => 1
    7. [address] => Roadtohell 616
    8. [zipcode] => 61666
    9. [country] => Deep South
    10. [branches] => Array
    11. (
    12. [0] => 1
    13. [1] => 2
    14. )
    15.  
    16. )
    17.  
    18. [__referrer] => Array
    19. (
    20. [extensionName] => TestCompany
    21. [controllerName] => Location
    22. [actionName] => edit
    23. )
    24.  
    25. [__hmac] => a:4:{s:8:\"location\";a:5:{s:7:\"address\";i:1;s:7:\"zipcode\";i:1;s:7:\"country\";i:1;s:8:\"branches\";a:2:{i:0;i:1;i:1;i:1;}s:10:\"__identity\";i:1;}s:7:\"company\";i:1;s:6:\"action\";i:1;s:10:\"controller\";i:1;}df1e332fcf4cf1cdd2a418568900e8b79e1f2af6
    26. )
    27.  
    28. )

    Aber Extbase will nicht das Tx_Extbase_Persistence_ObjectStorage
    location[branches]mit den Werten befüllen sondern versucht irgendwo die Eigenschaft 0 mit 2 zu befüllen, was es nicht mag.

    Im Template kann kein Fehler sein.

    Kann der Fehler noch im TCA sein?

    Über jede Art von Hilfe wäre ich sehr froh...

  • kitsunet kitsunet
    Flash Gordon
    0 x
    2559 Beiträge
    27 Hilfreiche Beiträge
    06. 09. 2012, 10:51

    Also die Persistence braucht infos aus dem TCA, das PropertyMapping nicht, soweit ich weiß. Was ich so sehe sollte das im PropertyMapper auch alles so laufen wie du denkst, da müsste man mal debuggen. Vielleicht hast du das mit dem ObjectStorage erst später gemacht? Du kannst testweise mal die tx_extbase cache tabellen in der DB leeren damit die Object Reflection neu gemacht wird.

    config.baseURL = http://www.kitsunet.com/
    TYPO3 Flow und Neos Community Contact
    Release Manager TYPO3 Neos 1.1
    Ich habe Probleme mit den PMs hier, also schreibt mir bitte eine Mail oder über Twitter!

  • MajPay MajPay
    Jedi-Meister
    0 x
    345 Beiträge
    2 Hilfreiche Beiträge
    06. 09. 2012, 11:24

    Nö, gerade versucht, habe alle tables (cf_extbase...) über phpmyadmin geleert. Selber Fehler.

    In der Alpha3 ging das noch, in der Beta1 nicht mehr, ich habe allerdings kein Update gemacht sondern einfach neu aufgesetzt, extension installiert und weitergemacht. Und siehe da: Fehler...

    In TYPO3\CMS\Extbase\Reflection\ObjectAccess::setProperty wurde soweit ich das sehen kann allerdings nur die Syntax angepasst, da kam keine neuartige Validierung rein. Alle Scripte da durchzuforsten - da habe ich keine Lust dazu wo der "Fehler" ja höchstwahrscheinlich an meiner Extension liegt.

  • MajPay MajPay
    Jedi-Meister
    0 x
    345 Beiträge
    2 Hilfreiche Beiträge
    06. 09. 2012, 16:29

    Habe aus Interesse nochmals ein System mit der Alpha3 eingerichtet und die Extension dort installiert (einfach 1:1 rüberkopiert und installiert). Schwupps -> funktioniert wieder. Version 6B1 - funktioniert nicht.

    Alpha3:

    1. /**
    2. * Set a property for a given object.
    3. * Tries to set the property the following ways:
    4. * - if target is an array, set value
    5. * - if super cow powers should be used, set value through reflection
    6. * - if public setter method exists, call it.
    7. * - if public property exists, set it directly.
    8. * - if the target object is an instance of ArrayAccess, it sets the property
    9. * on it without checking if it existed.
    10. * - else, return FALSE
    11. *
    12. * @param mixed $subject The target object or array
    13. * @param string $propertyName Name of the property to set
    14. * @param mixed $propertyValue Value of the property
    15. * @param boolean $forceDirectAccess directly access property using reflection(!)
    16. * @return boolean TRUE if the property could be set, FALSE otherwise
    17. * @throws InvalidArgumentException in case $object was not an object or $propertyName was not a string
    18. */
    19. static public function setProperty(&$subject, $propertyName, $propertyValue, $forceDirectAccess = FALSE) {
    20. if (is_array($subject)) {
    21. $subject[$propertyName] = $propertyValue;
    22. return TRUE;
    23. }
    24. if (!is_object($subject)) throw new InvalidArgumentException('subject must be an object or array, ' . gettype($subject). ' given.', 1237301368-);
    25. if (!is_string($propertyName)) throw new InvalidArgumentException('Given property name is not of type string.', 1231178878-);
    26.  
    27. if ($forceDirectAccess === TRUE) {
    28. if (property_exists(get_class($subject), $propertyName)) {
    29. $propertyReflection = new Tx_Extbase_Reflection_PropertyReflection(get_class($subject), $propertyName);
    30. $propertyReflection->setAccessible(TRUE);
    31. $propertyReflection->setValue($subject, $propertyValue);
    32. } else {
    33. $subject->$propertyName = $propertyValue;
    34. }
    35. } elseif (is_callable(array($subject, $setterMethodName = self::buildSetterMethodName($propertyName)))) {
    36. $subject->$setterMethodName($propertyValue);
    37. } elseif ($subject instanceof ArrayAccess) {
    38. $subject[$propertyName] = $propertyValue;
    39. } elseif (array_key_exists($propertyName, get_object_vars($subject))) {
    40. $subject->$propertyName = $propertyValue;
    41. } else {
    42. return FALSE;
    43. }
    44. return TRUE;
    45. }

    Beta1:

    1. /**
    2. * Set a property for a given object.
    3. * Tries to set the property the following ways:
    4. * - if target is an array, set value
    5. * - if super cow powers should be used, set value through reflection
    6. * - if public setter method exists, call it.
    7. * - if public property exists, set it directly.
    8. * - if the target object is an instance of ArrayAccess, it sets the property
    9. * on it without checking if it existed.
    10. * - else, return FALSE
    11. *
    12. * @param mixed $subject The target object or array
    13. * @param string $propertyName Name of the property to set
    14. * @param mixed $propertyValue Value of the property
    15. * @param boolean $forceDirectAccess directly access property using reflection(!)
    16. * @throws \InvalidArgumentException in case $object was not an object or $propertyName was not a string
    17. * @return boolean TRUE if the property could be set, FALSE otherwise
    18. */
    19. static public function setProperty(&$subject, $propertyName, $propertyValue, $forceDirectAccess = FALSE) {
    20. if (is_array($subject)) {
    21. $subject[$propertyName] = $propertyValue;
    22. return TRUE;
    23. }
    24. if (!is_object($subject)) {
    25. throw new \InvalidArgumentException(('subject must be an object or array, ' . gettype($subject)) . ' given.', 1237301368-);
    26. }
    27. if (!is_string($propertyName)) {
    28. throw new \InvalidArgumentException('Given property name is not of type string.', 1231178878-);
    29. }
    30. if ($forceDirectAccess === TRUE) {
    31. if (property_exists(get_class($subject), $propertyName)) {
    32. $propertyReflection = new \TYPO3\CMS\Extbase\Reflection\PropertyReflection(get_class($subject), $propertyName);
    33. $propertyReflection->setAccessible(TRUE);
    34. $propertyReflection->setValue($subject, $propertyValue);
    35. } else {
    36. $subject->{$propertyName} = $propertyValue;
    37. }
    38. } elseif (is_callable(array($subject, $setterMethodName = self::buildSetterMethodName($propertyName)))) {
    39. $subject->{$setterMethodName}($propertyValue);
    40. } elseif ($subject instanceof \ArrayAccess) {
    41. $subject[$propertyName] = $propertyValue;
    42. } elseif (array_key_exists($propertyName, get_object_vars($subject))) {
    43. $subject->{$propertyName} = $propertyValue;
    44. } else {
    45. return FALSE;
    46. }
    47. return TRUE;
    48. }

    Mir ist schon klar, dass es auch von wo anders kommen kann aber hier schlägt schließlich alles fehl.

    Sehr ärgerlich, schließlich wollte ich mit dem Release von V6 fit sein in der Entwicklung von Extensions.

  • MajPay MajPay
    Jedi-Meister
    0 x
    345 Beiträge
    2 Hilfreiche Beiträge
    06. 09. 2012, 16:44

    Noch ein paar Details (an TYPO3\CMS\Extbase\Reflection\ObjectAccess liegt das Problem mit Sicherheit nicht):

    1. 26 TYPO3\CMS\Extbase\Reflection\ObjectAccess::setProperty(TYPO3\CMS\Extbase\Persistence\Generic\ObjectStorage, 0, "1")
    2. 25 TYPO3\CMS\Extbase\Property\Mapper::map(array, array, TYPO3\CMS\Extbase\Persistence\Generic\ObjectStorage)
    3. 24 TYPO3\CMS\Extbase\Property\Mapper::transformToObject(array, "Tx_Extbase_Persistence_ObjectStorage", "branches")
    4. 23 TYPO3\CMS\Extbase\Property\Mapper::map(array, array, Tx_TestCompany_Domain_Model_Location)
    5. 22 TYPO3\CMS\Extbase\Property\Mapper::transformToObject(array, "Tx_TestCompany_Domain_Model_Location", "--none--")
    6. 21 TYPO3\CMS\Extbase\Property\Mapper::map(array, array, "Tx_TestCompany_Domain_Model_Location")
    7. 20 TYPO3\CMS\Extbase\Mvc\Controller\Argument::transformValue(array)
    8. 19 TYPO3\CMS\Extbase\Mvc\Controller\Argument::setValue(array)
    9. 18 TYPO3\CMS\Extbase\Mvc\Controller\Arguments::__call("setLocation", array)
    10. 17 TYPO3\CMS\Extbase\Mvc\Controller\Arguments::setLocation(array)
    11. 16 TYPO3\CMS\Extbase\Reflection\ObjectAccess::setProperty(TYPO3\CMS\Extbase\Mvc\Controller\Arguments, "location", array)
    12. 15 TYPO3\CMS\Extbase\Property\Mapper::map(array, array, TYPO3\CMS\Extbase\Mvc\Controller\Arguments, array)
    13. 14 TYPO3\CMS\Extbase\Property\Mapper::mapAndValidate(array, array, TYPO3\CMS\Extbase\Mvc\Controller\Arguments, array, TYPO3\CMS\Extbase\Mvc\Controller\ArgumentsValidator)
    14. 13 TYPO3\CMS\Extbase\Mvc\Controller\AbstractController::mapRequestArgumentsToControllerArguments()
    15. 12 TYPO3\CMS\Extbase\Mvc\Controller\ActionController::processRequest(TYPO3\CMS\Extbase\Mvc\Web\Request, TYPO3\CMS\Extbase\Mvc\Web\Response)
    16. 11 TYPO3\CMS\Extbase\Mvc\Dispatcher::dispatch(TYPO3\CMS\Extbase\Mvc\Web\Request, TYPO3\CMS\Extbase\Mvc\Web\Response)
    17. 10 TYPO3\CMS\Extbase\Mvc\Web\FrontendRequestHandler::handleRequest()
    18. 9 TYPO3\CMS\Extbase\Core\Bootstrap::handleWebRequest()

    Hier wirds uninteressant...

  • MajPay MajPay
    Jedi-Meister
    0 x
    345 Beiträge
    2 Hilfreiche Beiträge
    06. 09. 2012, 17:31

    Hier: 13 TYPO3\CMS\Extbase\Mvc\Controller\AbstractController::mapRequestArgumentsToControllerArguments()

    Habe ich das gefunden:
    // @deprecated since Extbase 1.4, will be removed in Extbase 6.0

    da wurde ich aufmerksam.

    1. if ($this->configurationManager->isFeatureEnabled('rewrittenPropertyMapper')) {

    Okay, also mal das feature im setup aktiviert

    1. plugin.tx_[yourExtensionName].features.rewrittenPropertyMapper = 1

    Und nun kommt ein anderer Fehler! Aber der ist mir nach all der Zeit lieber, diese is not string Scheiße konnte ich nicht mehr sehen.

    Also am besten ab der Beta1 für Typo3 6.0 im Setup der Extension das Feature enablen (siehe oben).

    Mein neuer Fehler ist übrigens:

    1. #1297759968: Exception while property mapping at property path "branches":No converter found which can be used to convert from "array" to "Tx_Extbase_Persistence_ObjectStorage". (More information)

  • MajPay MajPay
    Jedi-Meister
    0 x
    345 Beiträge
    2 Hilfreiche Beiträge
    07. 09. 2012, 08:59

    Ich glaube ich habe das Problem spezifiziert:

    In meinem Location Model (das ja die Branches hält) gibt es für die branches einen Setter:

    1. /**
    2.  * Set branches
    3.  *
    4.  * @param Tx_Extbase_Persistence_ObjectStorage $branches One or more Tx_TestCompany_Domain_Model_Branch objects
    5.  * @return void
    6.  */
    7. public function setBranches(Tx_Extbase_Persistence_ObjectStorage $branches) {
    8. $this->branches = $branches;
    9. }

    Aus dem branches Array, das ja so aussieht:
    array (0=>1, 1=>2)

    Kann Extbase nun kein Tx_Extbase_Persistence_ObjectStorage erstellen.

    Dazu würde mein Fehler jetzt ja passen.

    Oder muss der Wert Tx_TestCompany_Domain_Model_Branch:1 bzw. Tx_TestCompany_Domain_Model_Branch:2 sein?
    Die Values wurden aber so generiert.

    Liegt es vielleicht an der AbstractEntity? Den großen Unterschied zwischen der AbstractEntity und dem ValueObject habe ich jetzt nicht verstanden muss ich zugeben, habe alles AbstractEntitys für meine Models genommen.

    Die property ist so deklariert:

    1. /**
    2.  * @var Tx_Extbase_Persistence_ObjectStorage<Tx_TestCompany_Domain_Model_Branch>
    3.  */
    4. protected $branches;

    Von der Idee her sollte das ja stimmen so, oder?

  • MajPay MajPay
    Jedi-Meister
    0 x
    345 Beiträge
    2 Hilfreiche Beiträge
    07. 09. 2012, 10:18

    Um alle Eventualitäten auszuschließen habe ich ein neues System auf meinem Server installiert (da ich zum Testen nur auf XAMPP/Windows arbeite). Dort wollte ich zunächst prüfen ob die blog_example Extension, auf der mein Lern-Buch basiert einwandfrei läuft. Da bekomme ich beim anlegen eines Posts diesen Error:

    Oops, an error occurred!

    transformToObject() accepts only numeric values and arrays.

    Scheint mir ein änliches Problem zu sein, so langsam beginne ich mit dem Gedanken zu spielen, dass es sich dabei um ein Problem der Beta1 handelt.

  • MajPay MajPay
    Jedi-Meister
    0 x
    345 Beiträge
    2 Hilfreiche Beiträge
    11. 09. 2012, 09:58

    Vielleicht erbarmt sich ja jemand und sieht sich meine Extension soweit mal an.

    Ich bin momentan dabei das Admin Plugin im FE zum laufen zu bekommen. Einfach installieren, Static Templates einbinden, Plugin Platzieren, Storage Folder angeben und dann eine neue Company anlegen. Ein paar Branches anlegen. Dann auf die Company klicken und eine Location anlegen, dort kommt dann unter Typo3 6.0 Beta 1 der Fehler, dass das Branches Array nicht in ein Tx_Extbase_Persistence_ObjectStorage Konvertiert werden kann.

    Ich habe schon sicherlich 100 mal meine Models überprüft. Bin schon zig Ebenen durch den Extbase Sourcecode durchgewandert und habe an allen möglichen Stellen gesucht. Ich habe keine Ahnung, warum Extbase den Konverter nicht finden kann, es handelt sich doch nur um ein ObjectStorage, nichts eigenes...

    Im Anhang mein derzeitiger Stand.

    Auf Typo3 6.0A3 lief das
    Auf Typo3 6.0B1 läuft es nicht.

    Anhänge (1)
    test_company.zip application/zip 0,00 B 187 heruntergeladen