Link Widget
The link can be used to display a link. It is the extension of the Text Widget therefore text widget options can be used for rendering links.
Usage
The most simple way to render a link is the usage of a static text and url:
$link = Widgets::make('link', ['url' => 'https://protonmail.com']);
$link->render('Gmail Alternative with Privacy');
// <a href="https://protonmail.com">Gmail Alternative with Privacy</a>
Based on Model Fields
It is possible to use the $model.field
notation:
$link = Widgets::make('link', ['text' => '$model.title', 'url' => '$model.link']);
$document = Document::create(['title' => 'Users Guide', 'link' => 'https://bit.ly/xyz']);
$link->render($document);
// <a href="https://bit.ly/xyz">Users Guide</a>
Using Named Routes
It is possible to use Laravel named routes and pass route parameters
$link = Widgets::make('link', [
'text' => '$model.name',
'url' => [
'route' => 'admin.users.edit',
'parameters' => ['$model'],
]
]);
$user = User::find(1);
$link->render($user);
// <a href="https://localhost/users/edit/1">Joe Bloggs</a>
Resolving URLs via Laravel
It is possible to pass the link through Laravel's url()
helper:
$link = Widgets::make('link', [
'text' => '$model.name',
'url' => [
'path' => '/show/user',
'parameters' => ['$model.id'],
]
]);
$user = User::find(1);
$link->render($user);
// <a href="https://localhost/users/show/1">Joe Bloggs</a>
The model can also be an array:
$link = Widgets::make('link', ['text' => '$model.caption', 'url' => '$model.path']);
$data = ['caption' => 'Imbox', 'url' => 'https://hey.com'];
$link->render($data);
// <a href="https://hey.com">Imbox</a>
HTML Tweaks
The inner text of the link can be configured the same way as the text widgets.
It is possible to define a wrapper html tag:
$link = Widgets::make('link', [
'text' => [
'text' => 'Signal',
'wrap' => 'span',
],
'url' => 'https://signal.org',
]);
$link->render();
// <a href="https://signal.org"><span>Signal</span></a>
Classes can also be added to the inner text:
$link = Widgets::make('link', [
'text' => [
'text' => 'Signal',
'wrap' => 'span',
'class' => 'text-muted',
],
'url' => 'https://signal.org',
]);
$link->render();
// <a href="https://signal.org"><span class="text-muted">Signal</span></a>
Conditional Links
It is possible to only render links on if
and can
conditions.
OnlyIf Conditions
It is possible to pass a closure that determines
$link = Widgets::make('link', [
'text' => '$model.title',
'url' => [
'route' => 'app.absence.edit',
'parameters' => ['$model'],
],
'onlyIf' => fn ($absence) => $absence->user_id === auth()->id(),
]);
Calling the render method of the link widget above with a given model will only render the link if the closure returns true:
$myabsence = Absence::find(123);
$link->render($myabsence)
// <a href="http://localhost/absence/edit/123">My Absence</a>
$notMyAbsence = Absence::find(444);
$link->render($notMyAbsence);
//Title of the absence without link
OnlyIfCan Conditions
It is possible to only render links if they are allowed by the
Laravel Authorization subsystem
ie. the can()
method:
$link = Widgets::make('link', [
'text' => 'Customers',
'url' => 'https://app.url/customers',
'onlyIfCan' => 'view customers'
]);
If the Auth::user()->can('view customers')
method returns true, the
link will be rendered. If not, then only the text, without the link.