Ошибка с multiTV в шаблонизаторе Blade

Всем привет.

Вот такой код


@php
	$docid = $documentObject['id'];
	$tvName = $documentObject['image'];
@endphp

{!! $modx->runSnippet('multiTV',[
	'docid' => $docid,
	'tvName' => $tvName,
	'display' => 100,
]) !!}


вызывает ошибку



« Evolution CMS Parse Error »
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'fieldValue":[{"image":"assets/images/foto/img_1.jpg","thumb":""},{"image":"asset' at line 1


А вызов сниппета с помощью стандартного парсера обрабатывает корректно:

@evoParser('[!multiTV?
&docid=`[*id*]`
&tvName=`image`
&display=`100`
!]')


Почему в первом случае ошибка?

Хочется писать код в одном стиле.

13 комментариев

avatar
Если вы испоользуете блейд то не нужен вам снипет MultiTV
используйте функцию json_decode и работайте с масивом средствами BLADE
avatar
Dmi3yy, спасибо за совет! Не подумал об этом, что это тоже решение.

Почему не нужен сниппет? Ведь в нем можно указывать параметры.
Комментарий отредактирован 2020-03-18 10:37:34 пользователем antonfix
avatar
Рекомендую глянуть цикл видео я описывал почему так:
www.youtube.com/watch?v=xQ_aqYpS0Cc&list=PLKTHZGrYLdtoMegu0vG1Isek4_HsZPtZf

Поверьте проходил тот же путь когда снипеты в шаблонах но на проекте сложнее визитки это потом все дико усложняет и путает а использование контроллеров упрощает очень сильно, но надо изначально понять такой подход
avatar
получаете не имя TV, а его значение
$tvName = $documentObject['image'];

во втором же вызовы подставляете именно имя TV
&tvName=`image`
avatar
Спасибо!
Вот так получилось:

@php
        $docid = $documentObject['id'];
@endphp

{!! $modx->runSnippet('multiTV',[
        'docid' => $docid,
        'tvName' => 'image',
        'display' => 100,
]) !!}
avatar
@php — это вообще боль суть разделить HTML от PHP, логику от визуала

сделайте хотя бы так

{!! $modx->runSnippet('multiTV',[
        'docid' => $documentObject['id'],
        'tvName' => 'image',
        'display' => 100,
]) !!}
avatar
Сделал, спасибо.
avatar
Ну всё, стоило пример привести в соседней ветке, как его бездумно без башки начали копировать все, кому не лень.
Сниппет MultiTV вам не нужен в-принципе при использовании BLADE


@php
  $images = json_decode($modx->getTemplateVarOutput(array('image'),$documentObject['id'])['image'],TRUE)['fieldValue'];
@endphp

@if(!$images->isEmpty())
  @foreach($images as $item)
    ...
  @endforeach
@endif
avatar
Правильно ли я понимаю, что это уже отказ от удобств использования сниппетов в пользу функционала Blade + Laravel?
Скажем, от простых сниппетов уходим с более сложному и продвинутому.
avatar
Не слушайте паникеров ) просто нужно в tvName совать не значение ТВ ($documentObject['image']) а всего лишь его имя image :) Да и блок php лишний, хватит этого для текущего документа в шаблоне блейда.

{!! $modx->runSnippet('multiTV',[
        'tvName' => 'image',
        'display' => 100,
]) !!}


Если через контроллер — то у сниппета multiTV имеется параметр toJson=1 — чтобы вернуть сразу json. Это намного надежнее, чем работать напрямую с базой, как тут показывали выше, без всяких проверок того, что возвращается и в каком формате.
avatar
Laravel тут и не пахнет
avatar
Довольно странное предложение, получать тв запросом в базу, когда он уже есть в documentObject — если уж на то пошло:)
avatar
Пардон, в моем случае забирал из другого ресурса, а не с текущей страницы, это да, надо сократить
Комментарий отредактирован 2020-03-18 18:29:53 пользователем alexbeep
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.