2016-07-05 2 views
0

관리 콘솔에서 GridField를 만들면 모든 것이 정상입니다. MemberList :: get() - 또는 ArrayList를 통해 고전적인 방법으로 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) 

두 방법 모두 확인 작업 을 그러나, 나는 사용자 페이지에서 GridField를 만들려고하면 -. - 형태 - 2 - 어떻게 든 (GridField는 ArrayList에 의해 채워 져야합니다 - 작동하지 않는) 두 번째 방법을.

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

- woks ok,하지만 m 내가 ArrayList를 옛날 방식으로 만드는 경우 ethod :

$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/행 27 C : \ wamp \ www \ ss340 \ framework \ view \ ArrayData.php에 대한 누락 된 인수 1

관리자가 아닌 페이지에서 gridfield를 채우기 위해 외부 데이터베이스의 데이터가 필요하므로이 문제에 대한 해결책을 찾기 위해 필사적입니다. 누군가 Silverstripe에서 표 형식의 데이터를 표시/편집 할 수있는 대체 방법을 제공 할 수 있다면 매우 감사하겠습니다.

답변

1

방금 ​​오류를 찾았습니다.

당신이 그것에 ArrayData와 ArrayList에를 제공하는 경우
public function getDisplayFields($gridField) { 
    if(!$this->displayFields) { 
     return singleton($gridField->getModelClass())->summaryFields(); 
    } 
    return $this->displayFields; 
} 

, ArrayData의 싱글을 만들려고한다 : 그것은이 기능을 사용하려고 gridfield에서 온다. 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을 'dev 모드'에 두는 것이 좋습니다. 의견에서 당신은 SilverStripe이 dev 모드가 아니거나 귀하의 error_reporting이 활성화되어 있지 않음을 나타내는 서버 오류 (500)가 발생한다고 말합니다. 어쩌면 this 그 일을 도울 수 있습니다.

* 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(); 

이 오류는 불완전 보이지만, 내가 제출 한 코드가 발견 :

+0

귀하의 노력에 감사 드리며 - 언급 한 바와 같이 GridField에 외부 DB의 데이터를 채우고 싶습니다. 따라서 ORM 메서드를 사용할 수 없습니다. error_reporting을 켜고 오류에 대한 답변을 게시했습니다. 그러나 - 여전히 고전적인 방법으로 관리 섹션에서 그리드 필드를 채울 수 있지만 사용자 섹션에서 채울 수 없습니다. 감사합니다 – Grega

+0

내 대답이 업데이트되었습니다. 코드를 사용하여 데이터베이스간에 전환 할 수 있습니다. –

0

확인, 오류에서 당신이 게시

$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. 그러나 제공 한 코드를 사용하더라도 오류가 남아 있습니다. 경고는 다음과 같습니다. [경고] ArrayData :: __ construct()에 대한 인수 1이 누락되었습니다. 외부 DB에 연결하는 것처럼 - Member :: get() -을 사용할 수 없습니다. 외부 DB의 멤버 테이블은 클래스가 아니기 때문에 - 일부 데이터가있는 테이블 일뿐입니다. 감사합니다, GRega – Grega

+0

나는 외부 DB에 연결하는 방법을 알고 있습니다 - 그러나 그 테이블에있는 클래스는 클래스가 아니며 ORM 메서드로 쿼리 할 수 ​​없습니다. – Grega

+0

오류는 배열 데이터 생성자에 대한 인수가 누락 된 것입니다. 그런 다음 생성자에 아무것도 전달하지 않습니다. var가 비어 있거나 구문 오류가 있습니다. 우리에게 표시되지 않습니다. –

관련 문제