Zend_Form set action - Может ли он работать с приложением Zend, встроенным в подкаталог?
-
08-07-2019 - |
Вопрос
Мое приложение создается в подкаталоге моего локального сервера, который выглядит примерно так:
http://localhost/application/
Проблема в том, что когда я устанавливаю действие формы на «/ form / save», форма перенаправляется на «localhost / form / save», которого не существует. Р>
Если я установлю действие формы на «/ application / form / save», я получу сообщение об ошибке, поскольку Zend использует ввод URL-адреса в своем Front_Controller для выбора модулей, контроллеров и действий, которые будут использоваться для запросов. р>
Есть ли простой способ проанализировать 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'));