从扩展页面的控制器访问SilverStripe自定义配置变量

时间:2012-10-05 23:30:27

标签: php ajax content-management-system silverstripe hmvc

如果我在Ajax_Controller中对URL进行硬编码,基本上一切都有效,但我希望它能够从我创建的CMS字段中访问URL。

提前致谢。 (当我不关闭括号时请忽略 - 只是试图有效地复制/粘贴)

在/mysite/_config.php中我创建了一个自定义配置:

Object::add_extension('SiteConfig', 'CustomSiteConfig');

在/mysite/code/CustomSiteConfig.php中我添加了一个字段,我将存储一个URL:

class CustomSiteConfig extends DataObjectDecorator {

function extraStatics() {
    return array(
        'db' => array(
            'COJsonPath' => 'Text'
        )
    );
}

public function updateCMSFields(FieldSet &$fields) {
    $fields->addFieldToTab("Root.CO", new TextField("COJsonPath", "CO JSON URL"));
}

public function getCOJsonPath(){
    return $SiteConfig.COJsonPath;
}

这成功地在CMS中的主父级中创建了一个名为“CO”的选项卡和一个名为“CO JSON URL”的字段。我登录了CMS并将http://api.localhost/mymethod/保存到该字段。

现在我已经创建了一个Ajax页面类型,以便于运行Ajax命令而不让网站用户找到我的API所在,并且因为jQuery Ajax不喜欢XSS(跨站点脚本)。

在/mysite/code/Ajax.php中:

class Ajax extends Page {

static $db = array(
);
static $has_one = array(
);

function getCMSFields()
{
    $fields = parent::getCMSFields();
    return $fields;
}

}

class Ajax_Controller extends Page_Controller {
public function getCO()
{
    $buffer = self::createHttpRequest("http://api.localhost/mymethod/");
    //$buffer = self::createHttpRequest($CustomSiteConfig::getCOJsonPath());        
    return $buffer;
}

此代码有效,但是当我尝试使用您看到注释掉的行执行我的createHttpRequest()时,它会失败。我知道我的语法错了,我只是想不出它应该是什么。感谢您的帮助 - 我已经做到了这一点,直到我无法解决它 - 它的星期五。

1 个答案:

答案 0 :(得分:1)

我在您的代码中发现了几个语法错误:

public function getCOJsonPath(){
    return $SiteConfig.COJsonPath;
}

应该是:

public function getCOJsonPath(){
    return $this->owner->COJsonPath;
}

1)$ SiteConfig永远不会在那时定义。 2)通常你会使用$ this,但在你的情况下你是在DataObjectDecorator里面,所以你必须使用$ this->所有者 3)您无法使用.访问对象的属性,在php中您必须使用->


继续使用Ajax_Controller类,在getCO中有以下错误:

1)$ CustomSiteConfig未定义,因此无法使用 2)getCOJsonPath不是静态函数,但是你试着将它称为静态函数(再次使用->

所以,代码看起来应该是这样的:

public function getCO() {
    $siteConfig = SiteConfig::current_site_config();
    $buffer = self::createHttpRequest($siteConfig->getCOJsonPath());        
    return $buffer;
}


应该有用,但还有另一种想法可以改进。 据我了解,您正在创建一个ajax页面,然后在CMS中创建一次,并告诉您的网站内容作者永远不要触摸ajax页面? 这很安静,有几种不错的方法可以做你想做的事。

以下是我将如何创建Ajax控制器:

_config.php

// tell SilverStripe what URL your AjaxController should have, 
// here we set it to AjaxController::$URLSegment which is 'myAjaxController'
// so the url to the controller is mysite.com/myAjaxController
Director::addRules(100, array(
    AjaxController::$URLSegment => 'AjaxController',
));

AjaxController.php

<?php
class EventAssetsController extends Controller {
    public static $URLSegment = 'myAjaxController';
    // tell SilverStripe what URL should call what function (action)
    // for example, mysite.com/myAjaxController/foo should call the function foo
    public static $url_handlers = array(
        'foo' => 'foo',
        'bar/$ID/$OtherID' => 'bar',
        'co' => 'getCO'
    );
    public function Link($action = null) {
        // this function is just a helper, in case you evern need $this->Link()
        return Controller::join_links(self::$URLSegment, $action);
    }
    public function AbsoluteLink($action = null) {
        return Director::absoluteURL($this->Link($action));
    }
    public function foo(SS_HTTPRequest $request) {
         // do something here
         // this method is an action, the url to this action is:
         // mysite.com/myAjaxController/foo
    }
    public function bar(SS_HTTPRequest $request) {
         // do something here
         // this method is an action, the url to this action is:
         // mysite.com/myAjaxController/bar
         // you notice that the $url_handlers has "bar/$ID/$OtherID", 
         // that means you cann call mysite.com/myAjaxController/bar/21/42
         // and silverstripe will make 21 the ID, and 42 the OtherID
         // you can access ID and OtherID like this:
         // $ID = $request->param('ID'); // which is 21
         // $OtherID = $request->param('OtherID'); // which is 42
    }
    public function getCO() {
        // this method is an action, the url to this action is:
        // mysite.com/myAjaxController/co
        $siteConfig = SiteConfig::current_site_config();
        $buffer = self::createHttpRequest($siteConfig->getCOJsonPath());        
        return $buffer;
    }
}