[Frage] Eigenes field für Typoscript analog 'title' im PHP definieren [Gelöst] TYPO3-Version: 6.2.7

  • tobla tobla
    R2-D2
    0 x
    100 Beiträge
    1 Hilfreiche Beiträge
    17. 12. 2014, 16:37

    Hallo zusammen

    Im Typoscript kann man mittels 'field' auf Variablen wie title oder subtitle zugreifen:

    1. 20 = TEXT
    2. 20.field = title

    Damit der Integrator die Möglichkeit hat, Einzelne Werte aus meiner Extension zu benutzen, möchte ich selbst solche Felder anlegen. Hintergrund ist der Gedanke, das der Benutzer den Namen des aktuellen Objektes in den Seitentitel integrieren kann (zusammen mit seinem Standardtitel) zur Suchmaschinenoptimierung.
    -
    Der Integrator möchte ev. einen solchen Seitentitel gestalten: 'Websitename - Pagename | EntryName'
    -
    Versucht habe ich es folgendermassen (im ExtbaseController, in der aufgerufenen Action, wo ich auch die andern Metafelder setze):

    1. $GLOBALS['TSFE']->page['entryTitle'] = $entry->getName();
    2.  
    3. $this->addPageMetaTag('keywords', $entry->getKeywords());
    4. $this->addPageMetaTag('description', $entry->getMetaDescription());
    5. $this->addPageMetaTag('author', $entry->getMetaAuthor());

    Zugriff im TS:

    1. 20 = TEXT
    2. 20.field = entryTitle

    Das klappt leider nicht. Weiss jemand von euch, wie man das richtig macht?
    -
    Das Überschreiben des Titels ist in meinen Augen keine Lösung, da ich entweder den bestehenden Titel parsen und einen Platzhalter mit dem entryTitle ersetzten müsste, den Integrator zu stark einschränken würde und das Problem hätte, das das ganze dann nur beim Title funktioniert. Ich möchte aber, das der Integrator das Field frei verwenden kann.
    -
    Ebenfalls versucht habe ich, über eine Userfunc eine Funktion im ExtbaseController aufzurufen. Allerdings macht er dann einen Normalen Plugin-Include, bzw. Bootstrapt den kompletten Kontext und benötigt auch ein Template etc. In einer Variabel hab ich das Ganze dann aber immer noch nicht.
    -
    Früher bei PI-Base Extensions hatten wird das jeweils so gemacht, das wir den EntryTitle mit den Datenbankfunktionen des TS aus der Datenbank gelesen haben und dann in den Seitentitel eingefügt haben. Das geht aber nur, wenn Parameter übergeben werden. Mein Entry wird aber vom Integrator im Plugin (Flexform) ausgewählt, sodass gar kein Parameter mit einer ID übergeben wird, anhand dessen man in der Datebank nach dem Entrynamen suchen könnte.

  • tobla tobla
    R2-D2
    0 x
    100 Beiträge
    1 Hilfreiche Beiträge
    03. 02. 2015, 13:31 - Lösung

    Ich beantworte mir meine Frage mal selbst. Die Lösung ist einfacher als gedacht. Statt Field im TS einfach data verwendung und alles klappt. Beispiel für Alle, die das Gleiche machen möchten (keine Leerzeichen vor und nach dem Doppelpunkt nach dem TSFE, diese wurden nur wegen dem Forum eingefügt):

    1. ...
    2. public function showAction(\Vendor\MyExtension\Domain\Model\Entry $entry) {
    3. $GLOBALS['TSFE']->page['myExtension']['name'] = $entry->getName();
    4. }
    5. ...

    1. config.noPageTitle = 2
    2.  
    3. page.headerData {
    4. 10 = TEXT
    5. 10.wrap = <title>MySuperPage -&nbsp;|</title>
    6. 10.data = TSFE : page|myExtension|name
    7. }

    Für die Metatags muss man etwas kreativer rangehen, aber auch das klappt wunderbar:

    1. page.meta {
    2. // create description meta tag containing description of current element,
    3. // description of entrySet or page description
    4. description.stdWrap.cObject = COA
    5. description.stdWrap.cObject {
    6. 10 = TEXT
    7.  
    8. // if TSFE : page|myExtension|description (current entry of detail view)
    9. 10.override {
    10. cObject.data = TSFE : page|myExtension|description
    11. }
    12.  
    13. // else if TSFE : page|myExtension|entrySetDescription (current entrySet)
    14. 10.data = TSFE : page|myExtension|entrySetDescription
    15.  
    16. // else (current page)
    17. 10.ifEmpty {
    18. cObject.data = TSFE : page|description
    19. }
    20. }
    21. }

    Das Ganze funktioniert mit beliebnig vielen Feldern und auch mehreren Plugin-Views einer Extension. Eine Substrukturierung innerhalb von $GLOBALS['TSFE']->page['myExtension'] lohnt sich wenn viele Felder von verschiedenen Plugins zusammenkommen.


  • 1
  • toifel toifel
    Jedi-Ratsmitglied
    0 x
    831 Beiträge
    96 Hilfreiche Beiträge
    18. 12. 2014, 09:11

    Wenn du .field benutzen willst, dann muss das Feld in der Datenbank und im TCA enthalten sein. Deine Idee mit der userFunc war also schon mal richtig, über einen ExtbaseController musst du aber gar nicht gehen. Hört sich zumindest umständlicher an, als es sonst schon ist ;)

    http://www.greenbanana.ch/blog/seite/typo3/extension-schreiben/flexform-fuer-eigene-extension-erstellen.html - diese init() Funktion macht wahrscheinlich einiges einfacher und müsste auch in 6.2 noch genau so funktionieren.

  • tobla tobla
    R2-D2
    0 x
    100 Beiträge
    1 Hilfreiche Beiträge
    18. 12. 2014, 09:23

    Danke für den Tipp.

    Aber um Extbase komme ich ja nicht herum, da ich den Entry (anhand der EntryID vom Flexform) über Extbase Repositories laden muss und anschliessend auf dessen Namen zugreifen möchte.

    Ansonsten greife ich mit pi-base Style direkt auf die Datenbank zu und dann kann ich mir die umfangreiche Übung auch sparen und mit der TypoScript-DB Funktion arbeiten.

    Gibt es eine Andere Möglichkeit, einen Wert in $GLOBALS abzulegen, der im Typoscript zugreifbar ist? Also nicht im TSFE Array?

  • tobla tobla
    R2-D2
    0 x
    100 Beiträge
    1 Hilfreiche Beiträge
    03. 02. 2015, 13:31

    Ich beantworte mir meine Frage mal selbst. Die Lösung ist einfacher als gedacht. Statt Field im TS einfach data verwendung und alles klappt. Beispiel für Alle, die das Gleiche machen möchten (keine Leerzeichen vor und nach dem Doppelpunkt nach dem TSFE, diese wurden nur wegen dem Forum eingefügt):

    1. ...
    2. public function showAction(\Vendor\MyExtension\Domain\Model\Entry $entry) {
    3. $GLOBALS['TSFE']->page['myExtension']['name'] = $entry->getName();
    4. }
    5. ...

    1. config.noPageTitle = 2
    2.  
    3. page.headerData {
    4. 10 = TEXT
    5. 10.wrap = <title>MySuperPage -&nbsp;|</title>
    6. 10.data = TSFE : page|myExtension|name
    7. }

    Für die Metatags muss man etwas kreativer rangehen, aber auch das klappt wunderbar:

    1. page.meta {
    2. // create description meta tag containing description of current element,
    3. // description of entrySet or page description
    4. description.stdWrap.cObject = COA
    5. description.stdWrap.cObject {
    6. 10 = TEXT
    7.  
    8. // if TSFE : page|myExtension|description (current entry of detail view)
    9. 10.override {
    10. cObject.data = TSFE : page|myExtension|description
    11. }
    12.  
    13. // else if TSFE : page|myExtension|entrySetDescription (current entrySet)
    14. 10.data = TSFE : page|myExtension|entrySetDescription
    15.  
    16. // else (current page)
    17. 10.ifEmpty {
    18. cObject.data = TSFE : page|description
    19. }
    20. }
    21. }

    Das Ganze funktioniert mit beliebnig vielen Feldern und auch mehreren Plugin-Views einer Extension. Eine Substrukturierung innerhalb von $GLOBALS['TSFE']->page['myExtension'] lohnt sich wenn viele Felder von verschiedenen Plugins zusammenkommen.

  • 1