Доброго времени!
Как исправить ошибку? Много всяких советов в тырнете, но ни один не подошел...
ошибка в этой строке:
TypeError: str_replace(): Argument #2 ($replace) must be of type array|string, Drupal\Core\Field\FieldItemList given in str_replace() (line 583 of /var/www/pafes/data/www/sites.ru/sites/all/modules/zbase/src/zbase-sql-class.php).
// трансляция параметров во встроенные переменные
function _setvar( $tpl ) {
$str = $tpl;
if ( $str ) {
foreach( $this->vars as $var => $val ) { $str = str_replace ('$'.$var,$val,$str); }
}
return $str;
}
function _setvar( $tpl ) {
$str = $tpl;
if ( $str ) {
foreach( $this->vars as $var => $val ) { $str = str_replace ('$'.$var,$val,$str); }
}
return $str;
}
- Блог
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
Комментарии
Ошибка говорит буквально следующее:
str_replace() не умеет работать с объектами, а в качестве второго аргумента ($replace) вы передаёте объект
Drupal\Core\Field\FieldItemList.
ожидается, что $val будет строкой или массивом, но фактически один (или несколько) элементов в $this->vars — это объект
Нужно преобразовать значение поля в строку, прежде чем передавать его в str_replace().
Вариант 1
<?phpfunction _setvar($tpl) {$str = $tpl;
if ($str) {
foreach ($this->vars as $var => $val) {
if ($val instanceof \Drupal\Core\Field\FieldItemList) {
$val = $val->value ?? '';
}
$str = str_replace('$' . $var, (string) $val, $str);
}
}
return $str;
}
?>
Вариант 2. Если поле может быть многозначным
<?phpif ($val instanceof \Drupal\Core\Field\FieldItemList) {$values = [];
foreach ($val as $item) {
$values[] = $item->value;
}
$val = implode(', ', $values);
}
?>
Вариант 3. Если вы точно знаете, что это поле сущности
Можно извлекать значение заранее, до передачи в $this->vars:
<?php$this->vars['title'] = $node->get('field_title')->value;?>
Резюме
str_replace() принимает только string|array
FieldItemList — это объект
Нужно:
либо извлечь $field->value
либо привести к строке вручную
либо не передавать объекты в $this->vars
Спасибо за подробный ответ!
Как я понял, :
1. vars это сущность (массив переменных) Drupal7, которую в D10 упразднили, и теперь нужно другим запросом получать данные.
2. при разборе строки $str = str_replace('$' . $var, $val, $str);
выяснил что: '$' . $var, преобразуется в $user .
В контексте модуля, где используется метод _setvar, понятно что он транслирует параметры пользователя,
для организации доступа по ролям и уровню доступа.
3. Большое подозрение, что при обновлении модулей D7 - D10, не правильно организовал структуру каталогов. Но об этом в другой теме написал:
https://drupal.ru/node/146555
если что, обращайтесь в личку