1. Главная
  2. Форумы
  3. Техподдержка Drupal
  4. Решение проблем

str_replace() Oбновлнние кода php7 - php8.2

Главные вкладки

Доброго времени!
Как исправить ошибку? Много всяких советов в тырнете, но ни один не подошел...

ошибка в этой строке:

foreach( $this->vars as $var => $val ) { $str = str_replace ('$'.$var,$val,$str); }

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;
}

Комментарии

Аватар пользователя ignatev ignatev 14 января в 15:51

Ошибка говорит буквально следующее:
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

Аватар пользователя quattro quattro 15 января в 17:59

Спасибо за подробный ответ!
Как я понял, :
1. vars это сущность (массив переменных) Drupal7, которую в D10 упразднили, и теперь нужно другим запросом получать данные.
2. при разборе строки $str = str_replace('$' . $var, $val, $str);
выяснил что: '$' . $var, преобразуется в $user .
В контексте модуля, где используется метод _setvar, понятно что он транслирует параметры пользователя,
для организации доступа по ролям и уровню доступа.
3. Большое подозрение, что при обновлении модулей D7 - D10, не правильно организовал структуру каталогов. Но об этом в другой теме написал:
https://drupal.ru/node/146555

Логотип drupal.ru

Содержимое сайта публикуется на условиях CreativeCommons Attribution-ShareAlike 3.0 или более поздней версии. Программные коды в тексте статей — на условиях GNU GPL v2 или более поздней версии.

Документация по совместной работе с репозиторием drupal.ru – https://docs.drupal.ru/code

Drupal – торговая марка Дриса Бёйтарта

12+

AltStyle によって変換されたページ (->オリジナル) /