-
Notifications
You must be signed in to change notification settings - Fork 11
Описание параметров конфигурации
Минимальной требуемой конфигурации нет
Полная конфигурация выглядит следующим образом
doctrs_sonata_import:
mappings:
- { name: center_point, class: doctrs.form_format.point}
- { name: city_autocomplete, class: doctrs.form_format.city_pa}
upload_dir: %kernel.root_dir%/../web/uploads
class_loaders:
- { name: CSV, class: Doctrs\SonataImportBundle\Loaders\CsvFileLoader}
- { name: XLS, class: AppBundle\Loader\Doctrs\XlsFileLoader}
encode:
default: utf8
list:
- cp1251
- utf8
- koir8
Теперь подробнее
upload_dir
- директория для загрузки файлов CSV.
class_loaders
- массив с загрузчиками. Подробнее о создании разхличных загрузчиков можно прочитать здесь
encode.default
- кодировка файла (по умолчанию utf8)
encode.list
- в случае если предполагается грузить файлы в нескольких кодировках, то добавление этого параметра позволит выбрать кодировку перед загрузкой
mappings
- в случае, если у вас есть нестандартные поля в базе данных (например в моем случае, center_point
это координаты в базе данных), то необходимо объявить класс, который будет обрабатывать данные из файла, и приводить их к виду, в котором они будут заливаться в mysql
Например - тип center_point
это координата (MySql тип - point
). При добавлении в базу и получении из базы, она является объектом класса Point
. У объекта Point
есть метод __toString
, который возвращает x,y
. С помощью него и происходит импорт, и в файле импорта мы получаем красивые координаты. Если мы попытаемся залить в базу те же x,y
, то нас ждет ORMException
. Именно для этого и предназначается массив mappings
. В данном случае он просто берет сервис с id doctrs.form_format.point
, который реализует интерфейс Doctrs\SonataImportBundle\Service\ImportAbstract
, и на основе полученного значения возвращает нужный тип, который мы сможем залить в базу.
Вот код самого сервиса
class Point implements ImportAbstract {
public function getFormatValue($value){
$value = explode(',', $value);
$point = new \PHPOpenGIS\MainBundle\Geometry\Point($value[0], $value[1] ?? 0);
return $point;
}
}
Код сервиса doctrs.form_format.city_pa
class CityPa implements ImportAbstract, ContainerAwareInterface {
private $container;
public function setContainer(ContainerInterface $container = null) {
$this->container = $container;
}
public function getFormatValue($value){
/** @var ContainerInterface $container */
$container = $this->container;
$city = $container->get('promoatlas.city_autocomplete')->byName($value);
return $city;
}
}
Как видите, в параметре mappings мы указываем не названия классов, а id сервисов, что дает нам свободу действий. Например для преобразования типа city_autocomplete
мне понадобился container
.