Skip to content

arillo/silverstripe-links

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

25 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Arillo\Links

Latest Stable Version   Total Downloads

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