[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 ;)


  • frankbi frankbi
    Padawan
    0 x
    57 Beiträge
    0 Hilfreiche Beiträge
    31. 03. 2015, 12:31

    Danke für die Einschätzung! Dann gucke ich mir das mal an. 'Werde ich aber die nächsten Tage wohl nicht schaffen. Ich konzentriere mich erst einmal auf die FlexForm-Lösung.

  • sini sini
    R2-D2
    0 x
    75 Beiträge
    0 Hilfreiche Beiträge
    30. 09. 2015, 15:17

    Ich hab auch grad die nn_address erweitert. Da ist mir bei deinen Dateien was aufgefallen:

    # Extend Example Controller

    1. config.tx_extbase {
    2. objects {
    3. NN\NnAddress\Domain\Model\Person {
    4. className = My\MyExt1\Domain\Model\Person
    5. }
    6. }}

    Du musst ja die Klasse der Extension erweitern, und nicht die TYPO3\CMS\Extbase\DomainObject\AbstractEntity.

    Das gilt auch hier:
    /typo3conf/ext/my_ext1/Classes/Domain/Model/Person.php:

    statt:

    1. class Person extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity {

    so:

    1. class Person extends \NN\NnAddress\Domain\Model\Person {

    Bei mir hat es dann funktioniert und ich konnte die Marker ausgeben. Schon ein bisschen spät, aber vielleicht hilft es ja doch noch irgendjemandem.

  • frankbi frankbi
    Padawan
    0 x
    57 Beiträge
    0 Hilfreiche Beiträge
    07. 10. 2015, 14:34

    Danke sini! Ich bin da momentan total nicht mehr drin, aber sollte es nochmal dazu kommen, schaue ich mal. :)

  • mtness mtness
    Padawan
    0 x
    36 Beiträge
    0 Hilfreiche Beiträge
    05. 05. 2017, 19:28

    Gibt es hier irgendwelche neuen Erkenntnisse?
    Habe hier gerade auch exakt das gleiche Problem...

    Auch mit einer ganz frisch erstellten Extension bekomme ich das Model zwar im Backend erweitert,
    aber bei der dem Object im Frontend fehlen alle erweiterten Felder.

  • mtness mtness
    Padawan
    0 x
    36 Beiträge
    0 Hilfreiche Beiträge
    08. 05. 2017, 14:18

    So, ich habe es tatsächlich so herausgefunden...

    Sehr hilfreich war dieser Link: https://somethingphp.com/extending-classes-typo3/

    Damit das object für das FE auch erweitert wird, hat folgender Part im ext_typoscript setup gefehlt:

    1. config.tx_extbase.objects {
    2. NN\NnAddress\Domain\Model\Person.className = MYVENDOR\Nndb\Domain\Model\Person
    3. NN\NnAddress\Domain\Model\Address.className = MYVENDOR\Nndb\Domain\Model\Address
    4. }

    Dazu müssen dann allerdings noch die Klassen PersonRepository und AddressRepository in der ext vorhanden sein, können aber leer sein.