ホームページ  >  記事  >  バックエンド開発  >  thinkPHP のクロスコントローラー テンプレート出力の問題

thinkPHP のクロスコントローラー テンプレート出力の問題

WBOY
WBOYオリジナル
2016-06-23 13:34:511250ブラウズ

まず問題を説明します
ホームページの Index の下で検索し、次に Show モジュールの下の show テンプレート出力に検索結果を割り当てます。


class IndexAction extends Action {// これが Index モジュールです
public functionindex() {
/ /echo session("uid");
$this->display()
}
パブリック関数 dosearch(){//ファジー クエリ
$user = M('user'); $_REQUEST[ 'keysearch'];
//$where['username'] = $key;
$where['username'] = array("like",array("%$key","$key%") ));
import('ORG.Util.Page') // ページング クラスをインポートします
//$data=$user->where($where)->select(); >where ($where)->count();//条件付きクエリの総数
$Page= new Page($count,3);//ページング クラスをインスタンス化し、レコードの総数を渡します。各ページに表示されるレコードの数
foreach( $where as $key=>$val) {
if(!is_array($val)) {
$Page->parameter .= "$key=".urlencode ($val).'&';
}
}

$show = $Page->show();// ページングで出力を表示
$mohulist = $user->where($where)-> limit($Page->firstRow.',' .$Page->listRows)->select();
$this->assign('users',$mohulist); assign('page',$show);// ページング出力を割り当てます

$this->display('Show/show') // 検索結果を Show モジュールの show Model 出力に割り当てます

}

ただし、検索フォームが送信されると、アドレスは http://www.tanss.com/alumni/index.php/Index/dosearch になります
実際には、これで問題ないようですが、操作を実行する必要がありますこの検索の結果、メッセージを残す、詳細を表示するなどの操作を行うため、Show モジュールでメッセージを書き込んだり、詳細を表示したりすると、不正な操作を示すエラーが報告されます。このような問題がありますか?パブリック関数 show(){

$this->display();

パブリック関数 domessage() {

$message = M('message')

$data['content'] = $_POST; ['メッセージ']; $data['time'] = date('y-m-d h:i:s',time ());
$this->リダイレクト('Show/show');

}

}

送信後にエラーが報告されました

不正な操作: domessage

エラーの場所
FILE: D:phpdemoalumniThinkPHPCommonfunctions.php LINE: 112




エラーレポートと見てください

これは Show
クラス ShowAction extends Action{

public function show(){

$this ->display() }

public function domessage(){
$message = M('メッセージ');
$data['content'] = $_POST['message']
$data[ 'time'] = date('y-m-d h:i:s',time() );
$message->add($data);
$this->redirect('Show/show');

}
送信後にエラーが報告されました 不正な操作: domessage

エラーの場所

FILE: D:phpdemoalumniThinkPHPCommonfunctions.php LINE: 112



フォームから送信されたアドレスを見てください






エラーレポートを投稿して見てください

これは、以下に新しく書かれたメソッドです。 Show
class ShowAction extends Action{

public function show(){

$this->display();

}

public function domessage(){
$message = M('Message'); data['content'] = $_POST['message'];
$data['time'] = date('y-m-d h:i:s',time());
$message->add($data) );
$this->redirect('Show/show'); }

}
送信後にエラーが報告される 不正な操作: domessage

エラーの場所

FILE: D :phpdemoalumniThinkPHPCommonfunctions.php LINE: 112



フォームに送信されたアドレスを見てください




TA にメッセージを残す

p>


/form>





エラーレポートを投稿して見てください


これは Show

クラス ShowAction extends Action{

public function show(){

これ-> ;display();

}

public function domessage(){
$message = M('message');
$data['content'] = $_POST['message']; 'time '] = date('y-m-d h:i:s',time());
$message->add($data);
$this->redirect('Show/show');

}

送信後にエラーが報告されました
不正な操作:domessage
エラーの場所
FILE: D:phpdemoalumniThinkPHPCommonfunctions.php LINE: 112



フォームで送信されたアドレスを確認してください

action="__ URL __ /domessage" メソッド ="post">

TA にメッセージを残す







に置き換えますaction="{ :U('Show/domessage')}" 試してみてください




エラーを投稿して確認してください


これは Show

クラスの下に書かれた新しいメソッドです ShowAction extends Action{

パブリック関数 show(){

$this->display();

}

パブリック関数 domessage(){
$message = M('message')
$data['content'] = $_POST; ['メッセージ'];
$data['time'] = date('y-m-d h:i:s',time());
$this->リダイレクト(' Show/show');
}

}

送信後にエラーが発生しました
不正な操作: domessage
エラーの場所
FILE: D:phpdemoalumniThinkPHPCommonfunctions.php LINE: 112



送信されたアドレスを見てくださいフォームから

< ;form action="__URL__/domessage" method="post">

TA にメッセージを残す

;


;



代わりに action="{:U('Show/domessage')}" を試してください


うーん、これはまだ機能します。現在のコントロールが別のコントローラーでクエリが実行されているが、クエリの結果が別のコントローラーのテンプレートから出力されている場合、どうすれば変更できますか? http://www.tanss.com/alumni/index.php /Index/dosearch を http://www.tanss.com/alumni/index.php/Show/show に変更します。この場合、U メソッドを使用せずに Show の直下に新しいメソッドを記述できます









投稿する エラーを報告して確認してください


これは Show
クラスに新しく書かれたメソッドです ShowAction extends Action{

public function show(){

$this->display();

}

public function domessage(){
$message = M ('メッセージ');
$data['content'] = $_POST['message']
$data['time'] = date('y-m-d h:i:s',time()); message->add($data);
$this->redirect('Show/show');
}

}

送信後にエラーが報告されました
不正な操作: domessage
エラーの場所
FILE: D : phpdemoalumniThinkPHPCommonfunctions.php LINE: 112



フォームから送信されたアドレスを参照してください







action="{:U('Show/domessage')}" に置き換えてください


うーん、これは確かに可能です、よろしくお願いします
まだ理解できていないのは、クエリが現在のコントロールで実行されているのに、クエリの結果が別のコントローラーのテンプレートから出力される場合、どうなるのかということです。完了しましたか?
http://www.tanss.com /alumni/index.php/Index/dosearch を http://www.tanss.com/alumni/index.php/Show/show に変更します。 U メソッドを使わずに Show の直下に新しい情報を書き込む


メソッドはこのようになります。このとき、Index の dosearch メソッド内で、display('Show/show') を使用します。 、URL はオリジナルのままです。またはインデックス。現時点では、__URL__/message は Index/message を探しています。 (Index にメッセージ メソッドを記述して確認できます)。解決策は、Index で検索を行うときに display を使用するのではなく、 redirect('Show/show') を使用することです

assign をリダイレクト パラメータとして Show/show に渡してから使用する必要があります。割り当ててから表示する show メソッド

assign はもう利用できない可能性があります。リダイレクトのパラメータとして Show/show に渡してから、show メソッドを使用して割り当ててからダイアログを実行する必要があります。うーん、リダイレクトが使用されている場合、assign は実際には役に立たないので、redirect パラメーターを Show コントローラーの下に渡すのはどうすればよいでしょうか?


assign は使用できない可能性があります。リダイレクトパラメータとして Show/show に渡し、show メソッドを通じて割り当ててからダイアログを実行する必要があります。 assign は確かに役に立たないので、このリダイレクトはパラメーターを渡すにはどうすればよいですか? redirect(Show/show) は Show コントローラーの下の show メソッドですか?

Show コントローラーの show メソッド redirect('Show/show',array('users'=>$mohulist,'page'=>$show)) 次に、ショー内で $mohulist = $_GET[ を使用しますメソッド 'mohulist']; $page = $_GET['page'];

show の記述は $mohulist = $_GET['users']; です。


assign は使用できない可能性があります。リダイレクトのパラメータとして Show/show に渡し、show メソッドで割り当ててから表示する必要があります。

うーん、リダイレクトを使用する場合は、このリダイレクトパラメータはどうでしょうか? Show コントローラの show メソッドである redirect(Show/show) はどうですか?

Show コントローラーの show メソッド redirect('Show/show',array('users'=>$mohulist,'page'=>$show)) 次に、ショー内で $mohulist = $_GET[ を使用しますメソッド 'mohulist']; $page = $_GET['page'];


Indexx の Dosearch メソッド
public function dosearch(){//Fuzzy query
$user = M('user');
$key = $_REQUEST['keysearch']
//$where['username'; ] = $key;
$where['username'] = array("like",array("%$key","$key%"));
import('ORG.Util.Page');//ページング クラスをインポートします
//$data=$user->where($where)->select();
$count=$user->where($where)->count();クエリの総数
$Page= new Page($count,3);//インスタンス化されたページング クラス 総レコード数と各ページに表示されるレコード数を渡します


foreach($where as $key=> ;$val) {
if(!is_array($val)) {
$Page->parameter .= "$key=".urlencode($val).'&'
}
}

$show = $Page-> show();// ページングで出力を表示
$mohulist = $user->where($where)->limit($Page->firstRow.','.$Page-> listRows)->select ();
//$this->assign('users',$mohulist);
//$this->assign('page',$show);// 割り当てのページング出力
//$this->display('Show/show');
$this->redirect('Show/show',array('users'=>$mohulist,'page'=>$show) ));
}

以下の show メソッドを表示します

$mohulist = $_GET['mohulist']
$page = $_GET['page']; display();
}

クエリの送信後にエラー Not Found が報告されました

リクエストされた URL /alumni/index.php/Show/show/users//page/+1+æ?¡ è®°å½?+1/1+é¡このサーバーには µ++++++++++.html が見つかりませんでした
さらに、コントローラーに header('content-type:text/hmtl;charset=utf-8'); を追加して報告しました。エラーが発生しました。なぜまだ文字化けが発生しますか? diaplay


うーん、 redirect を使用する場合、 assign は確かに役に立たないので、このリダイレクトパラメーターを渡すにはどうすればよいですか? redirect(Show/show) は Show コントローラーの下の show メソッドですか?

Show コントローラーの show メソッド redirect('Show/show',array('users'=>$mohulist,'page'=>$show)) 次に、ショー内で $mohulist = $_GET[ を使用しますメソッド 'mohulist']; $page = $_GET['page'];


Indexx の Dosearch メソッド
public function dosearch(){//Fuzzy query
$user = M('user');
$key = $_REQUEST['keysearch']
//$where['username'; ] = $key;
$where['username'] = array("like",array("%$key","$key%"));
import('ORG.Util.Page');//ページング クラスをインポートします
//$data=$user->where($where)->select();
$count=$user->where($where)->count();クエリの総数
$Page= new Page($count,3);//インスタンス化されたページング クラス 総レコード数と各ページに表示されるレコード数を渡します


foreach($where as $key=> ;$val) {
if(!is_array($val)) {
$Page->parameter .= "$key=".urlencode($val).'&'
}
}

$show = $Page-> show();// ページングで出力を表示
$mohulist = $user->where($where)->limit($Page->firstRow.','.$Page-> listRows)->select ();
//$this->assign('users',$mohulist);
//$this->assign('page',$show);// 割り当てのページング出力
//$this->display('Show/show');
$this->redirect('Show/show',array('users'=>$mohulist,'page'=>$show) ));
}

以下の show メソッドを表示します

$mohulist = $_GET['mohulist']
$page = $_GET['page']; display();
}

クエリの送信後にエラー Not Found が報告されました

リクエストされた URL /alumni/index.php/Show/show/users//page/+1+æ?¡ è®°å½?+1/1+é¡このサーバーには µ++++++++++.html が見つかりませんでした
さらに、コントローラーに header('content-type:text/hmtl;charset=utf-8'); を追加して報告しました。エラー なぜまだ文字化けしたコードが存在するのですか?


うーん、変更内容に従って変更しましたが、同じエラーが報告されます。また、エラーは空のクエリまたはクエリ結果がある場合にのみ報告されます。結果のないクエリはエラーを報告しません。



これをリダイレクトパラメータとして Show/show に渡し、show メソッドを通じて割り当てる必要があります。


うーん、リダイレクトを使用する場合は、実際には役に立たないので、このリダイレクトは、Showコントローラーの下のshowメソッドですか?

Show コントローラーの show メソッド redirect('Show/show',array('users'=>$mohulist,'page'=>$show)) 次に、ショー内で $mohulist = $_GET[ を使用しますメソッド 'mohulist']; $page = $_GET['page'];


Indexx の Dosearch メソッド
public function dosearch(){//Fuzzy query
$user = M('user');
$key = $_REQUEST['keysearch']
//$where['username'; ] = $key;
$where['username'] = array("like",array("%$key","$key%"));
import('ORG.Util.Page');//ページング クラスをインポートします
//$data=$user->where($where)->select();
$count=$user->where($where)->count();クエリの総数
$Page= new Page($count,3);//インスタンス化されたページング クラス 総レコード数と各ページに表示されるレコード数を渡します


foreach($where as $key=> ;$val) {
if(!is_array($val)) {
$Page->parameter .= "$key=".urlencode($val).'&'
}
}

$show = $Page-> show();// ページングで出力を表示
$mohulist = $user->where($where)->limit($Page->firstRow.','.$Page-> listRows)->select ();
//$this->assign('users',$mohulist);
//$this->assign('page',$show);// 割り当てのページング出力
//$this->display('Show/show');
$this->redirect('Show/show',array('users'=>$mohulist,'page'=>$show) ));
}

以下の show メソッドを表示します

$mohulist = $_GET['mohulist']
$page = $_GET['page']; display();
}

クエリの送信後にエラー Not Found が報告されました

リクエストされた URL /alumni/index.php/Show/show/users//page/+1+æ?¡ è®°å½?+1/1+é¡このサーバーには µ++++++++++.html が見つかりませんでした
さらに、コントローラーに header('content-type:text/hmtl;charset=utf-8'); を追加して報告しました。エラー 文字化けがまだあるのはなぜですか?


パラメータ $show が単純な文字列パラメータまたは配列パラメータではないため、それはオブジェクトであるはずです。アクションでは引き続き U メソッドを使用することをお勧めします。U メソッドはもともとクロスコントローラーをサポートしていますが、それを使用しないのはどうでしょうか?

$show を強制的にシリアル化し、それを渡してから逆シリアル化してください。しかし、これは非常に反人間的な操作です

$show をシリアル化して渡してから、逆シリアル化して戻す必要があります。しかし、これは非常に反人間的な操作です

うーん、わかりました、私は PHP を学んだばかりで、皆さんがコントローラーの問題をどのように処理するかを知りたいだけです。OK、U メソッドを使用してください。お疲れ様でした。