Zend_Form set action - Peut-il fonctionner avec le sous-répertoire intégré à l'application Zend?

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

Question

Mon application est en cours de création dans un sous-répertoire de mon serveur local, qui ressemble à ceci:

http://localhost/application/

Le problème est que, lorsque je mets l'action de formulaire à "/ form / save", le formulaire achemine vers "localhost / form / save", ce qui n'existe pas.

Si je règle l'action de formulaire sur "/ application / form / save", j'obtiens une erreur, car Zend utilise l'URL saisie dans Front_Controller pour choisir les modules, les contrôleurs et les actions à utiliser pour les demandes.

Existe-t-il un moyen simple d’analyser les requêtes dans base_url? Cela fonctionne sur tout le reste sauf les formulaires pour une raison quelconque.

Une autre alternative serait d’ajouter base_url à toutes les actions de formulaire afin que votre application puisse fonctionner dans différents environnements, puis de l’analyser à la réception de l’action par le contrôleur.

Existe-t-il un moyen simple de définir une variable pour faire quelque chose comme cela, déjà intégrée à Zend? Si non, quelle est la solution?

Je n'arrive pas à trouver quoi que ce soit qui règle ce problème nulle part.

Était-ce utile?

La solution

Le problème est dû à l'inclusion de la barre oblique initiale dans l'action. Lorsque vous définissez un lien avec un lien relatif à la racine, cela revient à définir un lien absolu lorsque l'ancre de destination se trouve sous le même nom de domaine. ("/ form / save" est équivalent à " http: // localhost / form / save ". ).

Dans votre cas, il semble que vous deviez ajouter une URL de base au formulaire si vous souhaitez envoyer les données à un autre contrôleur / action. Vous utilisez Zend_Form (pas vrai?), La solution la plus élégante consisterait à sous-classer Zend_Form , en remplaçant la méthode setAction () pour URL de base pour chaque action définie.

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).
    }        
}

Désormais, chaque fois que vous créez un nouveau formulaire à partir de My_Form et appelez My_Form :: setAction () , votre URL de base est automatiquement incluse.

J'espère que cela vous aidera.

Autres conseils

Vous pouvez simplement laisser l'action vide et traiter les données de formulaire dans la même action.

Je suis nouveau sur Zend Framework, donc je ne sais pas s'il s'agit de la meilleure solution, mais cela fonctionne bien pour moi.

J'ai utilisé le code suivant pour définir l'action:

    $url = new Zend_View_Helper_Url();
    $this->setAction($url->url(array('controller'=> 'register','action'=>'index'),'default'));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top