SilverStripe 3.5.1 - 如果用户尝试导航到amp.html版本,则重定向到SilverStripe页面的AbsoluteLink

时间:2018-02-28 15:41:39

标签: silverstripe google-amp

我正在开发SilverStripe AMP模块的分支(https://github.com/thezenmonkey/silverstripe-amp),如果尚未生成amp.html链接,则必须阻止任何人导航到SilverStripe页面的amp.html版本页面的负责人。

一些额外信息:我们添加了2个字段,这些字段将出现在每个页面的AMP版本上:AmpImage和AmpContent(富文本编辑器)。如果其中任何一个为空,我的代码设置为不生成SilverStripe页面的AMP页面。这似乎已足够,但已添加了一项额外要求,即提及的重定向功能,因此没有人可以实际导航到amp.html页面。

我正在考虑使用AmpSiteTreeExtension文件进行重定向,但它似乎不允许重定向,然后我想在Page.php中有一个函数来检查url是否包含amp.html,然后引用它AmpSiteTreeExtension,但每次我尝试时,都会收到错误消息,说明该功能不存在于" Page"或者它不公开。

有没有办法处理这种情况?最好是使用Page.php或使用其他方法吗?

以下是我正在使用的文件:

AmpSiteTreeExtension     

    public function MetaTags(&$tags)
    {
        if ($this->owner->AmpContent != "" && $this->owner->AmpImageID != "") {

            if ($this->owner->class != "HomePage") {
                $ampLink = $this->owner->AbsoluteLink() . "amp.html";
            } else {
                $ampLink = $this->owner->AbsoluteLink() . "home/" . "amp.html";
            }

            $tags .= "<link rel='amphtml' href='$ampLink' /> \n";
        }

      //add a redirect here? Referencing a function from Page.php like so: $this->owner->functionName() causes the error mentioned above
    }
}

<?php

AmpController

class AmpController extends Extension
{

    private static $allowed_actions = array('amp');

    private static $url_handlers = array(
        'amp.html' => 'amp'
    );

    public function amp()
    {
        Requirements::clear();

        $class = Controller::curr()->ClassName;
        $page = $this->owner->renderWith(array("$class"."_amp", "Amp"));

        return $this->AmplfyHTML($page);
    }


    public function AmplfyHTML($content)
    {
        if (!$content) {
            return false;
        }

        $content = preg_replace('/style=\\"[^\\"]*\\"/', '', $content);
        $content = str_replace("<img", "<amp-img", $content);

        return $content;
    }
}

1 个答案:

答案 0 :(得分:1)

据我所知,您正在尝试重定向SiteTree扩展程序的MetaTags()方法...而且我可以告诉您,MetaTags()方法可能会在某些Silverstripe中使用像这样的模板:$MetaTags

...并且你无法以这种方式应用重定向。

你应该在控制器类中完成所有这些重定向工作,并且从你的控制器示例中可能是AmpController类,这是通过扩展Page_Controller类的功能来实现的。

现在我假设AmpController它是Page_Controller的扩展,所以我会这样做:

class Page_Controller extends ContentController {

  public function init() {
    parent::init();

    // you might have some other stuff here

    // make sure this is the last line in this method
    $this->extend('updateInit');
  }

  public function yourRedirectMethod() {
    // do your redirect thing here
  }

}

以下是关键字:

  1. 我扩展了控制器中的init()方法 - 这将允许我这样做 使用。扩展页面控制器的init()功能 扩展类中的updateInit()方法(AmpController 情况)。

  2. 而不是将正在执行重定向的方法添加到Page     我把它添加到Page_Controller类(     yourRedirectMethod()方法)。

  3. 现在来了AmpController类,我实现了updateInit()方法:

    class AmpController extends Extension {
    
        private static $allowed_actions = array('amp');
    
        private static $url_handlers = array(
            'amp.html' => 'amp'
        );
    
        public function amp()
        {
            Requirements::clear();
    
            $class = Controller::curr()->ClassName;
            $page = $this->owner->renderWith(array("$class"."_amp", "Amp"));
    
            return $this->AmplfyHTML($page);
        }
    
    
        public function AmplfyHTML($content)
        {
            if (!$content) {
                return false;
            }
    
            $content = preg_replace('/style=\\"[^\\"]*\\"/', '', $content);
            $content = str_replace("<img", "<amp-img", $content);
    
            return $content;
        }
    
        public function updateInit() {
          $should_redirect = true;  // of course you add your own condition here to decide wether to redirect or not
    
          if ($should_redirect) {
            $this->owner->yourRedirectFunction();
          }
        }
    
    }
    

    这里唯一的一点是,您需要更新上面的$should_redirect变量(我在此示例中默认将其设置为true - 但是您可以在此决定是否应该重定向) ...是的,您可以在AmpController课程中参考Page课程中的$this->owner->Title课程内容,例如:@Autowired public void configureAuthorizationEndpoint(AuthorizationEndpoint authorizationEndpoint) { DefaultRedirectResolver redirectResolver = new DefaultRedirectResolver() { @Override public String resolveRedirect(String requestedRedirect, ClientDetails client) { SecurityContextHolder.clearContext(); return super.resolveRedirect(requestedRedirect, client); } }; redirectResolver.setMatchPorts(false); authorizationEndpoint.setRedirectResolver(redirectResolver); }