Zend_Form setアクション-サブディレクトリに組み込まれたZendアプリケーションで動作しますか?
-
08-07-2019 - |
質問
私のアプリケーションは、ローカルサーバーのサブディレクトリに構築されています。次のようになります。
http://localhost/application/
問題は、フォームアクションを" / form / save"に設定すると、フォームが存在しない" localhost / form / save"にルーティングされることです。
フォームアクションを" / application / form / save"に設定すると、ZendはFront_ControllerのURL入力を使用して、リクエストに使用するモジュール、コントローラー、およびアクションを選択するため、エラーが発生します。
リクエストからbase_urlを解析する簡単な方法はありますか?何らかの理由でフォームを除く他のすべてで機能します。
別の方法は、アプリケーションが異なる環境で動作できるようにすべてのフォームアクションにbase_urlを追加し、コントローラーがアクションを受信したときに解析することです。
Zendに既に組み込まれている、このようなことを行う変数を設定する簡単な方法はありますか? そうでない場合、解決策は何ですか?
この問題に対処するものはどこにも見つからないようです。
解決
問題の原因は、アクションに最初のスラッシュを含めることです。ルート相対リンクでリンクを設定する場合、宛先アンカーが同じドメイン名の下にある場合、絶対リンクを設定するのと同じです。 (" / form / save"は" http:// localhost / form / save "と同等です。 )。
あなたの場合、データを別のコントローラー/アクションに送信する場合は、フォームにベースURLを追加する必要があるようです。 Zend_Form
を使用している場合(右?)、最もエレガントなソリューションは Zend_Form
をサブクラス化し、 setAction()
メソッドをオーバーライドして設定したすべてのアクションのベースURL。
class My_Form extends Zend_Form
{
...
public function setAction($action)
{
$baseAction = rtrim($this->_getBaseUrl(),'/') . $action; // Will remove a slash from the end of the base URL, so form actions start with a slash.
parent::setAction($baseAction);
}
private function _getBaseUrl()
{
// Retrive your base url from somewhere (config might be a good place).
}
}
My_Form
から新しいフォームを作成して My_Form :: setAction()
を呼び出すと、ベースURLが自動的に含まれるようになります。
これがお役に立てば幸いです。
他のヒント
アクションを空白のままにして、同じアクションでフォームデータを処理できます。
私はZend Frameworkを初めて使用するので、これが最善の解決策であるかどうかはわかりませんが、うまく機能しています。
次のコードを使用してアクションを設定しました:
$url = new Zend_View_Helper_Url();
$this->setAction($url->url(array('controller'=> 'register','action'=>'index'),'default'));