Надеюсь, название не звучит слишком запутанно, но я понятия не имел, как назвать мою проблему.
Краткое вступление:
Я использую Zend 1.1X.
В данный момент я работаю с формой поиска, отправляющей несколько параметров через POST.
Теперь я должен изменить его, чтобы использовать GET, у меня есть маршрут, похожий на этот:
"search/what/:what/shape/:shape"
и так далее, у меня также есть 2 необязательных параметра, которые по умолчанию принимают значение null.
Я пытаюсь сгенерировать URL (используя Zend View Helper Url) при действии формы, но выдает исключение:
Uncaught exception 'Zend_Controller_Router_Exception' with message what is not specified
Теперь я понятия не имею, что мне делать. Если я изменю свой маршрут только на «поиск», тогда он отправит форму правильно, но я получу "search?what=XXXX&shape=YYYY"
вместо "search/what/XXXX/shape/YYYY"
,
Есть ли способ, которым я могу обращаться так, как мне нравится ??? :>
@РЕДАКТИРОВАТЬ
Я думаю, что это также должно быть упомянуто — у меня есть другая форма, похожая, указывающая на маршрут без заданных параметров, и URI «переводится» в форму пар «ключ / значение». Единственное различие между ними состоит в том, что первый не использует помощника Url, вместо этого имеет жестко запрограммированную часть метода, и моя форма отправляется программно (button => jQuery stuff => submit). Будет ли это иметь значение здесь, как я полагаю, не должно? :>
Я надеюсь, что любой возможный источник этого поведения придет к вам, потому что я действительно застрял на данный момент, и я просто не могу найти, что не так ..
Заранее спасибо!
С GET
Метод форма генерирует URL, как это: action?param1=val1¶m2=val2&....
Я вижу два решения:
Во-первых, чтобы восстановить URL с помощью javacsript, мы можем представить что-то вроде этого:
<form method="get" id="id_form">
....
</form>
<script>
var objet_form = document.getElementById('id_form');
function gestionclic(event){
var url = objet_form.action;
for(var i = 0; i < objet_form.length; i++){
url += "/" + objet_form[i].name + "/" + objet_form[i].value;
}
objet_form.action = url;
}
if (objet_form.addEventListener){
objet_form.addEventListener("submit", gestionclic, false);
} else{
objet_form.attachEvent("onsubmit", gestionclic, false);
}
</script>
Но я не думаю, что это хорошее решение.
Второе — управлять им с помощью плагина:
Для плагина он должен быть объявлен в bootstrap
,
Например:
public function _initPlugins(){
$front = Zend_Controller_Front::getInstance();
$front->registerPlugin(new Application_Plugin_PRoutage());
}
с этим примером application/plugins
папку, создайте PRoutage.php
плагин, как это:
class Application_Plugin_PRoutage extends Zend_Controller_Plugin_Abstract
{
public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request)
{
...
}
}
и с переменной $request
у вас есть доступ к вашим данным в виде массива с $request->getParams()
,
Мы можем представить что-то вроде этого:
public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request)
{
$param = $request->getParams();
$what = "";
$shape = "";
if (isset($param['what']) $what = $param['what'];
if (isset($param['shape']) $shape = $param['shape'];
if ($what == "XXXX" && $shape == "YYYY"){
$request->setControllerName('other_controler')
->setActionName('other_action')
->setDispatched(true) ;
}
}
Я надеюсь, что это поможет вам
Других решений пока нет …