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:
@@ -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);
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user