вторник, 15 сентября 2015 г.

MODX - Перенос сайта на хостинг клиента

 Требования к хостингу:
  • Расширения PHP:
    • zlib
    • hash
    • JSON (or PECL library)
    • mod_rewrite (for friendly URLs/.htaccess)
    • GD lib (required for captcha and file browser)
    • PDO, specifically pdo_mysql (for xPDO)
    • ImageMagick (for thumbnails)
    • SimpleXML
    • cURL (for Package Management)
  • Настройки PHP:
    • safe_mode off
    • register_globals off
    • magic_quotes_gpc off
    • php-mbstring on (required on some extras like Gallery)
    • PHP memory_limit 24MB or more, depending on your server
Алгоритм переноса:
  1. Чистим всё через админку ModX. 
    1. Управление - Обновить сайт.
    2. Управление - Снять блокировки. 
    3. Управление - Перезагрузить права доступа.
    4. Завершить все сеансы. 
    5. Чистим папку core/cache, либо cd .../docs/core/cache, rm -rf ./*, либо через FTP, либо оставляем на следующий шаг.
  2. Переносим файлы
    1. Пакуем всё в ZIP архив: cd .../docs, zip -r -9 sitename.zip *
    2. Переносим sitename.zip в каталог нового хостинга, распаковываем в админке хостинга.
    3. Если не удалили кеш ранее, заходим в /core/cache и удаляем. (Лучше проверить наличие содержимого папки с кешем в любом случае, вдруг кто-то успел зайти на сайт после очистки).
  3. Переносим таблицы.
    1. Открываем PhpMyAdmin у себя, открываем базу, экспортируем(можно установить сжатие в zip) нашу базу в файл, скачиваем.
    2. Создаём у хостера новые базу и пользователя(копируем их данные чтобы потом записать в конфиг).
    3. Заходим у хостера в phpMyAdmin и заходим в базу. Импортируем в новую БД наш файл с табличками.
  4. Редактируем core/config/config.inc.php
    1. Меняем пути в файле конфигурации с путей старого хостинга (например /var/www/sitename.ru/docs/) на пути нового (например /home/sitename/sitename.ru/docs/).
    2. Меняем строки соединения с базой данных, переписывая новыми данными.
  5. Переустановка
    1. Проверяем на наличие каталога setup на новом хостинге, если нет то скачиваем тот же дистрибутив MODX, закидываем на хостинг, и из него копируем папку setup в корень.
    2. Открываем .../sitename.ru/docs/setup/index.php в блокноте, добавляем куда-нибудь error_reporting(E_ALL); ini_set('display_errors', 1);
    3. Открываем в браузере sitename.ru/setup/. Выбираем существующую установку. Если хостер поотрубал нам модули, необходимые для работы и сыплются ошибки вроде PDO::__construct cannot find file... или что-то подобное - идём в настройки модулей у хостера, переходим в настройку PHP, и проверяем на наличие подключенных модулей из начала статьи.
    4. Пробуем снова открыть /setup, выбрать язык, далее, далее, в отчете о переустановке все сообщения должны гореть зелёным. Если не может соединиться с базой - проверяем файл конфигурации core/config/config.inc.php и данные связи с базой. Если будет ошибка в модулях - должен выводить ошибку наверху страницы.
    5. Если вылазиет просто ошибка 500(без подробностей), то идем в /core/cache/logs/error.log и проверяем его на наличие ошибок, действуем по обстоятельствам.
    6. Производим установку. Файлы установки на всякий случай не удаляем. 
  6. Проверка сайта
    1. Крестимся и переходим по ссылке авторизации. Ещё раз крестимся и вводим логин и пароль, который использовался на dev-хостинге.
    2. Если крест животворящий помог, значит вас должно пустить в админку. Если начнёт говорить что action not found или что-то подобное - вы забили на шаг с очисткой кеша. Чистите и пробуйте ещё раз.
    3. Если после установки появляются ошибки вроде неожиданной скобки [, это значит что хостер застрял в прошлом и не в состоянии обновить РНР до нормальной версии. Ну или кто-то слишком ленив, чтобы создавать массивы через array(). Исправляйте код через БД.
    4. Если после установки сайт выдаёт 500 - что-то неверно в конфигурационных файлах. Проверяйте соединение с базой данных в первую очередь и пути к файлам.
Инструкция создана по мотивам инструкции от Егора Приставки, и с его неоценимой помощью :).
Читать далее

четверг, 3 сентября 2015 г.

MIGX DB - Как создать свои объекты с таблицами БД в MODX

В MODX есть удобная возможность создавать свои классы, ассоциировать их с таблицами в базе данных и хранить там коллекции данных оперируя ими как объектами в ООП.
К тому-же ими можно удобно управлять контент менеджерам сайта с помощью MIGX DB через странички админки, которые можно довольно быстро создать:

Для этого в MODX нужно создать свой пакет(package), добавить туда схему модели в xml файле, спарсить эту схему, создать таблицу в БД и подключить этот пакет для работы. На самом деле в ручную все это делать довольно долго и есть возможность допустить кучу ошибок, поэтому лучше воспользоваться менеджером пакетов MIGX:


Первым делом создаем новый пакет(package), после создания мы сможем его увидеть в списке папок внутри core->components.  После создания пакета нужно написать свою XML схему(или взять мой пример), которая представляет из себя один класс(<object>) или набор классов внутри модели(<model>) с полями(<field>). Именно с этими полями мы сможем потом работать в сниппете или плагине примерно таким образом:

$student = $modx->getObject('myStudent',array('id'=>2));
$name = $student->get('name');

В схеме прописываем:
model package - имя пакета, то-же самое что написали в "Package Name" наверху;
object class - имя класса нашего объекта;
object table - имя таблички в БД, где будут храниться наши объекты;
field key - имя поля нашего объекта;
field dbtype - тип поля(int, varchar, text, datetime и т.д.);
field default - значение по умолчанию для поля;
aggregate alias - имя связи(например University), которую мы сможем использовать подобным образом:
$university = $student->getOne('University');
aggregate class - класс объекта связи;
aggregate local - имя локального id поля для связи с объектом;
aggregate foreign - имя id объекта связи(в большинстве случаев то поле, которое хранит id-шник нашего объекта для связи);
aggregate cardinality - вид связи(one, many);
aggregate owner - указание объекту: кто тут главный(в случае связи Университет - Студенты: главный университет);

Я рекомендую не писать заново схему, а скопировать уже существующую(например из моего примера) и изменить на свой лад.
Кстати благодаря object extends="xPDOSimpleObject", а не xPDOObject в объект автоматически добавляется поле id. Вообще наследовать объект можно от любого класса, благодаря чему в объект попадут все поля от наследуемого класса.

Когда сохраняем XML схему, да и когда проводим другие операции над нашим пакетом в менеджере MIGX нужно следить за тем, чтобы в поле "Package Name" было написано имя именно того пакета, над которым мы проводим операции.
Следующим шагом будет parse Schema на соответствующей вкладке:

После этого нам остается только создать таблицу в БД:

Теперь можно заглянуть в PHPMyAdmin и проверить наличие наших табличек в БД:


Вот и все, необходимый минимум выполнен, теперь мы из кода можем добавить в любую из табличек объект, сохранить его там, а после, в нужный момент получить с помощью подобного кода:

$modx->addPackage('mypackage', MODX_BASE_PATH . 'core/components/mypackage/model/', 'modx_');

$university = $modx->newObject('myUniversity');
$university->set('name', 'Тихоокеанский Государтсвенный университет');
$university->set('abb', 'ТОГУ');
$university->save();

$petrov = $modx->newObject('myStudent');
$petrov->set('fullname', 'Иванов Иван');
$petrov->set('university', $university->get('id'));
$petrov->save();

$ivanov = $modx->newObject('myStudent');
$ivanov->set('fullname', 'Петров Петр');
$ivanov->set('university', $university->get('id'));
$ivanov->save();

Этот код можно, например, выполнить в консоле.
После выполнения записи добавятся в БД:
Вы наверно заметили ту некрасивую строчку($modx->addPackage) в начале нашего кода, она нужна для подключения нашего пакета со всеми его классами. Можно организовать автоматическое подключение пакета, если в настройках системы прописать для extension_packages:
[{...здесь уже что-то есть...},{"mypackage":{"path":"[[++core_path]]components/mypackage/model/"}}]
Более подробнее тут.
После этого строчка $modx->addPackage будет не нужна и мы будет использовать наши новык классы как родные MODX-овские (типа modResource или modUser) без лишних манипуляций.

Теперь, когда мы проверили что все работает как надо, можно создать страницы для работы с этими табличками в админке MODX. Для этого заходим в Меню:
Примечание: в старой версии MODX пункт "Меню" назывался "Действия".

На странице "Меню" выбираем родителя, куда мы добавим новый пункт меню - "Верхнее меню" и добавляем пункт students-and-universities, прописывая указанные параметры:

После сохранения в MIGX в верхней меню появляется новый пункт students-and-universities (позже можно зайти в управление словарями и присвоить этому ключу в пространстве migx и языке ru подходящее значение для вывода):

Пункт меню будет направлять нас на страничку по адресу, оканчивающемуся на &configs=students||universities (потому-что именно это мы и прописали при создании), по нему очевидно что на странице должно что-то отображаться с помощью каких-то конфигов. Все встает на свои места когда мы заходим в MIGX(или Приложения->MIGX) на вкладку MIGX:


Именно здесь должны располагаться наши конфиги, которые наша страница для работы с БД будет использовать для отображения и вообще работы в целом. Я описывал в своей прошлой статье по MIGX создание этих конфигов и использование их как TV в ресурсах, но конфиги для MIGX DB будут отличаться дополнительными настройками для связи с БД и дополнительным описанием.
Здесь подготовлен конфиг по модели Студента, если экспортируете его и зайдете посмотрите через GUI менеджер то увидете на вкладке Migxdb-Settings настройки для подключения к нашему классу myStudent:

А на вкладке CMP-Settings можно настроить надписи для нашей странички управления записями БД:

Так-же в колонках(Columns) нужно добавлять id,deleted и published для корректной работы редактирования, удаления в корзину и публикации.
Конфигурацию для университетов попробуйте создать сами, можно на основе конфигурации Студентов заменив класс и надписи в настройках и убрав лишние поля оставив только name.
Так-же при создании конфигураций стоит прописывать им unique MIGX ID: поле которого находится в первой вкладке Settings, и который должен быть уникален у каждой конфигураций(я прописываю таким-же как и имя у конфигурации).
Теперь когда мы создали наши конфигурации, присовили им имена, unique MIGX ID и настроили MIGX DB у каждой из них, можно зайти на страничку students-and-universities и посмотреть список наших студентов:
Вывод имени университета обеспечивается с помощью настроек Joins на вкладке Migxdb-Settings в менеджере MIGX:
И колонки с Field: University_name, где University - это alias связи <aggregate> в xml схеме нашей модели, а name - это поле внутри object myUniversity.
Если вы попробуйте зайти в редактирование студента, то увидите что выбор университета так-же работает:
Он работает с помощью input TV type: listbox и @SELECT в Input Option Values:
Для сравнения я добавил так-же поле mod_user, которое берет inputTV: select-user(вам следует его создать как новый TV у себя в MODX если хотите протестировать), который так-же обеспечивает выбор из обьектов БД по принципу, который я описывал в этой статье.
В отличие от выбора университета, выбор пользователя работает со строкой поиска что часто очень полезно при работе с БД. К сожалению я не смог найти как добиться такой-же функции у input TV type: listbox.

Теперь когда объекты лежат в Базе Данных и ждут своего часа мы можем выводить их на страницах нашего сайта с помощью migxLoopCollection , который уже находится в пакете MIGX. Примеры использования можно посмотреть здесь и здесь.
Или самостоятельно получать через сниппеты с помощью $collection = $modx->getCollection('myUniversity', array('deleted'=>0));

Обяснение почему нужно наследоваться от xPDOSimpleObject
Документация MIGX по созданию такой-же странички для управления записями в БД "Doodles Manager"
Документация по созданию модели xpdo обьектов MODX
Примеры моделей и запросов xpdo обьектов MODX
Видео туториал по созданию подобной странички
Инструкция по добавлению пользовательских обьектов в MODX
Примеры использования Joins 
Конфигурация MIGX CMP для One to Many схемы
Читать далее