[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
    11. 03. 2015, 13:42

    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?

    Jede zu rendernde fluid/html-Datei benötigt die Variablen, die sie verarbeiten soll... logisch, oder?
    Wenn z.B. die show.html eine Partial/Person/Properties.html aufrufen soll, muss diese alle relevanten Variablen an jene übergeben. Alles was in einem übergebenen Objekt oder Array drin steckt, ist dann auch dort zu sehen, z.B. {person.vorname} oder gar {person.haustiere.1} usw... Aber um an den Vornamen oder die Haustiere zu kommen, muss auch das Pertial die Person kennen.

    Ich weiß nicht, was NN-Address tut - aber auch diese Ext. muss es "richtig" tun ;) - und DU musst sie eventuell konfigurieren :D Leider kann ich dir dabei nicht helfen. :|

    Ich weiß nicht, was dieser ominöse Extbase Type ist.

    Wenn soweit mal alles stimmt, daß du entweder eine erkennbare Extbase-Klasse geschrieben oder besser gesagt, eine Extension installiert hast, die Extbase-Klassen verwendet - das kann eine eigene sein, oder z.B. nn_address, dann kannst du (und musst sogar, damit bestimmte Dinge funktionieren) im Backend einstellen, daß hier diese Datensätze (Personen) auch als entsprechende Extbase-Klasse betrachtet werden.
    Langer Satz - ich hoffe, verständlich genug.

    Wie und wo?
    1.) Backend - Listenansicht - SysOrdner wählen, in dem die entsprechenden Datensätze (die Personen... sind das bei dir FE-User?) stehen. Jede davon auswählen (bearbeiten) - auf den Reiter "Erweitert" - Selectfeld Datensatztyp.
    Da steht er, der Typ. Im Falle FE-User wäre das Tx_Extbase_Domain_Model_FrontendUser.
    2.) Das gleiche für die Usergroup. In meinem Beispiel ist das dann Tx_Extbase_Domain_Model_FrontendUserGroup. Analog dazu heißen die bei dir wohl entsprechend anders.
    ... aber das ist egal. Wenn du soweit bist, wirst du es sehen. Es ist ein Select-Feld, oder auf deutsch "zum auswählen" ;)

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

    @zooloohed: Danke für die fixe Antwort. Ja, Logo: namespace macht die Unterscheidung. :)

    Zitiert von:
    Hast du sonst mal versucht, direkt mit dem ExtensionBuilder die vorhandene Klasse zu erweitern? So habe ich es nämlich bei den ABExtensions gemacht, und ich glaube bis auf eine oder zwei Zeilen hat das dann direkt funktioniert.

    Ja, das hatte ich ganz zu Beginn anhand einer Anleitung. Aber Deine Ext. sieht halt anders aus. Daher will ich es nochmal im Abgleich mit Deiner Ext. von vorn versuchen. (Ich musste jetzt mal die alternative FlexForm-Lösung parallel in Gang bringen, damit ich was zeigen kann ... und bin dabei ewig auf einen Bug bei der Übersetzung mit den XLF-Dateien reingefallen. :( )

    @harald: Danke für die ausführliche Antwort und die Anleitung! Bei FE-User muss anders funktionieren ... Ich habe definitiv kein Select-Feld. Der Reiter "Erweitert" der jeweiligen Personendatensätze (nein, keine FE-User) im SysOrdner ist nnaddress-spezifisch und enthält die Flexform (s. o.).
    Auch wenn ich in der Listenansicht über das "+" weitere Felder setze, sehe ich dort nichts mit extbase_type (aber einige leere Zeilen). In der DB gibt es die Spalte wenn ich meine Erweiterungs-Erweiterung installiere (war vorher nicht vorhanden). "Usergroups" heißen "Gruppe/group". Dort gibt es aber auch keinen extbase_type, auch in der DB nicht.

    Ein Drop-Down-Feld gibt es nur im Reiter "Allgemein" (allgemeine Personendaten). Dort kann man nur die eigene Ext. auswählen (weiter oben beschrieben).

    "Extbase Type" ist also sowas wie eine "Markierung" am Datensatz, um dem Datensatz zu sagen (hier Person und die zugehörige Gruppe): "Du bist extbase, also immer schön bei deiner Klasse bleiben." (klingt nach Schulausflug und kleinen Kindern mit Schal und Rucksack :) )
    Aber darum müsste sich NN Address ja schon ausreichend gekümmert haben. Sonst würde NN Address mit den Standardfelder ja gar nicht laufen?! (Ich "hänge" mich ja nur mit neuen Felder und nicht mit neuen Datensatz-Typen oder neuen Funktionen rein.) Warum hat NN Address kein "Extbase Type" oder sehe ich es nicht? (Zudem: Wenn ein Redakteur einen neuen Datensatz erstellt, müsste er im BE den "Extbase Type" auswählen? Das wäre eine potentielle Fehlerquelle ...)

    Das mit den Variablen leuchtet mir ein. Das kann man ja schön über den ViewHelper <f:debug> verfolgen. Gleichzeitig muss man ggf. auch überprüfen ob die eine Datei die andere kennt. Das ist aber immer schwer nachzuvollziehen, wenn TYPO3 "automatisch" Dateien einliest ...

    – Aber ich werde zoolooheds Ext. und den Ext. Builder nochmal bemühen und berichten ... Danke soweit!

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

    Ich habe mit dem Ext. Builder nach Vorbild von zoolooheds BExtension eine Erweiterung erstellt. Leider ist alles wie vorher – mit dem kleinen Unterschied, dass in der DB bei "tx_extbase_type" nun "Tx_Ext_ModelB" steht (also mein Model) – nur bekomme ich wieder keine Ausgabe in Fluid.

    Im BE erscheint nach Installation ein Select-Feld der Name der Extension. Wenn ich den Datensatz einmal speichere erscheint der Tab mit dem Namen meines Models und dem Feld. Dies fülle ich aus und speichere es. Es wird in der DB eingetragen. Das Partial Properties.html, also die Fluid-Ausgabe gibt mit <f:debug>{person.myfield1}</f:debug> wieder NULL aus, meine Variable wird nicht im Modell aufgenommen.

    Ich habe meine neue Ext. mit zoolooheds nochmal abgeglichen und nur in der ext_tables.sql "DEFAULT '' " hinzugefügt. Sonst ist alles gleich (zumindest bei den von mir im ersten Beitrag geposteten Datei-Ausschnitten). Namespaces stimmen. Controller interessiert ja nicht, oder?

    Ich vermute also, dass noch irgendwas mit dem Extbase Type ist (s. o.) oder dass irgendwas in NN Address besonders ist.

    Hat noch wer eine Idee wo ich schauen könnte?


  • 0 x
    17. 03. 2015, 09:18

    Langsam gehen mir auch die Ideen aus .. :D
    Hattest du dein Table Mapping entsprechend in deiner Extension angepasst ?

    Das müsste analog hier zu aussehen:

    1. config.tx_extbase{
    2. persistence{
    3. classes{
    4.  
    5. Sb\Aextension\Domain\Model\ModelA {
    6. subclasses {
    7. Tx_Bextension_ModelB = Sb\Bextension\Domain\Model\ModelB
    8.  
    9. }
    10. }
    11. Sb\Bextension\Domain\Model\ModelB {
    12. mapping {
    13. tableName = tx_aextension_domain_model_modela
    14. recordType = Tx_Bextension_ModelB
    15. }
    16. }
    17.  
    18. }
    19. }
    20. }

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

    Danke zooloohed, das hatte ich mit Deiner Ext. verglichen und jetzt nochmal ... ist analog.

    Ich bin auch nochmal alle Beiträge für meine Frage durchgegangen. Jetzt bin ich auch mit Ideen am Ende. Schade. Vielleicht versuche ich es mal mit der Erweiterung einer anderen Ext., um mal ein Erfolgserlebnis zu haben ...

    Ich dachte dann noch, vielleicht hat jmd. mittlerweile eine Ext. geschrieben, um Felder von NN Address zu erweitern (wie für tt_address). Im Repository finde ich keine entsprechende Ext. Aber eine Ext. namens "Extender" ([url]http://docs.typo3.org/typo3cms/extensions/extender/Introduction/Index.html[/url]), die sagt Folgendes: "As it is not possible to extend domain models in extbase directly its sometimes not possible to add properties and methods to a model. This is valid for all cases where the domain model is given as an type hint to an action. ..." Den Rest, inkl. "type hint to an action" verstehe nicht, aber könnte das mein Problem mit NN Address sein?


  • 1 x
    23. 03. 2015, 09:55

    Moin,

    ich habe mir am Wochenende mal die nn_address runtergeladen und eine Extension mit dem EB erstellt, um das Person Model zu erweitern. Das hat auch einwandfrei funktioniert, und ich glaube nun weiß ich, was dein Problem ist ;)

    Du nutzt vermutlich weiterhin die Plugins von nn_address. Diese Plugins nutzen logischerweise die Repositories von nn_address. Das PersonRepository von nn_address dürfte dir daher Datensätze vom Typ nn_address_person zurückgeben. Diese Klasse kennt aber deine Attribute nicht. Wenn du deine_person Datensätze mit einem eigenen Plugin (und aus deinem_repository) ausgibst, wirst du sehen, dass deine eigenen Attribute ansprechbar sind und funktionieren.

    Leider habe ich nun keine Ahnung, wie man das lösen könnte, ohne nn_address selbst anzufassen. Am Ende dürfte es jedes mal daran scheitern, dass das nn_address_person model die setter und getter nicht kenntund dies auch nicht tun wird, sofern man die Klasse selbst nicht anfasst.

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

    Oh man, danke für das Ausprobieren und die Erklärungen! :)

    Ja, ich will die Plugins von NN Address nutzen. Gibt es noch andere Gründe die Felder erweitern zu wollen? Da bin ich noch gar nicht drauf gekommen. Ich dachte, dass meine Erweiterung "irgendwie" die Klasse von NN Address erweitert und ihr meine Attribute beibringt ...

    Dann hieße es, dass NN Address (und auch andere Extbase-Erweiterungen) nicht sinnvoll erweiterbar sind wenn nicht bereits eine Funktion, wie z. B. die Erweiterung über eine Flexform, vorgesehen ist? Früher ging es ja auch (tt_address + Kickstarter). Kann ich mir eigentlich nicht vorstellen ...

    Warum funktioniert es für "News" (http://keinerweiss.de/525-die-extbase-extension-news-um-ein-feld-erweitern.html)? Wird hier gar nicht darauf abgezielt, die Felder im BE und auch im FE anzuzeigen?


  • 0 x
    23. 03. 2015, 15:34

    Zitat aus den Kommentaren der von dir verlinkten news-extension:
    "Anne
    27. JUNI 2014 UM 13:03
    Herzlichen Dank für das Tutorial. Leider kann ich über das Template item.html (Partials) nicht das neuangelegte Feld ausgeben lassen. Es wird im Frontend nicht angezeigt. Im Backend ist das Feld sichtbar und kann beschrieben und gespeichert werden. Muss ich die neuen Felder für das Frontend noch bekanntgeben? Wo liegt mein Fehler?
    Herzlichen Dank, Anne"

    Klingt nach dem gleichen Problem, das du aktuell hast.
    Auch für den Fall gilt: ich kann mir eigentlich nicht vorstellen, dass das so einfach funktionieren soll.

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

    Danke für den Hinweis. Entschuldige die späte Rückmeldung. Irgendwie war die Benachrichtigung ausgeschaltet ... Den Blog-Kommentar hatte ich sogar vor meiner Frage hier gelesen, aber gedacht "wohl ein einzelnes Problem, da sich andere dazu nicht melden".

    Ich muss gestehen, ich bin immer noch verwirrt. Wozu dann die ganzen Anleitungen? Man will doch letztlich die Anzeige im FE?!

    Es gibt ja Erweiterungen, die z. B. die Extbase/Fluid-basierte EXT:news erweitern (http://typo3.org/extensions/repository/view/pb_news_jobs für "additional fields for jobs offers" ) und hier ist beschrieben, wie man selber ein Feld erweitert: [url]http://docs.typo3.org/typo3cms/extensions/news/Tutorial/ExtendingNews/Index.html[/url]. Interessant wohl der Abschnitt "Tell EXT:news about it [= meine Ext.]" und "Use the new field in the template". Damit ist ja vermutlich das eigene News-Template unter Verwendung eines News-Plugins gemeint? (Ich habe das Ganze nicht probiert ... fehlt leider die Zeit.)

    EDIT: [ url ]will nicht richtig bei beiden Links, sorry.