当我在管理控制台中创建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中的表格数据 - 非常感谢。
答案 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));
}