0

如果我在 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() 时,它失败了。我知道我的语法是错误的,我只是不知道它应该是什么。感谢您的帮助-在我无法弄清楚之前我已经完成了这项工作-星期五。

4

1 回答 1

1

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

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

应该:

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

1) $SiteConfig 在那一点上从未定义过。2) 通常你会使用 $this,但在你的情况下,你在 DataObjectDecorator 内部,所以你必须使用 $this->owner 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;
    }
}
于 2012-10-06T08:03:06.503 回答