Zend_Router ... Zend_Form ... Mod_Rewrite ... Перезаписать URL-адрес, чтобы получить пары значений для слешей - PullRequest
0 голосов
/ 11 февраля 2010

Я отправляю обычный элемент <form method="get"> на текущий URL-адрес ... Это часть страницы поиска. Полученный URL ниже.
http://domain.com/module/controller/action/get1/value1/?get2=get2&value3=value3
Проблема в том, что я использую <?= $this->url(array('page' => x)); ?> и похож на него, но я хочу сохранить параметры $_GET ... Всякий раз, когда я его использую, он сохраняет параметры / slashed $_GET и теряет значение ?&= пар ...
Я хочу использовать Mod_Rewrite, чтобы изменить пары значений на косые черты ... Мое текущее правило ..

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ zend.php [NC,L]

Я не уверен в Mod_Rewrite и не хочу конфликтовать с существующими правилами.

Мне тоже нравится косая черта ... так что это был бы бонус ...

Пожалуйста, помогите !! Большое спасибо ...

PS ... Re "Zend_Router ... Zend_Form .." в заголовке. Я использую Zend_Form для создания формы, и я понимаю, что я мог бы использовать javascript для функции onSubmit для записи URL-адреса ... аналогично, я мог бы использовать Zend_Router для переписывания URL-адреса ... лучше всего ...

Ответы [ 2 ]

0 голосов
/ 20 февраля 2010

Я не мог найти хороший способ сделать это ... поэтому я решил написать минимизированный код PHP в верхней части моего zend.php.

list($sURL, $sQuery) = explode('?', $_SERVER['REQUEST_URI']);
$sOriginalURL = $sURL;
if ('/' !== substr($sURL, -1)) $sURL .= '/';
if (isset($sQuery)) {
    foreach (explode('&', $sQuery) as $sPair) {
        if (empty($sPair)) continue;
        list($sKey, $sValue) = explode('=', $sPair);
        $sURL .= $sKey . '/' . $sValue . '/';
    }
}
if (isset($sQuery) || $sOriginalURL !== $sURL) header(sprintf('Location: %s', $sURL));

Если кто-то может улучшить это, пожалуйста, прокомментируйте ниже.

0 голосов
/ 11 февраля 2010

Я не знаю, как реализовать это, используя регулярные выражения и mod_rewrite, но вы можете расширить Zend_Controller_Router_Route следующим образом и использовать его вместо стандартного маршрутизатора:

<?php
class ZendY_Controller_Router_Route_GetAware extends
        Zend_Controller_Router_Route
{
    public static function getInstance(Zend_Config $config)
    {
        $reqs = ($config->reqs instanceof Zend_Config)
                ? $config->reqs->toArray() : array();
        $defs = ($config->defaults instanceof Zend_Config)
                ? $config->defaults->toArray() : array();
        return new self($config->route, $defs, $reqs);
    }

    public function match($path)
    {
        foreach ($_GET as $k => $v) {
            if (is_array($v)) {
                $v = implode(',', $v);
            }
            $path .= "{$this->_urlDelimiter}{$k}{$this->_urlDelimiter}{$v}";
        }
        parent::match($path);
    }
}
...