1
0
mirror of https://github.com/processwire/processwire.git synced 2025-08-08 07:47:00 +02:00

Code improvements to ProcessPageEdit module and refactor of change-template form within it.

This commit is contained in:
Ryan Cramer
2022-09-12 09:36:01 -04:00
parent 4aa75a7d17
commit 6262fcdff8
3 changed files with 185 additions and 138 deletions

View File

@@ -18,7 +18,8 @@ function initPageEditForm() {
$("#wrap_delete_page label").effect('highlight', {}, 500);
return;
}
$(this).before("<input type='hidden' name='submit_delete' value='1' />");
var $input = $("<input type='hidden' name='submit_delete' />").val($(this).val());
$(this).before($input);
$("#ProcessPageEdit").submit();
});

View File

@@ -1 +1 @@
function initPageEditForm(){$("#ProcessPageEdit:not(.ProcessPageEditSingleField)").WireTabs({items:$("#ProcessPageEdit > .Inputfields > .InputfieldWrapper"),id:"PageEditTabs",skipRememberTabIDs:["ProcessPageEditDelete"]});$("#submit_delete").click(function(){if(!$("#delete_page").is(":checked")){$("#wrap_delete_page label").effect("highlight",{},500);return}$(this).before("<input type='hidden' name='submit_delete' value='1' />");$("#ProcessPageEdit").submit()});$(document).on("click","button[type=submit]",function(e){if($("body").hasClass("pw-uploading")){return confirm($("#ProcessPageEdit").attr("data-uploading"))}});if(typeof InputfieldSubmitDropdown!="undefined"){var $dropdownTemplate=$("ul.pw-button-dropdown:not(.pw-button-dropdown-init)");$("button[type=submit]").each(function(){var $button=$(this);var name=$button.attr("name");if($button.hasClass("pw-no-dropdown"))return;if(name.indexOf("submit")==-1||name.indexOf("_draft")>-1)return;if(name.indexOf("_save")==-1&&name.indexOf("_publish")==-1)return;InputfieldSubmitDropdown.init($button,$dropdownTemplate)})}var $viewLink=$("#_ProcessPageEditView");var $viewMenu=$("#_ProcessPageEditViewDropdown");var color=$viewLink.css("color");$("#_ProcessPageEditViewDropdownToggle").css("color",color);$viewLink.click(function(){var action=$viewLink.attr("data-action");if(action=="this"||action=="new"||!action.length)return true;$viewMenu.find(".page-view-action-"+action+" > a").click();return false});var $template=$("#template");var templateID=$template.val();$template.on("change",function(){if($(this).val()==templateID){$(".pw-button-dropdown-toggle").trigger("pw-button-dropdown-on")}else{$(".pw-button-dropdown-toggle").trigger("pw-button-dropdown-off")}});$(document).on("wiretabclick",function(event,$newTab,$oldTab){if($newTab.attr("id")=="ProcessPageEditDelete"){$(".InputfieldSubmit:not(#wrap_submit_delete):visible").addClass("pw-hidden-tmp").hide()}else if($oldTab.attr("id")=="ProcessPageEditDelete"){$(".InputfieldSubmit.pw-hidden-tmp").removeClass("pw-hidden-tmp").show()}});var $title=$("body").hasClass("AdminThemeReno")?$("#title"):$("#pw-content-title");if($title.length){var $titleInput=null;if(typeof ProcessWire.config.LanguageSupport!=="undefined"){if(typeof ProcessWire.config.LanguageSupport.language!=="undefined"){$titleInput=$("#Inputfield_title__"+ProcessWire.config.LanguageSupport.language.id)}}if(!$titleInput||!$titleInput.length||!$titleInput.val().length)$titleInput=$("#Inputfield_title");if(!$titleInput.length||!$titleInput.val().length)$titleInput=$("#Inputfield__pw_page_name");if($titleInput.length){var title=$titleInput.val();if(title.length)$titleInput.on("input",function(){var val=$(this).val();$title.text(val.length>0?val:title)})}}}
function initPageEditForm(){$("#ProcessPageEdit:not(.ProcessPageEditSingleField)").WireTabs({items:$("#ProcessPageEdit > .Inputfields > .InputfieldWrapper"),id:"PageEditTabs",skipRememberTabIDs:["ProcessPageEditDelete"]});$("#submit_delete").click(function(){if(!$("#delete_page").is(":checked")){$("#wrap_delete_page label").effect("highlight",{},500);return}var $input=$("<input type='hidden' name='submit_delete' />").val($(this).val());$(this).before($input);$("#ProcessPageEdit").submit()});$(document).on("click","button[type=submit]",function(e){if($("body").hasClass("pw-uploading")){return confirm($("#ProcessPageEdit").attr("data-uploading"))}});if(typeof InputfieldSubmitDropdown!="undefined"){var $dropdownTemplate=$("ul.pw-button-dropdown:not(.pw-button-dropdown-init)");$("button[type=submit]").each(function(){var $button=$(this);var name=$button.attr("name");if($button.hasClass("pw-no-dropdown"))return;if(name.indexOf("submit")==-1||name.indexOf("_draft")>-1)return;if(name.indexOf("_save")==-1&&name.indexOf("_publish")==-1)return;InputfieldSubmitDropdown.init($button,$dropdownTemplate)})}var $viewLink=$("#_ProcessPageEditView");var $viewMenu=$("#_ProcessPageEditViewDropdown");var color=$viewLink.css("color");$("#_ProcessPageEditViewDropdownToggle").css("color",color);$viewLink.click(function(){var action=$viewLink.attr("data-action");if(action=="this"||action=="new"||!action.length)return true;$viewMenu.find(".page-view-action-"+action+" > a").click();return false});var $template=$("#template");var templateID=$template.val();$template.on("change",function(){if($(this).val()==templateID){$(".pw-button-dropdown-toggle").trigger("pw-button-dropdown-on")}else{$(".pw-button-dropdown-toggle").trigger("pw-button-dropdown-off")}});$(document).on("wiretabclick",function(event,$newTab,$oldTab){if($newTab.attr("id")=="ProcessPageEditDelete"){$(".InputfieldSubmit:not(#wrap_submit_delete):visible").addClass("pw-hidden-tmp").hide()}else if($oldTab.attr("id")=="ProcessPageEditDelete"){$(".InputfieldSubmit.pw-hidden-tmp").removeClass("pw-hidden-tmp").show()}});var $title=$("body").hasClass("AdminThemeReno")?$("#title"):$("#pw-content-title");if($title.length){var $titleInput=null;if(typeof ProcessWire.config.LanguageSupport!=="undefined"){if(typeof ProcessWire.config.LanguageSupport.language!=="undefined"){$titleInput=$("#Inputfield_title__"+ProcessWire.config.LanguageSupport.language.id)}}if(!$titleInput||!$titleInput.length||!$titleInput.val().length)$titleInput=$("#Inputfield_title");if(!$titleInput.length||!$titleInput.val().length)$titleInput=$("#Inputfield__pw_page_name");if($titleInput.length){var title=$titleInput.val();if(title.length)$titleInput.on("input",function(){var val=$(this).val();$title.text(val.length>0?val:title)})}}}

View File

@@ -56,7 +56,7 @@ class ProcessPageEdit extends Process implements WirePageEditor, ConfigurableMod
return array(
'title' => 'Page Edit',
'summary' => 'Edit a Page',
'version' => 111,
'version' => 112,
'permanent' => true,
'permission' => 'page-edit',
'icon' => 'edit',
@@ -355,7 +355,7 @@ class ProcessPageEdit extends Process implements WirePageEditor, ConfigurableMod
*/
public function wired() {
parent::wired();
if($this->wire('process') instanceof WirePageEditor) {
if($this->wire()->process instanceof WirePageEditor) {
// keep existing process, which may be building on top of this one
} else {
$this->wire('process', $this);
@@ -370,12 +370,12 @@ class ProcessPageEdit extends Process implements WirePageEditor, ConfigurableMod
*/
public function init() {
$this->modules = $this->wire('modules');
$this->input = $this->wire('input');
$this->config = $this->wire('config');
$this->user = $this->wire('user');
$this->sanitizer = $this->wire('sanitizer');
$this->session = $this->wire('session');
$this->modules = $this->wire()->modules;
$this->input = $this->wire()->input;
$this->config = $this->wire()->config;
$this->user = $this->wire()->user;
$this->sanitizer = $this->wire()->sanitizer;
$this->session = $this->wire()->session;
// predefined messages that maybe used in multiple places
$this->set('noticeUnknown', $this->_("Unknown page")); // Init error: Unknown page
@@ -398,7 +398,7 @@ class ProcessPageEdit extends Process implements WirePageEditor, ConfigurableMod
$id = abs($postID ? $postID : $getID);
if(!$id) {
$this->session->redirect('./bookmarks/');
$this->session->location('./bookmarks/');
throw new Wire404Exception($this->noticeUnknown, Wire404Exception::codeSecondary); // Init error: no page provided
}
@@ -433,7 +433,7 @@ class ProcessPageEdit extends Process implements WirePageEditor, ConfigurableMod
// determine if we're going to be dealing with a save/post request
$this->isPost = ($postID > 0 && ($postID === $this->page->id))
|| ($this->config->ajax && (count($_POST) || isset($_SERVER['HTTP_X_FIELDNAME'])));
|| ($this->config->ajax && ($this->input->requestMethod('POST') || isset($_SERVER['HTTP_X_FIELDNAME'])));
if(!$this->isPost) {
$this->setupHeadline();
@@ -532,14 +532,14 @@ class ProcessPageEdit extends Process implements WirePageEditor, ConfigurableMod
*/
public function ___execute() {
if(!$this->page) throw new WireException("No page found");
if(!$this->page) throw new WireException($this->_('No page found'));
if($this->setEditor) {
// note that setting the editor can force a redirect to a ProcessPageType editor
$this->page->setEditor($this->editor ? $this->editor : $this);
}
if($this->config->ajax && (isset($_SERVER['HTTP_X_FIELDNAME']) || count($_POST))) {
if($this->config->ajax && (isset($_SERVER['HTTP_X_FIELDNAME']) || $this->input->requestMethod('POST'))) {
$this->ajaxSave($this->page);
return '';
}
@@ -560,7 +560,7 @@ class ProcessPageEdit extends Process implements WirePageEditor, ConfigurableMod
$this->form = $this->buildForm($this->form);
$this->form->setTrackChanges();
if($this->isPost && count($_POST)) $this->processSave();
if($this->isPost && $this->form->isSubmitted()) $this->processSave();
if($this->page->hasStatus(Page::statusLocked)) {
if($this->user->hasPermission('page-lock', $this->page)) {
@@ -592,7 +592,6 @@ class ProcessPageEdit extends Process implements WirePageEditor, ConfigurableMod
$config = $this->config;
$class = '';
$numFields = count($this->fields);
// $out = "<p id='PageIDIndicator' class='$class'>" . ($this->page->id ? $this->page->id : "New") . "</p>";
$out = "<p id='PageIDIndicator' class='$class'>{$this->page->id}</p>";
$description = $this->form->getSetting('description');
@@ -719,8 +718,7 @@ class ProcessPageEdit extends Process implements WirePageEditor, ConfigurableMod
$url = '';
if(!$this->page) throw new WireException('No page yet');
if($this->hasLanguagePageNames) {
/** @var Languages $languages */
$languages = $this->wire('languages');
$languages = $this->wire()->languages;
if($language) {
if(is_string($language) || is_int($language)) $language = $languages->get($language);
$userLanguage = $language;
@@ -811,7 +809,7 @@ class ProcessPageEdit extends Process implements WirePageEditor, ConfigurableMod
$ul .= "<li>$_action</li>";
}
$ul .= "</ul>";
$actions[$name] = str_replace('</a>', ' &nbsp;</a>', $actions[$name]) . $ul;
$actions[$name] = str_replace('</a>', ' &nbsp;</a>', $action) . $ul;
} else {
$actions[$name] = str_replace(' pw-has-items', '', $action);
}
@@ -947,6 +945,7 @@ class ProcessPageEdit extends Process implements WirePageEditor, ConfigurableMod
if(!isset($collapsedTabTypes[$inputfield->collapsed])) continue;
/** @var InputfieldFieldsetTabOpen $tab */
if(!$fieldsetTab) {
/** @var FieldtypeFieldsetTabOpen $fieldsetTab */
$fieldsetTab = $this->modules->get('FieldtypeFieldsetTabOpen');
$this->modules->get('FieldtypeFieldsetClose');
}
@@ -1566,7 +1565,7 @@ class ProcessPageEdit extends Process implements WirePageEditor, ConfigurableMod
$multilang = $languages && $languages->hasPageNames();
$slashUrls = $this->page->template->slashUrls;
$deleteIDs = array();
$rootUrl = $this->wire('config')->urls->root;
$rootUrl = $this->config->urls->root;
/** @var InputfieldCheckbox $delete */
$delete = $modules->get('InputfieldCheckbox');
@@ -1576,7 +1575,7 @@ class ProcessPageEdit extends Process implements WirePageEditor, ConfigurableMod
$delete->attr('title', $this->_x('Delete', 'prev-path-delete'));
$delete->renderReady();
if($this->isPost) {
if($this->isPost && $this->form->isSubmitted('_prevpath_delete')) {
$deleteIDs = array_flip($input->post->array('_prevpath_delete'));
}
@@ -1679,7 +1678,7 @@ class ProcessPageEdit extends Process implements WirePageEditor, ConfigurableMod
}
}
if($this->isPost) {
if($this->isPost && $this->form->isSubmitted('_prevpath_add')) {
$add->processInput($input->post);
if($add->val()) {
foreach(explode("\n", $add->val()) as $path) {
@@ -2034,9 +2033,16 @@ class ProcessPageEdit extends Process implements WirePageEditor, ConfigurableMod
*
*/
protected function processSave() {
$input = $this->wire()->input;
$pages = $this->wire()->pages;
$page = $this->page;
$user = $this->user;
$form = $this->form;
if($this->page->hasStatus(Page::statusLocked)) {
if(!$this->user->hasPermission('page-lock', $this->page) || (!empty($_POST['status']) && in_array(Page::statusLocked, $_POST['status']))) {
if($page->hasStatus(Page::statusLocked)) {
$inputStatus = $input->post('status');
if(!$user->hasPermission('page-lock', $page) || (is_array($inputStatus) && in_array(Page::statusLocked, $inputStatus))) {
$this->error($this->noticeLocked);
$this->processSaveRedirect($this->redirectUrl);
return;
@@ -2046,16 +2052,16 @@ class ProcessPageEdit extends Process implements WirePageEditor, ConfigurableMod
$formErrors = 0;
// remove temporary status that may have been assigned by ProcessPageAdd quick add mode
if($this->page->hasStatus(Page::statusTemp)) $this->page->removeStatus(Page::statusTemp);
if($page->hasStatus(Page::statusTemp)) $page->removeStatus(Page::statusTemp);
if($this->input->post('submit_delete')) {
if($form->isSubmitted('submit_delete')) {
if($this->input->post('delete_page')) $this->deletePage();
if(((int) $input->post('delete_page')) === $this->page->id) $this->deletePage();
} else {
$this->processInput($this->form);
$changes = array_unique($this->page->getChanges());
$this->processInput($form);
$changes = array_unique($page->getChanges());
$numChanges = count($changes);
if($numChanges) {
$this->changes = $changes;
@@ -2068,50 +2074,50 @@ class ProcessPageEdit extends Process implements WirePageEditor, ConfigurableMod
// if any Inputfields threw errors during processing, give the page a 'flagged' status
// so that it can later be identified the page may be missing something
if($formErrors && count($this->form->getErrors())) {
if($formErrors && count($form->getErrors())) {
// add flagged status when form had errors
$this->page->addStatus(Page::statusFlagged);
} else if($this->page->hasStatus(Page::statusFlagged)) {
$page->addStatus(Page::statusFlagged);
} else if($page->hasStatus(Page::statusFlagged)) {
// if no errors, remove incomplete status
$this->page->removeStatus(Page::statusFlagged);
$page->removeStatus(Page::statusFlagged);
$this->message($this->_('Removed flagged status because no errors reported during save'));
}
$isUnpublished = $this->page->hasStatus(Page::statusUnpublished);
$isUnpublished = $page->hasStatus(Page::statusUnpublished);
if($this->input->post('submit_publish') || $this->input->post('submit_save')) {
if($input->post('submit_publish') || $input->post('submit_save')) {
try {
$options = array();
$name = '';
if($this->page->isChanged('name')) {
if(!strlen($this->page->name) && $this->page->namePrevious) {
if($page->isChanged('name')) {
if(!strlen($page->name) && $page->namePrevious) {
// blank page name when there was a previous name, set back the previous
// example instance: when template.childNameFormat in use and template.noSettings active
$this->page->name = $this->page->namePrevious;
$page->name = $page->namePrevious;
} else {
$name = $this->page->name;
$name = $page->name;
}
$options['adjustName'] = true;
}
$numChanges = $numChanges > 0 ? ' (' . sprintf($this->_n('%d change', '%d changes', $numChanges) . ')', $numChanges) : '';
if($this->input->post('submit_publish') && $isUnpublished && $this->page->publishable() && !$formErrors) {
$this->page->removeStatus(Page::statusUnpublished);
if($input->post('submit_publish') && $isUnpublished && $this->page->publishable() && !$formErrors) {
$page->removeStatus(Page::statusUnpublished);
$message = sprintf($this->_('Published Page: %s'), '{path}') . $numChanges; // Message shown when page is published
} else {
$message = sprintf($this->_('Saved Page: %s'), '{path}') . $numChanges; // Message shown when page is saved
if($isUnpublished && $formErrors && $this->input->post('submit_publish')) {
if($isUnpublished && $formErrors && $input->post('submit_publish')) {
$message .= ' - ' . $this->_('Cannot be published until errors are corrected');
}
}
$restored = false;
if($this->input->post('restore_page') && $this->page->isTrash() && $this->page->restorable()) {
if($input->post('restore_page') && $page->isTrash() && $page->restorable()) {
if($formErrors) {
$this->warning($this->_('Page cannot be restored while errors are present'));
} else if($this->wire('pages')->restore($this->page, false)) {
} else if($pages->restore($page, false)) {
$message = sprintf($this->_('Restored Page: %s'), '{path}') . $numChanges;
$restored = true;
} else {
@@ -2119,12 +2125,12 @@ class ProcessPageEdit extends Process implements WirePageEditor, ConfigurableMod
}
}
$this->wire('pages')->save($this->page, $options);
if($restored) $this->wire('pages')->restored($this->page);
$message = str_replace('{path}', $this->page->path, $message);
$pages->save($page, $options);
if($restored) $pages->restored($page);
$message = str_replace('{path}', $page->path, $message);
$this->message($message);
if($name && $name != $this->page->name) {
if($name && $name != $page->name) {
$this->warning(sprintf($this->_('Changed page URL name to "%s" because requested name was already taken.'), $this->page->name));
}
@@ -2147,7 +2153,7 @@ class ProcessPageEdit extends Process implements WirePageEditor, ConfigurableMod
// if there were errors to attend to, stay where we are
} else {
// after submit action
$submitAction = $this->input->post('_after_submit_action');
$submitAction = $input->post('_after_submit_action');
if($submitAction) $this->processSubmitAction($submitAction);
}
@@ -2224,7 +2230,7 @@ class ProcessPageEdit extends Process implements WirePageEditor, ConfigurableMod
}
}
$this->setRedirectUrl($redirectUrl);
$this->session->redirect($this->getRedirectUrl());
$this->session->location($this->getRedirectUrl());
}
/**
@@ -2239,6 +2245,7 @@ class ProcessPageEdit extends Process implements WirePageEditor, ConfigurableMod
$input = $this->wire()->input;
$languages = $this->wire()->languages;
$page = $this->page;
static $skipFields = array(
'sortfield_reverse',
@@ -2250,10 +2257,10 @@ class ProcessPageEdit extends Process implements WirePageEditor, ConfigurableMod
if(!$level) {
$form->processInput($input->post);
$formRoot = $form;
$this->page->setQuietly('_forceAddStatus', 0);
$page->setQuietly('_forceAddStatus', 0);
}
$errorAction = (int) $this->page->template->errorAction;
$errorAction = (int) $page->template->errorAction;
foreach($form as $inputfield) {
@@ -2263,8 +2270,8 @@ class ProcessPageEdit extends Process implements WirePageEditor, ConfigurableMod
if($name == '_pw_page_name') $name = 'name';
if(in_array($name, $skipFields)) continue;
if(!$this->page->editable($name, false)) {
$this->page->untrackChange($name); // just in case
if(!$page->editable($name, false)) {
$page->untrackChange($name); // just in case
continue;
}
@@ -2285,7 +2292,7 @@ class ProcessPageEdit extends Process implements WirePageEditor, ConfigurableMod
} else if($name == 'parent_id' && count($this->predefinedParents)) {
if(!$this->predefinedParents->has("id=$inputfield->value")) {
$this->error("Parent $inputfield->value is not allowed for $this->page");
$this->error("Parent $inputfield->value is not allowed for $page");
continue;
}
}
@@ -2293,20 +2300,20 @@ class ProcessPageEdit extends Process implements WirePageEditor, ConfigurableMod
if($name == 'status' && $this->processInputStatus($inputfield)) continue;
}
if($this->processInputErrorAction($this->page, $inputfield, $name, $errorAction)) continue;
if($this->processInputErrorAction($page, $inputfield, $name, $errorAction)) continue;
if($name && $inputfield->isChanged()) {
if($languages && $inputfield->getSetting('useLanguages')) {
$v = $this->page->get($name);
$v = $page->get($name);
if(is_object($v)) {
$v = clone $v;
$v->setFromInputfield($inputfield);
$this->page->set($name, $v);
$page->set($name, $v);
} else {
$this->page->set($name, $inputfield->value);
$page->set($name, $inputfield->val());
}
} else {
$this->page->set($name, $inputfield->value);
$page->set($name, $inputfield->val());
}
}
@@ -2316,9 +2323,9 @@ class ProcessPageEdit extends Process implements WirePageEditor, ConfigurableMod
}
if(!$level) {
$forceAddStatus = $this->page->get('_forceAddStatus');
if($forceAddStatus && !$this->page->hasStatus($forceAddStatus)) {
$this->page->addStatus($forceAddStatus);
$forceAddStatus = $page->get('_forceAddStatus');
if($forceAddStatus && !$page->hasStatus($forceAddStatus)) {
$page->addStatus($forceAddStatus);
}
}
}
@@ -2396,16 +2403,17 @@ class ProcessPageEdit extends Process implements WirePageEditor, ConfigurableMod
*
*/
protected function processInputUser(Inputfield $inputfield) {
if(!$this->user->isSuperuser() || !$this->page->id || !$this->page->template->allowChangeUser) return;
$userID = (int) $inputfield->attr('value');
$page = $this->page;
if(!$this->user->isSuperuser() || !$page->id || !$page->template->allowChangeUser) return;
$userID = (int) $inputfield->val();
if(!$userID) return;
if($userID == $this->page->created_users_id) return; // no change
$user = $this->pages->get($userID);
if(!$user->id) return;
if(!in_array($user->template->id, $this->config->userTemplateIDs)) return; // invalid user template
if(!in_array($user->parent_id, $this->config->usersPageIDs)) return; // invalid user parent
$this->page->created_users_id = $userID;
$this->page->trackChange('created_users_id');
$page->created_users_id = $userID;
$page->trackChange('created_users_id');
}
/**
@@ -2420,7 +2428,7 @@ class ProcessPageEdit extends Process implements WirePageEditor, ConfigurableMod
if($this->page->template->noChangeTemplate) return true;
$templateID = (int) $inputfield->attr('value');
if(!$templateID) return true;
$template = $this->wire('templates')->get((int) $inputfield->attr('value'));
$template = $this->wire()->templates->get((int) $inputfield->val());
if(!$template) return true; // invalid template
if($template->id == $this->page->template->id) return true; // no change
if(!$this->isAllowedTemplate($template)) {
@@ -2428,7 +2436,7 @@ class ProcessPageEdit extends Process implements WirePageEditor, ConfigurableMod
}
// template has changed, set a redirect URL which will confirm the change
$this->setRedirectUrl("template?id={$this->page->id}&template={$template->id}");
$this->setRedirectUrl("template?id={$this->page->id}&template=$template->id");
return true;
}
@@ -2478,7 +2486,7 @@ class ProcessPageEdit extends Process implements WirePageEditor, ConfigurableMod
*/
protected function processInputSortfield(Inputfield $inputfield) {
if(!$this->user->hasPermission('page-sort', $this->page)) return true;
$sortfield = $this->sanitizer->name($inputfield->value);
$sortfield = $this->sanitizer->name($inputfield->val());
if($sortfield != 'sort' && !empty($_POST['sortfield_reverse'])) $sortfield = '-' . $sortfield;
if(empty($sortfield)) $sortfield = 'sort';
$this->page->sortfield = $sortfield;
@@ -2607,10 +2615,10 @@ class ProcessPageEdit extends Process implements WirePageEditor, ConfigurableMod
$v->setFromInputfield($inputfield);
$page->set($name, $v);
} else {
$page->set($name, $inputfield->value);
$page->set($name, $inputfield->val());
}
} else {
$page->set($name, $inputfield->value);
$page->set($name, $inputfield->val());
}
$numFields++;
$lastFieldName = $inputfield->name;
@@ -2680,7 +2688,6 @@ class ProcessPageEdit extends Process implements WirePageEditor, ConfigurableMod
*
*/
protected function ___ajaxSaveDone(Page $page, array $data) {
if($page && $data) {} // ignore
return false;
}
@@ -2691,41 +2698,42 @@ class ProcessPageEdit extends Process implements WirePageEditor, ConfigurableMod
*/
/**
* Execute a template change for a page, building an info + confirmation form (handler for /template/ action)
* Build template form
*
* @return string
* @param Template $template Proposed template to change to
* @return InputfieldForm
* @throws WireException
*
* @since 3.0.205
*
*/
public function ___executeTemplate() {
protected function buildTemplateForm(Template $template) {
if($this->page->template->noChangeTemplate) {
throw new WireException("Template changes not allowed by pages using template: $template");
}
if(!$this->useSettings || !$this->user->hasPermission('page-template', $this->page)) {
throw new WireException("You don't have permission to change the template on this page.");
}
$templateID = (int) $this->input->get('template');
if($templateID < 1) throw new WireException("This method requires a 'template' get var");
$template = $this->templates->get($templateID);
if(!$template) throw new WireException("Unknown template");
if(!$this->isAllowedTemplate($template->id)) {
throw new WireException("That template is not allowed");
}
$labelConfirm = $this->_('Confirm template change'); // Change template confirmation subhead
$labelAction = sprintf($this->_('Change template from "%1$s" to "%2$s"'), $this->page->template, $template); // Change template A to B headline
$labelAction = sprintf($this->_('Change template from "%1$s" to "%2$s"'), $this->page->template, $template->name); // Change template A to B headline
$this->headline($labelConfirm);
if($this->requestModal) $this->error("$labelConfirm $labelAction"); // force modal open
/** @var InputfieldForm $form */
$form = $this->modules->get("InputfieldForm");
$form->attr('action', 'saveTemplate');
$form->attr('method', 'post');
$form = $this->modules->get("InputfieldForm");
$form->attr('action', 'saveTemplate');
$form->attr('method', 'post');
$form->description = $labelAction;
/** @var InputfieldMarkup $f */
$f = $this->modules->get("InputfieldMarkup");
$f = $this->modules->get("InputfieldMarkup");
$f->icon = 'cubes';
$f->label = $labelConfirm;
$list = array();
@@ -2735,34 +2743,62 @@ class ProcessPageEdit extends Process implements WirePageEditor, ConfigurableMod
$list[] = $this->sanitizer->entities($field->getLabel()) . " ($field->name)";
}
}
if(!$list) $this->executeSaveTemplate($template);
$f->description = $this->_('Warning, changing the template will delete the following fields:'); // Headline that precedes list of fields that will be deleted as a result of template change
$icon = "<i class='fa fa-times-circle'></i> ";
$f->attr('value', "<p class='ui-state-error-text'>$icon" . implode("<br />$icon", $list) . '</p>');
$form->append($f);
if(count($list)) {
$f->description = $this->_('Warning, changing the template will delete the following fields:'); // Headline that precedes list of fields that will be deleted as a result of template change
$icon = wireIconMarkup('times-circle');
$f->attr('value', "<p class='ui-state-error-text'>$icon " . implode("<br />$icon ", $list) . '</p>');
$form->append($f);
}
/** @var InputfieldCheckbox $f */
$f = $this->modules->get("InputfieldCheckbox");
$f->attr('name', 'template');
$f->attr('value', $template->id);
$f = $this->modules->get("InputfieldCheckbox");
$f->attr('name', 'template');
$f->attr('value', $template->id);
$f->label = $this->_('Are you sure?'); // Checkbox label to confirm they want to change template
$f->label2 = $labelAction;
$f->icon = 'warning';
$f->description = $this->_('Please confirm that you understand the above by clicking the checkbox below.'); // Checkbox description to confirm they want to change template
$form->append($f);
if(count($list)) $f->description = $this->_('Please confirm that you understand the above by clicking the checkbox below.'); // Checkbox description to confirm they want to change template
$form->append($f);
/** @var InputfieldHidden $f */
$f = $this->modules->get("InputfieldHidden");
$f->attr('name', 'id');
$f->attr('value', $this->page->id);
$form->append($f);
$f = $this->modules->get("InputfieldHidden");
$f->attr('name', 'id');
$f->attr('value', $this->page->id);
$form->append($f);
/** @var InputfieldSubmit $f */
$f = $this->modules->get("InputfieldSubmit");
$form->append($f);
$f = $this->modules->get("InputfieldSubmit");
$f->attr('name', 'submit_change_template');
$form->append($f);
return $form;
}
$page = $this->masterPage ? $this->masterPage : $this->page;
$this->wire('breadcrumbs')->add(new Breadcrumb("./?id={$page->id}", $page->get("title|name")));
/**
* Execute a template change for a page, building an info + confirmation form (handler for /template/ action)
*
* @return string
* @throws WireException
*
*/
public function ___executeTemplate() {
$page = $this->page;
$editUrl = "./?id=$page->id";
$templateId = (int) $this->input->get('template');
try {
if($templateId < 1) throw new WireException("Missing a 'template' GET variable");
$template = $this->templates->get($templateId);
if(!$template) throw new WireException("Unknown template");
$form = $this->buildTemplateForm($template);
} catch(\Exception $e) {
$this->error($e->getMessage());
$this->session->location($editUrl);
return '';
}
$this->breadcrumb($editUrl, $page->get("title|name"));
return $form->render();
}
@@ -2770,33 +2806,44 @@ class ProcessPageEdit extends Process implements WirePageEditor, ConfigurableMod
/**
* Save a template change for a page (handler for /saveTemplate/ action)
*
* @param Template $template
* @throws WireException
*
*/
public function ___executeSaveTemplate($template = null) {
if(!$this->useSettings || !$this->user->hasPermission('page-template', $this->page)) {
throw new WireException($this->_("You don't have permission to change the template on this page.")); // Error: user doesn't have permission to change template
public function ___executeSaveTemplate() {
$page = $this->page;
$editUrl = "./?id=$page->id";
$templateId = (int) $this->input->post('template');
$template = $templateId > 0 ? $this->templates->get($templateId) : null;
if(!$template) {
// checkbox not checked, template change aborted
$this->session->location($editUrl);
return;
}
try {
$form = $this->buildTemplateForm($template);
} catch(\Exception $e) {
$this->error($e->getMessage());
$form = null;
}
if(!$form || !$form->isSubmitted('submit_change_template')) {
$this->session->location($editUrl);
return;
}
try {
$page->template = $template;
$page->save();
$this->message(sprintf($this->_("Changed template to '%s'"), $template->name)); // Message: template was changed
} catch(\Exception $e) {
$this->error($e->getMessage());
}
if(!$this->page->template->noChangeTemplate) {
if(!is_null($template) || (isset($_POST['template']) && ($template = $this->templates->get((int) $_POST['template'])))) {
try {
if(!$this->isAllowedTemplate($template)) {
throw new WireException($this->_('That template is not allowed')); // Error: selected template is not allowed
}
$this->page->template = $template;
$this->page->save();
$this->message(sprintf($this->_("Changed template to '%s'"), $template)); // Message: template was changed
} catch(\Exception $e) {
$this->error($e->getMessage());
}
}
}
$this->session->redirect("./?id={$this->page->id}");
$this->session->location($editUrl);
}
/**
@@ -2815,8 +2862,7 @@ class ProcessPageEdit extends Process implements WirePageEditor, ConfigurableMod
$page = $this->masterPage ? $this->masterPage : $this->page;
$parent = $page->parent;
$parentEditable = ($parent->id && $parent->editable());
/** @var Config $config */
$config = $this->wire('config');
$config = $this->config;
$superAdvanced = $isSuperuser && $config->advanced;
// current page template is assumed, otherwise we wouldn't be here
@@ -2828,7 +2874,7 @@ class ProcessPageEdit extends Process implements WirePageEditor, ConfigurableMod
return $templates;
}
$allTemplates = count($this->predefinedTemplates) ? $this->predefinedTemplates : $this->wire('templates');
$allTemplates = count($this->predefinedTemplates) ? $this->predefinedTemplates : $this->wire()->templates;
// note: this triggers load of all templates, fieldgroups and fields
foreach($allTemplates as $template) {
@@ -2888,7 +2934,7 @@ class ProcessPageEdit extends Process implements WirePageEditor, ConfigurableMod
* @return bool
*
*/
protected function isAllowedTemplate($id) {
public function isAllowedTemplate($id) {
// if $id is a template, then convert it to it's numeric ID
if($id instanceof Template) $id = $id->id;
@@ -3169,7 +3215,7 @@ class ProcessPageEdit extends Process implements WirePageEditor, ConfigurableMod
*/
public function ___executeNavJSON(array $options = array()) {
$bookmarks = $this->getPageBookmarks();
$options['edit'] = $this->wire('config')->urls->admin . 'page/edit/?id={id}';
$options['edit'] = $this->config->urls->admin . 'page/edit/?id={id}';
$options['defaultIcon'] = 'pencil';
$options = $bookmarks->initNavJSON($options);
return parent::___executeNavJSON($options);
@@ -3204,7 +3250,7 @@ class ProcessPageEdit extends Process implements WirePageEditor, ConfigurableMod
$title = (string) $title;
}
if(empty($title)) {
if($this->wire('pages')->names()->isUntitledPageName($page->name)) {
if($this->pages->names()->isUntitledPageName($page->name)) {
$title = $page->template->getLabel();
} else {
$title = $page->get('name');
@@ -3250,9 +3296,9 @@ class ProcessPageEdit extends Process implements WirePageEditor, ConfigurableMod
*/
public function setupBreadcrumbs() {
if($this->input->urlSegment1) return;
if($this->wire('page')->process != $this->className()) return;
$this->wire('breadcrumbs')->shift(); // shift off the 'Admin' breadcrumb
if($this->page && $this->page->id != 1) $this->wire('breadcrumbs')->shift(); // shift off the 'Pages' breadcrumb
if($this->wire()->page->process != $this->className()) return;
$this->wire()->breadcrumbs->shift(); // shift off the 'Admin' breadcrumb
if($this->page && $this->page->id != 1) $this->wire()->breadcrumbs->shift(); // shift off the 'Pages' breadcrumb
$page = $this->page ? $this->page : $this->parent;
if($this->masterPage) $page = $this->masterPage;
$lastID = (int) $this->session->get('ProcessPageList', 'lastID');