1
0
mirror of https://github.com/processwire/processwire.git synced 2025-08-11 01:04:16 +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) {
$sanitizer = $this->wire()->sanitizer;
$languages = $this->noLang ? null : $this->wire()->languages;
$languages = $this->wire()->languages;
$user = $this->wire()->user;
if($n) {}
@@ -341,7 +341,7 @@ class InputfieldFile extends Inputfield implements InputfieldItemList, Inputfiel
if($this->renderValueMode) {
if($languages) {
$description = $pagefile->description($user->language);
$description = $pagefile->description($this->noLang ? $languages->getDefault() : $user->language);
} else {
$description = $pagefile->description;
}
@@ -357,11 +357,12 @@ class InputfieldFile extends Inputfield implements InputfieldItemList, Inputfiel
$userLanguage = $languages ? $user->language : null;
$defaultDescriptionFieldLabel = $sanitizer->entities1($this->labels['description']);
if(!$userLanguage || $languages->count() < 2) {
if(!$userLanguage || $languages->count() < 2 || $this->noLang) {
$numLanguages = 0;
$languages = array(null);
$forLanguages = array(null);
} else {
$numLanguages = $languages->count();
$forLanguages = $languages;
if(is_null($hasLangTabs)) {
$modules = $this->wire()->modules;
$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";
$descriptionFieldLabel = $defaultDescriptionFieldLabel;
@@ -401,6 +402,9 @@ class InputfieldFile extends Inputfield implements InputfieldItemList, Inputfiel
$out .= "<div class='InputfieldFileDescription'>"; // open wrapper
$attrStr = "placeholder='$descriptionFieldLabel&hellip;'";
$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";
@@ -847,12 +851,16 @@ class InputfieldFile extends Inputfield implements InputfieldItemList, Inputfiel
*
*/
protected function ___extractMetadata(Pagefile $pagefile, array $metadata = array()) {
$metadata['description'] = $pagefile->description;
$languages = $this->noLang ? null : $this->wire()->languages;
$languages = $this->wire()->languages;
if($languages) {
$metadata['description'] = $pagefile->description($languages->getDefault());
} else {
$metadata['description'] = $pagefile->description;
}
if($languages && !$this->noLang) {
foreach($languages as $language) {
/** @var Language $language */
if($language->isDefault()) continue;
@@ -1026,8 +1034,10 @@ class InputfieldFile extends Inputfield implements InputfieldItemList, Inputfiel
}
// description and tags
$languages = $this->noLang ? null : $this->wire()->languages;
$keys = $languages ? array('tags') : array('description', 'tags');
// $languages = $this->noLang ? null : $this->wire()->languages;
$languages = $this->wire()->languages;
$useLanguages = $languages && !$this->noLang;
$keys = $useLanguages ? array('tags') : array('description', 'tags');
foreach($keys as $key) {
if(isset($input[$key . '_' . $id])) {
@@ -1045,6 +1055,7 @@ class InputfieldFile extends Inputfield implements InputfieldItemList, Inputfiel
if($languages) {
foreach($languages as $language) {
/** @var Language $language */
if(!$useLanguages && !$language->isDefault()) continue;
if(!$languages->editable($language)) continue;
$key = $language->isDefault() ? "description_$id" : "description{$language->id}_$id";
if(!isset($input[$key])) continue;
@@ -1398,6 +1409,7 @@ class InputfieldFile extends Inputfield implements InputfieldItemList, Inputfiel
$this->itemFieldgroup = false;
$template = $pagefiles->getFieldsTemplate();
if(!$template) return false;
if($this->noLang) $template->setQuietly('noLang', 1);
$this->itemFieldgroup = $template->fieldgroup;
}

View File

@@ -5,7 +5,7 @@ require_once(dirname(__FILE__) . '/FieldtypeLanguageInterface.php');
/**
* Multi-language capable textarea field
*
* ProcessWire 3.x, Copyright 2016 by Ryan Cramer
* ProcessWire 3.x, Copyright 2023 by Ryan Cramer
* https://processwire.com
*
*
@@ -19,7 +19,7 @@ class FieldtypeTextareaLanguage extends FieldtypeTextarea implements FieldtypeLa
'version' => 100,
'summary' => 'Field that stores a multiple lines of text in multiple languages',
'requires' => array('LanguageSupportFields')
);
);
}
/**
@@ -32,19 +32,28 @@ class FieldtypeTextareaLanguage extends FieldtypeTextarea implements FieldtypeLa
*
*/
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
if(is_array($value)) $value = reset($value);
$str = (string) $value;
$value = $page->data($field->name);
if(!is_object($value)) { // string, array or null
$value = new LanguagesPageFieldValue($page, $field, $value);
}
$value->setLanguageValue($this->wire('user')->language->id, $str);
if($value instanceof LanguagesPageFieldValue) return $value;
if(is_array($value)) $value = reset($value);
$value = (string) $value;
$template = $page->template;
$pageValue = $page->data($field->name);
if(!$pageValue instanceof LanguagesPageFieldValue) { // string, array or null
$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) {
$schema = parent::getDatabaseSchema($field);
$languageSupport = $this->wire('modules')->get('LanguageSupport');
/** @var LanguageSupport $languageSupport */
$languageSupport = $this->wire()->modules->get('LanguageSupport');
foreach($languageSupport->otherLanguagePageIDs as $languageID) {
// $schema['data' . $languageID] = $schema['data'];
$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
// 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);
$exportValue = $this->wire('fieldtypes')->get('FieldtypeTextLanguage')->___exportValue($page, $field, $value, $options);
$exportValue = $this->wire()->fieldtypes->get('FieldtypeTextLanguage')->___exportValue($page, $field, $value, $options);
return $exportValue;
}
@@ -107,11 +117,10 @@ class FieldtypeTextareaLanguage extends FieldtypeTextarea implements FieldtypeLa
*
*/
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 */
$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) {
$languageValue = $importValue->getLanguageValue($language->id);