Ворклог ноябрь 2019

Небольшие заметки о задачах, которых приходится решать full stack разработчику, кейсы. Возможно, мой опыт вам пригодится (обращайтесь в telegram @bridge2web).

1. Доработка международной доски объявлений на WordPress

Проект основан на платной теме Adifier — Classified Ads WordPress Theme + одноименный плагин Adifier System.

Список того, что нужно было сделать:

  1. При первом посещении посетителя предлагать выбрать страну и сохранять куки.
  2. В зависимости от выбранной страны ограничивать показ объявлений только из выбранной страны.
  3. В верхнее меню добавить возможность переключить страну.
  4. Ограничивать работу поиска по месту выбранной страной (google places, в настройках темы можно ограничить поиск вводом двухбуквенных обозначений стран, но надо этот список ограничивать только выбранной пользователем страной).
  5. При первоначальном заполнении профиля (после регистрации) подставлять страну из куки.
  6. При проверке телефона автоматически проставлять код страны в соответсвии со странной в профиле.
  7. Проверять соовтвествие страны и уточнённого адреса в профиле на предмет конфликта.

Изначально сделал выбор страны в pop-up и select’ом, позже переделал в выпадающее подменю в строке навигации в верхней части сайта + автоматическое определение страны пользователя по IP (используется MaxMind  GeoLite2).

Для работы с международными телефонами используется libphonenumber for PHP — очень мощная библиотека, основанная на Google’s phone number handling library (Java, C++).

Нужно было убрать поле «Location *» со всех форм: в профиле, формы подтверждения телефонного номера через смс + автоподстановка телефонного кода региона, и формы подачи объявления.

2. Знакомство с Факерами MODX CMS

Интереса ради, решил глянуть на MODX. Скачал дистрибутив с официального сайта, распаковал на сервере, создал БД MySQL, запустил установку — все типично для oldschool-CMS, и… на этапе указания параметров MySQL дело встало:

Подключение к серверу базы данных:
Не удалось подключиться к серверу базы данных. Проверьте параметры соединения с сервером базы данных и повторите попытку.

(ERROR in xPDOConnection::connect @ /core/xpdo/xpdo.class.php : 3119) SQLSTATE[HY000] [2019] Unknown character set

Проблема решалась правкой файла класса xPDOConnection xpdo.class.php:

 $this->config['dsn']= $dsn . 'utf8'; // Line: 3083

Необходимо добавить к переменной dsn (Data Source Name) . ‘utf8’ (кодировку).

Установщик выдаст, что все «ОК». Далее, на следующем шаге, следует откатить изменения файла, убрать . ‘utf8’.

Изучив форумы, пришел к выводу, что эта проблема встречается очень часто и такой подход/такой фикс, с помощью редактирования файла ядра — ЭТО НОРМА! Ну, по крайней мере, в среде разработчиков MODX 🙂 А ведь этой системе уже больше 15 лет!!!

На последнем шаге «Отчет об установке», почти все пункты горели зеленым «ОК», кроме 3-х «Проверка существования каталога : Ошибка!». Какого черта каталога, MODX?! Очень информативно… Вернулся на предыдущие шаги, снова заполнил параметры MySQL 🤦‍♂️, далее все «ОК», система установлена.

Несмотря на не очень приятное знакомство c MODX, я готов взяться за разработку/доработку проектов на этой CMS, т. к. не боюсь legacy.

3. Переписать логику ценообразования WooСommerce. Цена для роли пользователя.

Вот такой экспресс-проект на фриланс бирже:

Магазин на woocommerce, есть две цены:
1. обычная (regular_price)
2. оптовая (sale_price)

Нужно чтобы все залогиненные видели sale
а все «гости» видели только regular.

Это уже решено! Но! Нужно обновить алгоритм. И переписать цену для пользователя с ролью CUSTOMER.

Хотим, чтобы все залогиненые (кроме роли CUSTOMER) — видели sale_price, а все «гости» + роль CUSTOMER видели только regular + выставить регистрацию по-умолчанию в CUSTOMER. Роль оптовика будет включаться менеджером вручную.

Цены в WooCommerce можно перехватывать хуками (фильтрами) woocommerce_get_price_html, для вариаций woocommerce_available_variation, итого woocommerce_before_calculate_totals.

Небольшие функции-хелперы для проверки роли пользователя:

function b2w_get_current_user_roles()
{
    if (is_user_logged_in()) {
        $user = wp_get_current_user();
        $roles = (array) $user->roles;
        return $roles;
    } else {
        return array();
    }
}

function b2w_is_user_in_role($role)
{
    return in_array($role, b2w_get_current_user_roles());
}

Я успешно решил эту проблему, и заработал хороший отзыв на Фрилансим.