1
0
mirror of https://github.com/processwire/processwire.git synced 2025-08-12 01:34:31 +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. * 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 * https://processwire.com
* *
* @property int $repeaterMaxItems * @property int $repeaterMaxItems
@@ -210,7 +210,6 @@ class InputfieldRepeater extends Inputfield implements InputfieldItemList {
* *
*/ */
protected function getRepeaterItemType(Page $page) { protected function getRepeaterItemType(Page $page) {
if($page) {}
return 1; return 1;
} }
@@ -256,9 +255,9 @@ class InputfieldRepeater extends Inputfield implements InputfieldItemList {
if(!$field) continue; if(!$field) continue;
$fieldContext = $fieldgroup && $fieldgroup->hasFieldContext($field) ? $fieldgroup->getFieldContext($field) : $field; $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 // repeater has no items yet and this is a file or image field
if($fieldtype->getFieldsTemplate($field)) { if($fieldtype->getFieldsTemplate($field)) {
// if it has custom fields, it needs a real example rather than $this->page substitute // 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 // the following forces assets to be loaded
$inputfield = $fieldContext->getInputfield($item ? $item : $this->page); $inputfield = $fieldContext->getInputfield($item ? $item : $this->page);
if($inputfield) $this->renderReadyInputfield($inputfield); if($inputfield) $this->renderReadyInputfield($inputfield);
@@ -391,7 +390,7 @@ class InputfieldRepeater extends Inputfield implements InputfieldItemList {
$isSingle = $this->singleMode; $isSingle = $this->singleMode;
// create field for each repeater iteration // create field for each repeater iteration
foreach($value as $key => $page) { foreach($value as /* $key => */ $page) {
if($itemID && $page->id != $itemID) continue; if($itemID && $page->id != $itemID) continue;
/** @var RepeaterPage $page */ /** @var RepeaterPage $page */
@@ -582,6 +581,7 @@ class InputfieldRepeater extends Inputfield implements InputfieldItemList {
if($itemID) { if($itemID) {
// only rendering a single item, ajax mode // only rendering a single item, ajax mode
foreach($form->getAll() as $inputfield) { foreach($form->getAll() as $inputfield) {
/** @var Inputfield $inputfield */
$idAttr = $inputfield->attr('id'); $idAttr = $inputfield->attr('id');
$this->renderReadyInputfield($inputfield, $form, $this->renderValueMode); $this->renderReadyInputfield($inputfield, $form, $this->renderValueMode);
$jsValue = $this->wire()->config->js($idAttr); $jsValue = $this->wire()->config->js($idAttr);
@@ -933,7 +933,7 @@ class InputfieldRepeater extends Inputfield implements InputfieldItemList {
$loadedIDs = array(); $loadedIDs = array();
// determine which repeater pages have data posted in this request // determine which repeater pages have data posted in this request
foreach($value as $key => $page) { foreach($value as $page) {
$loadedName = "loaded_repeater$page->id"; $loadedName = "loaded_repeater$page->id";
if($isSingle || ((int) $input->$loadedName) > 0) $loadedIDs[$page->id] = $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 the sort changed, then tell the PageArray to sort by _repeater_sort
if($sortChanged) { if($sortChanged) {
$this->value->sort('sort'); $value->sort('sort');
$numChanges++; $numChanges++;
} }
@@ -1085,6 +1085,7 @@ class InputfieldRepeater extends Inputfield implements InputfieldItemList {
$languages = $this->wire()->languages; $languages = $this->wire()->languages;
foreach($wrapper as $inputfield) { foreach($wrapper as $inputfield) {
/** @var Inputfield $inputfield */
$name = $inputfield->attr('name'); $name = $inputfield->attr('name');
$name = preg_replace('/_repeater\d+$/', '', $name); $name = preg_replace('/_repeater\d+$/', '', $name);
@@ -1093,6 +1094,8 @@ class InputfieldRepeater extends Inputfield implements InputfieldItemList {
if($languages && $inputfield->getSetting('useLanguages')) { if($languages && $inputfield->getSetting('useLanguages')) {
$value = $page->get($name); $value = $page->get($name);
if(is_object($value)) { if(is_object($value)) {
/** @var LanguagesPageFieldValue $value */
$value->setTrackChanges(true);
$value->setFromInputfield($inputfield); $value->setFromInputfield($inputfield);
$page->set($name, $value); $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. * 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 * https://processwire.com
* *
*/ */
@@ -65,6 +65,7 @@ class LanguagesPageFieldValue extends Wire implements LanguagesValueInterface, \
* *
*/ */
public function __construct($page = null, $field = null, $values = null) { // #98 public function __construct($page = null, $field = null, $values = null) { // #98
parent::__construct();
if($page) $this->setPage($page); if($page) $this->setPage($page);
if($field) $this->setField($field); if($field) $this->setField($field);
@@ -152,8 +153,10 @@ class LanguagesPageFieldValue extends Wire implements LanguagesValueInterface, \
* *
*/ */
public function setLanguageValue($languageID, $value) { public function setLanguageValue($languageID, $value) {
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; if(is_string($languageID) && !ctype_digit("$languageID")) {
$languageID = $this->wire()->languages->get($languageID)->id;
}
$existingValue = isset($this->data[$languageID]) ? $this->data[$languageID] : ''; $existingValue = isset($this->data[$languageID]) ? $this->data[$languageID] : '';
if($value instanceof LanguagesPageFieldValue) { if($value instanceof LanguagesPageFieldValue) {
// to avoid potential recursion // to avoid potential recursion
@@ -176,7 +179,8 @@ class LanguagesPageFieldValue extends Wire implements LanguagesValueInterface, \
public function setFromInputfield(Inputfield $inputfield) { public function setFromInputfield(Inputfield $inputfield) {
foreach($this->wire()->languages as $language) { foreach($this->wire()->languages as $language) {
if($language->isDefault) { /** @var Language $language */
if($language->isDefault()) {
$key = 'value'; $key = 'value';
} else { } else {
$key = 'value' . $language->id; $key = 'value' . $language->id;
@@ -194,7 +198,8 @@ class LanguagesPageFieldValue extends Wire implements LanguagesValueInterface, \
*/ */
public function setToInputfield(Inputfield $inputfield) { public function setToInputfield(Inputfield $inputfield) {
foreach($this->wire()->languages as $language) { 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)); $inputfield->set($key, $this->getLanguageValue($language->id));
} }
} }
@@ -207,7 +212,7 @@ class LanguagesPageFieldValue extends Wire implements LanguagesValueInterface, \
* *
*/ */
public function getLanguageValue($languageID) { 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; if(is_string($languageID) && !ctype_digit("$languageID")) $languageID = $this->wire()->languages->get($languageID)->id;
$languageID = (int) $languageID; $languageID = (int) $languageID;
return isset($this->data[$languageID]) ? $this->data[$languageID] : ''; return isset($this->data[$languageID]) ? $this->data[$languageID] : '';
@@ -240,7 +245,7 @@ class LanguagesPageFieldValue extends Wire implements LanguagesValueInterface, \
$value = (string) $this->getDefaultValue(); $value = (string) $this->getDefaultValue();
if(strlen($value)) return $value; if(strlen($value)) return $value;
foreach($this->wire('languages') as $language) { foreach($this->wire()->languages as $language) {
$value = $this->getLanguageValue($language->id); $value = $this->getLanguageValue($language->id);
if(strlen($value)) break; if(strlen($value)) break;
} }