Небольшие заметки о задачах, которых приходится решать full stack разработчику, кейсы. Возможно, мой опыт вам пригодится (обращайтесь в telegram @bridge2web).
1. Доработка международной доски объявлений на WordPress
Проект основан на платной теме Adifier — Classified Ads WordPress Theme + одноименный плагин Adifier System.
Список того, что нужно было сделать:
- При первом посещении посетителя предлагать выбрать страну и сохранять куки.
- В зависимости от выбранной страны ограничивать показ объявлений только из выбранной страны.
- В верхнее меню добавить возможность переключить страну.
- Ограничивать работу поиска по месту выбранной страной (google places, в настройках темы можно ограничить поиск вводом двухбуквенных обозначений стран, но надо этот список ограничивать только выбранной пользователем страной).
- При первоначальном заполнении профиля (после регистрации) подставлять страну из куки.
- При проверке телефона автоматически проставлять код страны в соответсвии со странной в профиле.
- Проверять соовтвествие страны и уточнённого адреса в профиле на предмет конфликта.
Изначально сделал выбор страны в 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());
}
Я успешно решил эту проблему, и заработал хороший отзыв на Фрилансим.