2015-10-18 87 views
1

我需要了解下面的代碼,特別是$duplicateChecks$relationCallbacks的工作方式,但對官方文檔的解釋很少。有人可以解釋這些工作或建議我可以看看的其他文檔嗎?SilverStripe CSV重複導入和RelationCallbacks

class PlayerCsvBulkLoader extends CsvBulkLoader { 
    public $columnMap = array(
     'Number' => 'PlayerNumber', 
     'Name' => '->importFirstAndLastName', 
     'Birthday' => 'Birthday', 
     'Team' => 'Team.Title', 
    ); 
    public $duplicateChecks = array(
     'Number' => 'PlayerNumber' 
    ); 
    public $relationCallbacks = array(
     'Team.Title' => array(
     'relationname' => 'Team', 
     'callback' => 'getTeamByTitle' 
    ) 
    ); 
    public static function importFirstAndLastName(&$obj, $val, $record) { 
     $parts = explode(' ', $val); 
     if(count($parts) != 2) return false; 
     $obj->FirstName = $parts[0]; 
     $obj->LastName = $parts[1]; 
    } 
    public static function getTeamByTitle(&$obj, $val, $record) { 
     return FootballTeam::get()->filter('Title', $val)->First(); 
    } 
} 

回答

3

$duplicateChecksCsvBulkLoader類使用findExistingObject功能。它被迭代以找到具有指定值的列的任何對象。在那個例子中,它檢查「PlayerNumber」列。

它也可以通過一個回調,像這樣:

public $duplicateCheck = array(
    'Number' => array(
     'callback' => 'checkPlayerNumberFunction' 
    ) 
); 

回調指定的需求要麼存在於對物業objectClass或在CsvBulkLoader本身(這會發生,如果你指定的類的實例擴展它)。這些回調函數用於執行更復雜的重複查找並返回找到的現有對象(如果有的話)。

$relationCallbacks另一方面主要用於processRecord功能。回調的工作方式與$duplicateCheck回調相同,它需要存在於objectClassCsvBulkLoader上指定的類的實例上。這些回調可以返回一個對象,該對象將作爲has_one返回到特定對象記錄(新的或現有的)。

還有一點比它更多,雖然最好的學習方法是通過一些實驗並跳過課程本身的代碼。我在我的答案中鏈接了各種功能等。