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

Fix issue processwire/processwire-issues#1611 where single-language site using multi-language fields in repeaters were not saving

This commit is contained in:
Ryan Cramer
2022-08-26 11:38:39 -04:00
parent 36702d7b57
commit 866f91424f
2 changed files with 23 additions and 15 deletions

View File

@@ -5,7 +5,7 @@
*
* Maintains a collection of fields that are repeated for any number of times.
*
* ProcessWire 3.x, Copyright 2021 by Ryan Cramer
* ProcessWire 3.x, Copyright 2022 by Ryan Cramer
* https://processwire.com
*
* @property int $repeaterMaxItems
@@ -210,7 +210,6 @@ class InputfieldRepeater extends Inputfield implements InputfieldItemList {
*
*/
protected function getRepeaterItemType(Page $page) {
if($page) {}
return 1;
}
@@ -256,9 +255,9 @@ class InputfieldRepeater extends Inputfield implements InputfieldItemList {
if(!$field) continue;
$fieldContext = $fieldgroup && $fieldgroup->hasFieldContext($field) ? $fieldgroup->getFieldContext($field) : $field;
$fieldtype = $field ? $field->type : null; /** @var Fieldtype $fieldtype */
$fieldtype = $field->type;
if(!$item && $fieldtype && $fieldtype instanceof FieldtypeFile) {
if(!$item && $fieldtype instanceof FieldtypeFile) {
// repeater has no items yet and this is a file or image field
if($fieldtype->getFieldsTemplate($field)) {
// if it has custom fields, it needs a real example rather than $this->page substitute
@@ -268,7 +267,7 @@ class InputfieldRepeater extends Inputfield implements InputfieldItemList {
}
}
if($field) try {
try {
// the following forces assets to be loaded
$inputfield = $fieldContext->getInputfield($item ? $item : $this->page);
if($inputfield) $this->renderReadyInputfield($inputfield);
@@ -391,7 +390,7 @@ class InputfieldRepeater extends Inputfield implements InputfieldItemList {
$isSingle = $this->singleMode;
// create field for each repeater iteration
foreach($value as $key => $page) {
foreach($value as /* $key => */ $page) {
if($itemID && $page->id != $itemID) continue;
/** @var RepeaterPage $page */
@@ -582,6 +581,7 @@ class InputfieldRepeater extends Inputfield implements InputfieldItemList {
if($itemID) {
// only rendering a single item, ajax mode
foreach($form->getAll() as $inputfield) {
/** @var Inputfield $inputfield */
$idAttr = $inputfield->attr('id');
$this->renderReadyInputfield($inputfield, $form, $this->renderValueMode);
$jsValue = $this->wire()->config->js($idAttr);
@@ -933,7 +933,7 @@ class InputfieldRepeater extends Inputfield implements InputfieldItemList {
$loadedIDs = array();
// determine which repeater pages have data posted in this request
foreach($value as $key => $page) {
foreach($value as $page) {
$loadedName = "loaded_repeater$page->id";
if($isSingle || ((int) $input->$loadedName) > 0) $loadedIDs[$page->id] = $page->id;
}
@@ -1040,7 +1040,7 @@ class InputfieldRepeater extends Inputfield implements InputfieldItemList {
// if the sort changed, then tell the PageArray to sort by _repeater_sort
if($sortChanged) {
$this->value->sort('sort');
$value->sort('sort');
$numChanges++;
}
@@ -1085,6 +1085,7 @@ class InputfieldRepeater extends Inputfield implements InputfieldItemList {
$languages = $this->wire()->languages;
foreach($wrapper as $inputfield) {
/** @var Inputfield $inputfield */
$name = $inputfield->attr('name');
$name = preg_replace('/_repeater\d+$/', '', $name);
@@ -1093,6 +1094,8 @@ class InputfieldRepeater extends Inputfield implements InputfieldItemList {
if($languages && $inputfield->getSetting('useLanguages')) {
$value = $page->get($name);
if(is_object($value)) {
/** @var LanguagesPageFieldValue $value */
$value->setTrackChanges(true);
$value->setFromInputfield($inputfield);
$page->set($name, $value);
}

View File

@@ -3,7 +3,7 @@
/**
* Serves as a multi-language value placeholder for field values that contain a value in more than one language.
*
* ProcessWire 3.x, Copyright 2021 by Ryan Cramer
* ProcessWire 3.x, Copyright 2022 by Ryan Cramer
* https://processwire.com
*
*/
@@ -65,6 +65,7 @@ class LanguagesPageFieldValue extends Wire implements LanguagesValueInterface, \
*
*/
public function __construct($page = null, $field = null, $values = null) { // #98
parent::__construct();
if($page) $this->setPage($page);
if($field) $this->setField($field);
@@ -152,8 +153,10 @@ class LanguagesPageFieldValue extends Wire implements LanguagesValueInterface, \
*
*/
public function setLanguageValue($languageID, $value) {
if(is_object($languageID) && $languageID instanceof Language) $languageID = $languageID->id;
if(is_string($languageID) && !ctype_digit("$languageID")) $languageID = $this->wire()->languages->get($languageID)->id;
if($languageID instanceof Language) $languageID = $languageID->id;
if(is_string($languageID) && !ctype_digit("$languageID")) {
$languageID = $this->wire()->languages->get($languageID)->id;
}
$existingValue = isset($this->data[$languageID]) ? $this->data[$languageID] : '';
if($value instanceof LanguagesPageFieldValue) {
// to avoid potential recursion
@@ -176,7 +179,8 @@ class LanguagesPageFieldValue extends Wire implements LanguagesValueInterface, \
public function setFromInputfield(Inputfield $inputfield) {
foreach($this->wire()->languages as $language) {
if($language->isDefault) {
/** @var Language $language */
if($language->isDefault()) {
$key = 'value';
} else {
$key = 'value' . $language->id;
@@ -194,7 +198,8 @@ class LanguagesPageFieldValue extends Wire implements LanguagesValueInterface, \
*/
public function setToInputfield(Inputfield $inputfield) {
foreach($this->wire()->languages as $language) {
$key = $language->isDefault ? "value" : "value$language->id";
/** @var Language $language */
$key = $language->isDefault() ? "value" : "value$language->id";
$inputfield->set($key, $this->getLanguageValue($language->id));
}
}
@@ -207,7 +212,7 @@ class LanguagesPageFieldValue extends Wire implements LanguagesValueInterface, \
*
*/
public function getLanguageValue($languageID) {
if(is_object($languageID) && $languageID instanceof Language) $languageID = $languageID->id;
if($languageID instanceof Language) $languageID = $languageID->id;
if(is_string($languageID) && !ctype_digit("$languageID")) $languageID = $this->wire()->languages->get($languageID)->id;
$languageID = (int) $languageID;
return isset($this->data[$languageID]) ? $this->data[$languageID] : '';
@@ -240,7 +245,7 @@ class LanguagesPageFieldValue extends Wire implements LanguagesValueInterface, \
$value = (string) $this->getDefaultValue();
if(strlen($value)) return $value;
foreach($this->wire('languages') as $language) {
foreach($this->wire()->languages as $language) {
$value = $this->getLanguageValue($language->id);
if(strlen($value)) break;
}