Laravel View::make render и HTML сущности

151
27 марта 2019, 21:40

Задача: нужно из контроллера вставить один шаблон view1 в другой view2. При этом оба шаблона - blade (view1.blade.php и view2.blade.php).

Метод контроллера возвращает view2: return view('view2', $extras); Во view2 есть следующий блок:

@if(!empty($extras))
 @section('extras')
  {{ $extras}}
 @stop
@endif

view1 формируется таким образом:

$view1 = View::make('view1', array('id' => $id));
$extras = $view1 ->render();

Во view1 не просто HTML, там так же ожидаются переменные.

Проблема: на выходе у view1 вместо обычного HTML - сущности:

<div class="layer"></div>
<div class="row custom">
<div class="col-xs-12">

Пробовал:

htmlspecialchars_decode($extras);
e($extras)
{!! $extras !!}
{!! html_entity_decode($extras) !!}

Ничего не помогает, кроме нативной php функции html_entity_decode($extras);

Почему встроенные в Laravel функции в данном случае не решают проблему? Всё-таки они не спроста реализованы и мне кажется я что-то не так делаю.

P.S. Ну и вопрос на засыпку: насколько корректно вообще вставлять один шаблон в другой таким образом? Да, я в курсе что это можно делать из самого blade шаблона, но всё же - вопрос актуальный.

Answer 1

Короче я не въеду что Вы там делаете и почему, но вот такой вариант предлагаю, учитывая, что в $data находится:

<div class="layer"></div>
<div class="row custom"></div>
<div class="col-xs-12"></div>

То в контроллере:

return view('extras', compact('data'));

И во вьюшке тупо:

{!! $data !!} 

Зачем у вас там render я ума не приложу вообще

Answer 2

Прошерстил ресурсы западных коллег и пришёл к выводу, что, всё же, View::make()->render() это нормальная практика: https://stackoverflow.com/questions/29253979/laravel-5-display-html-with-blade (обсуждение по ссылке будет в том числе полезно тем, кто не совсем понимает отличия {{ $var }} и {!! $var !!})

Не зря же разработчики Лары реализовали этот метод.

Моя задача решилась таким образом:

Создаём массив с элементом html который будет содержать в себе рендер blade мини-шаблона, который нужно вставить по тем или иным причинам в главный шаблон:

$layer = array('html' => View::make('layer.detail', array('data' => $data))->render());

И передаём его в возвращаемый контроллером blade шаблон:

return view('page.detail', array('layer' => $layer));

В шаблоне page.detail в месте, где нужно вставить полученный html, пишем:

{!! html_entity_decode($layer['html']) !!}

Я новичок в Laravel, но для меня решение работает.

READ ALSO
Обновление записей в RedBeanPHP

Обновление записей в RedBeanPHP

Всем привет, я хочу сделать так чтобы можно было редактировать различные записи на странице путём sql запроса R::execИ у меня почему то не хочет...

172
MySQL inner join 3 таблицы

MySQL inner join 3 таблицы

У меня есть таблиц с данными о фотографии, таблица с списком лайков от различных пользователей ко всем фотографиям и таблица с комментариями...

148
Как распределить полученный ответ PHP

Как распределить полученный ответ PHP

Есть константа $donate1, которая в итоге выдает STEAM_X:Y:Z, мне надо подсчитать за формулой через PHP Z*2+Y=W и отправить в БД запрос с W, если находит значение-...

151
Почему в php “lcfirst()” не работает для русских символов?

Почему в php “lcfirst()” не работает для русских символов?

lcfirst() не работает для русских символов

176