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


  • fuzz fuzz
    Jedi-Meister
    0 x
    291 Beiträge
    5 Hilfreiche Beiträge
    09. 03. 2015, 11:57

    Moin,

    generell kannst du ja auch über Flexforms in der nn_address Felder erweitern. Ansonsten könnte deine Lösung vielleicht für zukünftige Versionen oder die Doku interessant sein. Wenn du soweit bist kannst dich ja einfach mal direkt bei mir melden.

    E-Mail steht direkt in der Doku oder unter [url]http://www.kern23.de[/url]

    Danke & Gruß

    TypoScript kann alles, auch kochen! ...Man muss nur wissen wie ;-)

    Take a look at my TYPO3 Extensions in the Repository:
    content_designer, k23_imagecrop, nn_address and more...

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

    @Harald: Danke für den Hinweis ... das könnte in die richtige Richtung gehen:

    Zitiert von: harald1972

    Kennt die Properties.html die Variable person ?
    1. <f:debug>{person}</f:debug>

    ...?

    Ja, die Properties.html von nn_address (/typo3conf/ext/nn_address/Resources/Private/Partials/Person/Properties.html) kennt {person} und gibt mir per Debug alles außer meine neuen Felder aus.

    Zitiert von: harald1972

    Die muss aus der new (oder wo immer du herkommst) mitgeliefert werden:
    1. <f:render partial="Person/Properties" arguments="{person: person}" />

    Jetzt doof gefragt: Wie kriege ich myfield1 in person, wo komme ich her? Ich habe eine /typo3conf/ext/my_ext/Resources/Private/Templates/Person/New.html in meiner Ext., aber die wird ja nicht genutzt. Es geht ja 'nur' darum, neue Felder zu erstellen und diese an die Fluid-Ausgabe von NN Address zu übergeben (also keinerlei Ausgabe über meine Ext.)? Ich dachte, durch meine Erweiterung werden meine Variablen an {person} bereits übergeben. Da verstehe ich aber die Abläufe nicht.

    @zooloohed und @Harald: Danke wg. der Erläuterungen zu CREATE und dem Ext. Builder. Nachvollziehbar und gut zu wissen.

    @fuzz: Ja, Flexform-Lösung ist mir bekannt und habe ich kurz begonnen, gibt aber gerade auch keine Ausgabe *rolleyes* ... Doku finde ich gut, hatte ich auch schon dran gedacht, aber wenn jemand anderes das vorschlägt ist man noch ganz anders motiviert. :) Danke. Ich hoffe nur, ich kriege einen Lösung hin und kann was beitragen. Melde mich.


  • 1 x
    10. 03. 2015, 09:10

    Oh... ich sehe gerade, dass du die Klasse nn_address_person gar nicht erweiterst, sondern die AbstractEntity. So kann das natürlich auch gar nicht funktionieren.

    Das Problem das du hast, ist folgendes:
    Du versuchst nn_person zu erweitern mit deiner_person. Du gibst bei der Klassen-Definition von deiner_person aber gar nicht an, dass du nn_person erweitern möchtest. Du hast lediglich das Table-Mapping dafür definiert.

    Außerdem musst du dann bei deinen Datensätzen von Person auswählen, welchen Extbase Type (nn_person oder deine_person) diese Person haben soll. nn_person kennt deine Attribute tatsächlich nicht (woher auch?). deine_person hingegen kennt alle Attribute von nn_person UND deiner_person. Also musst du den extbase type dann auch noch auf deine_person einstellen (im Backend dann, wenn alles richtig angelegt und konfiguriert ist).

    Wenn du f:debug auf {person} anwendest, dann steht im Debug Title als Objekt Typ sicherlich, nn_person, oder?

    Sende mir mal deine Mail-Adresse per PN. Dann schicke ich dir meine Beispiel-Extension, vielleicht findest du dort, was dir fehlt ;) Oder ich versuche mal, sie hier hochzuladen.

    Anhänge (1)
    ABextensions.rar application/x-rar 0,00 B 69 heruntergeladen
  • harald1972 harald197...
    Sternenflotten-Admiral
    1 x
    198 Beiträge
    13 Hilfreiche Beiträge
    10. 03. 2015, 09:20

    Also gut... eins nach dem anderen...

    [i]" Wie kriege ich myfield1 in person"[/i] ?
    Durch die Definition im Model (Classes/Domain/Model/Person.php Zeilen 8-13, s.o.)

    [i]"wo komme ich her?"[/i]
    Das habe ich mich auch schon gefragt ;) ... weil du geschrieben hattest
    [i]"In der Personen-Ausgabe von NN Address (/typo3conf/ext/nn_address/Resources/Private/Partials/Person/Properties.html) setze ich die Variable"[/i]

    Die "Ausgabe" klingt nach der showAction. Weil diese aber nur die Properties anzeigt und kein Formular, kannst du dort auch nichts eingeben oder setzen.
    Ein Eingabe-Formular hast du in der newAction bzw. editAction - standardmäßig rendern beide das selbe Partial FormFields.html.

    Die newAction (das HTML-Formular) enthält aus PHP eine person=NULL; die editAction will eine Person, die es schon gibt, also zuvor schon persisitiert wurde = in der DB steht... new validiert nicht, edit schon.
    Beide tun so etwas:

    1. $this->view->assign('person', $person);

    Damit kennt die View die Variable (und kann mit fluid verarbeitet werden).
    An der Stelle ist die Variable aber erst bis zur new.html, edit.html bzw. show.html durchgedrungen.
    Das Partial als eigenständige Datei kennt sie (noch) nicht. Deshalb musst du den Partials auch immer alle relevanten Variablen mitgeben.

    Die nn_address (ich hatte damit noch nicht zu tun) zu erweiteren, sollte prinzipiell nicht anders gehen, als z.B. die feuser - mit der hab ich scho ein paar Erweiterungen vollbracht.

    Achja! Da fällt mir was ein. Du hast ja deine Datensätze (die Personen/Adressen) irgendwo im BE (SysOrdner) gespeichert. Wenn du diese als eine bestimmte Extbase-Klasse behandeln willst, musst du diesen Datensätzen auch sagen, daß sie von der entsprechenden Klasse sind.
    Bei den feusers musste ich noch eine Fe-Usergroup dazu einrichten.
    Zu nn_address kann ich nichts spezielles sagen, aber vielleicht ists da ja ähnlich.

    P.S.: Der ExtensionBuilder schreibt in die new.html die Variable 'newPerson', in die edit aber nur 'person'. Die FormFields.html will eine Variable 'person'.
    Entweder du änderst in das der new.html beim Aufruf des Partial derart

    1. attributes="{person: newPerson}"

    oder du machst aus allen 'newVariablenname' nur 'variablenname'.
    (Noch so ein Fallstrick vom E.B. der mir grad noch eingefallen ist)

  • harald1972 harald197...
    Sternenflotten-Admiral
    0 x
    198 Beiträge
    13 Hilfreiche Beiträge
    10. 03. 2015, 11:13

    Jetzt guten Morgen!
    Menno, zooloohed! Du warst schneller ;)

    Du versuchst nn_person zu erweitern mit deiner_person. Du gibst bei der Klassen-Definition von deiner_person aber gar nicht an, dass du nn_person erweitern möchtest. Du hast lediglich das Table-Mapping dafür definiert.

    Korrekt!
    (Hatte ich übersehen)

    Außerdem musst du dann bei deinen Datensätzen von Person auswählen, welchen Extbase Type (nn_person oder deine_person) diese Person haben soll.

    Yep. Das hab ich auch gesagt.


  • 0 x
    10. 03. 2015, 15:37

    Ja.. manchmal sieht man den Wald vor lauter Bäumen nicht. Hoffentlich klappt das nun ;)

  • frankbi frankbi
    Padawan
    0 x
    57 Beiträge
    0 Hilfreiche Beiträge
    10. 03. 2015, 21:40

    Danke für Eure fleißigen Antworten! Super!

    Ich habe meine Ext. angepasst, s. u., es bleibt jedoch wie gehabt. Die Sache mit dem Extbase Type verstehe ich allerdings nicht. Im Einzelnen:

    @zooloohed: Danke auch für die Erweiterung. Ich habe mir verschiedene Stellen angeschaut und im Ext. Builder gesehen, dass es ja super schlicht ist, ohne die zu erweiternde Klasse anzugeben etc. (ich habe auch noch ein zweites Model in meiner Ext, das hatte ich mir irgendwo abgeguckt ...). Das wird mir mit Sicherheit noch helfen, aber ich fürchte, ich kriege das im Ganzen nicht auf meinen Fall übertragen ... vielleicht nochmal mit einem frischen Anlauf.

    Zitiert von:
    Außerdem musst du dann bei deinen Datensätzen von Person auswählen, welchen Extbase Type (nn_person oder deine_person) diese Person haben soll. nn_person kennt deine Attribute tatsächlich nicht (woher auch?). deine_person hingegen kennt alle Attribute von nn_person UND deiner_person. Also musst du den extbase type dann auch noch auf deine_person einstellen (im Backend dann, wenn alles richtig angelegt und konfiguriert ist).

    Ich weiß nicht, was dieser ominöse Extbase Type ist. :) Ich hatte schon letzten Woche nachgeschlagen und gesucht, aber nichts Brauchbares gefunden, was ich hätte verstehen können. Ich bekomme eine neue Spalte extbase_type in der DB und in der ext_tables.php wird für NN Address ein "Type" zugewiesen: "$GLOBALS['TCA']['tx_nnaddress_domain_model_person']['ctrl']['type'] = 'tx_extbase_type';", aber im Backend habe ich das noch nie gesehen. Was ist das bzw. wo kann ich dazu lesen und wo finde ich das im BE? Scheitert es daran, dass meine Felder nicht in {person} auftauchen?

    Darf das hier im TCA stehen?:

    1. $TCA['tx_nnaddress_domain_model_person']['columns']['tx_extbase_type']['config']['items']['0']['1'] = 'Tx_MyExt_Person';

    Oder darf da meine Ext gar nicht auftauchen?

    Die AbstractEntity habe ich durch das Model von NN Address ersetzt (hatte ich früher auch schon mal, es zeigte keine Auswirkungen, dann weiß ich aber, dass ich da richtig gedacht hatte):

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

    Zitiert von:

    Wenn du f:debug auf {person} anwendest, dann steht im Debug Title als Objekt Typ sicherlich, nn_person, oder?

    Ja, genau, nicht im Title (= "Extbase Variable Dump"), aber 1. Zeile: NN\NnAddress\Domain\Model\Person.

    @harald: Tut mir leid, dass zooloohed das Rennen gewonnen hat, aber Du hattest den längeren Wagen. ;) Danke für das Hintergrundwissen.

    'newPerson' habe ich durch 'person' ersetzt (wird in EB-Fallstrick-Sammlung aufgenommen). Aber warum spielen meine Templates/Partials hier überhaupt eine Rolle? Die Ausgabe findet doch komplett über NN Address statt. Die Ausgabe will ich nicht neu machen, nur neue Felder in NN Address bringen.

    Zitiert von: harald1972

    An der Stelle ist die Variable aber erst bis zur new.html, edit.html bzw. show.html durchgedrungen.
    Das Partial als eigenständige Datei kennt sie (noch) nicht. Deshalb musst du den Partials auch immer alle relevanten Variablen mitgeben.

    Das verstehe ich. Aber das Template von NN Address hat {person} ja bereits und wenn meine neuen Felder nun mit extends Nn\NnAddress\Domain\Model in {person} erscheinen (was sie sollten, aber nicht tun), dann wären diese doch bereits mitgegeben und ich muss nichts an die Partials übergeben? NN Address macht ja für mich die View, nicht meine Ext., oder?
    In diesem Fall würde etwas bei der Definition im Model nicht stimmen, aber ich sehe dort prinzipiell nicht ... außer mein zweites Model. Aber das dürfte ja nicht stören?


  • 0 x
    11. 03. 2015, 09:21

    Moin,

    ich habe mir das gerade nochmal angeschaut, und ich bin mir nun ziemlich sicher, dass der Hund in deiner ext_tables.php (also aus deiner Extension) begraben ist. Schau dir dazu am besten nochmal die ext_tables.php aus meiner BExtension an.

    Dort wird unter anderem das extbase_type field für die zu erweiternde Klasse im TCA angelegt. Hab grad nicht so viel Zeit, daher kann ich dir nur empfehlen, die Struktur der ext_tables.php meiner Bextension auf deine Extension zu übertragen ;) Vielleicht hab ich heute abend mehr Zeit.

    Gruß

  • frankbi frankbi
    Padawan
    0 x
    57 Beiträge
    0 Hilfreiche Beiträge
    11. 03. 2015, 10:50

    Danke zooloohed, kein Problem wg. Zeit, das ist eh schon alles total nett ...

    Ich habe mit frischerem Kopf nun nochmal einige Dateien mit Deiner Ext. abgeglichen und einige wohl falsche Einträge korrigiert. In der ext_tables.php habe ich, Zeile für Zeile, nichts entdeckt, nur die Angaben zu meinem zweiten Model auskommentiert. Leider alles erfolglos.
    Ich werde als nächstes mal meine Ext. nach Deiner Ext. neu anlegen ... oder auf Basis Deiner Ext. eine eigene Ext. auf NN Address anpassen.

    Änderungen/Ergänzungen bisher:

    Darf das hier im TCA stehen?:
    $TCA['tx_nnaddress_domain_model_person']['columns']['tx_extbase_type']['config']['items']['0']['1'] = 'Tx_MyExt_Person';

    Offenbar ja, denn in Deiner Ext. ist es auch so. War auch nur ohne Verstand spät abends und unterzuckert drin rumgestochert ... :)

    Es muss hinter \Model\ noch der Name des Models "Person" stehen:

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

    ext_typoscript_setup.txt muss statt "classes{TYPO3\...\AbstractEntity" lauten:

    1. config.tx_extbase{
    2. persistence{
    3. classes{
    4. Nn\NnAddress\Domain\Model\Person {...

    Darf mein Erweiterungs-Model eigentlich überhaupt "Person" heißen, wenn NN Address Model schon "Person" heißt? Ich dachte zu Beginn, das müsste sogar. In Deiner Ext. ist es nicht so.