Zum Inhalt springen

Link in eigenem ViewHelper

Erstellt am 13. November 2014 · 12 Antworten · letzte Antwort am 19. November 2014

Tags: ViewHelper, Links, Frage

schmidtpublic ·

Hallo,

ich finde nirgendwo eine Information, wie ich einen Link in meinem eigenen ViewHelper erstelle.

Ziel ist eine aus einem übergebenen Array erstellte Liste, die dann jeweils mit den IDs verlinkt ist. Eigentlich was ganz simples also...

use TYPO3\CMS\Fluid\ViewHelpers\Link\ActionViewHelper as ActionLink;

[...]


$link = new ActionLink();

$url = $link->render('categorylist',array('category'=>$uid), 'Articles');

endet in einem
Call to a member function getUriBuilder() on a non-object ...

Einen 'handgeschriebenen' <a href=".."> möchte ich natürlich nicht verwenden, wozu hat man FLUID.

Denke ich völlig falsch oder geht das nicht?

Gruß vom Rhein, Stefan

Julian.​Hofmann ·

Hallo Stefan.

Warum willst Du im ViewHelper Link-HTML-Code erzeugen? Gibt dafür nicht der link-ViewHelper?

Ich würde eher ansetzen, dass für die Parameter, die an den Linkviewhelper übergeben werden ggf. ein eigener ViewHelper Datenaufbereitet, die Link-Erzeugung aber in Link-ViewHelper bleibt.

Sind jetzt aber eher Gedanken bzgl. "Denke ich völlig falsch". Vielleicht hast Du ja Gründe.

Viele Grüße
Julian

P.S: Hast Du Dir \TYPO3\CMS\Fluid\ViewHelpers\Link\PageViewHelper schon angeschaut. IMHO dürfte sich dieser Code doch anpassen lassen, um einen URI zu erzeugen.

schmidtpublic ·

Hallo Julian,

im Grunde hast Du mein Problem besser beschrieben als ich: Ich würde gerne einfach auf den Linkviewhelper zugreifen, aber genau das bekomme ich nicht hin.
Und wenn ich meine Linkliste zurückgebe ist es ja zu spät.
Im Vorgang der Zusammenstellung (also der Verarbeitung des übergebenen Arrays in meinem ViewHelper) müsste ich den Link drumherumbauen.

Man kann das <f:link.action.../> Ding ja nicht einfach reinschreiben, das wird ja nach der Rückgabe nicht mehr verarbeitet.

Viele Grüße, Stefan

jenses ·

f:link.action nutzt man, um eine Controller-Action zu verlinken -
ist das, was du erreichen willst?
Ansonsten ist f:link.page dein Freund, im Fluid-Template wohlgemerkt.
Du mußt halt nur dafür sorgen, deine ID's zu übergeben und f:link.page als z.B. additionalParams anzubieten.
Julian hat dazu ja eigentlich schon alles gesagt...

schmidtpublic ·

Moin Jenses,

ja, das ist mir grundsätzlich natürlich bekannt. So nutzt man das, wenn man einen einzelnen Link generieren möchte.

In meinem Fall muss/will ich aber die Erzeugung eines Listenmenüs in einen Viewehelper übergeben und gebe dazu ein multidimensionales Array hinein. Dieser muss also während des Listenaufbaus schon die Links erzeugen, denn hinterher ist es ja zu spät.

Das heißt ich benötige eine 'ordentliche' Funktion zur Erzeugung von Links innerhalb MEINES Viewehelpers.

Oder ist das der ganz falsche Ansatz?

Grüße vom Rhein, Stefan

Julian.​Hofmann ·

Ich versteh noch nicht ganz, warum Du ganze HTML-Codeblöcke in einem Viewhelper erzeugen willst. Mit passenden Schachtelungen, Bedingungen und ViewHelpern lässt sich doch nahezu jedes Menü/jede Liste mit Fluid generieren.
Wozu ein PHP-Array erst an Fluid übergeben, um es dann wieder an PHP zu übergeben? IMHO kann dann gleich wieder wie früher der HTML-Code direkt aus dem PHP der Extension erzeugt werden. Dann ist die Trennung von Logik-Code und Darstellung eh für die Katz.

schmidtpublic ·

Ich muss aus Kategorien mit vorab nicht festgelegter Verschachtelungstiefe ein Menü ausgeben.
Das habe ich bis jetzt nur mittels Viewhelper hinbekommen, in dem ich das rekursiv durchlaufe und die entsprechende Liste / Sublist ausgebe.

Deshalb müsste ich hier schon den Link ausgeben und dachte, irgendwie müsste man das kombinieren können.

Julian.​Hofmann ·

Das lässt sich aber prinzipiell auch mittels Fluid lösen.

Beispiel:

$testArray => array(
      array('title' => 'Element 1'),
      array('title' => 'Element 2'),
      array('title' => 'Element 3',
          'array' => array(
              array('title' => 'Element 3.1'),
              array('title' => 'Element 3.2'),
              array('title' => 'Element 3.3',
                  'array' => array(
                      array('title' => 'Element 3.3.1'),
                      array('title' => 'Element 3.3.2'),
                      array('title' => 'Element 3.3.3',
                        'array' => array(
                            array('title' => 'Element 3.3.3.1'),
                            array('title' => 'Element 3.3.3.2'),
                            array('title' => 'Element 3.3.3.3',
                                'array' => array(
                                    array('title' => 'Element 3.3.3.3.1'),
                                    array('title' => 'Element 3.3.3.3.2'),
                                    array('title' => 'Element 3.3.3.3.3'
                                    )
                                )
                            )
                        )
                      )
                  )
              )
          )
        );

Template:

<f:render partial="showList" arguments="{testArray: testArray}" />

Partial showList:

<ol>
  <f:for each="{testArray}" as="entry">
    <f:if condition="{entry->f:count()}==1">
      <f:then>
        <li>{entry.title}</li>
      </f:then>
      <f:else>
        <f:render partial="showList" arguments="{testArray: entry.array}"/>
      </f:else>
    </f:if>
  </f:for>
</ol>
Unbekannter Benutzer ·

Willst du denn die Links aus Actions einer Extension/Plugins generieren ?
Ich weiß nicht, ob man's auch im VieHelper nutzen kann, aber im ActionController einer Extension könntest du den UriBuilder nutzen, um die Links zu generieren.

jenses ·

Willst du denn die Links aus Actions einer Extension/Plugins generieren ?
Ich weiß nicht, ob man's auch im VieHelper nutzen kann, aber im ActionController einer Extension könntest du den UriBuilder nutzen, um die Links zu generieren.

Eingangspost schon mal richtig gelesen? 😉

jenses ·

Also nochmal - der Eingangspost:

use TYPO3\CMS\Fluid\ViewHelpers\Link\ActionViewHelper as ActionLink;
 
[...]
 
 
$link = new ActionLink();

Dann riskierst du mal einen Blick in TYPO3\CMS\Fluid\ViewHelpers\Link\ActionViewHelper:

public function render(...dreissigundelfparameter...) {
	[b]$uriBuilder = $this->controllerContext->getUriBuilder();[/b]
	...
}

Offensichtlich nutzt der TS also bereits den UriBuilder, gelle?

Unbekannter Benutzer ·

Dann tut er das offenbar nicht richtig. Julian's Lösung tut es ja aber wie du schon sagst auch.
Und falls nicht, dann habe ich tatsächlich offenbar nicht ganz verstanden, was dem TE auf dem Herzen liegt.
Passiert, gelle?