[Frage] nn_address um Felder erweitern: keine Ausgabe in Fluid (Cross-Posting)

  • frankbi frankbi
    Padawan
    0 x
    57 Beiträge
    0 Hilfreiche Beiträge
    02. 03. 2015, 18:13

    Da ich keine Antwort im forum.typo3.org ([url]http://forum.typo3.org/index.php/m/728496/#msg_728496[/url]) erhalten habe, als Cross-Post nochmal. Sorry, ich komme allein nicht weiter.

    [b]Kurzfassung:[/b]
    Ich habe in TYPO3 6.2.9 per Extension Builder und manuell eine Erweiterung erstellt, um nn_address von Hendrik Reimers ([url]http://docs.typo3.org/typo3cms/extensions/nn_address/[/url]) um eigene Felder zu erweitern. Die Fluid-Ausgabe ist jedoch leer.

    • Die Felder werden in der Tabelle tx_nnaddress_domain_model_person angelegt (zusätzlich ein Feld tx_extbase_type).
    • Im Backend erscheinen die Felder an der gewünschten Stelle. Ich kann Text eintragen und speichern. Die Inhalte sind in der Datenbank enthalten.
    • Das Problem: In der Personen-Ausgabe von NN Address (/typo3conf/ext/nn_address/Resources/Private/Partials/Person/Properties.html, muss ich dann noch updatesicher in meine Extension umbiegen) setze ich die Variable {person.myfield1} zur Ausgabe mit dem neuen Feldnamen, aber im Frontend erscheint nichts
      <f:debug>{person.myfield1}</f:debug> ergibt "NULL", der Inhalt der Condition in Fluid (s. u.) wird nicht ausgeführt.

    Ich bin diverse Foren-Einträge und Tutorials zur Erstellung von Extensions durchgegangen (habe dabei sicherlich nicht alles verstanden), habe nach Fehlermeldungen gesucht, Caches gelöscht, die Erweiterung nochmal installiert/deinstalliert und mehrfach ein Compare im Install-Tool durchgeführt, hänge jetzt aber fest und weiß nicht, warum es keine Ausgabe gibt bzw. welche Voraussetzungen die Fluid-Ausgabe benötigt oder wie NN Address hier funktioniert.
    Ich habe keine wirklichen PHP-Kenntnisse und noch keine "richtige" eigene Extension geschrieben. tt_address konnte ich unter 4.5 aber einfach um Felder erweitern.

    Mir ist bekannt, dass man NN Address sehr einfach über eine Flexform um Felder erweitern kann, möchte aber, dass die neuen Felder alle im Reiter "Allgemein" erscheinen und nicht im Reiter "Erweitert" (und zudem am Beispiel lernen, wie ich Felder einer bestehenden Extension erweitere).

    Hat jemand eine Idee? Wie sollte ich mein Problem anpacken?
    Oder sollte ich als Voraussetzung erst einmal weiter Extensions schreiben lernen und PHP lernen?

    Danke für's Reinschauen.

    Hier hoffentlich relevante Codeausschnitte (sende gern mehr):

    /typo3conf/ext/nn_address/Resources/Private/Partials/Person/Properties.html:

    1. <f:if condition="{person.myfield1}">
    2. <tr>
    3. <td>
    4. <f:translate key="tx_nnaddress_domain_model_person.myfield1" />
    5. </td>
    6. <td>
    7. {person.myfield1}
    8. </td>
    9. </tr>
    10. </f:if>

    /typo3conf/ext/my_ext1/ext_tables.php

    1. <?php
    2. if (!defined('TYPO3_MODE')) {
    3. die('Access denied.');
    4. }
    5. \TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin(
    6. $_EXTKEY,
    7. 'Myext1',
    8. 'NN Address new fields'
    9. );
    10. \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addStaticFile($_EXTKEY, 'Configuration/TypoScript', 'NN Address new fields');
    11. $tempColumns = array(
    12. 'myfield1' => array(
    13. 'exclude' => 1,
    14. 'label' => 'LLL:EXT:my_ext1/Resources/Private/Language/de.locallang_db.xlf:tx_nnaddress_domain_model_person.myfield1',
    15. 'config' => array(
    16. 'type' => 'text',
    17. 'cols' => '40',
    18. 'rows' => '5',
    19. 'wizards' => array(
    20. '_PADDING' => 2,
    21. 'RTE' => array(
    22. 'icon' => 'wizard_rte2.gif',
    23. 'notNewRecords' => 1,
    24. 'RTEonly' => 1,
    25. 'script' => 'wizard_rte.php',
    26. 'title' => 'LLL:EXT:cms/locallang_ttc.xlf:bodytext.W.RTE',
    27. 'type' => 'script',
    28. ),
    29. ),
    30. )
    31. ),
    32. );
    33. \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTCAcolumns('tx_nnaddress_domain_model_person',$tempColumns,1);
    34. \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addToAllTCAtypes('tx_nnaddress_domain_model_person','myfield1','','after:last_name');
    35. $TCA['tx_nnaddress_domain_model_person']['interface']['showRecordFieldList'] .= ',myfield1';
    36. \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::makeCategorizable(
    37. $_EXTKEY,
    38. 'tx_nnaddress_domain_model_person'
    39. );

    /typo3conf/ext/my_ext1/ext_tables.sql:

    1. #
    2. # Table structure for table 'tx_nnaddress_domain_model_person'
    3. #
    4. CREATE TABLE tx_nnaddress_domain_model_person (
    5. myfield1 tinytext NOT NULL,
    6. tx_extbase_type varchar(255) DEFAULT '' NOT NULL,
    7. );
    8. #
    9. # Table structure for table 'tx_nnaddress_domain_model_person'
    10. #
    11. CREATE TABLE tx_nnaddress_domain_model_person (
    12. categories int(11) unsigned DEFAULT '0' NOT NULL,
    13. );

    /typo3conf/ext/my_ext1/ext_typoscript_setup.txt:

    1. config.tx_extbase{
    2. persistence{
    3. classes{
    4. TYPO3\CMS\Extbase\DomainObject\AbstractEntity {
    5. subclasses {
    6. Tx_Myext1_Person = My\MyExt1\Domain\Model\Person
    7. }
    8. }
    9. My\MyExt1\Domain\Model\Person {
    10. mapping {
    11. tableName = tx_nnaddress_domain_model_person
    12. #recordType = Tx_Myext1_Person
    13. }
    14. }
    15. }
    16. }
    17. }

    /typo3conf/ext/my_ext1/Classes/Domain/Model/Person.php:

    1. <?php
    2. namespace My\MyExt1\Domain\Model;
    3. /**
    4. * Person
    5. */
    6. class Person extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity {
    7.  
    8. /**
    9. * myfield1
    10. *
    11. * @var string
    12. */
    13. protected $myfield1 = '';
    14.  
    15. /**
    16. * Returns the myfield1
    17. *
    18. * @return string $myfield1
    19. */
    20. public function getMyfield1() {
    21. return $this->myfield1;
    22. }
    23.  
    24. /**
    25. * Sets the myfield1
    26. *
    27. * @param string $myfield1
    28. * @return void
    29. */
    30. public function setMyfield1($myfield1) {
    31. $this->myfield1 = $myfield1;
    32. }
    33. ...

    /typo3conf/ext/my_ext1/Classes/Domain/Repository/PersonRepository.php

    1. <?php
    2. namespace My\MyExt1\Domain\Repository;
    3. /**
    4. * The repository for Person
    5. */
    6. class PersonRepository extends \TYPO3\CMS\Extbase\Persistence\Repository {
    7. }

  • Hilfreichster Beitrag

  • harald1972 harald197...
    Sternenflotten-Admiral
    1 x
    198 Beiträge
    13 Hilfreiche Beiträge
    04. 03. 2015, 08:14 - Hilfreichster Beitrag

    Nur ...

    Der Backslash bei den Variablen wird auch in NN Address verwendet. "sollte da immer ein führender Backslash hin" heißt auch bei @param und @return?

    Ja, außer bei void. Das sieht dann (beispielhaft) ungefähr so aus:
    1. /**
    2.  * Funktionsname und Beschreibung
    3.  * @param \XYZ\extension\Domain\Model\DeineKlasse $foo
    4.  * @param \TYPO3\CMS\Extbase\Domain\Model\FrontendUser $bak
    5.  * @return \string
    6.  */
    7. protected function deinFunktionsname(\XYZ\extension\Domain\Model\DeineKlasse $foo, \TYPO3\CMS\Extbase\Domain\Model\FrontendUser $bak)
    8. {...}

    Diese Zeilen wurden ursprünglich vom Extension Builder angelegt. Macht der das nicht richtig oder werden da Namespaces nicht berücksichtigt?)

    Der Extension Builder macht dir ein grobes Gerüst. So richtig "richtig" ist das aber nicht.
    Erstmal nehm ich den EB in Schutz: Es ist nicht falsch, was er macht ;) und nimmt doch einiges an Arbeit weg.
    Ab einer bestimmten Version (hab die Nummer nicht im Kopf) berücksichtigt er die Namespaces.

    In deiner ext_tables.sql steht z.B mehrmals...
    CREATE TABLE tx_nnaddress_domain_model_person
    Das ist ein Zeichen dafür, daß eine Objektbeziehung doppelt gemoppelt wurde. Das geschieht immer, wenn ich eine 1:N Beziehung in beiden Richtungen brauch. Z.B. 1 Firma hat N Mitarbeiter. Jeder Mitarbeiter ist in genau 1 Firma.
    Diese erscheinen dann immer irgendwo zweimal -> den überflüssigen entfernen
    Im TCA kriegst du auch doppelte Angaben (die mit passthrough können weg).

    Hab ich was vergessen?
    Ja. Kaffee! Jetzt!
    Bis dann ;)


  • harald1972 harald197...
    Sternenflotten-Admiral
    0 x
    198 Beiträge
    13 Hilfreiche Beiträge
    02. 03. 2015, 23:50

    Nabend,
    so auf den ersten Blick würd ich mal sagen...

    1. /**
    2. * myfield1
    3. *
    4. * @var \string // imho sollte da immer ein führender Backslash hin
    5. */
    6. protected $myfield1; // das weglassen = '';

    So weit ich weiß, müssen die Kommentar-Angaben auch bei einfachen Variablen den führenden Backslash haben.
    Die Zuweisung auf Leerstring würde ich weglassen. Stattdessen da rein (ext_tables.sql)

    myfield1 tinytext DEFAULT '' NOT NULL

    Ob das bei deinem Probem hilft, kann ich aber nicht sagen ;)


  • 0 x
    03. 03. 2015, 09:23

    Hast du denn auch den richtigen Extbase Type ausgewählt ?
    Haralds Anmerkungen sind zwar weitestgehend korrekt ( ich glaube aber der Backslash ist nicht nötig ;) ), dürften mit deinem Problem aber nichts zu tun haben.

    Gruß

  • frankbi frankbi
    Padawan
    0 x
    57 Beiträge
    0 Hilfreiche Beiträge
    03. 03. 2015, 17:23

    Danke Harald! Dein Feedback macht wieder Hoffnung, großartig. :)

    Leider aber haben die Änderungen nichts bewirkt.
    DB-Felder werden zwar angelegt und können gefüllt werden, aber die Debug-Ausgabe im FE ist nach wie vor "NULL".

    DEFAULT '' NOT NULL hatte ich auch schon mal, meine ich ... Ändert sich offenbar nichts.

    Der Backslash bei den Variablen wird auch in NN Address verwendet. "sollte da immer ein führender Backslash hin" heißt auch bei @param und @return? (Sorry, habe keinen Schnall ... Diese Zeilen wurden ursprünglich vom Extension Builder angelegt. Macht der das nicht richtig oder werden da Namespaces nicht berücksichtigt?)

    Eine Änderung gibt es übrigens doch: Im Compare-Tool erscheint, trotz mehrfachem "Execute" immer wieder: ALTER TABLE tx_nnaddress_domain_model_person CHANGE myfield1 myfield1 tinytext default '';
    Current value: tinytext. Aber die Tabelle wird ja geschrieben. Da wird es wohl nicht liegen.

  • frankbi frankbi
    Padawan
    0 x
    57 Beiträge
    0 Hilfreiche Beiträge
    03. 03. 2015, 18:13

    Danke zooloohed! Deine Nachricht habe ich erst jetzt gesehen ... noch mehr Hoffnung! :)

    Welchen "Extbase Type"? Das Feld "tx_extbase_type"? Das hat mir der Extension Builder angelegt und ich weiß nicht wozu es notwendig ist. Hier finde ich etwas dazu, weiß aber nicht, wie ich es bei mir umsetze:
    [url]http://forum.typo3.org/index.php?t=msg&th=196825&goto=685766&#msg_685766[/url].

    "Be sure to set this in the place you have the ctr section defined:

    1. $TCA= array(
    2. ...
    3. 'type' => 'tx_extbase_type',
    4. ...
    5. )

    "

    Wo ist eine "ctr section"? Oder ist $TCA['tx_nnaddress_domain_model_person']['ctrl'] gemeint?

    Oder sollte ich sowas in der Art in der ext_tables.php hinzufügen (etwas weiter oben im Forums-Beitrag gelistet)? Wozu ist da die Sprache gut, wenn ich das Feld doch selber gar nicht benutzen will?:

    1. $tempColumns = array(
    2. ...
    3. 'tx_extbase_type' => array(
    4. 'exclude' => 1,
    5. 'label' =>
    6. 'LLL:EXT:extbase/Resources/Private/Language/locallang_db.xml:fe_users.tx_extbase_type',
    7. 'config' => array(
    8. 'type' => 'select',
    9. 'items' => array(
    10. array('LLL:EXT:extbase/Resources/Private/Language/locallang_db.xml:fe_users.tx_extbase_type.0',
    11. '0'),
    12. array('LLL:EXT:extbase/Resources/Private/Language/locallang_db.xml:fe_users.tx_extbase_type.Tx_Extbase_Domain_Model_FrontendUser',
    13. 'Tx_Extbase_Domain_Model_FrontendUser')
    14. ),
    15. 'size' => 1,
    16. 'maxitems' => 1,
    17. 'default' => '0'
    18. )
    19. )
    20. );

  • frankbi frankbi
    Padawan
    0 x
    57 Beiträge
    0 Hilfreiche Beiträge
    03. 03. 2015, 19:17

    Vermutlich hilft mir das hier (betreffend 6.1): http://www.typo3.net/forum/thematik/zeige/thema/114183/?
    Ich habe den Code teilweise entsprechend der Lösung am Ende angepasst, ohne es wirklich zu verstehen, aber leider keine Änderung mit Folgendem:

    ext_tables.php ctrl type zugewiesen und tx_extbase_type-Feld definiert:

    1. ...
    2. $TCA['tx_nnaddress_domain_model_person']['ctrl']['type'] = 'tx_extbase_type';
    3. ...
    4. $tempColumns = array(
    5. ...
    6. 'tx_extbase_type' => array(
    7. 'config' => array(
    8. 'type' => 'input',
    9. 'default' => '0'
    10. )
    11. )

    ext_tables.sql Wert '0' statt leer vergeben:

    1. ...
    2. tx_extbase_type varchar(255) DEFAULT '0' NOT NULL,

    ext_typoscript_setup.txt "recordType = 0" eingefügt:

    1. mapping {
    2. tableName = tx_nnaddress_domain_model_person
    3. recordType = 0
    4. }

  • harald1972 harald197...
    Sternenflotten-Admiral
    1 x
    198 Beiträge
    13 Hilfreiche Beiträge
    04. 03. 2015, 08:14

    Nur ...

    Der Backslash bei den Variablen wird auch in NN Address verwendet. "sollte da immer ein führender Backslash hin" heißt auch bei @param und @return?

    Ja, außer bei void. Das sieht dann (beispielhaft) ungefähr so aus:
    1. /**
    2.  * Funktionsname und Beschreibung
    3.  * @param \XYZ\extension\Domain\Model\DeineKlasse $foo
    4.  * @param \TYPO3\CMS\Extbase\Domain\Model\FrontendUser $bak
    5.  * @return \string
    6.  */
    7. protected function deinFunktionsname(\XYZ\extension\Domain\Model\DeineKlasse $foo, \TYPO3\CMS\Extbase\Domain\Model\FrontendUser $bak)
    8. {...}

    Diese Zeilen wurden ursprünglich vom Extension Builder angelegt. Macht der das nicht richtig oder werden da Namespaces nicht berücksichtigt?)

    Der Extension Builder macht dir ein grobes Gerüst. So richtig "richtig" ist das aber nicht.
    Erstmal nehm ich den EB in Schutz: Es ist nicht falsch, was er macht ;) und nimmt doch einiges an Arbeit weg.
    Ab einer bestimmten Version (hab die Nummer nicht im Kopf) berücksichtigt er die Namespaces.

    In deiner ext_tables.sql steht z.B mehrmals...
    CREATE TABLE tx_nnaddress_domain_model_person
    Das ist ein Zeichen dafür, daß eine Objektbeziehung doppelt gemoppelt wurde. Das geschieht immer, wenn ich eine 1:N Beziehung in beiden Richtungen brauch. Z.B. 1 Firma hat N Mitarbeiter. Jeder Mitarbeiter ist in genau 1 Firma.
    Diese erscheinen dann immer irgendwo zweimal -> den überflüssigen entfernen
    Im TCA kriegst du auch doppelte Angaben (die mit passthrough können weg).

    Hab ich was vergessen?
    Ja. Kaffee! Jetzt!
    Bis dann ;)


  • 0 x
    04. 03. 2015, 09:24

    Als ich mir das letzte mal ein Model mit dem EB erweitert habe, hat er mir auch den Extbase Type angelegt. Dieser wird mir im Backend auch angezeigt als Select, in dem ich entweder die Eltern-Klasse oder aber die erweiternde Klasse auswählen kann. Erst wenn ich dann die erweiternde Klasse auswähle (und speichere?), wird mir auch das zusätzliche Feld angezeigt. Ich hatte dazu mal irgendwo eine Minimalextension rumliegen, an der man sich das angucken kann, die muss ich allerdings erstmal suchen ;)

  • frankbi frankbi
    Padawan
    0 x
    57 Beiträge
    0 Hilfreiche Beiträge
    04. 03. 2015, 13:17

    @harald1972:
    Danke Harald für die weiteren Erläuterungen und das Beispiel zum Ext Builder. Und einen guten Morgen-Kaffee! :)
    Sinngemäß doppelte SQL- und TCA-Angaben hatte ich nicht, soweit ich erinnere. "CREATE TABLE tx_nnaddress_domain_model_person" muss es doch mehrfach geben, für jedes neue Feld, oder? Den Backslash habe ich umgesetzt. Wie erwartet keinen Erfolg leider.

    "Namespaced classes" sind für den Extension Builder (mindestens) für die Version 6.2.0 (May 12, 2014) als Feature notiert: http://typo3.org/extensions/repository/view/extension_builder.

    @zooloohed: Danke, für mich nochmal Anlass zu rekapitulieren. Ich bin damals auch zu der Select-Box im BE gekommen. Da mir das "falsch" erschien habe ich (anhand von diesem Beispiel: http://keinerweiss.de/525-die-extbase-extension-news-um-ein-feld-erweitern.html) so lang manuell in den Ext.-Dateien rumgebastelt, bis ich die Felder funktionierend und "sauber" im BE hatte, aber eben keine Fluid-Ausgabe.

    Ich habe nur eine Option in der Select-Box, die Elternklasse. Wenn ich das BE-Formular speichere trägt er einen Wert im Feld "tx_extbase_type" in die DB ein, die Felder werden in einem neuen Reiter mit Name der Elternklasse angezeigt und werden in die DB eingetragen. Es gibt jedoch leider wieder keine Ausgabe (Feld-Variablen sind im Partial eingetragen). (Manuell habe ich jetzt nichts mehr angepasst.)

    Sollte in der Select-Box mehr als ein Eintrag auftauchen? Habe ich da vielleicht die Erstellung meines Models nicht verstanden? (Die Anleitung unter http://docs.typo3.org/typo3cms/extensions/extension_builder/Developer/ExtendingModels.html ist für mich vmtl. zu kurz gehalten.)
    Oder muss ich noch manuell was anpassen?

    Wenn Du da eine funktionierende "Erweiterungs-Erweiterung" als Beispiel hast, zooloohed, würde ich mich freuen. :)

  • harald1972 harald197...
    Sternenflotten-Admiral
    1 x
    198 Beiträge
    13 Hilfreiche Beiträge
    07. 03. 2015, 13:53

    Hab das grad nochmal gelesen...

    Das Problem: In der Personen-Ausgabe von NN Address (/typo3conf/ext/nn_address/Resources/Private/Partials/Person/Properties.html, muss ich dann noch updatesicher in meine Extension umbiegen) setze ich die Variable {person.myfield1} zur Ausgabe mit dem neuen Feldnamen, aber im Frontend erscheint nichts
    <f:debug>{person.myfield1}</f:debug> ergibt "NULL", der Inhalt der Condition in Fluid (s. u.) wird nicht ausgeführt.

    Kennt die Properties.html die Variable person ?

    1. <f:debug>{person}</f:debug>

    ...?
    Die muss aus der new (oder wo immer du herkommst) mitgeliefert werden:

    1. <f:render partial="Person/Properties" arguments="{person: person}" />

    "CREATE TABLE tx_nnaddress_domain_model_person" muss es doch mehrfach geben, für jedes neue Feld, oder?

    CREATE TABLE muss es für jede Tabelle nur einmal geben. Darin muss dann jede Spalte angegeben werden. Soviel ich weiß, schadet's aber nicht, wenn du mehrere CREATE TABLE hast. Ist nur ein Indiz dafür, daß der Ext.Builder sich irgendwo verschluckt hat (oder zuviel ausspuckt).