Я продолжаю писать о Битриксе в контексте обменов, Mysql и командной строки Linux.
Эта статья является вводной к серии статей о структуре базы данных Битрикс, где эта тема будет раскрыта достаточно подробно. Для начала же будут представлены решения некоторых небольших, но назойливых задач. Как всегда, знание SQL обязательно.
В статье рассматриваются довольно частные вопросы, которые не возникают ежедневно. Конечно, вы можете использовать эти материалы по их прямому назначению, но главная цель статьи не в этом. Я начинаю вскрывать «чёрный ящик» под названием «структура базы данных битрикс», и показывать, что эти знания могут пригодиться для повышения уровня владения как системой, так и базовыми технологиями (SQL, linux shell), что, конечно, помогает решать новые, сложные, интересные, разнообразные задачи.
Страница, с которой можно делать SQL запросы в базу, или mysql web клиент битрикс, находится в панели управления Битрикса по пути: «Настройки->Инструменты->SQL запрос».
Также, конечно, можно делать запросы из командной строки операционной системы, для чего могу предложить вам несложную операцию извлечения логина и пароля прямо из настроек Битрикса:
— таким образом можно получить логин и пароль к базе данных Mysql Bitrix из командной строки linux на bash. Пути, конечно же, заменяйте на ваши собственные. В варианте, предоставляемом виртаульной машиной Битрикс, DOCUMENT_ROOT выглядит как /home/bitrix/www/.
Когда вводится новый сайт, разработчику не хочется объяснять каждому, кто добавляет новости или редактирует страницы, что нужно нажать, чтобы попасть в новости или каталог товаров. Лучше вывести ссылки прямо на стартовую страницу панели управления битрикс, тем более, что в битриксе «рабочий стол» в админке для этого и предназначен.
Если настройки так называемого «рабочего стола» можно распространить на всех, кто зайдёт в админку Битрикса, то колонку «Избранное» пользователь заполняет только для себя. Это логично, но обычно пользователи пренебрегают такой возможностью, поэтому сделаем эту работу за них.
К тому же, не всё можно поместить на «Рабочий стол», а в «Избранное» можно добавить всё, что угодно, даже ссылку на сторонний ресурс, например, на почту или тикеты службы техподдержки другой системы.
Заполнить блок «Избранное» в админке битрикса именно для всех контент-менеджеров панель управления не позволяет: нет такой кнопочки. Поэтому, вначале добавим нужные ссылки в блок «Избранное» для себя.
Узнайте ваш ID пользователя. Если вы под администратором (admin) в панели управления, то ваш ID пользователя =1.
Очевидно, эти данные относятся к пользователю, и первый взгляд бросается на таблицы, начинающиеся с b_user_, которых в базе Битрикса с десяток. Однако, нужная нам таблица не имеет такого префикса и называется b_favorites.
Эта таблица содержит поле COMMON, которое для всех записей имеет значение 'N'. Как обнаруживается, функция показа избранного для всех пользователей есть, и поле COMMON в таблице b_favorites полностью оправдывает своё наименование.
Нам даже не нужно дублировать записи администратора для всех пользователей (а как тогда было бы с вновь заводимыми администраторами сайта?.. Делать mysql триггер?.. Заводить событие?...). Теперь все пользователи админки Bitrix видят те же самые «Избранные», что и вы. Задача решена.
Если вы не можете зайти в панель управления Битрикс, но база доступна, вы можете либо установить свой собственный пароль для пользователя, либо сделать его таким же, как у какого-то другого пользователя, пароль которого вы знаете.
Основные данные всех пользователей хранятся в таблице b_user. Вам нужно знать ID пользователя в системе Битрикс.
Пароль хранится в базе в виде:
Говорят, они что-то ещё изменили, но если вы сделаете так, то оно будет работать.
Пароль битрикс сброшен, задача решена. Заодно, вы можете изменить и логин.
И второй, очень простой, способ сброса пароля в битрикс.
На этот раз, нам нужно просто перенести хеш пароля от одного пользователя к другому. Конечно, нужно знать ID обоих пользователей в bitrix, в данном случае пользователю с ID=36 мы устанавливаем пароль от пользователя с ID=895.
В некоей доменной зоне второго уровня, на некотором сайте, в административной панели системы управления Битрикс располагается страница редактирования заказа интернет-магазина, в заголовке таблицы товаров которой есть кнопка настройки в виде шестерёнки, и бывает эта кнопка то синяя, то серая…
Нажав на эту кнопку, можно задавать поля заказа, которые будут выводиться в таблице, в том числе и пользовательские свойства заказа. Но при этом, задаётся это только для одного пользователя.
Чтобы применить эти настройки ко всем пользователям панели управления битрикса, а не объяснять каждому, «нажмите маленькую кнопочку в заголовке таблицы с товарами, видите список свойств… Выберите нужные вам...», выставим настройки через базу.
Эти настройки хранятся в таблице b_user_option, которые сопоставлены определённому пользователю посредством поля user_id. Но есть одна особенность: если user_id=0, то свойство — глобальное, и применяется для всех пользователей.
где user_id=1 — ID пользователя, под которым вы настраивали таблицу товаров. Если это admin, то ID=1.
Задача решена: Теперь ваши настройки таблицы товаров работают у всех сразу.
Если речь идёт о поиске по сайту, основной таблицей для модулей поиска в битриксе является b_search_content.
Интересные поля таблицы b_search_content:
custom_rank — поле, по которому сортировка работает прежде всех остальных полей
param1 — код инфоблока
param2 — номер инфоблока
module_id — ='iblock'
item_id — id элемента или раздела
— для поиска в инфоблоках.
Прежде всего нас интересует поле custom_rank.
Если в предыдущих случаях мы пользовались предусмотренными, но нереализованными возможностями Битрикс, то для этого поля в панели управления специальная «галочка» есть. Но выставляется она отдельно для каждого элемента, и обычно этой возможностью не пользуются.
Это поле кстати оказывается числовым, так и заполним его по своему усмотрению, тем самым задавая собственные правила сортировки результатов поиска. По умолчанию, для всех элементов его значение равно нулю.
В моём случае, при поиске товаров в каталоге интернет-магазина, реализованном на решении разработчика romza, нужно было вначале выводить те товары, у которых была установлена некая специальная галочка, которая являлась «свойством», соответствующим наличию товара в определённой торговой точке. Прилетало всё это добро с инкрементальной загрузкой из 1С, поэтому данный SQL запрос был повешен на событие окончания обмена с 1С.
В настройке инфоблока должно быть указано «Значения свойств хранятся: в общей таблице (по умолчанию)», а не в отдельной таблице, иначе запрос будет выглядеть несколько по-другому.
Сейчас же, за счёт того, что запрос идёт вначале по таблице b_iblock_element_property, а не b_iblock_element, которая является основной для хранения элементов инфоблоков, мы отбираем только те элементы, у которых нужное свойство вообще есть, и если оно равно нужному значению, то поднимается custom_rank, в противном случае, он сбрасывается в ноль.
В моём случае задача решена, а для вас имеется полный простор для реализации своей собственной логики сортировки результатов поиска. А если вам не совсем знакомы эти наименования таблиц, то уже в следующей статье я раскрою их назначение более подробно.
«И на footer.php»: Очистка кеша в битрикс через панель управления происходит очень медленно. На самом деле, идёт всего лишь удаление файлов в определённых директориях, просто это делается медленными средствами. Сделаем специальный файл для очистки кеша в битрикс в командной строке linux.
Теперь вы можете запустить ./clearcache.sh, и кеш битрикса очистится практически мгновенно.
Скрипт этот должен лежать на одну директорию выше, чем DOCUMENT_ROOT вашего сайта. Хотя, вы можете изменить как место его нахождения, так и код, суть в том, что мы должны удалить все файлы из директорий:
cache
managed_cache
stack_cache — раньше была ещё эта директория, но в последних версиях я её не наблюдаю, поэтому сейчас без неё.
На самом деле, если удалить и сами директории, ничего не случится, они пересоздадутся. Но более правильно их оставлять.
В виртаульной машине Битрикс DOCUMENT_ROOT равен /home/bitrix/www/, если же у вас сайт установлен в другую директорию, скорректируйте скрипт согласно вашим путям.
Эта статья является вводной к серии статей о структуре базы данных Битрикс, где эта тема будет раскрыта достаточно подробно. Для начала же будут представлены решения некоторых небольших, но назойливых задач. Как всегда, знание SQL обязательно.
В статье рассматриваются довольно частные вопросы, которые не возникают ежедневно. Конечно, вы можете использовать эти материалы по их прямому назначению, но главная цель статьи не в этом. Я начинаю вскрывать «чёрный ящик» под названием «структура базы данных битрикс», и показывать, что эти знания могут пригодиться для повышения уровня владения как системой, так и базовыми технологиями (SQL, linux shell), что, конечно, помогает решать новые, сложные, интересные, разнообразные задачи.
Страница, с которой можно делать SQL запросы в базу, или mysql web клиент битрикс, находится в панели управления Битрикса по пути: «Настройки->Инструменты->SQL запрос».
Также, конечно, можно делать запросы из командной строки операционной системы, для чего могу предложить вам несложную операцию извлечения логина и пароля прямо из настроек Битрикса:
log=$(grep -i "login" /home/bitrix/www/bitrix/php_interface/dbconn.php | cut -f2 -d'"')
pas=$(grep -i "pass" /home/bitrix/www/bitrix/php_interface/dbconn.php | cut -f2 -d'"')
mysql -u$log -p$pas $log
— таким образом можно получить логин и пароль к базе данных Mysql Bitrix из командной строки linux на bash. Пути, конечно же, заменяйте на ваши собственные. В варианте, предоставляемом виртаульной машиной Битрикс, DOCUMENT_ROOT выглядит как /home/bitrix/www/.
1. Настройка «Избранного» для всех пользователей панели управления Bitrix сразу.
Когда вводится новый сайт, разработчику не хочется объяснять каждому, кто добавляет новости или редактирует страницы, что нужно нажать, чтобы попасть в новости или каталог товаров. Лучше вывести ссылки прямо на стартовую страницу панели управления битрикс, тем более, что в битриксе «рабочий стол» в админке для этого и предназначен.
Если настройки так называемого «рабочего стола» можно распространить на всех, кто зайдёт в админку Битрикса, то колонку «Избранное» пользователь заполняет только для себя. Это логично, но обычно пользователи пренебрегают такой возможностью, поэтому сделаем эту работу за них.
К тому же, не всё можно поместить на «Рабочий стол», а в «Избранное» можно добавить всё, что угодно, даже ссылку на сторонний ресурс, например, на почту или тикеты службы техподдержки другой системы.
Заполнить блок «Избранное» в админке битрикса именно для всех контент-менеджеров панель управления не позволяет: нет такой кнопочки. Поэтому, вначале добавим нужные ссылки в блок «Избранное» для себя.
Узнайте ваш ID пользователя. Если вы под администратором (admin) в панели управления, то ваш ID пользователя =1.
Очевидно, эти данные относятся к пользователю, и первый взгляд бросается на таблицы, начинающиеся с b_user_, которых в базе Битрикса с десяток. Однако, нужная нам таблица не имеет такого префикса и называется b_favorites.
Эта таблица содержит поле COMMON, которое для всех записей имеет значение 'N'. Как обнаруживается, функция показа избранного для всех пользователей есть, и поле COMMON в таблице b_favorites полностью оправдывает своё наименование.
update b_favorite set common='Y' where user_id=1;
Нам даже не нужно дублировать записи администратора для всех пользователей (а как тогда было бы с вновь заводимыми администраторами сайта?.. Делать mysql триггер?.. Заводить событие?...). Теперь все пользователи админки Bitrix видят те же самые «Избранные», что и вы. Задача решена.
2. Как сменить логин и пароль пользователя битрикс через базу данных. Как сбросить пароль администратора Bitrix.
Если вы не можете зайти в панель управления Битрикс, но база доступна, вы можете либо установить свой собственный пароль для пользователя, либо сделать его таким же, как у какого-то другого пользователя, пароль которого вы знаете.
Основные данные всех пользователей хранятся в таблице b_user. Вам нужно знать ID пользователя в системе Битрикс.
Установка собственного логина и пароля Bitrix средствами Mysql
Пароль хранится в базе в виде:
<соль_строка>md5(<соль_строка><пароль>)
Говорят, они что-то ещё изменили, но если вы сделаете так, то оно будет работать.
update b_user set login='su',password=concat('12345678',md5('12345678stupidpassword')) where id=8;
где
su — новый логин пользователя
12345678 — соль
stupidpassword — новый пароль пользователя
id=8 — id пользователя (если admin, то =1)
Пароль битрикс сброшен, задача решена. Заодно, вы можете изменить и логин.
Копирование пароля от другого пользователя
И второй, очень простой, способ сброса пароля в битрикс.
На этот раз, нам нужно просто перенести хеш пароля от одного пользователя к другому. Конечно, нужно знать ID обоих пользователей в bitrix, в данном случае пользователю с ID=36 мы устанавливаем пароль от пользователя с ID=895.
update b_user b1 inner join b_user b2 on b2.id=36 set b1.password=b2.password where b1.id=895;
3. Применение настройки полей в редактировании заказа в Bitrix админке для всех пользователей.
В некоей доменной зоне второго уровня, на некотором сайте, в административной панели системы управления Битрикс располагается страница редактирования заказа интернет-магазина, в заголовке таблицы товаров которой есть кнопка настройки в виде шестерёнки, и бывает эта кнопка то синяя, то серая…
Нажав на эту кнопку, можно задавать поля заказа, которые будут выводиться в таблице, в том числе и пользовательские свойства заказа. Но при этом, задаётся это только для одного пользователя.
Чтобы применить эти настройки ко всем пользователям панели управления битрикса, а не объяснять каждому, «нажмите маленькую кнопочку в заголовке таблицы с товарами, видите список свойств… Выберите нужные вам...», выставим настройки через базу.
Эти настройки хранятся в таблице b_user_option, которые сопоставлены определённому пользователю посредством поля user_id. Но есть одна особенность: если user_id=0, то свойство — глобальное, и применяется для всех пользователей.
update b_user_option set user_id=0 where name='table_columns' and category='order_basket_table' and user_id=1
где user_id=1 — ID пользователя, под которым вы настраивали таблицу товаров. Если это admin, то ID=1.
Задача решена: Теперь ваши настройки таблицы товаров работают у всех сразу.
4. Сортировка результатов поиска в битрикс по собственному алгоритму.
Если речь идёт о поиске по сайту, основной таблицей для модулей поиска в битриксе является b_search_content.
Интересные поля таблицы b_search_content:
custom_rank — поле, по которому сортировка работает прежде всех остальных полей
param1 — код инфоблока
param2 — номер инфоблока
module_id — ='iblock'
item_id — id элемента или раздела
— для поиска в инфоблоках.
Прежде всего нас интересует поле custom_rank.
Если в предыдущих случаях мы пользовались предусмотренными, но нереализованными возможностями Битрикс, то для этого поля в панели управления специальная «галочка» есть. Но выставляется она отдельно для каждого элемента, и обычно этой возможностью не пользуются.
Это поле кстати оказывается числовым, так и заполним его по своему усмотрению, тем самым задавая собственные правила сортировки результатов поиска. По умолчанию, для всех элементов его значение равно нулю.
В моём случае, при поиске товаров в каталоге интернет-магазина, реализованном на решении разработчика romza, нужно было вначале выводить те товары, у которых была установлена некая специальная галочка, которая являлась «свойством», соответствующим наличию товара в определённой торговой точке. Прилетало всё это добро с инкрементальной загрузкой из 1С, поэтому данный SQL запрос был повешен на событие окончания обмена с 1С.
update
b_search_content sc
inner join
b_iblock_element_property elp on
elp.iblock_element_id=sc.item_id and
elp.iblock_property_id=<числовой_id_параметра>
set
sc.custom_rank=if(elp.value=<числовой_id_значения_параметра>,<произвольное_число>,0)
where
sc.param1='<код_инфоблока>' and
sc.param2=<номер_инфоблока>
В настройке инфоблока должно быть указано «Значения свойств хранятся: в общей таблице (по умолчанию)», а не в отдельной таблице, иначе запрос будет выглядеть несколько по-другому.
Сейчас же, за счёт того, что запрос идёт вначале по таблице b_iblock_element_property, а не b_iblock_element, которая является основной для хранения элементов инфоблоков, мы отбираем только те элементы, у которых нужное свойство вообще есть, и если оно равно нужному значению, то поднимается custom_rank, в противном случае, он сбрасывается в ноль.
В моём случае задача решена, а для вас имеется полный простор для реализации своей собственной логики сортировки результатов поиска. А если вам не совсем знакомы эти наименования таблиц, то уже в следующей статье я раскрою их назначение более подробно.
Как быстро почистить кеш в битрикс.
«И на footer.php»: Очистка кеша в битрикс через панель управления происходит очень медленно. На самом деле, идёт всего лишь удаление файлов в определённых директориях, просто это делается медленными средствами. Сделаем специальный файл для очистки кеша в битрикс в командной строке linux.
cd /home/bitrix/
cat <<'EOF' > clearcache.sh
#!/bin/bash
cd $( dirname $0 )
basedir=$(pwd)/www/bitrix/
for d in cache managed_cache; do
find $basedir$d -mindepth 1 -delete
done
EOF
chmod 0775 clearcache.sh
Теперь вы можете запустить ./clearcache.sh, и кеш битрикса очистится практически мгновенно.
Скрипт этот должен лежать на одну директорию выше, чем DOCUMENT_ROOT вашего сайта. Хотя, вы можете изменить как место его нахождения, так и код, суть в том, что мы должны удалить все файлы из директорий:
cache
managed_cache
stack_cache — раньше была ещё эта директория, но в последних версиях я её не наблюдаю, поэтому сейчас без неё.
На самом деле, если удалить и сами директории, ничего не случится, они пересоздадутся. Но более правильно их оставлять.
В виртаульной машине Битрикс DOCUMENT_ROOT равен /home/bitrix/www/, если же у вас сайт установлен в другую директорию, скорректируйте скрипт согласно вашим путям.
Поделиться с друзьями
Комментарии (9)
servekon
05.03.2017 01:08А существует нормальный консольный менеджер под Битрикс типа Drush?
Как быстро почистить кеш в битрикс.
Почистили только файловый кэш, а кэша запросов нет?
sspat
05.03.2017 15:08Знать структуру таблиц и как система строит запросы конечно полезно, но в данном случае ваши советы скорее вредные. Все указанные вами задачи можно решить средствами API без ковыряния в базе напрямую:
Избранное — CFavorites:: Update
Смена пароля — CUser::Update
Настройки полей — CUserOptions::SetOption
Сортировка поиска — CSearch::Search
Кеш — настройте мемкеш, и работать все будет гораздно быстрее, очищаться — за секунду
Собственно эти методы и есть уже готовые обертки для работы с упомянутыми вами таблицами, но они:
- Не дадут вам что-то сломать не поняв даже что вы что-то сломали, в отличие от работы с базой напрямую
- Если вдруг сменится схема базы данных, все ваши советы перестанут работать, методы API же обязаны сохранять обратную совместимость
- Можно написать скрипт используя эти методы и переиспользовать его сколько угодно, не обьясняя другим и напоминая себе какой там запрос и куда вводить
- Выучите готовые инструменты системы и будете работать быстрее не изобретая то, что уже существует
symbios_zi
Для cms/cmf с таким бюджетом сделать нормальную консольную утилиту как у symfony или laravel не составило бы труда. Разработчикам битрикса должно быть стыдно.
maxic
Там им должно быть стыдно за всю архитектуру.
Она неандертальская
errogaht
На самом деле жаль разработчиков на битриксе, ведь им приходится работать с битриксом не потому что они этого хотят, а потому, что менеджмент выбирает битрикс и просто приходится на нём работать…