Skip to content

Описание параметров конфигурации

DOC_tr edited this page Oct 10, 2017 · 2 revisions

Минимальной требуемой конфигурации нет

Полная конфигурация выглядит следующим образом

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.