当不在公共函数getCMSFields中时,Gridfield不会填充ArrayList

时间:2016-07-05 13:14:18

标签: php arraylist silverstripe tabular

当我在管理控制台中创建GridField时 - 一切正常 - 我通过经典方法填充gridfield(例如,成员:: get() - 或通过ArrayList -

var pollLoop = function () {
      element(by.id('spinnerElem')).getAttribute('class').then(function (cls) {
                if (cls.indexOf('spinner-active') > -1) {
                    // wait for the spinner
                } else {
                    //do your logic
                    promise.defer().fulfill();
                }
            }, function () {
                // This err handling function is to handle the {StaleElementReferenceError} and makes sure we find the element always.
                pollLoop();
            });
        };

这两种方法都运行正常。 但是,如果我尝试在用户页面上创建GridField - 以表单形式呈现 - 以某种方式 - 第二种方法(其中GridField应该由ArrayList填充 - 不起作用)。

$al1 = new ArrayList();
$records = DB::query("SELECT * from Member where id<10");
while ($rec = $records->next()) {
    $al1->push(new ArrayData($rec));
}       
$grid = new GridField('Pages', 'All pages', $al1)

- woks ok,但是我用老式的方式创建ArrayList的方法:

$gridField = new GridField('pages1', 'All pages1', Member::get(), $config);

当我尝试渲染gridfield时遇到错误:

$al = new ArrayList();
$records = DB::query("SELECT * from Member where id<10");
while ($rec1 = $records->next()) {
    $al->push(new ArrayData($rec));
}

我得到的错误是:

  

[警告]在C:\ wamp \ www \ ss340 \ framework \ view \ ArrayData.php中缺少ArrayData :: __ construct()的参数1 GET / ss340 / gridfield-test / gridfield-underr-grid / Line 27 / p>

由于我需要外部数据库中的数据来填充非管理页面上的网格域,我迫切希望得到解决方案。 如果有人可以提供替代方法来显示/编辑Silverstripe中的表格数据 - 非常感谢。

2 个答案:

答案 0 :(得分:1)

我刚看了你的错误。它来自尝试使用此功能的网格域:

public function getDisplayFields($gridField) {
    if(!$this->displayFields) {
        return singleton($gridField->getModelClass())->summaryFields();
    }
    return $this->displayFields;
}

如果你在其中给出一个包含ArrayData的ArrayList,它会尝试创建一个ArrayData的单例。这会导致错误,因为ArrayData需要一个对象或一个数组。

我的观点仍然是使用我的旧答案,这会给你一个DataList,你不必经历麻烦。

旧答案

为什么要解决所有问题而不仅仅是使用SearchFilters来使用SilverStripe的ORM?

$dbConfig = [
    "type" => 'MySQLDatabase',
    "server" => 'localhost',
    "username" => '',
    "password" => '',
    "database" => '',
    "path" => '',
]; // fill this array with your other database configuration

//connect
DB::connect($dbConfig);

$members = Member::get()->filter('ID:LessThan', 10);

//reset to your own database
global $databaseConfig;
DB::connect($databaseConfig);

最后一点;当'开发'时,建议将SilverStripe置于'开发模式'。在评论中,您说您收到服务器错误(500),表示您的SilverStripe未处于开发模式,或者您的error_reporting未启用。也许this可以帮助你做到这一点。

答案 1 :(得分:0)

好的,从您发布的错误:

 * var array
 * see ArrayData::_construct() / protected $array; 
/*
 * @param object|array $value An associative array, or an object with simple properties. 
 * Converts object properties to keys of an associative array. 
 */
public function __construct($value) {
    if (is_object($value)) { 
        $this->array = get_object_vars($value); 
    } elseif (ArrayLib::is_associative($value)) { 
        $this->array = $value; 
    } elseif (is_array($value) && count($value) === 0) { 
        $this->array = array();

此错误看起来不完整,但我注意到您提交的代码是:

$al = new ArrayList();
$records = DB::query("SELECT * from Member where id<10");
while ($rec1 = $records->next()) {
    $al->push(new ArrayData($rec));
}

$rec未定义,因此您可能没有将有效的构造函数参数传递给new ArrayData()

尝试:

$al = new ArrayList();
$records = DB::query("SELECT * from Member where id<10");
while ($rec = $records->next()) {
    $al->push(new ArrayData($rec));
}