2016-07-05 103 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是空的,或者你沒有顯示語法錯誤 –