1
0
mirror of https://github.com/processwire/processwire.git synced 2025-08-14 02:34:24 +02:00

Fix issue processwire/processwire-issues#1118 fixes to multi-language textarea and file/image fields when template has 'noLang' option set and user is editing page in non-default language

This commit is contained in:
Ryan Cramer
2023-01-20 09:10:33 -05:00
parent e34a190eeb
commit 0b79e38d9d
2 changed files with 51 additions and 30 deletions

View File

@@ -329,7 +329,7 @@ class InputfieldFile extends Inputfield implements InputfieldItemList, Inputfiel
protected function renderItemDescriptionField(Pagefile $pagefile, $id, $n) { protected function renderItemDescriptionField(Pagefile $pagefile, $id, $n) {
$sanitizer = $this->wire()->sanitizer; $sanitizer = $this->wire()->sanitizer;
$languages = $this->noLang ? null : $this->wire()->languages; $languages = $this->wire()->languages;
$user = $this->wire()->user; $user = $this->wire()->user;
if($n) {} if($n) {}
@@ -341,7 +341,7 @@ class InputfieldFile extends Inputfield implements InputfieldItemList, Inputfiel
if($this->renderValueMode) { if($this->renderValueMode) {
if($languages) { if($languages) {
$description = $pagefile->description($user->language); $description = $pagefile->description($this->noLang ? $languages->getDefault() : $user->language);
} else { } else {
$description = $pagefile->description; $description = $pagefile->description;
} }
@@ -357,11 +357,12 @@ class InputfieldFile extends Inputfield implements InputfieldItemList, Inputfiel
$userLanguage = $languages ? $user->language : null; $userLanguage = $languages ? $user->language : null;
$defaultDescriptionFieldLabel = $sanitizer->entities1($this->labels['description']); $defaultDescriptionFieldLabel = $sanitizer->entities1($this->labels['description']);
if(!$userLanguage || $languages->count() < 2) { if(!$userLanguage || $languages->count() < 2 || $this->noLang) {
$numLanguages = 0; $numLanguages = 0;
$languages = array(null); $forLanguages = array(null);
} else { } else {
$numLanguages = $languages->count(); $numLanguages = $languages->count();
$forLanguages = $languages;
if(is_null($hasLangTabs)) { if(is_null($hasLangTabs)) {
$modules = $this->wire()->modules; $modules = $this->wire()->modules;
$hasLangTabs = $modules->isInstalled('LanguageTabs'); $hasLangTabs = $modules->isInstalled('LanguageTabs');
@@ -373,7 +374,7 @@ class InputfieldFile extends Inputfield implements InputfieldItemList, Inputfiel
} }
} }
foreach($languages as $language) { foreach($forLanguages as $language) {
$descriptionFieldName = "description_$id"; $descriptionFieldName = "description_$id";
$descriptionFieldLabel = $defaultDescriptionFieldLabel; $descriptionFieldLabel = $defaultDescriptionFieldLabel;
@@ -401,6 +402,9 @@ class InputfieldFile extends Inputfield implements InputfieldItemList, Inputfiel
$out .= "<div class='InputfieldFileDescription'>"; // open wrapper $out .= "<div class='InputfieldFileDescription'>"; // open wrapper
$attrStr = "placeholder='$descriptionFieldLabel&hellip;'"; $attrStr = "placeholder='$descriptionFieldLabel&hellip;'";
$labelClass = 'detail pw-hidden'; $labelClass = 'detail pw-hidden';
// for the $pagefile->description($language) call further below
if($languages && $this->noLang) $language = $languages->getDefault();
} }
$attrStr = "name='$descriptionFieldName' id='$descriptionFieldName' $attrStr"; $attrStr = "name='$descriptionFieldName' id='$descriptionFieldName' $attrStr";
@@ -848,11 +852,15 @@ class InputfieldFile extends Inputfield implements InputfieldItemList, Inputfiel
*/ */
protected function ___extractMetadata(Pagefile $pagefile, array $metadata = array()) { protected function ___extractMetadata(Pagefile $pagefile, array $metadata = array()) {
$metadata['description'] = $pagefile->description; $languages = $this->wire()->languages;
$languages = $this->noLang ? null : $this->wire()->languages;
if($languages) { if($languages) {
$metadata['description'] = $pagefile->description($languages->getDefault());
} else {
$metadata['description'] = $pagefile->description;
}
if($languages && !$this->noLang) {
foreach($languages as $language) { foreach($languages as $language) {
/** @var Language $language */ /** @var Language $language */
if($language->isDefault()) continue; if($language->isDefault()) continue;
@@ -1026,8 +1034,10 @@ class InputfieldFile extends Inputfield implements InputfieldItemList, Inputfiel
} }
// description and tags // description and tags
$languages = $this->noLang ? null : $this->wire()->languages; // $languages = $this->noLang ? null : $this->wire()->languages;
$keys = $languages ? array('tags') : array('description', 'tags'); $languages = $this->wire()->languages;
$useLanguages = $languages && !$this->noLang;
$keys = $useLanguages ? array('tags') : array('description', 'tags');
foreach($keys as $key) { foreach($keys as $key) {
if(isset($input[$key . '_' . $id])) { if(isset($input[$key . '_' . $id])) {
@@ -1045,6 +1055,7 @@ class InputfieldFile extends Inputfield implements InputfieldItemList, Inputfiel
if($languages) { if($languages) {
foreach($languages as $language) { foreach($languages as $language) {
/** @var Language $language */ /** @var Language $language */
if(!$useLanguages && !$language->isDefault()) continue;
if(!$languages->editable($language)) continue; if(!$languages->editable($language)) continue;
$key = $language->isDefault() ? "description_$id" : "description{$language->id}_$id"; $key = $language->isDefault() ? "description_$id" : "description{$language->id}_$id";
if(!isset($input[$key])) continue; if(!isset($input[$key])) continue;
@@ -1398,6 +1409,7 @@ class InputfieldFile extends Inputfield implements InputfieldItemList, Inputfiel
$this->itemFieldgroup = false; $this->itemFieldgroup = false;
$template = $pagefiles->getFieldsTemplate(); $template = $pagefiles->getFieldsTemplate();
if(!$template) return false; if(!$template) return false;
if($this->noLang) $template->setQuietly('noLang', 1);
$this->itemFieldgroup = $template->fieldgroup; $this->itemFieldgroup = $template->fieldgroup;
} }

View File

@@ -5,7 +5,7 @@ require_once(dirname(__FILE__) . '/FieldtypeLanguageInterface.php');
/** /**
* Multi-language capable textarea field * Multi-language capable textarea field
* *
* ProcessWire 3.x, Copyright 2016 by Ryan Cramer * ProcessWire 3.x, Copyright 2023 by Ryan Cramer
* https://processwire.com * https://processwire.com
* *
* *
@@ -19,7 +19,7 @@ class FieldtypeTextareaLanguage extends FieldtypeTextarea implements FieldtypeLa
'version' => 100, 'version' => 100,
'summary' => 'Field that stores a multiple lines of text in multiple languages', 'summary' => 'Field that stores a multiple lines of text in multiple languages',
'requires' => array('LanguageSupportFields') 'requires' => array('LanguageSupportFields')
); );
} }
/** /**
@@ -32,19 +32,28 @@ class FieldtypeTextareaLanguage extends FieldtypeTextarea implements FieldtypeLa
* *
*/ */
public function sanitizeValue(Page $page, Field $field, $value) { public function sanitizeValue(Page $page, Field $field, $value) {
if(is_object($value) && $value instanceof LanguagesPageFieldValue) {
// great, already what we wanted if($value instanceof LanguagesPageFieldValue) return $value;
} else {
// convert it to a LanguagesPageFieldValue if(is_array($value)) $value = reset($value);
if(is_array($value)) $value = reset($value);
$str = (string) $value; $value = (string) $value;
$value = $page->data($field->name); $template = $page->template;
if(!is_object($value)) { // string, array or null $pageValue = $page->data($field->name);
$value = new LanguagesPageFieldValue($page, $field, $value);
} if(!$pageValue instanceof LanguagesPageFieldValue) { // string, array or null
$value->setLanguageValue($this->wire('user')->language->id, $str); $pageValue = new LanguagesPageFieldValue($page, $field, $value);
} }
return $value;
if($template && $template->noLang) {
$languages = $this->wire()->languages;
$pageValue->setLanguageValue($languages->getDefault()->id, $value);
} else {
$language = $this->wire()->user->language;
if($language) $pageValue->setLanguageValue($language->id, $value);
}
return $pageValue;
} }
/** /**
@@ -56,7 +65,8 @@ class FieldtypeTextareaLanguage extends FieldtypeTextarea implements FieldtypeLa
*/ */
public function getDatabaseSchema(Field $field) { public function getDatabaseSchema(Field $field) {
$schema = parent::getDatabaseSchema($field); $schema = parent::getDatabaseSchema($field);
$languageSupport = $this->wire('modules')->get('LanguageSupport'); /** @var LanguageSupport $languageSupport */
$languageSupport = $this->wire()->modules->get('LanguageSupport');
foreach($languageSupport->otherLanguagePageIDs as $languageID) { foreach($languageSupport->otherLanguagePageIDs as $languageID) {
// $schema['data' . $languageID] = $schema['data']; // $schema['data' . $languageID] = $schema['data'];
$schema['data' . $languageID] = 'mediumtext'; $schema['data' . $languageID] = 'mediumtext';
@@ -92,7 +102,7 @@ class FieldtypeTextareaLanguage extends FieldtypeTextarea implements FieldtypeLa
// in this method we are delegating the exportValue() to FieldtypeTextLanguage::exportValue // in this method we are delegating the exportValue() to FieldtypeTextLanguage::exportValue
// but we want to make sure it has textarea sleepValue, so we pass sleepValue in the $options // but we want to make sure it has textarea sleepValue, so we pass sleepValue in the $options
if(!isset($options['sleepValue'])) $options['sleepValue'] = $this->sleepValue($page, $field, $value); if(!isset($options['sleepValue'])) $options['sleepValue'] = $this->sleepValue($page, $field, $value);
$exportValue = $this->wire('fieldtypes')->get('FieldtypeTextLanguage')->___exportValue($page, $field, $value, $options); $exportValue = $this->wire()->fieldtypes->get('FieldtypeTextLanguage')->___exportValue($page, $field, $value, $options);
return $exportValue; return $exportValue;
} }
@@ -107,11 +117,10 @@ class FieldtypeTextareaLanguage extends FieldtypeTextarea implements FieldtypeLa
* *
*/ */
public function ___importValue(Page $page, Field $field, $value, array $options = array()) { public function ___importValue(Page $page, Field $field, $value, array $options = array()) {
/** @var Languages $languages */ $languages = $this->wire()->languages;
$languages = $this->wire('languages');
/** @var LanguagesPageFieldValue $importValue */ /** @var LanguagesPageFieldValue $importValue */
$importValue = $this->wire('fieldtypes')->get('FieldtypeTextLanguage')->___importValue($page, $field, $value, $options); $importValue = $this->wire()->fieldtypes->get('FieldtypeTextLanguage')->___importValue($page, $field, $value, $options);
foreach($languages as $language) { foreach($languages as $language) {
$languageValue = $importValue->getLanguageValue($language->id); $languageValue = $importValue->getLanguageValue($language->id);