Add per-item FrontEdit support for Fluid fields by Yulyaswan · Pull Request #5214 · ExpressionEngine/ExpressionEngine · GitHub
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,4 +1,20 @@
<div class="fluid__item <?php if ($reorderable) : ?>fluid__item--reorderable<?php endif ?>" data-field-name="<?= $field_group->short_name ?>" data-field-type="field_group">
<?php
$fluid_field_id = isset($fluid_field_id) ? (string) $fluid_field_id : '';
$field_ids = [];
$fluid_data_ids = [];

foreach ($field_group_fields as $field) {
$field_ids[] = (string) $field->getId();
$fluid_data_id = $field->getItem('fluid_field_data_id');
if (!is_null($fluid_data_id) && $fluid_data_id !== '') {
$fluid_data_ids[] = (string) $fluid_data_id;
}
}

$field_id_list = implode(',', array_unique($field_ids));
$fluid_data_id_list = implode(',', array_unique($fluid_data_ids));
?>
<div class="fluid__item <?php if ($reorderable) : ?>fluid__item--reorderable<?php endif ?>" data-field-name="<?= $field_group->short_name ?>" data-field-type="field_group" data-fluid-id="<?= $fluid_field_id ?>" data-field-id="<?= htmlspecialchars($field_id_list, ENT_QUOTES, 'UTF-8') ?>" data-fluid-data-id="<?= htmlspecialchars($fluid_data_id_list, ENT_QUOTES, 'UTF-8') ?>">
<div class="fluid__item-content">
<div class="fluid__item-fieldset ">

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,48 @@ public function validateField($field, $data)
* @param string $field_id_or_name Field ID or short name of the field is not custom
*/
public function entryFieldEditLink($site_id, $channel_id, $entry_id, $field_id_or_name)
{
return $this->entryFieldEditLinkWithParams($site_id, $channel_id, $entry_id, $field_id_or_name);
}

/**
* Get edit link for entry field with optional extra params
*
* @param int $site_id Site id
* @param int $channel_id Channel id
* @param int $entry_id Entry id
* @param string $field_id_or_name Field ID or short name of the field is not custom
* @param array $extra Optional params to include in frontedit_link token
*/
public function entryFieldEditLinkWithParams($site_id, $channel_id, $entry_id, $field_id_or_name, array $extra = [])
{
if ($this->fronteditIsDisabled()) {
return '';
}
if (!is_numeric($site_id) || !is_numeric($channel_id) || !is_numeric($entry_id)) {
return '';
}
return '{frontedit_link site_id=@' . $site_id . '@ channel_id=@' . $channel_id . '@ entry_id=@' . $entry_id . '@ field_id=@' . $field_id_or_name . '@}';

$params = [
'site_id' => $site_id,
'channel_id' => $channel_id,
'entry_id' => $entry_id,
'field_id' => $field_id_or_name,
];

foreach ($extra as $key => $value) {
if ($value === null || $value === '') {
continue;
}
$params[$key] = $value;
}

$parts = [];
foreach ($params as $key => $value) {
$parts[] = $key . '=@' . (string) $value . '@';
}

return '{frontedit_link ' . implode(' ', $parts) . '}';
}

/**
Expand Down Expand Up @@ -296,15 +330,15 @@ public function loadFrontEditAssets($output)
. $elementId
. '" data-editableurl="'
. $fieldEditUrl
. '" data-entry_id="ENTRY_ID" data-site_id="SITE_ID" data-size="WINDOW_SIZE" title="FIELD_NAME">'
. 'EDITABLE_URL_EXTRA" data-entry_id="ENTRY_ID" data-site_id="SITE_ID" data-size="WINDOW_SIZE"FLUID_ITEM_FIELD_ID_ATTRFLUID_ITEM_DATA_ID_ATTR title="FIELD_NAME">'
. '<img src="' . $pencilUrl . '" width="24px" height="24px" alt="' . $altText . '" style="cursor:pointer !important; filter: drop-shadow(0 1px 3px rgba(0,0,0,.20)) !important; vertical-align: bottom !important; border-radius: 0 !important; width: unset !important;" />'
. '</span>';
$frontEditPermission = [];
$entry_data = [];
if (preg_match_all("/{\s*frontedit_link\s+.*\}/sU", $output, $tags)) {
foreach ($tags[0] as $tag) {
$replace = [];
if (preg_match_all("/([a-zA-Z]+(?:_id|_name|lass)*)=[\"\'@]([a-zA-Z0-9_-]+)[\"\'@]/s", $tag, $params)) {
if (preg_match_all("/([a-zA-Z][a-zA-Z0-9_]*)=[\"\'@]([^\"\'@}]*)[\"\'@]/s", $tag, $params)) {
$replace['class'] = '';
foreach ($params[1] as $i => $key) {
$replace[$key] = $params[2][$i];
Expand Down Expand Up @@ -344,9 +378,23 @@ public function loadFrontEditAssets($output)
}

$keyGen = $this->randomKeyGen();
$editableUrlExtra = '';
$fluidItemFieldIdAttr = '';
$fluidItemDataIdAttr = '';

if (isset($replace['fluid_item_field_id']) && $replace['fluid_item_field_id'] !== '') {
$editableUrlExtra .= '&amp;fluid_item_field_id=' . rawurlencode($replace['fluid_item_field_id']);
$fluidItemFieldIdAttr = ' data-fluid_item_field_id="' . htmlspecialchars($replace['fluid_item_field_id'], ENT_QUOTES, 'UTF-8') . '"';
}

if (isset($replace['fluid_item_data_id']) && $replace['fluid_item_data_id'] !== '') {
$editableUrlExtra .= '&amp;fluid_item_data_id=' . rawurlencode($replace['fluid_item_data_id']);
$fluidItemDataIdAttr = ' data-fluid_item_data_id="' . htmlspecialchars($replace['fluid_item_data_id'], ENT_QUOTES, 'UTF-8') . '"';
}

$editLink = str_replace(
['SITE_ID', 'CHANNEL_ID', 'ENTRY_ID', 'FIELD_ID', 'KEYGEN', 'FIELD_NAME', 'WINDOW_SIZE', 'MARKER_CLASS'],
[$replace['site_id'], $replace['channel_id'], $replace['entry_id'], $replace['field_id'], $keyGen, $fieldName, $windowSize, $replace['class']],
['SITE_ID', 'CHANNEL_ID', 'ENTRY_ID', 'FIELD_ID', 'KEYGEN', 'FIELD_NAME', 'WINDOW_SIZE', 'MARKER_CLASS', 'EDITABLE_URL_EXTRA', 'FLUID_ITEM_FIELD_ID_ATTR', 'FLUID_ITEM_DATA_ID_ATTR'],
[$replace['site_id'], $replace['channel_id'], $replace['entry_id'], $replace['field_id'], $keyGen, $fieldName, $windowSize, $replace['class'], $editableUrlExtra, $fluidItemFieldIdAttr, $fluidItemDataIdAttr],
$element
);
} else {
Expand Down
Loading
Loading