From 7e3f10b2ffd15e67520cbc525175c02d607e8e1c Mon Sep 17 00:00:00 2001 From: Ryan Cramer Date: Thu, 23 Jul 2020 11:03:41 -0400 Subject: [PATCH] Attempt to fix issue processwire/processwire-issues#1118 --- .../InputfieldPageName.module | 23 ++++++--- .../FieldtypeTextLanguage.module | 47 ++++++++++++------- .../LanguageSupportPageNames.module | 11 +++-- .../LanguagesPageFieldValue.php | 17 +++++-- 4 files changed, 69 insertions(+), 29 deletions(-) diff --git a/wire/modules/Inputfield/InputfieldPageName/InputfieldPageName.module b/wire/modules/Inputfield/InputfieldPageName/InputfieldPageName.module index 51189da8..a539e3d8 100644 --- a/wire/modules/Inputfield/InputfieldPageName/InputfieldPageName.module +++ b/wire/modules/Inputfield/InputfieldPageName/InputfieldPageName.module @@ -165,16 +165,22 @@ class InputfieldPageName extends InputfieldName implements ConfigurableModule { $url = ''; $out = ''; $box = ''; - $user = $this->wire('user'); - $languages = $this->wire('languages'); - $sanitizer = $this->wire('sanitizer'); + $user = $this->wire()->user; + $languages = $this->wire()->languages; + $sanitizer = $this->wire()->sanitizer; $editable = $this->attr('disabled') ? false : true; - - if($this->editPage && $this->editPage->template->noLang) $languages = false; - if($editable && $languages && $this->hasLanguagePageNames && !$languages->editable($user->language)) $editable = false; + $template = $this->editPage ? $this->editPage->template : null; + $noLang = $template && $template->noLang; if($this->parentPage) { - $url = $this->parentPage->path; + if($noLang && $languages && !$user->language->isDefault()) { + // if noLang active for page edited by non-default user, ensure we use default language url + $languages->setDefault(); + $url = $this->parentPage->path; + $languages->unsetDefault(); + } else { + $url = $this->parentPage->path; + } if($this->hasLanguagePageNames && $this->parentPage->id == $this->wire('config')->rootPageID) { if($user->language->isDefault()) { $parentName = $this->parentPage->name; @@ -183,6 +189,9 @@ class InputfieldPageName extends InputfieldName implements ConfigurableModule { } } + if($noLang) $languages = false; + if($editable && $languages && $this->hasLanguagePageNames && !$languages->editable($user->language)) $editable = false; + if($this->languageSupportLabel) { if($this->checkboxName) { diff --git a/wire/modules/LanguageSupport/FieldtypeTextLanguage.module b/wire/modules/LanguageSupport/FieldtypeTextLanguage.module index 26ab7da3..dd72cf36 100644 --- a/wire/modules/LanguageSupport/FieldtypeTextLanguage.module +++ b/wire/modules/LanguageSupport/FieldtypeTextLanguage.module @@ -25,7 +25,7 @@ class FieldtypeTextLanguage extends FieldtypeText implements FieldtypeLanguageIn /** * Sanitize value for storage - * + * * @param Page $page * @param Field $field * @param LanguagesValueInterface|string $value @@ -33,26 +33,41 @@ class FieldtypeTextLanguage extends FieldtypeText implements FieldtypeLanguageIn * */ public function sanitizeValue(Page $page, Field $field, $value) { + if(is_object($value) && $value instanceof LanguagesPageFieldValue) { // great, already what we wanted - } else { - // convert it to a LanguagesPageFieldValue - $pageValue = $page->data($field->name); // raw unformatted value, with no load possible - if(!$pageValue instanceof LanguagesPageFieldValue) { - $pageValue = new LanguagesPageFieldValue($page, $field, $pageValue); // #98 - } - if(is_array($value)) { - $pageValue->importArray($value); - } else { - $user = $this->wire('user'); - $language = $user ? $user->language : null; - if($language) $pageValue->setLanguageValue($language->id, (string) $value); - } - $value = $pageValue; + return $value; } - return $value; + + // convert it to a LanguagesPageFieldValue + $pageValue = $page->data($field->name); // raw unformatted value, with no load possible + + if(!$pageValue instanceof LanguagesPageFieldValue) { + $pageValue = new LanguagesPageFieldValue($page, $field, $pageValue); // #98 + } + + if(is_array($value)) { + $pageValue->importArray($value); + return $pageValue; + } + + $user = $this->wire()->user; + $language = $user ? $user->language : null; + $template = $page->template; + + if(!$language) return $pageValue; + + if($template && $template->noLang) { + $languages = $this->wire()->languages; + $pageValue->setLanguageValue($languages->getDefault()->id, (string) $value); + } else { + $pageValue->setLanguageValue($language->id, (string) $value); + } + + return $pageValue; } + /** * Return the database schema in specified format * diff --git a/wire/modules/LanguageSupport/LanguageSupportPageNames.module b/wire/modules/LanguageSupport/LanguageSupportPageNames.module index 5f364d73..9fac658d 100644 --- a/wire/modules/LanguageSupport/LanguageSupportPageNames.module +++ b/wire/modules/LanguageSupport/LanguageSupportPageNames.module @@ -353,6 +353,11 @@ class LanguageSupportPageNames extends WireData implements Module, ConfigurableM public function getPagePath(Page $page, Language $language) { $isDefault = $language->isDefault(); + + if(!$isDefault && $page->template && $page->template->noLang) { + $language = $this->wire()->languages->getDefault(); + $isDefault = true; + } if($page->id == 1) { // special case: homepage @@ -685,9 +690,9 @@ class LanguageSupportPageNames extends WireData implements Module, ConfigurableM public function hookPagePath(HookEvent $event) { /** @var Page $page */ $page = $event->object; - if($page->template == 'admin') return; - $language = $this->wire('user')->get('language'); - if(!$language) $language = $this->wire('languages')->get('default'); + if($page->template->name == 'admin') return; + $language = $this->wire()->user->language; + if(!$language) $language = $this->wire()->languages->getDefault(); $event->return = $this->getPagePath($page, $language); } diff --git a/wire/modules/LanguageSupport/LanguagesPageFieldValue.php b/wire/modules/LanguageSupport/LanguagesPageFieldValue.php index ebb6713f..9507fd59 100644 --- a/wire/modules/LanguageSupport/LanguagesPageFieldValue.php +++ b/wire/modules/LanguageSupport/LanguagesPageFieldValue.php @@ -222,14 +222,24 @@ class LanguagesPageFieldValue extends Wire implements LanguagesValueInterface, \ * */ public function __toString() { - return $this->wire('hooks')->isHooked('LanguagesPageFieldValue::getStringValue()') ? $this->__call('getStringValue', array()) : $this->___getStringValue(); + if($this->wire('hooks')->isHooked('LanguagesPageFieldValue::getStringValue()')) { + return $this->__call('getStringValue', array()); + } else { + return $this->___getStringValue(); + } } protected function ___getStringValue() { - $language = $this->wire('user')->language; + + $template = $this->page->template; + $language = $this->wire()->user->language; $defaultValue = (string) $this->data[$this->defaultLanguagePageID]; - if(!$language || !$language->id || $language->isDefault()) return $defaultValue; + + if(!$language || !$language->id || $language->isDefault()) return $defaultValue; + if($template && $template->noLang) return $defaultValue; + $languageValue = (string) (empty($this->data[$language->id]) ? '' : $this->data[$language->id]); + if(!strlen($languageValue)) { // value is blank if($this->field) { @@ -239,6 +249,7 @@ class LanguagesPageFieldValue extends Wire implements LanguagesValueInterface, \ } } } + return $languageValue; }