SilverStripe中的CSV导入重复项和RelationCallbacks

时间:2015-10-18 20:50:03

标签: php csv silverstripe

我需要了解下面的代码,特别是$duplicateChecks$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();
   }
}

1 个答案:

答案 0 :(得分:3)

$duplicateChecksfindExistingObject类中的CsvBulkLoader函数使用。迭代它以查找具有指定值的列的任何对象。在该示例中,它检查“PlayerNumber”列。

它也可以像这样传递一个回调:

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

指定的回调需要存在于属性objectClass上指定的类的实例上或CsvBulkLoader本身上(如果扩展它会发生)。这些回调用于执行更复杂的重复查找,并返回找到的现有对象(如果有)。

另一方面,

$relationCallbacks由主processRecord函数使用。回调的工作方式与$duplicateCheck回调相同,它需要存在于proeprty objectClassCsvBulkLoader上指定的类的实例上。这些回调可以返回一个对象,该对象将作为has_one返回到特定对象记录(新的或现有的)。

虽然最好的学习方法是通过一些实验并跳过课程本身的代码,但还有更多的东西。我在答案中链接了各种功能等。