如果我在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()时,它会失败。我知道我的语法错了,我只是想不出它应该是什么。感谢您的帮助 - 我已经做到了这一点,直到我无法解决它 - 它的星期五。
答案 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;
}
}