2016-07-05 106 views
0

当我在管理控制台中创建GridField时 - 一切正常 - 我通过经典方法(例如Member :: get() - 或通过ArrayList填充gridfield -当不在公共函数中时,ArrayList不会填充ArrayList getCMSFields

$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) 

两种方法都 但是工作确定,如果我尝试的用户页面上创建GridField - - 的形式呈现 - - 莫名其妙的第二个方法(其中GridField应该由ArrayList的填充 - 不工作)。

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

- 炒锅好的,但米ethod在那里我创建的ArrayList老式的方法:

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

我得到一个错误,当我试图通过渲染gridfield:

return new Form($this, "AllSubmissions", new FieldList($gridField), new FieldList()); 

的错误,我得到的是:

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

因为我需要外部数据库的数据来填充非管理页面上的网格,所以我非常渴望为此获得解决方案。 如果有人可以提供替代方法来显示/编辑Silverstripe中的表格数据 - 非常感谢。

回答

1

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

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

如果你是在给它一个ArrayList与ArrayData,它试图创建一个ArrayData单。这会导致错误,因为ArrayData需要一个对象或数组。

我的意见仍然使用我的旧回答,这会给你一个DataList,你不会经历麻烦。

老回答

为什么要通过所有的麻烦,不只是利用SilverStripe的ORM与SearchFilters

​​

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

+0

我很欣赏你的努力 - 但正如前面提到的,我想用外部数据库的数据填充GridField,所以我不能使用ORM方法。我确实打开了error_reporting并发布了关于错误的答案。然而 - 仍然没有意识到我可以使用经典方法在管理部分填充网格字段,但不能在用户部分填充。问候 – Grega

+0

我更新了我的答案。通过代码,您可以在数据库之间切换。 –

0

OK,从错误你贴:

* 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)); 
} 
+0

感谢您的努力 - 我注意到我犯了一个错误rec1 <> rec。但是,即使使用您提供的代码,错误仍然存​​在 - 并且我得到的警告是:[Warning] ArrayData :: __ construct()缺少参数1。与连接到外部数据库一样 - 我不能使用Member :: get() - - 因为外部数据库中的成员表不是一个类 - 只是一个包含一些数据的表。问候,GRega – Grega

+0

我知道如何连接到外部数据库 - 但是 - 该数据库中的表不是通过ORM方法查询它们。 – Grega

+0

错误是你有一个阵列数据构造函数缺少的参数,那么你没有传递任何东西到构造函数。或者你的var是空的,或者你没有显示语法错误 –