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
- upgraded
silvershop/silverstripe-hasonefield
1.0.0
- improved extensibility