Angenommen, ich erweitere die blockBase
Klasse, um einen benutzerdefinierten Block zu erstellen, und implementiere die blockBuild
Methode, um ein Markup für meinen Block zu erstellen. Etwas wie das:
class YourModuleBlock extends BlockBase {
/**
* Implements \Drupal\block\BlockBase::blockBuild().
*/
public function build() {
return array(
'#markup' => 'This is a block!',
);
}
}
Wenn ich in diesem Markup einen Link bereitstellen wollte, hätte ich in D7 die l
Funktion verwendet, aber diese ist nicht mehr verfügbar ( siehe hier ). Daher muss ich die neue D8-Methode zum Generieren von Links bereitstellen. Ich könnte einfach ein <a>
Tag verwenden, aber dies war in D7 nie die beste Vorgehensweise.
Was ist die richtige Methode zum Erstellen von Links und wie stelle ich sie meiner Funktion zur Verfügung?
navigation
8
24ma13wg
quelle
quelle
Antworten:
\ Drupal :: l ist veraltet. Vielleicht ist dieser Fall für jemanden nützlich
quelle
toRenderable()
Trick ist sehr nützlich, danke!Erstens ist dies nicht 100% vollständig, siehe diese Ausgabe . Lassen Sie mich vor diesem Hintergrund einen Code aus der Änderungsmitteilung zitieren :
Drupal 7:
Drupal 8:
Bearbeiten: Routennamen befinden sich in den
moduledirectory/modulename.routing.yml
Dateien und (standardmäßig) in der{router}
Tabelle.quelle
fromRoute('<front>')
Eine andere Möglichkeit besteht darin, einen Link in einem Render-Array zu erstellen
Drupal stellt uns einige Hilfsmethoden zum Erstellen von URLs und Links zu Entitäten zur Verfügung.
Und
quelle
#attributes
können hinzugefügt werden , da dies eine ist RenderElement .Hier einige Beispiele zum Erstellen von Links in Drupal 8. Beachten Sie, dass $ this-> t ('some text') in Blöcken verfügbar ist, die BlockBase erweitern. Wenn Sie diese in eine andere Klasse kopieren, die sie nicht besitzt, oder diese in einer .module-Datei verwenden, müssen Sie sie möglicherweise in t () 1 ändern .
Grundlegender Link zu einem Knoten:
Dies erzeugt ein Render-Array wie folgt:
Sie können das Render-Array folgendermaßen erstellen, ohne den Knoten zu laden:
Oder mit der Core-Link-Klasse:
Wenn Sie Markup im Text Ihres Links verwenden möchten, können Sie nicht einfach einen String einfügen. Sie müssen ein Render-Array-Element verwenden:
Um einen absoluten Link zu erstellen, fügen Sie diese Option der URL hinzu, nicht dem Link:
Um eine Klasse zu Ihrem Link hinzuzufügen, müssen Sie diese auch zur URL hinzufügen, nicht zum Link:
Um eine Abfragezeichenfolge zu Ihrem Link hinzuzufügen, müssen Sie diese auch zur URL und nicht zum Link hinzufügen:
So legen Sie fest, dass der Link in einem neuen Fenster mit target = _blank geöffnet wird:
Hier ist ein Link zu einer Taxonomiebegriffsseite:
Hier ist ein Link zur Knotenbearbeitungsseite:
So erstellen Sie einen externen Link:
Link zur Homepage:
Beachten Sie, dass Sie für jedes dieser URL-Objekte die URL als Zeichenfolge abrufen können, indem Sie Folgendes aufrufen:
Beispielsweise:
quelle
link
Methode ist veraltet.Die Möglichkeit, Attribute festzulegen, scheint in den vorherigen Beispielen verloren zu gehen oder zu verwickeln, da die Funktionalität einfach nicht offensichtlich ist. Es gibt zwei Möglichkeiten, um Links zu erstellen, je nachdem, ob es eine Route gibt oder nicht, und jedes verhält sich ein bisschen anders. Hier sind die Beispiele.
Mit einer Route. Dies ist am sinnvollsten, Sie können es einfach in den Optionen angeben.
Mit einer externen URL. Dieser ist ein bisschen komisch. Es gibt kein Optionsargument, daher scheint es unmöglich, aber eigentlich ist es in Ordnung. Der Grund ist, dass Links aus unerklärlichen Gründen niemals nur die URL enthalten, die sie beschreiben. Dies bedeutet, dass Sie die Klasse beim Erstellen an die URL übergeben und sie funktioniert dann einfach.
Eine Folge all dessen ist, dass Sie dies auch tun können.
quelle
Ein vollständiges Beispiel mit Attributen und HTML-Markup im Linktext:
quelle
Ich musste der Tabelle einen Link als #suffix hinzufügen, aber ich musste ihn als html ausgeben, um das zu erreichen, was ich getan habe
\Drupal\Core\Link::fromTextAndUrl("Add New page", Url::fromRoute('mymodule.add_new_page'))->toString();
Wobei mymodule.add_new_page die Route von meiner Modul-YML-Datei ist.
quelle
Die Antworten hier gaben mir einige gute Hinweise. Ich wollte lediglich einen Link zu dem Knoten in meinen Protokollen bereitstellen
quelle
quelle