2012-05-04 35 views
0

私の問題はKohanaがビューをレンダリングすることだけです。 Controller_OtherでKohanaはfooクラスのView :: factory( '/ foo/bar')ヒットバーを作成します

View::factory('/foo/bar')の場合は、最初にController_Fooにヒットしません。私はそれがコントローラに当たってからビューをレンダリングするようにしたい。

class Controller_Other extends Controller_Template { 
    public $template = 'main'; 
    public function action_index() { 
     $this->template->body = View::factory('/foo/bar'); 
    } 
} 

は、どのように私はそれが最初のコントローラを介して実行するようになるだろう:

class Controller_Foo extends Controller_Template { 
    public function action_bar() { 
     $this->myVar = 'foo'; 
    } 
} 

私はいくつかの他のView::factory()からそれを呼び出したときに鑑み、$myVarは常にviews/foo/bar.phpに設定されているので、?

編集:

行くその文字列への独自のビューをレンダリングするためにaction_barを強制するよりもきれいな方法がなければならない:

$foo = new Controller_Foo($this->request, $this->response); 
$this->template->body = $foo->action_bar(); 

答えて

2

- グローバルな視点をバインドしたいです変数を使用するか、内部リクエストを行います。 はとにかく、ここでは両方のケースのための例は以下のとおりです。

バインドグローバルビュー変数

class Controller_Other extends Controller_Template { 
    public $template = 'main'; 

    public function action_index() { 
     View::bind_global('myVar', 'foo'); 
     //binds value by reference, this value will be available in all views. Also you can use View::set_global(); 

     $this->template->body = View::factory('/foo/bar'); 
    } 

}

内部要求を行う

これは 'FOO /バー' ですアクション

class Controller_Foo extends Controller_Template { 

    public function action_bar() { 
     $myVar = 'foo'; 
     $this->template->body = View::factory('/foo/bar', array('myVar' => $myVar); 
    } 
} 



class Controller_Other extends Controller_Template { 
    public $template = 'main'; 
    public function action_index() { 
     $this->template->body = Request::factory('foo/bar')->execute()->body(); 
     //by doing this you have called 'foo/bar' action and put all its output to curent requests template body 
    } 
} 
+0

内部要求は私が行っているもののように見えます。 action_barを独自のものにして、そのビューをレンダリングするたびにmyVarを別の場所に設定する必要はありません。 Btwは、$ this-> myVarですか?それはちょうど$ myVarではないでしょうか?誰でも、あなたは私の問題を完全に解決しました。これは、新しいコントローラオブジェクトを作成してメソッドを呼び出すよりもはるかにクリーンです。 – tester

+0

はい、 '$ this-> myVar'は' $ myVar'でなければなりません。 :)私の答えを編集しました。私はあなたを助けることができてうれしい。 :) – egis

0

あなたはいつも

のようにそれをレンダリングする前に表示するには、$ myVarに変数を渡す必要があります
public function action_index() { 
    $this->template->body = View::factory('/foo/bar')->set('myVar', 'foo'); 
} 

他のコントローラでは、Viewはちょうど緊張しているので、もう一度設定する必要があります。スクリプトの別の場所で同じビューを使用する予定の場合は、いくつかの変数にビューインスタンスを割り当てるなど、どこかにそれを使用することができます:私は何をやっているかわからない

public function action_index() { 
    $this->view = View::factory('/foo/bar')->set('myVar', 'foo'); 

    $this->template->body = $this->view ; 
} 

public function action_bar() { 
    $this->template->head = $this->view ; 
} 
+0

申し訳ありませんが、私の例では忘れています。私のコードにaction_barがあり、 '$ this-> myVar'を実行すると、ビューに$ myVarが定義されていません。 – tester

+0

私はより具体的な質問を更新しました – tester

+0

見た目の変更された回答 –

関連する問題