mirror of
https://github.com/processwire/processwire.git
synced 2025-08-17 20:11:46 +02:00
Fix issue processwire/processwire-issues#183 allow for front-end editing of fields in repeater items, individually per-field by non-superusers with edit access to the page the owns the repeater field.
This commit is contained in:
@@ -119,29 +119,54 @@ class FieldtypeRepeater extends Fieldtype implements ConfigurableModule {
|
|||||||
$template->set('pageClass', $class);
|
$template->set('pageClass', $class);
|
||||||
$template->save();
|
$template->save();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @var Page $page */
|
||||||
|
$page = $this->wire('page');
|
||||||
|
|
||||||
$process = $this->wire('page')->process;
|
/** @var Process|null $process */
|
||||||
|
$process = $page->process;
|
||||||
|
|
||||||
|
/** @var User $user */
|
||||||
|
$user = $this->wire('user');
|
||||||
|
|
||||||
if($process == 'ProcessPageEdit' || $process == 'ProcessProfile') {
|
/** @var Config $config */
|
||||||
|
$config = $this->wire('config');
|
||||||
|
|
||||||
|
/** @var WireInput $input */
|
||||||
|
$input = $this->wire('input');
|
||||||
|
|
||||||
|
$inEditor = $process == 'ProcessPageEdit' || $process == 'ProcessProfile';
|
||||||
|
$isSuperuser = $user->isSuperuser();
|
||||||
|
|
||||||
|
if($inEditor) {
|
||||||
|
// ProcessPageEdit or ProcessProfile
|
||||||
$this->addHookBefore('ProcessPageEdit::ajaxSave', $this, 'hookProcessPageEditAjaxSave');
|
$this->addHookBefore('ProcessPageEdit::ajaxSave', $this, 'hookProcessPageEditAjaxSave');
|
||||||
|
}
|
||||||
if($this->wire('config')->ajax) {
|
|
||||||
// handle scenario of repeater within repeater field
|
if($inEditor && $config->ajax) {
|
||||||
$fieldName = $this->wire('input')->get('field');
|
// handle scenario of repeater within repeater field
|
||||||
$pageID = (int) $this->wire('input')->get('id');
|
$fieldName = $input->get('field');
|
||||||
if($pageID && strpos($fieldName, '_repeater') && preg_match('/^(.+)_repeater\d+$/', $fieldName, $matches)) {
|
$pageID = (int) $input->get('id');
|
||||||
$editPage = $this->wire('pages')->get($pageID);
|
if($pageID && strpos($fieldName, '_repeater') && preg_match('/^(.+)_repeater\d+$/', $fieldName, $matches)) {
|
||||||
if($editPage->id && strpos($editPage->template->name, self::templateNamePrefix) === 0) {
|
$editPage = $this->wire('pages')->get($pageID);
|
||||||
// update field name to exclude the _repeater1234 part at the end, so that PageEdit recognizes it
|
if($editPage->id && strpos($editPage->template->name, self::templateNamePrefix) === 0) {
|
||||||
$this->wire('input')->get->field = $matches[1];
|
// update field name to exclude the _repeater1234 part at the end, so that PageEdit recognizes it
|
||||||
}
|
$input->get->__set('field', $matches[1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(!$this->wire('user')->isSuperuser()) {
|
}
|
||||||
$this->addHookAfter('PagePermissions::pageEditable', $this, 'hookPagePermissionsPageEditableAjax');
|
|
||||||
|
if(!$inEditor && !$user->isGuest() && !$isSuperuser && $user->hasPermission('page-edit')) {
|
||||||
|
// allow for front-end editor to also trigger an inEditor=true condition
|
||||||
|
if(strpos($page->url, $config->urls->admin) === false && $page->editable()) {
|
||||||
|
if($this->wire('modules')->isInstalled('PageFrontEdit')) $inEditor = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if($inEditor && !$isSuperuser) {
|
||||||
|
// need an extra hook to handle permissions
|
||||||
|
$this->addHookAfter('PagePermissions::pageEditable', $this, 'hookPagePermissionsPageEditableAjax');
|
||||||
|
}
|
||||||
|
|
||||||
$this->addHookBefore('PageFinder::getQuery', $this, 'hookPageFinderGetQuery');
|
$this->addHookBefore('PageFinder::getQuery', $this, 'hookPageFinderGetQuery');
|
||||||
|
|
||||||
|
@@ -223,7 +223,17 @@ class PageFrontEdit extends WireData implements Module {
|
|||||||
if(!$this->editorAllowed) return false;
|
if(!$this->editorAllowed) return false;
|
||||||
if(!$this->inlineSupported($field)) return false;
|
if(!$this->inlineSupported($field)) return false;
|
||||||
// if(!in_array($field->id, $this->inlineEditFields) && $field->id != $this->inlineEditField) return false;
|
// if(!in_array($field->id, $this->inlineEditFields) && $field->id != $this->inlineEditField) return false;
|
||||||
if(!$this->wire('user')->hasPermission('page-edit-front', $page)) return false;
|
/** @var User $user */
|
||||||
|
$user = $this->wire('user');
|
||||||
|
if($page->className() != 'Page' && wireInstanceOf($page, 'RepeaterPage')) {
|
||||||
|
/** @var RepeaterPage $page */
|
||||||
|
$forPage = $page->getForPage();
|
||||||
|
$forField = $page->getForField();
|
||||||
|
if(!$user->hasPermission('page-edit-front', $forPage)) return false;
|
||||||
|
if(!$forPage->editable($forField)) return false;
|
||||||
|
} else {
|
||||||
|
if(!$user->hasPermission('page-edit-front', $page)) return false;
|
||||||
|
}
|
||||||
if(!$page->editable($field)) return false;
|
if(!$page->editable($field)) return false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -964,7 +974,9 @@ class PageFrontEdit extends WireData implements Module {
|
|||||||
} else {
|
} else {
|
||||||
// okay to make edits
|
// okay to make edits
|
||||||
try {
|
try {
|
||||||
$this->wire('session')->CSRF->validate();
|
/** @var Session $session */
|
||||||
|
$session = $this->wire('session');
|
||||||
|
$session->CSRF->validate();
|
||||||
$data = $this->inlineProcessSaveEdits($fields, $data);
|
$data = $this->inlineProcessSaveEdits($fields, $data);
|
||||||
} catch(WireCSRFException $e) {
|
} catch(WireCSRFException $e) {
|
||||||
$data['error'] = "Failed CSRF check";
|
$data['error'] = "Failed CSRF check";
|
||||||
|
Reference in New Issue
Block a user