1
0
mirror of https://github.com/processwire/processwire.git synced 2025-08-22 06:13:57 +02:00

Some refactoring in ProcessPageEdit, plus fix issue where user having page-edit-lang-[lang] permission while having non-default language selected in their profile could receive incorrect "missing required field" error for Page Name, when making edits.

This commit is contained in:
Ryan Cramer
2018-11-02 06:41:35 -04:00
parent 09ee56b41d
commit a0192327e0
2 changed files with 144 additions and 90 deletions

View File

@@ -486,8 +486,8 @@ class LanguageSupport extends WireData implements Module, ConfigurableModule {
$inputfield = $event->object; $inputfield = $event->object;
$replace = false; $replace = false;
if($inputfield->getSetting('useLanguages')) { if($inputfield->getSetting('useLanguages') || $inputfield->getSetting('hasLanguages')) {
// native multi-language field // multi-language field
$this->hookInputfieldBeforeRender($event); // ensures default language values are populated $this->hookInputfieldBeforeRender($event); // ensures default language values are populated
if(!$this->wire('languages')->editable($this->defaultLanguagePage)) $replace = true; if(!$this->wire('languages')->editable($this->defaultLanguagePage)) $replace = true;

View File

@@ -969,22 +969,7 @@ class ProcessPageEdit extends Process implements WirePageEditor, ConfigurableMod
$this->addTab($id, $title); $this->addTab($id, $title);
if($this->page->template->nameContentTab) { if($this->page->template->nameContentTab) {
// name $fields->prepend($this->buildFormPageName());
/** @var InputfieldPageName $field */
$field = $this->modules->get('InputfieldPageName');
$label = $this->page->template->getNameLabel();
if($label) $field->label = $label;
$field->attr('name', '_pw_page_name');
$field->attr('value', $this->page->name);
$field->required = $this->page->id != 1 && !$this->page->hasStatus(Page::statusTemp);
$field->slashUrls = $this->page->template->slashUrls;
if(!$this->page->editable('name', false)) {
$field->attr('disabled', 'disabled');
$field->required = false;
}
$field->editPage = $this->page;
if($this->page->parent) $field->parentPage = $this->page->parent;
$fields->prepend($field);
} }
return $fields; return $fields;
@@ -1130,6 +1115,9 @@ class ProcessPageEdit extends Process implements WirePageEditor, ConfigurableMod
*/ */
protected function ___buildFormSettings() { protected function ___buildFormSettings() {
$superuser = $this->wire('user')->isSuperuser();
/** @var InputfieldWrapper $wrapper */
$wrapper = $this->wire(new InputfieldWrapper()); $wrapper = $this->wire(new InputfieldWrapper());
$id = $this->className() . 'Settings'; $id = $this->className() . 'Settings';
$title = $this->_('Settings'); // Tab Label: Settings $title = $this->_('Settings'); // Tab Label: Settings
@@ -1139,27 +1127,93 @@ class ProcessPageEdit extends Process implements WirePageEditor, ConfigurableMod
// name // name
if(($this->page->id > 1 || $this->hasLanguagePageNames) && !$this->page->template->nameContentTab) { if(($this->page->id > 1 || $this->hasLanguagePageNames) && !$this->page->template->nameContentTab) {
/** @var InputfieldPageName $field */ $wrapper->prepend($this->buildFormPageName());
$field = $this->modules->get('InputfieldPageName');
$label = $this->page->template->getNameLabel();
if($label) $field->label = $label;
$field->attr('value', $this->page->name);
$field->attr('name', '_pw_page_name');
$field->slashUrls = $this->page->template->slashUrls;
$field->required = $this->page->id != 1 && !$this->page->hasStatus(Page::statusTemp);
if(!$this->page->editable('name', false)) {
$field->attr('disabled', 'disabled');
$field->required = false;
}
$field->editPage = $this->page;
if($this->page->parent) $field->parentPage = $this->page->parent;
$wrapper->prepend($field);
} }
// template // template
if($this->page->editable('template', false)) { $wrapper->add($this->buildFormTemplate());
// parent
if($this->page->id > 1 && $this->page->editable('parent', false)) {
$wrapper->add($this->buildFormParent());
}
// createdUser
if($this->page->id && $superuser && $this->page->template->allowChangeUser) {
$wrapper->add($this->buildFormCreatedUser());
}
// status
$wrapper->add($this->buildFormStatus());
// roles and references
if(!$this->isPost) {
// what users may access this page
$wrapper->add($this->buildFormRoles());
// what pages link tot his page
$wrapper->add($this->buildFormReferences());
}
// page path history (previous URLs)
if($superuser) {
$f = $this->buildFormPrevPaths();
if($f) $wrapper->add($f);
}
// information about created and modified user and time
if(!$this->isPost) {
$wrapper->add($this->buildFormInfo());
}
return $wrapper;
}
/**
* Build the page name input
*
* @return InputfieldPageName
*
*/
protected function buildFormPageName() {
/** @var InputfieldPageName $field */
$field = $this->modules->get('InputfieldPageName');
$field->attr('name', '_pw_page_name');
$field->attr('value', $this->page->name);
$field->slashUrls = $this->page->template->slashUrls;
$field->required = $this->page->id != 1 && !$this->page->hasStatus(Page::statusTemp);
$label = $this->page->template->getNameLabel();
if($label) $field->label = $label;
if(!$this->page->editable('name', false)) {
$field->attr('disabled', 'disabled');
$field->required = false;
}
if($this->hasLanguagePageNames) {
// Using 'hasLanguages' as opposed to 'useLanguages' for different support from LanguageSupportPageNames
$field->setQuietly('hasLanguages', true);
}
$field->editPage = $this->page;
if($this->page->parent) $field->parentPage = $this->page->parent;
return $field;
}
/**
* Build the template selection field
*
* @return InputfieldMarkup|InputfieldSelect
*
*/
protected function buildFormTemplate() {
if($this->page->editable('template', false)) {
/** @var Languages $languages */
$languages = $this->wire('languages'); $languages = $this->wire('languages');
/** @var Language $language */
$language = $this->user->language; $language = $this->user->language;
/** @var InputfieldSelect $field */ /** @var InputfieldSelect $field */
@@ -1176,67 +1230,67 @@ class ProcessPageEdit extends Process implements WirePageEditor, ConfigurableMod
$field->addOption($template->id, $label); $field->addOption($template->id, $label);
} }
} else { } else {
/** @var InputfieldMarkup $field */
$field = $this->modules->get('InputfieldMarkup'); $field = $this->modules->get('InputfieldMarkup');
$field->attr('value', "<p>" . $this->page->template->getLabel() . "</p>"); $field->attr('value', "<p>" . $this->page->template->getLabel() . "</p>");
} }
$field->label = $this->_('Template'); // Settings: Template field label $field->label = $this->_('Template'); // Settings: Template field label
$field->icon = 'cubes'; $field->icon = 'cubes';
$wrapper->add($field);
// parent return $field;
if($this->page->id > 1 && $this->page->editable('parent', false)) { }
// @todo also use predefined parents when page is limited to only certain parents (template family settings)
if(count($this->predefinedParents)) { /**
$field = $this->modules->get('InputfieldSelect'); * Build the parent selection Inputfield
foreach($this->predefinedParents as $p) { *
$field->addOption($p->id, $p->path); * @return InputfieldPageListSelect|InputfieldSelect
} *
} else { */
/** @var InputfieldPageListSelect $field */ protected function buildFormParent() {
$field = $this->modules->get('InputfieldPageListSelect');
$field->set('parent_id', 0); if(count($this->predefinedParents)) {
if(!empty($this->configSettings['ajaxParent'])) $field->collapsed = Inputfield::collapsedYesAjax; /** @var InputfieldSelect $field */
$field = $this->modules->get('InputfieldSelect');
foreach($this->predefinedParents as $p) {
$field->addOption($p->id, $p->path);
} }
$field->required = true;
$field->label = $this->_('Parent'); // Settings: Parent field label
$field->icon = 'folder-open-o';
$field->attr('id+name', 'parent_id');
$field->attr('value', $this->page->parent_id);
$wrapper->add($field);
}
// createdUser } else {
if($this->page->id && $this->user->isSuperuser() && $this->page->template->allowChangeUser) {
/** @var InputfieldPageListSelect $field */ /** @var InputfieldPageListSelect $field */
$field = $this->modules->get('InputfieldPageListSelect'); $field = $this->modules->get('InputfieldPageListSelect');
$field->label = $this->_('Created by User'); $field->set('parent_id', 0);
$field->attr('id+name', 'created_users_id'); if(!empty($this->configSettings['ajaxParent'])) {
$field->attr('value', $this->page->created_users_id); $field->collapsed = Inputfield::collapsedYesAjax;
$field->parent_id = $this->config->usersPageID; // @todo support $config->usersPageIDs (array) }
$field->showPath = false;
$field->required = true;
$wrapper->add($field);
} }
// status $field->required = true;
$wrapper->add($this->buildFormStatus()); $field->label = $this->_('Parent'); // Settings: Parent field label
$field->icon = 'folder-open-o';
$field->attr('id+name', 'parent_id');
$field->attr('value', $this->page->parent_id);
// informational sections return $field;
if(!$this->isPost) { }
$wrapper->add($this->buildFormRoles());
$wrapper->add($this->buildFormReferences());
}
if($this->wire('user')->isSuperuser()) { /**
$f = $this->buildFormPrevPaths(); * Build the created user selection
if($f) $wrapper->add($f); *
} * @return InputfieldPageListSelect
*
*/
protected function buildFormCreatedUser() {
/** @var InputfieldPageListSelect $field */
$field = $this->modules->get('InputfieldPageListSelect');
$field->label = $this->_('Created by User');
$field->attr('id+name', 'created_users_id');
$field->attr('value', $this->page->created_users_id);
$field->parent_id = $this->config->usersPageID; // @todo support $config->usersPageIDs (array)
$field->showPath = false;
$field->required = true;
if(!$this->isPost) { return $field;
$wrapper->add($this->buildFormInfo());
}
return $wrapper;
} }
/** /**