Fi1osof 10 марта 2015 1 4
Продолжаю заниматься новостным порталом. Одна из задач — это импортировать все новости со старого сайта на новый сайт. Проблема в том, что в качестве источника старых новостей есть только дамп MSSQL-базы. Нет какой-либо другой выгрузки. Вот сидел занимался тем, чтобы поднять MODX под MSSQL, чтобы затем можно было вытащить данные из MSSQL-базы и использовать их для своих нужд.

Во-первых, поднять MODX под MSSQL — та еще задача. Пришлось долго с бубнами скакать, чтобы научить пых-пых с sqlsrv дружить. Для этого надо скачать специальный pdo-драйвер с сайта мелкомягких. А этих драйверов там куча… Не стал вникать во все тонкости именований тех драйверов, но если вам надо будет подобрать себе, ориентируйтесть, что 54 в названии файла — это будет под php-5.4, 55 — под php-5.5. К примеру у меня это был php_pdo_sqlsrv_54_ts.dll

Во-вторых, после того, как MODX поднял, надо было научить его генерировать мапу на основе баз данных. Для этого по старинке планировалось использовать CmpGenerator. Но как оказалось, не все так просто… Дла начала, CmpGenerator в принципе не рассчитан на работу с sqlsrv, у него для этого не было моделей под sqlsrv. Ну это не особая проблема, я добавил. Сам CmpGenerator зашуршал. А вот генерить мапу он не стал… У него попросту не было для этого генератора. ОК, я его допилил. Но вот что интересно: родной генератор схем из xPDO для sqlsrv просто не рабочий. Он не умеет нормально работать, там куча критических ошибок. Вот ревизия уже работающего генератора (там местами код отладки, но это не страшно).

Не буду деталей расписывать (они не интересны), главное — мапу сгенерил, все ОК. Но случайно сделал вот такое открытие: оказывается, не обязательно все поля подробно в мапе расписывать :) Есть задача просто прочитать данные из БД, достаточно вот такой мапы:
<?php
$xpdo_meta_map['Article']= array (
  'package' => 'test',
  'version' => NULL,
  'table' => 'article',
  'extends' => 'xPDOObject',
  'fields' => 
  array (
  ),
  'fieldMeta' => 
  array (
  ),
);

Понятно дело, что название класса и таблицы надо свои прописывать.
Такая мапа позволит выполнять код типа такого:
$q = $modx->newQuery('Article');
$q->select(array(
    "Article.*",
));
$s = $q->prepare();  
if($s->execute()){
    print_r($s->fetch(2));
}
else{
    print_r($s->errorInfo());
}


Главное здесь — это $q->select(array(
«Article.*»,
));, так как иначе из-за отсутствия данных о колонках xPDO просто не сможет составить запрос к базе. У него будет что-то типа SELECT FROM table, а не SELECT id, title… FROM table.
4 комментария
vanchelo1
vanchelo 10 марта 2015г в 15:04 #
Это классно! Спасибо!
Fi1osof1
Fi1osof 10 марта 2015г в 15:07 #
Всегда пожалуйста! :)
s
shurik.fesenko 04 декабря 2015г в 16:53 #
подскажите в какую директорию нужно установить php_pdo_sqlsrv_54_ts.dll?
Fi1osof1
Fi1osof 04 декабря 2015г в 19:28 #
В директорию расширений php. Это уже зависит от того, какое у вас веб-окружение настроено.
Авторизуйтесь или зарегистрируйтесь (можно через соцсети ), чтобы оставлять комментарии.