3

2つのフォームを持つページを表示したい。上部のフォームはこのページに固有のものですが、下部のフォームは別のコントローラーから既にレンダリングできます。次のコードを使用して他のフォームのアクションを呼び出していますが、このエラーが引き続き発生します。

「メッセージ: ID が指定されていません」

 #0 .../library/Zend/Controller/Router/Rewrite.php(441): Zend_Controller_Router_Route->assemble(Array, true, true)

私のコード:

最初のコントローラー:

abc_Controller
public function someAction()
{

    $this->_helper->actionStack('other','xyz');

}

2 番目のコントローラー:

    xyz_Controller
 public function otherAction()
 {
 // code
 }

望ましい結果:

/abc/some を呼び出すときに、xyz/other コンテンツと共に「some」コンテンツをレンダリングしたいと考えています。ドキュメントに正しく従ったと思います(http://framework.zend.com/manual/en/zend.controller.actionhelpers.html)が、そのエラーが発生する理由についてのヘルプが見つかりません。(XDebug を使用して) コードをトレースすると、xyz/other アクションは正常に完了しますが、abc/some アクションが最後に到達すると、ディスパッチまたはルーティング中にエラーがスローされます。

どんな助けでも大歓迎です。

4

8 に答える 8

3

someAction の phtml でこれを実現できます。したがって、 some.phtml put では、XyzController<?php echo $this->action('other','xyz');?>の otherAction にあるフォームがレンダリングされます。

于 2009-12-05T17:09:58.247 に答える
3

このようなことをしたいという衝動は、あなたがそれを完全に間違った方法で行っていることを示しています. コンテンツを再利用したいという衝動に駆られた場合、それはおそらくモデルに属しているはずです。それが本当にコントローラ コードである場合は、アクション コントローラ プラグインによってカプセル化する必要があります。

于 2009-12-06T03:16:13.570 に答える
2

phtml ファイルでは、 $this->action() を使用できます。ページをレンダリングすると、その応答が現在の応答に追加されます..

アクションの構文は次のとおりです。

public function action($action, $controller, $module = null, array $params = array())
于 2010-09-15T04:44:32.707 に答える
1

2 番目のコントローラーで新しいオブジェクトを作成し、そのメソッドを呼び出すことができます (ただし、これは最善の方法ではありません)。

最初のコントローラーを 2 番目のコントローラーで拡張して呼び出すことができます$this->methodFromSecond();。これにより、2 番目のフォームもテンプレートと共にレンダリングされます。

ところで - 両方のコントローラーで実行したいコードの種類は何ですか?

于 2009-12-05T17:08:12.277 に答える
0

うーん、1つのビューに異なるコントローラーを使用する必要がある理由がわかりません。より良い方法は、すべてを1つのコントローラーにまとめることです。私はこの例のようにこれを使用しています

DemoController extends My_Controller_Action() {
 ....
 public function indexAction() {
   $this->view->oForm = new Form_Registration();
 }
}

My_Controller_Action extends Zend_Controller_Action() {
   public function init() {
      parent::init();
      $this->setGeneralStuf();
   }

   public function setGeneralStuf() {
       $this->view->oLoginForm = new Form_Login();
   }
}
于 2010-09-14T21:05:01.513 に答える
0

この種のルート定義:

routes.abc.route = "abc/buy/:id/*" 
routes.abc.defaults.controller = "deal" 
routes.abc.defaults.action = "buy" 
routes.abc.reqs.id = "\d+"

機能するにはパラメーターが必要です。これは actionStack で実行できますが、何も指定されていない場合はデフォルトの ID を指定することもできます。

$this->_helper->actionStack('Action',
                            'Controller',
                            'Route',
                            array('param' => 'value')
);


routes.abc.defaults.id = "1" 
于 2012-04-28T13:48:40.170 に答える
0

ただの更新。このエラーは、アクションが 2 番目のコントローラーからどのように呼び出されたかとはまったく関係がありませんでした。2 番目のコントローラーのレイアウトでは、別の phtml 呼び出しがエラーをスローしていたことがわかりました (layout/abc.phtml):

<?php echo $this->render('userNavigation.phtml') ?>

エラー行:

echo $this->navigation()->menu()->renderMenu(...)

このスレッドを混乱させないように、これを個別にデバッグします。

迅速な対応をしてくれた Akeem と hsz に感謝します。あなたの回答から学びました。

要約すると、外部コントローラーからアクションを呼び出すには 3 つの異なる方法がありました。

  1. 最初のコントローラーから 2 番目のコントローラーをインスタンス化し、アクションを呼び出します。
  2. $this->_helper->actionStack を使用
  3. 最初のコントローラーの phtml では、action('other','xyz');?> (Akeem が上記で指摘したように)

これが他のZend初心者の助けになることを願っています。

于 2009-12-06T03:06:31.277 に答える
0

私にとって、これは魅力のように機能しました

    class abcController extends Zend_Controller_Action
    {
        public function dashBoardAction()
        {
            $this->_helper->actionStack('list-User-Data', 'xyz');
        }
    }

    class XyzController extends Zend_Controller_Action {
        public function listUserDataAction()
        {
            $data = array('red','green','blue','yellow');
            return $data;
        }
    }
于 2013-06-03T15:27:04.567 に答える