arillo / silverstripe-links
Add links to any DataObject
Installs: 576
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 5
Forks: 0
Open Issues: 0
Type:silverstripe-vendormodule
Requires
README
Add links to any DataObject.
Requirements
SilverStripe CMS ^4.0
Installation
composer require arillo/silverstripe-links
Usage
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 %>
Extending
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
Changelog
1.0.3
- upgraded
silvershop/silverstripe-hasonefield
1.0.0
- improved extensibility