Add links to any DataObject.
SilverStripe CMS ^4.0
composer require arillo/silverstripe-links
Attach the Arillo\Links\LinkExtension
to your DataObject via config.yml
:
MyDataObject:
extensions:
- Arillo\Links\LinkExtension
use SilverStripe\ORM\DataObject;
use Arillo\Links\Link;
use Arillo\Links\LinkExtension;
class MyDataObject extends DataObject
{
public function getCMSFields()
{
$this->beforeUpdateCMSFields(function($fields) {
// in case you use Link::EDITMODE_PLAIN, you might need
// to remove the link relation field generated by the scaffolder.
$fields->removeByName(LinkExtension::FIELD . 'ID')
$fields->addFieldsToTab(
'Root.Main',
// add link fields directly to the belonging DataObject.
Link::edit_fields(
$this,
[
'mode' => Link::EDITMODE_PLAIN,
'showLinkTitle' => true,
]
)
// or use default editing via HasOneButtonField
Link::edit_fields($this)
);
});
return parent::getCMSFields();
}
}
Inspect Arillo\Links\Link::DEFAULT_FIELDS_CONFIG
for all available config keys.
A link can be rendered in templates like this:
<% if $LinkObject.Exists %>
<% with $LinkObject %>
<a href="$Href" $TargetAttr.RAW>$Title</a>
<% end_with %>
<% end_if %>
or use the template of the module:
<% include Link Link=$LinkObject, CssClass=btn btn-primary %>
Since version 1.x extensibility should have become easier.
In this example we are adding the ability to create anchor links to elements:
<?php
namespace Arillo\Extensions;
use SilverStripe\Forms\DropdownField;
use Arillo\Elements\ElementBase;
use SilverStripe\ORM\DataObject;
use SilverStripe\Forms\FieldList;
use SilverStripe\ORM\DataExtension;
use Page;
class LinkExtension extends DataExtension
{
private static $has_one = [
'AnchorElement' => ElementBase::class,
];
// alter cms fields
public function updateLinkCMSFields(
FieldList $fields,
DataObject $holderRecord,
array $config = []
) {
$fieldsPrefix = $config['fieldsPrefix'];
if ($this->owner->PageID) {
$fields->push(
DropdownField::create(
"{$fieldsPrefix}AnchorElementID",
'Anker-Element',
$this->owner
->Page()
->Elements()
->map()
->toArray()
)
->setEmptyString('[keins]')
->displayIf("{$fieldsPrefix}Type")
->isEqualTo('internal')
->end()
);
}
}
// alter href
public function updateLinkHref($href)
{
if (
$href &&
$this->owner->Type == 'internal' &&
$this->owner->AnchorElement()->exists()
) {
$href .= "#{$this->owner->AnchorElement()->URLSegment}";
}
return $href;
}
}
Add extension via config:
Arillo\Links\Link:
extensions:
- Arillo\Extensions\LinkExtension
1.0.3
silvershop/silverstripe-hasonefield
1.0.0
Module rating system helping users find modules that are well supported. For more on how the rating system works visit Module standards
Score not correct? Let us know there is a problem