mirror of
https://github.com/dnadesign/silverstripe-elemental-list.git
synced 2024-10-22 11:05:47 +02:00
CMSEditLink() now reflects the nested path of an element.
This commit is contained in:
parent
46973678f5
commit
8ec9c1fc20
@ -1,6 +1,6 @@
|
||||
---
|
||||
name: elemental-list
|
||||
---
|
||||
DNADesign/Elemental/Models/BaseElement:
|
||||
DNADesign\Elemental\Models\BaseElement:
|
||||
extensions:
|
||||
- DNADesign/ElementalList/Extensions/BaseElementExtension
|
||||
- DNADesign\ElementalList\Extension\BaseElementCMSEditLinkExtension
|
||||
|
61
src/Extension/BaseElementCMSEditLinkExtension.php
Normal file
61
src/Extension/BaseElementCMSEditLinkExtension.php
Normal file
@ -0,0 +1,61 @@
|
||||
<?php
|
||||
|
||||
namespace DNADesign\ElementalList\Extension;
|
||||
|
||||
use DNADesign\Elemental\Models\BaseElement;
|
||||
use DNADesign\ElementalList\Model\ElementList;
|
||||
use SilverStripe\CMS\Controllers\CMSPageEditController;
|
||||
use SilverStripe\Control\Controller;
|
||||
use SilverStripe\Core\Extension;
|
||||
|
||||
/**
|
||||
* Class BaseElementCMSEditLinkExtension
|
||||
*
|
||||
* BaseElement can be nested, CMSEditLink() needs to be updated to reflect that
|
||||
*
|
||||
* @property BaseElementCMSEditLinkExtension|$this $owner
|
||||
* @package DNADesign\ElementalList\Extension
|
||||
*/
|
||||
class BaseElementCMSEditLinkExtension extends Extension
|
||||
{
|
||||
/**
|
||||
* @param string $link
|
||||
*/
|
||||
public function updateCMSEditLink(&$link)
|
||||
{
|
||||
/** @var $owner BaseElement */
|
||||
$owner = $this->owner;
|
||||
|
||||
$relationName = $owner->getAreaRelationName();
|
||||
$page = $owner->getPage(true);
|
||||
|
||||
if (!$page) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ($page instanceof ElementList) {
|
||||
// nested bock - we need to get edit link of parent block
|
||||
$link = Controller::join_links(
|
||||
$page->CMSEditLink(),
|
||||
'ItemEditForm/field/' . $page->getOwnedAreaRelationName() . '/item/',
|
||||
$owner->ID
|
||||
);
|
||||
|
||||
// remove edit link from parent CMS link
|
||||
$link = preg_replace('/\/item\/([\d]+)\/edit/', '/item/$1', $link);
|
||||
} else {
|
||||
// block is directly under a non-block object - we have reached the top of nesting chain
|
||||
$link = Controller::join_links(
|
||||
singleton(CMSPageEditController::class)->Link('EditForm'),
|
||||
$page->ID,
|
||||
'field/' . $relationName . '/item/',
|
||||
$owner->ID
|
||||
);
|
||||
}
|
||||
|
||||
$link = Controller::join_links(
|
||||
$link,
|
||||
'edit'
|
||||
);
|
||||
}
|
||||
}
|
@ -52,4 +52,22 @@ class ElementList extends BaseElement
|
||||
|
||||
return DBField::create_field('HTMLText', $summary . ' <span class="el-meta">Contains ' . $count . ' ' . $suffix . '</span>');
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve a elemental area relation name which this element owns
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getOwnedAreaRelationName()
|
||||
{
|
||||
$has_one = $this->config()->get('has_one');
|
||||
|
||||
foreach ($has_one as $relationName => $relationClass) {
|
||||
if ($relationClass === ElementalArea::class && $relationName !== 'Parent') {
|
||||
return $relationName;
|
||||
}
|
||||
}
|
||||
|
||||
return 'Elements';
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user