Zend_Form set action - Может ли он работать с приложением Zend, встроенным в подкаталог?

StackOverflow https://stackoverflow.com/questions/1640738

Вопрос

Мое приложение создается в подкаталоге моего локального сервера, который выглядит примерно так:

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'));
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top