编程语言
首页 > 编程语言> > SilverStripe 3.1使用PHP动态更改重定向器的URL slug

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

标签:silverstripe,php,redirect
来源: https://codeday.me/bug/20190824/1704890.html