Некоторые приёмы работы в Битрикс на SQL и BASH

habralogo.jpg
Я продолжаю писать о Битриксе в контексте обменов, Mysql и командной строки Linux.

Эта статья является вводной к серии статей о структуре базы данных Битрикс, где эта тема будет раскрыта достаточно подробно. Для начала же будут представлены решения некоторых небольших, но назойливых задач. Как всегда, знание 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/, если же у вас сайт установлен в другую директорию, скорректируйте скрипт согласно вашим путям.

Комментарии (0)

© Habrahabr.ru