2014-01-07 2 views
2

В моих представлениях я пытаюсь повторно использовать частичные файлы, поэтому я могу создать список последних сообщений в любом месте сайта/боковой панели используя @include лезвие, где прошло переменная является количество сообщений, которые будут включены, например:Laravel4 - Попытка создать виджет, например, частичные, которые передадут/принимают параметр, чтобы получить правильные данные.

@include('widgets.lastestposts', array('numPosts' => '10') 

Однако проблема у меня есть, как получить данные Post для правильного количества сообщений в парциальное ?

Я мог бы пройти через список всех сообщений через Post :: all() с помощью контроллера или даже с помощью View :: composer, а затем в частичном использовании цикла @for | @endfor отобразить только правильный номер на основе значения 'numPosts'.

Однако это не чувствует себя хорошо, и я уверен, что должно быть лучше, чем тянуть полный список сообщений, когда я, возможно, потребуется только 5 или 10.

Я попробовал Посмотреть :: композиторами, но я мог бы найти, как пройти через переменную, чтобы я мог получить правильное количество возвращенных сообщений. Я не могу получить доступ к параметру «numPosts» с помощью

$view->getdata() 

как я ожидаю потребность «numPosts» будет принята к представлению с помощью контроллера, а не файл клинка - либо или что я испортил!

Я пропустил что-то простое здесь или это то, что я ищу, чтобы сделать действительно плохую идею, и я должен делать что-то еще?

Любые указатели с благодарностью принимаются. Благодаря!

(ps - Я искал, чтобы иметь возможность сделать это через файл клинка, а не устанавливать количество сообщений в контроллере, чтобы наши дизайнеры/HTML-кодеры просто добавляли виджеты и параметры в представления, а не . придется возиться с контроллерами)

ответ

3

Я бы сделал это, используя View Composers.Вы можете передать данные композитора с вашим включают:

@include('widgets.lastestposts', array('numPosts' => '10') 

и затем из вида композитора, вы должны быть в состоянии получить доступ к тем парам, как так:

View::composer('widgets.latestposts', function($view) 
{ 
    $view_data= $view->getData(); 
    $post_count = $view_data['numPosts']; 

    //You will have to implement something to do this 
    $post_data = Post::getLatestPosts($post_count); 

, а затем вы можете передать пост данные обратно с:

$view->with('posts', $post_data); 
} 

, а затем из ваших лопаток частичного widgets.latestposts вы можете перебрать $ сообщений для отображения сообщения.

Я знаю, что вы сказали в своем посте, что вы пробовали этот метод, но я вполне уверен, что этот подход должен работать. Дважды проверьте все ваши имена файлов, расширения файлов (.blade.php) и т. Д.

Надеюсь, что это сработает.

+0

Ваш код - 95%, что я сделал и сдался! Однако ваша убежденность заставила меня проверить ** все ** снова, и поэтому я понял, что создал View Composer на главной странице, вызывая виджет NOT на странице виджетов. Следовательно, почему 'view-> getdata()' ничего не возвращал. Когда я изменил его на 'View :: Composer ('widgets.latestposts'), все это работало так, как мне было нужно. Спасибо за вашу помощь и заставив меня понять, что я не схожу с ума. –

1

Использование вида композитор довольно легко:

Вы можете, например, хранить количество сообщений в сессии вар:

View::composer('*', function($view) 
{ 
    $view->with('numPosts', Session::get('numPosts')); 
} 

Или просто жёстко их :

View::composer('*', function($view) 
{ 
    $view->with('numPosts', 10); 
} 

И использовать его на ваш взгляд:

<?php $i=1; ?> 

@foreach($posts as $post) 
    {{ $post->title }} 

    <?php 
     $i++; 
     if ($i > $numPosts) break; 
    ?>   
@endforeach 

Предполагая, что вы перешли $ сообщения на ваш взгляд:

$posts = Post::all(); 

return View::make('your-view')->with('posts', $posts); 

Но помните, что вы можете делать такие вещи, как

$posts = Post::orderBy('created_at', 'desc')->take(Session::get('numPosts'))->get(); 

// or 

$posts = Post::orderBy('created_at', 'desc')->take(10)->get(); 

// and 

return View::make('your-view')->with('posts', $posts); 

Поэтому вам не придется отфильтровывать их снова в вашем представлении.

+0

Спасибо за подробное объяснение и варианты. Хотя это не совсем то, что я искал в этом сценарии, использование переменной сеанса - это то, что я не рассматривал, но это то, что я теперь имел в виду для чего-то еще в проекте! Так спасибо миллион за вашу идею. –