微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SilverStripe 3.1使用PHP动态更改重定向器的URL slug

这是我原来的问题SilverStripe 3.1+ Dynamically creating page redirects的扩展

我有一个产品页面网址
a)www.mysite.com/category/subcat/productid
您可以通过单独的重定向页面访问此页面
b)www.mysite.com/productid

页面’a’包含可以通过访问的标签
c)www.mysite.com/category/subcat/productid/tabid

我想使用PHP为每个产品页面动态创建链接/重定向器,以便可以通过以下方式访问它:

1)仅使用’b’中显示的’预测’的短URL(我可以通过创建页面重定向器来实现这一点,但这对于大量产品来说是长篇大论.
2)为每个标签链接创建一个简短的URL,因此’c’将从以下位置重定向:d)www.mysite.com/productid/tabid

‘tabid’可以是硬编码的,在我的例子中可能是:音频,视频,图片,固件

目前使用我的ProductPage.PHP中的代码

class ProductPage_Controller extends Page_Controller {


private static $allowed_actions = array(

    'audio',
    'pictures',
    'firmware',
    'videos',
);


public function audio() {
    $this->redirect($this->Link().'?tab=audio');
}
public function pictures() {
    $this->redirect($this->Link().'?tab=pictures');
}
public function firmware() {
    $this->redirect($this->Link().'?tab=firmware');
}
public function videos() {
     $this->redirect($this->Link().'?tab=videos');
}

允许我从/ video转到/?tab = video但这当然不会缩短我所追求的最终结果的URL.
可能这可以在RedirectorPage.PHP的扩展中完成吗?

解决方法:

一种方法是使用onBeforeHTTPError404在调用404错误时挂钩并重定向找到的任何产品.

我们使用onBeforeHTTPError404函数创建ProductRedirectExtension.当找不到页面时,但在系统返回404错误之前,将调用函数.此处的代码将检查ProductPage是否存在URLSegment以及用户URL字符串的第一部分.如果找到ProductPage,我们检查用户的URL字符串的第二部分是否是标签关键字之一.之后,用户重定向页面.

ProductRedirectExtension.PHP

class ProductRedirectExtension extends Extension {

    public function onBeforeHTTPError404( $request ) {
        $urlSegment = $request->param('URLSegment');
        $action = strtolower($request->param('Action'));
        $page = ProductPage::get()->filter('URLSegment', $urlSegment)->first();

        if ($page) {
            $link = $page->Link();

            if ($action == 'audio' || $action == 'pictures' || $action == 'firmware' || $action == 'videos') {
                $link .= '?tab=' . $action;
            }

            $response = new SS_HTTPResponse();
            $response->redirect($link, 301);

            throw new SS_HTTPResponse_Exception($response);
        }
    }
}

我们使用以下配置设置启用此扩展.

config.yml

RequestHandler:
  extensions:
    - ProductRedirectExtension

ContentController:
  extensions:
    - ProductRedirectExtension

ModelAsController:
  extensions:
    - ProductRedirectExtension

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐