Gridfield не заполняется ArrayList, когда нет публичной функции getCMSFields

Когда я создаю GridField в консоли администратора — все в порядке — я могу заполнить сетку с помощью классического метода (например, Member :: get () — — или через 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)

Оба метода работают нормально.
Однако, если я пытаюсь создать GridField на пользовательской странице — представленной в форме, — каким-то образом второй метод (где GridField должен быть заполнен ArrayList — не работает).

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

— работает хорошо, но метод, где я создаю 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());

Я получаю ошибку:

[Предупреждение] Отсутствует аргумент 1 для ArrayData :: __ construct () GET / ss340 / gridfield-test / gridfield-underr-grid / Строка 27 в C: \ wamp \ www \ ss340 \ framework \ view \ ArrayData.php

Поскольку мне нужны данные из внешней базы данных, чтобы заполнить поле сетки на страницах без прав администратора, я отчаянно пытаюсь найти решение для этого.
Если кто-то может предоставить мне альтернативный метод для отображения / редактирования табличных данных в Silverstripe — -вся очень признателен.

0

Решение

Я только что посмотрел вашу ошибку. Это происходит из поля сетки, которое пытается использовать эту функцию:

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

Если вы даете ArrayList с ArrayData в нем, он пытается создать синглтон ArrayData, Это вызывает ошибку, потому что ArrayData ожидает объект или массив.

Я все еще не могу использовать мой старый ответ, это даст вам список данных, и вам не придется проходить через проблему.

Старый ответ

Зачем проходить через все неприятности, а не просто использовать ORM SilverStripe с SearchFilters?

$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 не включен Может быть этот может помочь вам сделать это.

1

Другие решения

Хорошо, из-за ошибки вы отправили:

 * 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

По вопросам рекламы [email protected]