0

これが私のコントローラーのコードです:

$this->view->myArray = array();
$this->view->test = "";
$out = $this->view->partialLoop('tab/partial.phtml', $data);

echo $this->view->test;  // Output: This works
echo count($this->view->myArray); // Output: 0

そして部分的なpartial.phtml

$v->test = $this->partialLoop()->view;

$v = "This works";
echo $v->test;  // Output: This works

$v->myArray[] = "hello";
echo count($v->myArray); // Output: 0

部分ループからビュー変数にアクセスすることは素晴らしいアイデアではないと思います。それはさておき、なぜそれが私の配列変数で機能しないのですか?

4

2 に答える 2

1

パーシャルのビュー変数にアクセスできないため、機能しません。パーシャルに渡すデータにアクセスできます。

$out = $this->view->partialLoop('tab/partial.phtml', $data);

このコード行は、に含まれる情報にアクセスできます$data

したがって、現在のパーシャルのこのコードは基本的に無意味です。

$v = $this->partialLoop()->view; //you choose to assign view data to the partial, and I don't think it's working as expected. 
//By not passing any args to the partial you have at least some access to the view object.

$this->view->test = "This works";//assign data to view locally
echo $v->test;  // you seem to be echoing out locally assigned data

$v->myArray[] = "hello";//you didn't assign this to the view
echo count($v->myArray); // myArray probably doesn't exist in this context or dosen't work as expected. If you make this an associative array it might work.

パーシャルがこのように使われているのを見たことがないと思います。パーシャルのポイントは、ビューの特定の部分に対して異なる可変スコープを確立することです。

パーシャルループとpartialLoopはビューヘルパーであるため、コントローラーで実行する必要がある唯一のアクション(データはモデルからのものである場合もあれば、モデルからのものである場合もあります)は、パーシャルで使用するデータと必要なデータを利用できるようにすることです。通常のビュースコープで使用できます。

//in a controller
public function userAction() {
    $model = Application_Model_DbTable_User();//Table columns = id, name, role
    $this->view->partailData = $model->fetchAll();//assign data to view that we want to use in partial, should be an array or object.
}

//in a view script
<?php 
//pass the path to the partial as the first arg and the data to be displayed as the second arg
echo $this->partialLoop('/path/to/partial.phtml', $this->partialData);
//we could pass data explicitly as well
echo $this->partial('/path/to/partial.phtml', array('id'=>1,'name'=>'jason','role'=>'user'));
?>

//now for our partial.phtml
//this could be used a simple partial or as a partialLoop
<p>My name is <?php echo $this->name ?>.</p>
<p>My data file id is <?php echo $this->id ?>.</p>
<p>My access control role is <?php echo $this->role ?>. </p>
<!-- name, id and role would be column names that we retrieved from the database and assigned to the view -->

部分ループまたはpartialLoopを使用するには、toArray()を実装する何らかのタイプの配列またはオブジェクトを渡す必要があります。

[編集]

まだ左側のフィールドにあるコードをクリーンアップします。

//controller code
$this->view->myArray = array();

//view code
<?php $v = $this->partial()->view ?> 
<?php $v->myArray[] = 'newName' ?>
<?php Zend_Debug::dump(count($this->partial()->view->myArray)) ?>

//my output =

int(1)

実際の部分スクリプトに割り当ててビューオブジェクトを出力しようとすると、これ以上ビューを渡すことができないようです。エラーがスローされます。

//my view again
<?php echo $this->partial('partial.phtml', $this->partial()->view) ?>
//This and attempts similar result in the error
/*Catchable fatal error: Object of class Zend_View could not be converted to string in E:\www\home-local\application\views\scripts\partial.phtml on line 1*/
//when the partial.phtml looks like
<?php echo $this />

//however when I access the data available in the view
<?php echo $this->myArray[0] ?>

//the result works and the output is   
newName 

空のpartial()(partialLoop())呼び出しは、ビューオブジェクトへのアクセス権がすでにある場合に、ビューオブジェクトへのアクセス権を与えるように見えます。ビューオブジェクトのスコープを離れると、__ get()および__call()によって提供される現在のスコープにのみアクセスできるようになります。

私はこれを助けるのに十分説明できたと思います。

于 2012-08-19T07:00:38.037 に答える
-1

$ vまたはアイテムの値を設定できない場合があります。これは、プライベートまたは静的であるか、再帰を使用して投稿したコードからも破棄されているため、非常に壊れやすくなる可能性があります(つまり、コントローラーがビューデータを参照していて、ビューが設定しているか、設定していないか、2回設定しています)

同意しました。partialLoopからビュー変数にアクセスするのは良い考えではないと思います。

編集:$ this-> view-> assign('variablename'、$ my_array);

そうでなければ、変数はRerenderで「失われる」と思うので、コントローラーで変数を操作し、完了する前にそれらをビューに割り当てます。$ this->view->myArrayで配列操作を実際に行うことはありません

于 2012-08-19T00:49:33.803 に答える