Доступ к пользовательской переменной конфигурации SilverStripe из контроллера, который расширяет страницу

В основном все работает, если я жестко запрограммирую URL-адрес в своем Ajax_Controller, но я хочу, чтобы он обращался к URL-адресу из созданного мной поля CMS.

Заранее спасибо. (пожалуйста, игнорируйте, когда я не закрываю фигурные скобки - просто пытаюсь эффективно скопировать/вставить)

В /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() с закомментированной строкой, он терпит неудачу. Я знаю, что мой синтаксис неверен, я просто не могу понять, каким он должен быть. Спасибо за помощь - я сделал это раньше, я просто не могу понять - это пятница.


person strantheman    schedule 05.10.2012    source источник


Ответы (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;
    }
}
person Zauberfisch    schedule 06.10.2012
comment
Сейчас пересматриваю - большое спасибо! Я отчитаюсь. Я подумал, что это должны быть простые синтаксические ошибки. - person strantheman; 08.10.2012
comment
Аааа - фрагмент кода 1: Да, я пробовал синтаксис из шаблона .ss, а не правильную ссылку на объект - спасибо. - person strantheman; 08.10.2012
comment
Кусок кода 2: я просто не совсем знал, как искать ответ на этот вопрос. $siteConfig = SiteConfig::current_site_config(); имеет смысл, теперь я понимаю, что мог бы поискать, как сослаться на текущую конфигурацию серебряной полосы - person strantheman; 08.10.2012
comment
Я изменил код, который вы рекомендовали в CustomSiteConfig.php, но теперь я получаю свойство [Notice] code[Notice] Undefined: SiteConfig::$COJsonPath GET /admin Строка 20 в .....\public\mysite\code \CustomSiteConfig.php Источник 11 ); 12 } 13 14 общедоступная функция updateCMSFields(FieldSet &$fields) { 15 $fields->addFieldToTab(Root.CO, new TextField(COJsonPath, CO JSON URL)); 16 } 17 18 19 public function getCOJsonPath(){ 20 return $this-›owner-›COJsonPath; 21 } 22 } 23 24 ?›` - person strantheman; 09.10.2012
comment
Попытка отформатировать этот вывод, но безуспешно. Спасибо за любую помощь. - person strantheman; 09.10.2012
comment
Вы также определили COJsonPath как значение $ db? - person Zauberfisch; 10.10.2012
comment
ах, подождите, у вас может быть эта проблема, потому что getCOJsonPath является геттером для COJsonPath, попробуйте: function getCOJsonPath() { return $this-›owner-›getField('COJsonPath'); } - person Zauberfisch; 10.10.2012
comment
Это сделало это! Спасибо за тщательную проверку моего кода и подробное описание того, ПОЧЕМУ некоторые вещи были неправильными. Ты жжешь. - person strantheman; 10.10.2012