Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 11.10.2017 13:27:01

Передача массива данных в blade-шаблон

получаю из БД данные:

public function eventsData(Request $request)
    {
        if ($request !== NULL){
            $eventsObject = DB::table('events')->select('id', 'title', 'content')->get();
            foreach($eventsObject as $event){
                $data[] = $event;
            }
// в $data в данный момент времени хранится массив из 2-х элементов, каждый из которых является объектом stdClass'a и содержит, соответственно, 3 поля: id, title, content
            $view = view('home', $data);
            return $view;
        }
    }

Psec83s.png
в представлении $data не определена:
Hm1Xv3G.png
что я хочу?
делаю админку. нужно получить список всех ивентов (айдишник, наименование и контент) и вывести списком:

<ul id='menu'>
        <li class='menuItem'>{{ $data-id }}</li>

Изменено Anque (11.10.2017 13:30:47)

Не в сети

#2 11.10.2017 13:54:28

Re: Передача массива данных в blade-шаблон

Не передается там параметр 

view('home', $data)

нужно: 

view('home', compact('data'))->render();

Ну и в целом подход очень странный. Почему не сделать модель и не обращаться через orm

Изменено vladislavTkachenko (11.10.2017 13:56:02)

Не в сети

#3 11.10.2017 14:15:00

Re: Передача массива данных в blade-шаблон

не понял, как работает compact при передаче одной строки.
и в доке показан пример с передачей вторым аргументом массива, как я и делал.

Не в сети

#4 11.10.2017 14:17:39

Re: Передача массива данных в blade-шаблон

У тебя $request никогда не будет null, зачем делать такую проверку? Зачем ты данные итерируешь и перезаписываешь в $data? Зачем определяешь переменную view?

Вот таким должен быть метод:

public function eventsData(Request $request)
{
    return view('home', ['events' => $this->event->getEvents()]);
}

Если ты логику не хочешь выносить в модель или репозиторий, тогда хотя бы так:

public function eventsData(Request $request)
{
    return view('home', [
        'events' => Event::get(['id', 'title', 'content']);
    ]);
}

В представлении уже итерируй:

@foreach ($events as $event)
    <div>{{ $event->title }}</div>
@endforeach

Изменено AlexeyMezenin (11.10.2017 14:19:26)

Не в сети

#5 11.10.2017 14:33:35

Re: Передача массива данных в blade-шаблон

переделал малость.
вывод:     

<ul id='menu'>
                                    @foreach($events as $event)
                                    <li class='menuItem'>
                                        <a href='/getevents/{{$event->id}}'>
                                            {{$event->title}}
                                        </a>
                                        <p>{{substr($event->content, 0, 200)}}..</p>
                                    </li>
                                        @endforeach
                                </ul>

контроллер:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Event as Events;


class DataController extends Controller
{

    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */
    public function eventsData(Request $request)
    {
        $events = Events::all();
       
        return view('home', compact('events'));
    }
}


как можно включить обработку html-тегов, которые содержатся в $event->content?
сейчас выводятся как текст.

Не в сети

#6 11.10.2017 14:42:28

Re: Передача массива данных в blade-шаблон

не суть. вырезал их с помощью strip_tags, хочу ограничить длину (для вывода фрагмента текста):
               

            <ul id='menu'>
                                    @foreach($events as $event)
                                    <li class='menuItem'>
                                        <h4> <a href='/getevents/{{$event->id}}'>
                                            {{$event->title}}
                                            </a></h4>
                                        <p> <i>{{substr(strip_tags($event->content), 0, 200)}}... </i></p>
                                    </li> 
                                        @endforeach
                                </ul>

в итоге выводится только у одного элемента:
NE76HI1.png

если без форматирования - выводятся оба текста

Изменено Anque (11.10.2017 14:44:07)

Не в сети

#7 12.10.2017 06:58:09

Re: Передача массива данных в blade-шаблон

Что бы с html тегами вывести, нужно использовать не {{ }} а {!! !!}. Что бы ораничить текст, можно использовать хелпер функцию str_limit()

Не в сети

Подвал раздела