Your SlideShare is downloading. ×
0
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Импорт данных с фреймворком Migrate. Владислав Богатырев.

1,325

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,325
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
13
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  1. Импорт данных с фреймворком Migrate Владислав Богатырев http://donetsk.drupal.ua
  2. Импорт данных с фреймворком Migrate Владислав Богатырев Ноябрь 2011
  3. Задача доклада <ul><ul><li>С какими проблемами я столкнусь при миграции данных на Drupal7? </li></ul></ul><ul><ul><li>Что из это может решить Migrate? </li></ul></ul><ul><ul><li>Использовать ли Migrate ? </li></ul></ul>
  4. Структура доклада <ul><ul><li>Задача, что мигрируем. </li></ul></ul><ul><ul><li>Проблемы </li></ul></ul><ul><ul><li>Выбор платформы. </li></ul></ul><ul><ul><li>Что такое Migrate. </li></ul></ul><ul><ul><li>Пример кода миграции. </li></ul></ul><ul><ul><li>Миграция множественных значений и сложных полей. </li></ul></ul><ul><ul><li>Сохранение связей при изменении ИД элементов. </li></ul></ul><ul><ul><li>Что еще может Migrate </li></ul></ul><ul><li>  </li></ul><ul><li>  </li></ul><ul><li>  </li></ul>
  5. Задача <ul><li>Из некоторой структуры данных, (обычно это CMS на основе БД), скопировать в Drupal набор объектов. </li></ul><ul><li>Обычный набор, это : </li></ul><ul><ul><li>ноды с их набором артибутов </li></ul></ul><ul><ul><li>термины таксономии </li></ul></ul><ul><ul><li>пользователи </li></ul></ul><ul><ul><li>комментарии </li></ul></ul><ul><ul><li>файлы </li></ul></ul><ul><ul><li>другие данные, как например оценки контента пользователями </li></ul></ul><ul><ul><li>связи между всем перечисленным </li></ul></ul><ul><li>                                                                Это значит, что ... </li></ul>
  6. Проблемы <ul><li>- вам нужно изучить внутреннюю структуру старой БД </li></ul><ul><li>(скорее всего данные будут разбросаны по разным таблицам) </li></ul><ul><li>- вам нужно знать API Drupal и выполнять импорт через него. </li></ul><ul><li>- почти наверняка потребуется знание структуры хранения данных в Drupal </li></ul><ul><li>- вам нужно написать код по копированию данных </li></ul><ul><li>- вам нужно знать как изменились ИД объектов для сохранение связей </li></ul><ul><li>- возможно, вы захотите использовать Batch API  </li></ul>
  7. Решение Это же Drupal!  Давайте используем модуль для этого! <ul><ul><li>Feeds http://drupal.org/project/feeds   </li></ul></ul><ul><ul><li>Десятки плагинов для Feeds -) </li></ul></ul><ul><ul><li>Node Export (dev) http://drupal.org/project/node_export </li></ul></ul><ul><ul><li>Wordpress Migrate  http://drupal.org/project/wordpress_migrate </li></ul></ul><ul><ul><li>Joomla to Drupal http://drupal.org/project/joomla </li></ul></ul><ul><ul><li>phpBB2Drupal (dev) http://drupal.org/project/phpbb2drupal   </li></ul></ul><ul><ul><li>Blogger Importer http://drupal.org/project/blogger_importer    </li></ul></ul><ul><ul><li>TYPO3_migrate http://drupal.org/project/TYPO3_migrate </li></ul></ul><ul><ul><li>Migrate http://drupal.org/project/migrate   </li></ul></ul>
  8. Migrate (7.x-2.2) <ul><li>- вся работа происходит в коде, это фреймворк </li></ul><ul><li>- любой источник данных* </li></ul><ul><li>- любая entity назначения* </li></ul><ul><li>- работает с любыми полями* </li></ul><ul><li>- умеет переводить старые ИД в новые </li></ul><ul><li>- хорошая документация </li></ul><ul><li>- ООП </li></ul><ul><li>- много дополнительных классов на DO </li></ul><ul><li>- Кое в чем может помочь migrate_extras </li></ul><ul><li>* но иногда для этого придется определить свой класс :) </li></ul>
  9. Как выглядит Migrate <ul><li>Немного вот так: </li></ul>
  10. Как выглядит Migrate <ul><li>Но в основном так: </li></ul>
  11. Начало работы <ul><li>1. Устанавливаем модули: migrate, migrate_ui </li></ul><ul><li>  </li></ul><ul><li>2. Создаем свой модуль:  </li></ul>3. Добавляем .inc файлы где будет располагаться код для миграции.   <ul><ul><ul><li>/* </li></ul></ul></ul><ul><ul><ul><li>  * You must implement hook_migrate_api(), setting the API level to 2, for </li></ul></ul></ul><ul><ul><ul><li>  * your migration classes to be recognized by the Migrate module. </li></ul></ul></ul><ul><ul><ul><li>  */ </li></ul></ul></ul><ul><ul><ul><li>function  migrate_example_migrate_api ()   { </li></ul></ul></ul><ul><ul><ul><li>   $api   =   array ( </li></ul></ul></ul><ul><ul><ul><li>     'api'   =>   2 , </li></ul></ul></ul><ul><ul><ul><li>   ) ; </li></ul></ul></ul><ul><ul><ul><li>   return   $api ; </li></ul></ul></ul><ul><ul><ul><li>} </li></ul></ul></ul><ul><ul><ul><li>  </li></ul></ul></ul><ul><li>  </li></ul>
  12. Пример. Миграция нод. <ul><ul><ul><li>abstract  class  BasicExampleMigration  extends  Migration  { </li></ul></ul></ul><ul><ul><ul><li>   public   function  __construct ()   { </li></ul></ul></ul><ul><ul><ul><li>    </li></ul></ul></ul><ul><ul><ul><li>    parent :: __construct () ; </li></ul></ul></ul><ul><ul><ul><li>  </li></ul></ul></ul><ul><ul><ul><li>     $this -> team   =   array ( </li></ul></ul></ul><ul><ul><ul><li>       new  MigrateTeamMember ( 'Liz Taster' ,   'ltaster@example.com' ,  t ( 'Product Owner' )) , </li></ul></ul></ul><ul><ul><ul><li>       new  MigrateTeamMember ( 'Larry Brewer' ,   'lbrewer@example.com' ,  t ( 'Implementor' )) , </li></ul></ul></ul><ul><ul><ul><li>     ) ; </li></ul></ul></ul><ul><ul><ul><li>  </li></ul></ul></ul><ul><ul><ul><li>     $this -> issuePattern   =   'http://drupal.org/node/:id:' ; </li></ul></ul></ul><ul><ul><ul><li>   } </li></ul></ul></ul><ul><ul><ul><li>} </li></ul></ul></ul><ul><ul><ul><li>  </li></ul></ul></ul>Определяем базовый класс с общими атрибутами и методами.
  13. Пример. Миграция нод. <ul><ul><ul><li>class  BeerNodeMigration  extends  BasicExampleMigration  { </li></ul></ul></ul><ul><ul><ul><li>   public   function  __construct ()   { </li></ul></ul></ul><ul><ul><ul><li>    parent :: __construct () ; </li></ul></ul></ul><ul><ul><ul><li>     $this -> description   =  t ( 'Beers of the world' ) ; </li></ul></ul></ul><ul><ul><ul><li>     $this -> dependencies   =   array ( 'BeerTerm' ,   'BeerUser' ) ; </li></ul></ul></ul><ul><ul><ul><li>  </li></ul></ul></ul><ul><ul><ul><li>     // карта старых и новых ИД мигрируемых объектов </li></ul></ul></ul><ul><ul><ul><li>     $this -> map   =   new  MigrateSQLMap ( $this -> machineName , </li></ul></ul></ul><ul><ul><ul><li>       array ( </li></ul></ul></ul><ul><ul><ul><li>         'bid'   =>   array ( </li></ul></ul></ul><ul><ul><ul><li>           'type'   =>   'int' , </li></ul></ul></ul><ul><ul><ul><li>           'not null'   =>   TRUE , </li></ul></ul></ul><ul><ul><ul><li>           'description'   =>   'Beer ID.' , </li></ul></ul></ul><ul><ul><ul><li>           'alias'   =>   'b' , </li></ul></ul></ul><ul><ul><ul><li>         ) </li></ul></ul></ul><ul><ul><ul><li>       ) , </li></ul></ul></ul><ul><ul><ul><li>      MigrateDestinationNode :: getKeySchema () </li></ul></ul></ul><ul><ul><ul><li>     ) ; </li></ul></ul></ul><ul><ul><ul><li>  </li></ul></ul></ul><ul><ul><ul><li>    </li></ul></ul></ul>Класс миграции нод. (Начало)
  14. <ul><ul><li>  </li></ul></ul><ul><ul><li>     // объект выборки данных из источника </li></ul></ul><ul><ul><li>     $query   =  db_select ( 'migrate_example_beer_node' ,   'b' ) </li></ul></ul><ul><ul><li>              -> fields ( 'b' ,   array ( 'bid' ,   'name' ,   ... )) ; </li></ul></ul><ul><ul><li>     $query ->... </li></ul></ul><ul><ul><li>  </li></ul></ul><ul><ul><li>     // определяем атрибут класса - источник данных </li></ul></ul><ul><ul><li>     $this -> source   =   new  MigrateSourceSQL ( $query ) ; </li></ul></ul><ul><ul><li>  </li></ul></ul><ul><ul><li>     // определяем атрибут класса - объект назначения данных </li></ul></ul><ul><ul><li>     $this -> destination   =   new  MigrateDestinationNode ( 'migrate_example_beer' ) ; </li></ul></ul><ul><ul><li>  </li></ul></ul><ul><ul><li>     // связываем поля источника и назначения </li></ul></ul><ul><ul><li>     $this -> addFieldMapping ( 'title' ,   'name' ) </li></ul></ul><ul><ul><li>          -> description ( t ( 'Mapping beer name in source to node title' )) ; </li></ul></ul><ul><ul><li>    </li></ul></ul><ul><ul><li>     // другие простые поля определяются аналогично </li></ul></ul><ul><ul><li>     ... </li></ul></ul><ul><ul><li>  </li></ul></ul><ul><ul><li>   } </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>  </li></ul></ul>Пример. Миграция нод. Класс миграции нод. (конец)
  15. <ul><ul><ul><li>class  BeerUserMigration  extends  BasicExampleMigration  { </li></ul></ul></ul><ul><ul><ul><li>   public   function  __construct ()   { </li></ul></ul></ul><ul><ul><ul><li>    parent :: __construct () ; </li></ul></ul></ul><ul><ul><ul><li>     $this -> description   =  t ( 'Beer Drinkers of the world' ) ; </li></ul></ul></ul><ul><ul><ul><li>     $this -> map   =   new  MigrateSQLMap ( $this -> machineName , </li></ul></ul></ul><ul><ul><ul><li>         array ( 'aid'   =>   array ( </li></ul></ul></ul><ul><ul><ul><li>                 'type'   =>   'int' , </li></ul></ul></ul><ul><ul><ul><li>                 'not null'   =>   TRUE , </li></ul></ul></ul><ul><ul><ul><li>                 'description'   =>   'Account ID.' </li></ul></ul></ul><ul><ul><ul><li>                 ) </li></ul></ul></ul><ul><ul><ul><li>              ) , </li></ul></ul></ul><ul><ul><ul><li>        MigrateDestinationUser :: getKeySchema () </li></ul></ul></ul><ul><ul><ul><li>     ) ; </li></ul></ul></ul><ul><ul><ul><li>  </li></ul></ul></ul><ul><ul><ul><li>     // объект выборки данных из источника </li></ul></ul></ul><ul><ul><ul><li>     $query   =  db_select ( 'migrate_example_beer_account' ,   'mea' ) </li></ul></ul></ul><ul><ul><ul><li>     -> fields ( 'mea' ,   array ( 'aid' ,   'status' ,   'posted' ,   'name' ,   'nickname' ,   ... )) ; </li></ul></ul></ul><ul><ul><ul><li>    </li></ul></ul></ul><ul><ul><ul><li>     // определяем атрибут класса - источник данных </li></ul></ul></ul><ul><ul><ul><li>     $this -> source   =   new  MigrateSourceSQL ( $query ) ; </li></ul></ul></ul><ul><ul><ul><li>    </li></ul></ul></ul><ul><ul><ul><li>     // определяем атрибут класса - объект назначения данных </li></ul></ul></ul><ul><ul><ul><li>     $this -> destination   =   new  MigrateDestinationUser () ; </li></ul></ul></ul><ul><ul><ul><li>  </li></ul></ul></ul><ul><ul><ul><li>     // связываем поля источника и назначения </li></ul></ul></ul><ul><ul><ul><li>     $this -> addFieldMapping ( 'created' ,   'posted' ) ; </li></ul></ul></ul><ul><ul><ul><li>  </li></ul></ul></ul><ul><ul><ul><li>     ... </li></ul></ul></ul><ul><ul><ul><li>   } </li></ul></ul></ul><ul><ul><ul><li>} </li></ul></ul></ul><ul><ul><ul><li>  </li></ul></ul></ul>Пример. Миграция пользователей.
  16. Ключевые моменты. Карта ИД. <ul><ul><ul><li>     $this -> map   =   new  MigrateSQLMap ( $this -> machineName , </li></ul></ul></ul><ul><ul><ul><li>         array ( 'aid'   =>   array ( </li></ul></ul></ul><ul><ul><ul><li>                 'type'   =>   'int' , </li></ul></ul></ul><ul><ul><ul><li>                 'not null'   =>   TRUE , </li></ul></ul></ul><ul><ul><ul><li>                 'description'   =>   'Account ID.' </li></ul></ul></ul><ul><ul><ul><li>                 ) </li></ul></ul></ul><ul><ul><ul><li>              ) , </li></ul></ul></ul><ul><ul><ul><li>        MigrateDestinationUser :: getKeySchema () </li></ul></ul></ul><ul><ul><ul><li>     ) ; </li></ul></ul></ul><ul><ul><ul><li>  </li></ul></ul></ul>
  17. Ключевые моменты. Источник и назначение. <ul><ul><ul><li>// определяем атрибут класса - источник данных </li></ul></ul></ul><ul><ul><ul><li>$this -> source   =   new  MigrateSourceSQL ( $query ) ; </li></ul></ul></ul><ul><ul><ul><li>  </li></ul></ul></ul><ul><ul><ul><li>// определяем атрибут класса - объект назначения данных </li></ul></ul></ul><ul><ul><ul><li>$this -> destination   =   new  MigrateDestinationUser () ; </li></ul></ul></ul><ul><ul><ul><li>  </li></ul></ul></ul>
  18. <ul><ul><ul><li>  // связываем поля источника и назначения </li></ul></ul></ul><ul><ul><ul><li>$this -> addFieldMapping ( 'created' ,   'posted' ) ; </li></ul></ul></ul><ul><ul><ul><li>  </li></ul></ul></ul>Ключевые моменты. Связывание полей. <ul><ul><li>Маппинг сложных полей </li></ul></ul><ul><ul><li>Маппинг полей с множественными значениями </li></ul></ul><ul><ul><li>Значения по умолчанию </li></ul></ul><ul><ul><li>Обработка поля источника и поля назначения перед сохранением.  </li></ul></ul><ul><ul><ul><li>Дополнительные обращение к БД  </li></ul></ul></ul><ul><ul><ul><li>Работа с объектом новой entity   </li></ul></ul></ul>
  19. <ul><ul><ul><li>$query   =  db_select ( 'migrate_example_beer_node' ,   'b' ) </li></ul></ul></ul><ul><ul><ul><li>  </li></ul></ul></ul><ul><ul><ul><li>   -> fields ( 'b' ,   array ( 'bid' ,   'name' ,   ...   )) ; </li></ul></ul></ul><ul><ul><ul><li>  </li></ul></ul></ul><ul><ul><ul><li>$query -> leftJoin ( 'migrate_example_beer_topic_node' , </li></ul></ul></ul><ul><ul><ul><li>  </li></ul></ul></ul><ul><ul><ul><li>    'tb' ,   'b.bid = tb.bid' ) ; </li></ul></ul></ul><ul><ul><ul><li>  </li></ul></ul></ul><ul><ul><ul><li>$query -> groupBy ( 'tb.bid' ) ; </li></ul></ul></ul><ul><ul><ul><li>  </li></ul></ul></ul><ul><ul><ul><li>$query -> addExpression ( 'GROUP_CONCAT(tb.style)' ,   'terms' ) ; </li></ul></ul></ul><ul><ul><ul><li>  </li></ul></ul></ul><ul><ul><ul><li>  </li></ul></ul></ul><ul><ul><ul><li>  </li></ul></ul></ul><ul><ul><ul><li>$this -> addFieldMapping ( 'migrate_example_beer_styles' ,   'terms' ) </li></ul></ul></ul><ul><ul><ul><li>  </li></ul></ul></ul><ul><ul><ul><li>   -> separator ( ',' ) ; </li></ul></ul></ul><ul><ul><ul><li>  </li></ul></ul></ul><ul><ul><ul><li>  </li></ul></ul></ul>Маппинг полей с множественными значениями на примере таксономии.
  20. <ul><ul><ul><li>public   function  prepareRow ( $current_row )   { </li></ul></ul></ul><ul><ul><ul><li>  </li></ul></ul></ul><ul><ul><ul><li>    parent :: prepareRow ( $current_row ) ; </li></ul></ul></ul><ul><ul><ul><li>  </li></ul></ul></ul><ul><ul><ul><li>     // Добавляем разделенные запятой термины к объекту рядя источника </li></ul></ul></ul><ul><ul><ul><li>     // с помощью кастомного метода </li></ul></ul></ul><ul><ul><ul><li>     $current_row -> terms   =   $this -> get_node_term_names ( </li></ul></ul></ul><ul><ul><ul><li>       $current_row -> nid , </li></ul></ul></ul><ul><ul><ul><li>       array ( CRNAAccreditationTermMigration :: $source_vocabulary_vid ) </li></ul></ul></ul><ul><ul><ul><li>     ) ; </li></ul></ul></ul><ul><ul><ul><li>  </li></ul></ul></ul><ul><ul><ul><li>     return   TRUE ; </li></ul></ul></ul><ul><ul><ul><li>   } </li></ul></ul></ul><ul><ul><ul><li>} </li></ul></ul></ul><ul><ul><ul><li>  </li></ul></ul></ul>Маппинг полей с множественными значениями на примере таксономии. <ul><ul><li>$this -> addFieldMapping ( 'migrate_example_beer_styles' ,   'terms' ) </li></ul></ul><ul><ul><li>   -> separator ( ',' ) ; </li></ul></ul>  prepare(stdClass $account, stdClass $row)
  21. Маппинг полей.   prepare(stdClass $entity, stdClass $row)
  22. Перевод ИД. <ul><ul><ul><li>// объявляем зависимость </li></ul></ul></ul><ul><ul><ul><li>$this -> dependencies   =   array ( 'BeerTerm' ,   'BeerUser' ) ; </li></ul></ul></ul><ul><ul><ul><li>  </li></ul></ul></ul><ul><ul><ul><li>// при маппинге поля просим фреймврок заменять значение 'aid' на новое, </li></ul></ul></ul><ul><ul><ul><li>// из таблицы карты миграции и устанавливаем значение по умолчанию </li></ul></ul></ul><ul><ul><ul><li>$this -> addFieldMapping ( 'uid' ,   'aid' ) </li></ul></ul></ul><ul><ul><ul><li>   -> sourceMigration ( 'BeerUser' ) </li></ul></ul></ul><ul><ul><ul><li>   -> defaultValue ( 1 ) ; </li></ul></ul></ul><ul><ul><ul><li>  </li></ul></ul></ul>В конструкторе класса миграции BeerNodeMigration:
  23. Перевод ИД. <ul><ul><ul><li>$this -> addFieldMapping ( 'pid' ,   'cid_parent' ) </li></ul></ul></ul><ul><ul><ul><li>  </li></ul></ul></ul><ul><ul><ul><li>   -> sourceMigration ( 'BeerComment' ) </li></ul></ul></ul><ul><ul><ul><li>  </li></ul></ul></ul><ul><ul><ul><li>   -> description ( 'Parent comment.' ) ; </li></ul></ul></ul><ul><ul><ul><li>  </li></ul></ul></ul><ul><ul><ul><li>  </li></ul></ul></ul>В конструкторе класса миграции BeerCommentMigration:
  24. Миграция сложных полей на примере  addressfield. <ul><li>Для миграции сложного поля, необходимо: </li></ul><ul><ul><li>проверить существование соответвующего класса </li></ul></ul><ul><ul><li>создать класс в случае необходимости </li></ul></ul><ul><ul><li>использовать соответвующий синтаксис маппинга </li></ul></ul>ИЛИ Использовать метод    prepare(stdClass $entity, stdClass $row)
  25. Миграция сложных полей на примере  addressfield. <ul><ul><ul><li>$arguments   =   array ( </li></ul></ul></ul><ul><ul><ul><li>   'administrative_area'   =>   array ( 'source_field'   =>   'province' ) , </li></ul></ul></ul><ul><ul><ul><li>   'locality'   =>   array ( 'source_field'   =>   'city' ) , </li></ul></ul></ul><ul><ul><ul><li>   'thoroughfare'   =>   array ( 'source_field'   =>   'street' ) , </li></ul></ul></ul><ul><ul><ul><li>   'premise'    =>   array ( 'source_field'   =>   'additional' ) , </li></ul></ul></ul><ul><ul><ul><li>   'postal_code'    =>   array ( 'source_field'   =>   'postal_code' ) , </li></ul></ul></ul><ul><ul><ul><li>) ; </li></ul></ul></ul><ul><ul><ul><li>$this -> addFieldMapping ( ‘field_address’ ,  ‘country’ ) </li></ul></ul></ul><ul><ul><ul><li>   -> arguments ( $arguments ) </li></ul></ul></ul><ul><ul><ul><li>   -> description ( t ( 'Mapping field_address' )) ; </li></ul></ul></ul><ul><ul><ul><li>  </li></ul></ul></ul>Маппинг поля в конструкторе. Кастомный класс для маппинга addrressfield >>>
  26. Миграция сложных полей на примере  addressfield. <ul><ul><ul><li>class  MigrateAddressFieldHandler  extends  MigrateFieldHandler  { </li></ul></ul></ul><ul><ul><ul><li>   public   function  __construct ()   { </li></ul></ul></ul><ul><ul><ul><li>     $this -> registerTypes ( array ( 'addressfield' )) ; </li></ul></ul></ul><ul><ul><ul><li>   } </li></ul></ul></ul><ul><ul><ul><li>  </li></ul></ul></ul><ul><ul><ul><li>   public   function  prepare ( $entity ,   array   $field_info ,   array   $instance ,   array   $values )   { </li></ul></ul></ul><ul><ul><ul><li>     $arguments   =   array () ; </li></ul></ul></ul><ul><ul><ul><li>     if   ( isset ( $values [ 'arguments' ]))   { </li></ul></ul></ul><ul><ul><ul><li>       $arguments   =   array_filter ( $values [ 'arguments' ]) ; </li></ul></ul></ul><ul><ul><ul><li>       unset ( $values [ 'arguments' ]) ; </li></ul></ul></ul><ul><ul><ul><li>     } </li></ul></ul></ul><ul><ul><ul><li>     $language   =   $this -> getFieldLanguage ( $entity ,   $field_info ,   $arguments ) ; </li></ul></ul></ul><ul><ul><ul><li>  </li></ul></ul></ul><ul><ul><ul><li>     // Setup the standard Field API array for saving. </li></ul></ul></ul><ul><ul><ul><li>     $delta   =   0 ; </li></ul></ul></ul><ul><ul><ul><li>     foreach   ( $values   as   $value )   { </li></ul></ul></ul><ul><ul><ul><li>       $return [ $language ][ $delta ]   =   array ( 'country'   =>   $value )   +   array_intersect_key ( $arguments , $field_info [ 'columns' ]) ; </li></ul></ul></ul><ul><ul><ul><li>       $delta ++; </li></ul></ul></ul><ul><ul><ul><li>     } </li></ul></ul></ul><ul><ul><ul><li>  </li></ul></ul></ul><ul><ul><ul><li>     return   isset ( $return )  ?  $return   :   NULL ; </li></ul></ul></ul><ul><ul><ul><li>   } </li></ul></ul></ul><ul><ul><ul><li>} </li></ul></ul></ul><ul><ul><ul><li>  </li></ul></ul></ul>
  27. Что еще может Migrate <ul><ul><li>Работа с файлами </li></ul></ul><ul><ul><li>Поддержка XML, JSON, CSV,    </li></ul></ul><ul><ul><li>Поддержка с различных типов БД источника (MSSQL, Oracle) </li></ul></ul><ul><ul><li>Миграция alias'ов </li></ul></ul><ul><ul><li>Интеграция с Drush </li></ul></ul><ul><ul><li>Откат импорта  </li></ul></ul><ul><ul><li>Интерфейс для контроля прогресса и маппинга </li></ul></ul><ul><ul><li>and even more... </li></ul></ul><ul><li>  </li></ul>
  28. Импорт данных с фреймворком Migrate Владислав Богатырев Ноябрь 2011 It is powerful. Use it!

×