2013-04-16 10 views
5

Posiadam kontroler podstawowy z metodą zwracania kanału twitter do mojego widoku.Laravel: Przekazywanie danych do default.blade.php z kontrolera podstawowego

Chcę przenieść to w widoku z widoku strony do domyślnego ostrza, aby zmniejszyć nadmiarowość, ponieważ będzie wyglądać na całej stronie. Jak przekazać dane z kontrolera podstawowego do serwera blade?

mogę wysłać go do mojego widoku z kontrolera widoku tak:

public function get_index() 
{ 
    .................. 
    $this->layout->nest('content', 'home.index', array(
     'tweets' => $this->get_tweet() 
    )); 
} 

iw widoku, wyjście to tak:

if ($tweets) 
{ 
    foreach ($tweets as $tweet) 
    { 
     .............. 

chcę zrobić to wszystko od wewnątrz default.blade.php i mój Base_Contoller:

<?php 
class Base_Controller extends Controller { 
    /** 
    * Catch-all method for requests that can't be matched. 
    * 
    * @param string $method 
    * @param array  $parameters 
    * @return Response 
    */ 
    public function __call($method, $parameters) 
    { 
     return Response::error('404'); 
    } 

    public function get_tweet() 
    { 
     ........... 
     return $tweets; 
    } 
} 

Jak to jest możliwe?

////////////////////// UPDATE ///////////////////////// //////

application/models/tweets.php

<?php 
class Tweets { 
    public static function get($count = 3) 
    { 
     Autoloader::map(array(
     'tmhOAuth'  => path('app'). 
       'libraries/tmhOAuth-master/tmhOAuth.php', 
      'tmhUtilities' => path('app'). 
       'libraries/tmhOAuth-master/tmhUtilities.php' 
     )); 
     $tmhOAuth = new tmhOAuth(array(
      'consumer_key'  => 'xxx', 
      'consumer_secret'  => 'xxx', 
      'user_token'   => 'xxxxx', 
      'user_secret'   => 'xxxxx', 
      'curl_ssl_verifypeer' => false 
     )); 
     $code = $tmhOAuth->request('GET', 
     $tmhOAuth->url('1.1/statuses/user_timeline'), array(
      'screen_name' => 'xxx', 
      'count' => $count 
     )); 
     $response = $tmhOAuth->response['response']; 
     $tweets = json_decode($response, true); 
     return $tweets; 
    } 
} 

application/views/widgety/tweets.blade.php

@foreach ($tweets) 
    test 
@endforeach 

application/views/układy/default. blade.php

.... 
{{ $tweets }} 
.... 

application/composers.php

<?php 
View::composer('widgets.tweets', function($view) 
{ 
    $view->tweets = Tweets::get(); 
}); 
View::composer('layouts.default', function($view) 
{ 
    $view->nest('tweets', 'widgets.tweets'); 
}); 

application/controllers/base.php

<?php 
class Base_Controller extends Controller { 

    /** 
    * Catch-all method for requests that can't be matched. 
    * 
    * @param string $method 
    * @param array  $parameters 
    * @return Response 
    */ 
    public $layout = 'layouts.default'; 

    public function __call($method, $parameters) 
    { 
     return Response::error('404'); 

    } 

} 

application/controllers/home.php

<?php 
class Home_Controller extends Base_Controller { 

    public $layout = 'layouts.default'; 

    public $restful = true; 

    public function get_index() 
    { 
     Asset::add('modernizr', 'js/thirdparty/modernizr.js'); 
     Asset::add('jquery', 
      'http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js'); 
     Asset::add('scripts', 'js/scripts.js'); 

     $this->layout->title = 'title'; 
     $this->layout->nest('content', 'home.index', array(
      //'data' => $some_data 
     )); 
    } 
} 

daje mi

Un zdefiniowana zmienna: tweety

błąd

+0

Chcesz tweets wygenerowana w układzie, albo zawsze zagnieżdżone w treści? –

+0

Albo bądźmy szczerzy. Po prostu renderuję je w widoku, dopóki nie znajdę lepszego/czystszego sposobu robienia tego. – Fraser

+0

Ale zamiast tego chciałbyś znaleźć miejsce w swoim układzie? Pytam, bo to pomoże mi napisać lepszą odpowiedź dla ciebie :) –

Odpowiedz

12

Krok 1 - Zrób przeglądaj tylko swoje tweety, nazwijmy to widgets/tweets.blade.php, to zaakceptuje twoje dane z $tweets. Dzięki temu bardzo łatwo będzie buforować widok tweetów w przyszłości, jeśli chcesz uzyskać nieco więcej wydajności. Chcemy również modelu, który wygeneruje dla ciebie dane tweet.

Krok 2 - Przekaż dane tweetów do widoku tweetów, użyjmy do tego celu View Composer, aby logika była zachowywana z widokiem (ale na zewnątrz).

Krok 3 - Utwórz domyślny układ, nazwijmy to layout/default.blade.php. To zaakceptuje $content i $tweets. Zagnieżdżymy widok tweetów z innym View Composer. Możesz zagnieździć $content w swoich działaniach kontrolera.

Krok 4 - Ustaw $layout na swoim Base_Controller.

Krok 5 - Zysk!

Uwaga - Jeśli to twoje pierwsze zobacz kompozytorzy następnie trzeba uwzględnić je w application/start.php


// application/models/tweets.php 
class Tweets { 
    public static function get($count = 5) 
    { 
     // get your tweets and return them 
    } 
} 

// application/views/widgets/tweets.blade.php 
@foreach ($tweets) 
    {{-- do something with your tweets --}} 
@endforeach 

// application/views/layouts/default.blade.php 
<section class="main">{{ isset($content) ? $content : '' }}</section> 
<aside class="widget widget-tweets">{{ $tweets }}</aside> 

// application/composers.php 
View::composer('widgets.tweets', function($view) 
{ 
    $view->tweets = Tweets::get(); 
}); 
View::composer('layouts.default', function($view) 
{ 
    $view->nest('tweets', 'widgets.tweets'); 
}); 

// application/start.php (at the bottom) 
include path('app').'composers.php'; 

// application/controllers/base.php 
class Base_Controller extends Controller { 
    public $layout = 'layouts.default'; 
} 

// application/controllers/home.php 
class Home_Controller extends Base_Controller { 

    public $restful = true; 

    public function get_index() 
    { 
     $this->layout->nest('content', 'home.welcome'); 
    } 

} 
+0

Awesome. Dziękuję bardzo za poświęcenie czasu na to. Jest to bardzo doceniane. Niedawno zacząłem na Laravel, ale uwielbiam to! – Fraser

+0

Witam, jeszcze raz dziękuję za powyższe. Próbowałem go zaimplementować, ale otrzymuję niezdefiniowaną zmienną: tweety z default.blade. Jakieś pomysły? Zaktualizowałem mój post powyżej za pomocą mojego kodu. Pozdrawiam – Fraser

+0

Hi @Fraser Całkowicie zapomniałem o kroku, musisz dołączyć plik composers.php, możesz to zrobić w 'application/start.php' –

6
View::share('key', 'value'); 

w wyświetlić wykorzystanie (Blade składnia)

{{$key}} 

lub (składnia PHP)

echo $key; 
+1

Nie zawsze powracają do 'View :: share()' - jest to świetne rozwiązanie dla niektórych rzeczy, ale w wielu przypadkach jest tak złe, jak [zmienna globalna] (http://c2.com/ cgi/wiki? GlobalVariablesAreBad) –

+0

@PhillSparks, zgadzam się. – Usman

Powiązane problemy