代码之家  ›  专栏  ›  技术社区  ›  Simon

Zend_路由器…Zend_窗体…Mod_重写…重写url获取值对以斜杠

  •  0
  • Simon  · 技术社区  · 14 年前

    我提交了一份普通的 <form method="get"> 元素到当前URL…它是搜索页面的一部分。结果URL在下面。
    http://domain.com/module/controller/action/get1/value1/?get2=get2&value3=value3
    问题是我正在使用 <?= $this->url(array('page' => x)); ?> 类似于导航,但我想保留 $_GET 帕拉姆…每当我使用它时,它会保留 / 削减 $GET 参数和松开 ?&= 价值对…
    我想用mod ou 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]
    

    我对修改没有信心,我不想与现有的规则冲突。

    我也喜欢斜杠…所以这将是一个奖金…

    请帮助!!非常感谢…

    PS.… 关于 Zend_Router Zend_Form …在标题中。我正在使用 Zend_表格 为了构造表单,我意识到我可以在 onSubmit 函数写入URL…同样,我可以使用Zend_路由器重写URL…我想 Mod_rewrite 最好不过…

    2 回复  |  直到 14 年前
        1
  •  0
  •   Vladimir Mihailenco    14 年前

    我不知道如何使用正则表达式和mod_rewrite来实现这一点,但是您可以像这样扩展zend_controller_router_路由,并使用它代替标准路由器:

    <?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);
        }
    }
    
        2
  •  0
  •   Simon    14 年前

    我找不到一个好方法来做这件事…所以我决定在我的 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));
    

    如果有人对此有所改进,请在下面发表评论。