Digamos que estoy extendiendo la blockBase
clase para crear un bloque personalizado, y estoy implementando el blockBuild
método para crear un marcado para mi bloque. Algo como esto:
class YourModuleBlock extends BlockBase {
/**
* Implements \Drupal\block\BlockBase::blockBuild().
*/
public function build() {
return array(
'#markup' => 'This is a block!',
);
}
}
Si quisiera proporcionar un enlace en este marcado, en D7 hubiera usado la l
función, pero ya no está disponible ( ver aquí ). Entonces, necesito poner a disposición el nuevo método D8 para generar enlaces. Podría usar una <a>
etiqueta, pero esta nunca fue la mejor práctica en D7.
Entonces, ¿cuál es el método correcto para crear enlaces y cómo lo hago disponible para mi función?
navigation
8
24ma13wg
fuente
fuente
Respuestas:
\ Drupal :: l está en desuso. Quizás este caso sea útil para alguien
fuente
toRenderable()
truco es muy útil, gracias!Uno, esto no está 100% completo, vea este problema . Dicho esto, permítanme citar un código del aviso de cambio :
Drupal 7:
Drupal 8:
Editar: los nombres de ruta están en los
moduledirectory/modulename.routing.yml
archivos y (por defecto) en la{router}
tabla.fuente
fromRoute('<front>')
Otra opción es crear un enlace en una matriz de renderizado
Drupal nos proporciona algunos métodos auxiliares para crear URL y enlaces a entidades.
Y
fuente
#attributes
se puede agregar porque este es un RenderElement .Aquí hay algunos ejemplos de creación de enlaces en Drupal 8. Tenga en cuenta que $ this-> t ('algún texto') está disponible dentro de los bloques que extienden BlockBase. Si los copia a otra clase que no lo tiene o los usa en un archivo .module, es posible que deba cambiar esto a t () 1 .
Enlace básico a un nodo:
Esto crea una matriz de renderización como esta:
Puede crear la matriz de renderizado sin cargar el nodo de esta manera:
O usando la clase Core Link:
Si desea usar marcado en el texto de su enlace, no puede simplemente poner una cadena. Necesita usar un elemento de matriz de renderizado:
Para crear un enlace absoluto, agregue esta opción a la URL, no el enlace:
Para agregar una clase a su enlace, también debe agregar esto a la URL, no al enlace:
Para agregar una cadena de consulta a su enlace, también debe hacerlo en la URL, no en el enlace:
Para configurar el enlace para que se abra en una nueva ventana con target = _blank:
Aquí hay un enlace a una página de términos de taxonomía:
Aquí hay un enlace a la página de edición de nodos:
Para crear un enlace externo:
Enlace a la página de inicio:
Tenga en cuenta que en cualquiera de estos objetos de URL, puede obtener la URL como una cadena llamando a:
Por ejemplo:
fuente
link
método está en desuso.La capacidad de establecer atributos parece perdida o complicada en los ejemplos anteriores porque la funcionalidad simplemente no es obvia. Hay dos formas de crear enlaces dependiendo de si tiene una ruta o no y cada una se comporta un poco diferente, así que aquí están los ejemplos.
Con una ruta. Esto tiene más sentido, solo puede suministrarlo en las opciones.
Con una url externa. Este es un poco raro. No hay un argumento de opción, por lo que puede parecer imposible, pero en realidad está bien. La razón es que los enlaces inexplicables nunca tienen opciones, solo la URL que describen. Esto significa que pasa la clase a la URL cuando la crea y simplemente funcionará.
Un corolario de todo esto es que también puedes hacer esto.
fuente
Un ejemplo completo con atributos y marcado HTML en el texto del enlace:
fuente
Tenía que agregar un enlace a la tabla como #suffix, pero tenía que ponerlo como html, para lograrlo lo hice
\Drupal\Core\Link::fromTextAndUrl("Add New page", Url::fromRoute('mymodule.add_new_page'))->toString();
Donde mymodule.add_new_page es la ruta desde el archivo yml de mi módulo.
fuente
Las respuestas aquí me dieron algunos buenos consejos. Todo lo que quería era proporcionar un enlace al nodo en mis registros ... Así que esto es lo que terminé con
fuente
fuente