Автор: admin
Как кастомизировать Битрикс24
В видео с партнерской конференции есть пункт о том, как добавить новый пункт во всплывающее меню:
Там же Антон предложил способ поиска нужных событий:
Т.е. ВРЕМЕННО добавить в скрипт /bitrix/js/main/core/core.js вывод в консоль названия события и его параметров:
1 2 3 4 |
BX.onCustomEvent = function(eventObject, eventName, arEventParams, secureParams) { console.log('eventName:', eventName, '-> arEventParams:', arEventParams); ... |
Отследить вызовы в бекэнде можно, если в файле /bitrix/php_interface/init.php ВРЕМЕННО добавить код:
1 2 3 4 |
<?php $log = new \Monolog\Logger('debug'); $log->pushHandler(new \Monolog\Handler\StreamHandler($_SERVER['DOCUMENT_ROOT'] . '/debug.log'), \Monolog\Logger::DEBUG); $log->addInfo($request->getRequestedPage()); |
А у себя в блоге Антон описал как добавить вкладку в сущность CRM.
В продолжении темы кастомизации опубликована статья Изменяем пользовательский интерфейс коробочного Битрикс24 и соответствующее видео:
- Как подключить свой JS
- Пример 1. Кнопка «Поблагодарить сотрудника» на странице профиля пользователя
- В какой момент вставлять верстку
- Пример 2. Добавление кнопки в popup-окно «Создать документ» модуля Диск
- Сниппет для логгирования js-событий битрикса в консоли
- Пример 3. Добавление дополнительной информации в карточки Канбан (setInterval)
- Переопределение метода объекта JS
Пользовательские поля в Битрикс
Получение значения пользовательского поля:
1 2 3 4 5 6 7 |
<?php $entityId = 'CRM_COMPANY'; // Объект (CRM-компания) $valueId = 1; // ID экземпляра (ID CRM-компании) $fieldId = 'UF_CRM_TEST'; // Код поля $result = $GLOBALS["USER_FIELD_MANAGER"]->GetUserFields($entityId, $valueId); echo "Значение поля $fieldId = " . $result[$fieldId]['VALUE']; |
Установка значения пользовательского поля:
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php $entityId = 'CRM_COMPANY'; // Объект (CRM-компания) $valueId = 1; // ID экземпляра (ID CRM-компании) $fieldId = 'UF_CRM_TEST'; // Код поля $value = 100500; function setUserFieldValue($entityId, $valueId, $fieldId, $value) { $result = $GLOBALS["USER_FIELD_MANAGER"]->Update($entityId, $valueId, array($fieldId => $value)); return $result; } setUserFieldValue($entityId, $valueId, $fieldId, $value); |
Отключить защиту административного раздела Битрикс
1. Закомментировать в файле bitrix/modules/security/classes/general/iprule.php строки (в районе 1238):
1 2 |
if($bMatch) include($_SERVER["DOCUMENT_ROOT"]."/bitrix/admin/security_403.php"); |
2. А потом в административном разделе Проактивная защита / Защита административного раздела = Выключить защиту.
3. Раскомментировать строки из п.1
Распаковка многотомной резервной копии 1С-Битрикс
Если частей архива меньше 10, то можно распаковать сразу командой
1 |
$ cat /mnt/backup/site.ru_20170905_083901_full_991920ba.tar.gz* | tar -xzvf - -i |
А если больше 10, то файлы нужно переименовать, добавив 0:
site.ru_20170905_083901_full_991920ba.tar.gz.1 в site.ru_20170905_083901_full_991920ba.tar.gz.01
Производительность VDS от Timeweb для Битрикс24
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
[root@server ~]# lshw -short -C processor -C memory -C disk H/W path Device Class Description =================================================== /0/0 memory 96KiB BIOS /0/400 processor QEMU Virtual CPU version 2.4.0 /0/401 processor QEMU Virtual CPU version 2.4.0 /0/1000 memory 2GiB System Memory /0/1000/0 memory 2GiB DIMM RAM /0/100/6/0 /dev/vda disk 42GB Virtual I/O device [root@server ~]# lshw -C processor -C memory -C disk *-firmware description: BIOS vendor: SeaBIOS physical id: 0 version: Ubuntu-1.8.2-1ubuntu1 date: 04/01/2014 size: 96KiB *-cpu:0 description: CPU product: QEMU Virtual CPU version 2.4.0 vendor: Intel Corp. vendor_id: GenuineIntel physical id: 400 bus info: cpu@0 version: pc-i440fx-wily slot: CPU 0 size: 2GHz capacity: 2GHz width: 64 bits capabilities: fpu fpu_exception wp de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pse36 clflush mmx fxsr sse sse2 syscall nx x86-64 rep_good nopl pni vmx cx16 x2apic popcnt hypervisor lahf_lm abm tpr_shadow vnmi flexpriority ept vpid configuration: cores=1 enabledcores=1 threads=1 *-cpu:1 description: CPU product: QEMU Virtual CPU version 2.4.0 vendor: Intel Corp. vendor_id: GenuineIntel physical id: 401 bus info: cpu@1 version: pc-i440fx-wily slot: CPU 1 size: 2GHz capacity: 2GHz width: 64 bits capabilities: fpu fpu_exception wp de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pse36 clflush mmx fxsr sse sse2 syscall nx x86-64 rep_good nopl pni vmx cx16 x2apic popcnt hypervisor lahf_lm abm tpr_shadow vnmi flexpriority ept vpid configuration: cores=1 enabledcores=1 threads=1 *-memory description: System Memory physical id: 1000 size: 2GiB capacity: 2GiB *-bank description: DIMM RAM vendor: QEMU physical id: 0 slot: DIMM 0 size: 2GiB *-virtio3 description: Virtual I/O device physical id: 0 bus info: virtio@3 logical name: /dev/vda size: 40GiB (42GB) capabilities: partitioned partitioned:dos configuration: driver=virtio_blk logicalsectorsize=512 sectorsize=512 signature=7cd88b13 |
Перенос сайта на WordPress на другой домен
На старом хостинге
Перейти во временный каталог и создать бекап каталога с сайтом:
1 2 |
$ cd /home/user/tmp $ tar -C /home/user/example.com/public_html -cvzf site.tar.gz . |
Там же создать бекап базы данных и упаковать его:
1 2 |
$ mysqldump -u database_user -p database_name > db.sql $ gzip db.sql |
На новом хостинге
Переходим во временный каталог, подключаемся по SFTP загружаем бекапы каталога и базы данных:
1 2 3 4 |
$ cd /home/user/tmp $ sftp user@old.hosting > get tmp/site.tar.gz > get tmp/db.sql.gz |
Распаковываем бекап базы и импортируем в новую базу данных
1 2 |
$ gunzip db.sql.gz $ mysql -u database_user -p database_name < db.sql |
Переходим в каталог нового сайта (DOCUMENT_ROOT) и распаковываем бекап каталога:
1 2 |
$ cd /home/user/example.com/public_html $ tar -xvzf /home/user/tmp/site.tar.gz |
Изменить данные для подключения к БД в файле wp-config.php
1 2 3 4 |
define('DB_NAME', '******'); define('DB_USER', '******'); define('DB_PASSWORD', '******'); define('DB_HOST', '******'); |
Скорректировать адрес сайта в БД:
1 2 3 4 5 6 7 8 9 |
UPDATE wp_options SET option_value = REPLACE(option_value, 'http://olddomain.ru', 'http://newdomain.ru') WHERE option_name = 'home' OR option_name = 'siteurl'; UPDATE wp_posts SET guid = REPLACE(guid, 'http://olddomain.ru','http://newdomain.ru'); UPDATE wp_posts SET post_content = REPLACE(post_content, 'http://olddomain.ru', 'http://newdomain.ru'); |
Очистить папку кеша wp-content/cache.
А вообще можно файлы можно перенести одной строкой:
1 |
tar -c * | ssh user@server cd && tar -x |
Ответы на тест по Bitrix
Последняя версия битрикс, с которой вам приходилось работать?
17.0
Что такое D7?
Это новое ядро Bitrix Framework, реализующее ООП принципы
Что такое модель D7?
Это класс сущности, наследованной от Bitrix\Main\Entity\Datamanager, описывающий таблицу БД и предназначенный для работы с данными таблицы.
Как перекинуть пользователя/посетителя на другой раздел отправив HTTP 301?
1 |
LocalRedirect('/', false, '301'); |
Как организовано кеширование в битрикс?
Кеширование в компонентах. Кешируется $arResult. Неуправляемое — когда результат кеширования не перестраивается после изменения данных. Управляемое — когда перестравивается.
Технология Композитный сайт. На странице выделяется блоки с динамичным контентом. В браузер отдается закешированная статическая страница специальный JS, который запрашивает с сервера данные и заполняет ими динамичные зоны.
Где и как хранятся сессии?
- файлы
- memcached — предпочтительно (возможны неблокируемые и виртуальные сессии, не нужно следить за старыми, можно разделять между серверами)
- БД (медленнее memcached)
Что необходимо сделать для создания закрытого раздела, доступного определенной группе пользователей?
Для доступа пользователей группы ID=3 к каталогу test в файле .access.php из корневого каталога добавить:
1 2 3 4 |
<? $PERM["test"]["G3"] = "R"; $PERM["test"]["*"] = "D"; |
Что необходимо сделать для создания закрытого раздела, доступного определенной группе пользователей?
Для доступа группы ID=3 к каталогу test в файле .access.php добавить:
1 2 3 |
$PERM["test"]["G3"]="R"; $PERM["test"]["*"]="D"; |
AJAX в битрикс. Способы реализации.
В JS:
1 2 3 |
CJSCore::Init(array('ajax')); BX.ajax(...); |
В PHP:
1 2 3 4 5 6 7 8 9 10 11 |
<? define('STOP_STATISTICS', true); define('NO_AGENT_CHECK', true); define('DisableEventsCheck', true); require_once($_SERVER["DOCUMENT_ROOT"].'/bitrix/modules/main/include/prolog_before.php'); echo CUtil::PhpToJSObject(array( 'RESULT' => 'OK' )); die(); |
Многосайтовость. Способы деления системы на 2 и более сайтов.
На одном домене — создать каталог для каждого сайта и указать в настройках сайтов.
На разных доменах — для каждого сайта в конфиге веб-сервера отдельная настройка, в каталогах сайтов создать символические ссылки на bitrix, upload, local.
Asset. Что это?
Asset — класс D7 для подключения скриптов и стилей. Вместо старых AddHeadScript, SetAdditionalCss, AddHeadString.
Максимальное кол-во свойств в инфоблоке?
Ограничения нет, но могут возникать проблемы из-за превышения лимита памяти.
HighLoad-блоки. Что это? Как используется в битрикс?
Это «легкая» замена инфоблокам в высоконагруженных проектах. У каждого HLB отдельные таблицы, легко создаются индексы. В обычных проектах используются как справочники.
Как битрикс ищет шаблон к компоненту?
- в шаблоне текущего сайта
- в шаблоне сайта по умолчанию .default
- в каталоге компонента
Для чего служит Cutil::InitJSCore()
Для подключения js-библиотек, например, ajax, jquery, popup.
Как битрикс ищет языковой файл?
В подкаталогах lang/[код языка]. В компонентах [компонент]/[template]/[lang][код языка]/[локализуемый файл]
Как в скрипте узнать, что «пришел» AJAX запрос средствами битрикс?
1 |
Bitrix\Main\Application::getInstance()->getContext()->getRequest()>isAjaxRequest(); |
Что такое BitrixVM?
Виртуальная машина, настроенная для работы с битриксом и не только. CentOS, httpd, nginx, php, mysql, memcached и пр.
Что необходимо для выведения кол-ва пользователей «он-лайн» средствами битрикс?
Модуль статистики и CUserOnline::GetList
Чем опасно включение опции «Переместить весь Javascript в конец страницы»? Какие способы избежать трудностей?
Некоторые скрипты могут сломаться. Чтобы оставить скрипт на месте добавить атрибут <script data-skip-moving=»true»>
Для каких целей внедрен и настроен по умолчанию Sphinx?
Для быстрого и качественного полнотекстового поиска. Интегрирован с модулем Поиск.
Ответы на тесты по PHP
Сколько типов данных в РНР?
Четыре скалярных типа: boolean, integer, float, string.
Четыре смешанных: array, object, callable (>=5.4), iterable ( >= 7.1, для генераторов yield)
Два специальных: resource и NULL
Что такое конструктор?
Это метод __construct класса, который вызывается при каждом создании объекта.
Обязательно ли писать закрывающий тег ?> в конце скрипта?
Нет. Стандарт PSR даже запрещает его использование.
Поддерживает ли РНР множественное наследование?
Нет, для этого используются interface и trait.
Какая разница между require(), require_once(), include() и include_once()?
require_once и include_once включают файл только один раз. Если файл не найден, require* выдает фатальную ошибку, а include* предупреждение.
Как перевернуть массив? Есть массив array(‘h’, ‘e’, ‘l’, ‘l’, ‘o’), как из него получить array(‘o’, ‘l’, ‘l’, ‘e’, ‘h’)
array_reverse(array(‘h’, ‘e’, ‘l’, ‘l’, ‘o’))
Как перевернуть строку? «Привет» → «тевирП»
1 2 3 4 5 |
$s = 'Привет'; $s = iconv('utf-8', 'utf-16le', $s); $s = strrev($s); $s = iconv('utf-16be', 'utf-8', $s); |
Есть ли разница между одинарными и двойными кавычками в PHP?
Есть, внутри двойных можно использовать переменные и управляющие последовательности спецсимволов
Нарисуй (напиши) форму для отправки файла + файл-приемник
file_send.html
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<!DOCTYPE html> <html> <head> <title>Send</title> </head> <body> <form method="POST" action="file_save.php" enctype="multipart/form-data"> <input type="file" name="file"><br> <input type="submit" name="save"> </form> </body> </html> |
file_save.php
1 2 3 4 5 6 7 8 9 10 11 |
<?php if ($_SERVER['REQUEST_METHOD'] == 'POST' && is_array($_FILES['file'])) { $file = $_SERVER['DOCUMENT_ROOT'] . '/upload/' . $_FILES['file']['name']; if (move_uploaded_file($_FILES['file']['tmp_name'], $file)) { echo 'Файл загружен: ' . $file; } else { echo 'Ошибка'; } } |
Сгенерировать 3 случайных числа в диапазоне от 0 до 10. Если сумма этих чисел меньше 14, сгенерировать новую тройку.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$s = 0; $limit = 14; while($s < $limit) { $s = 0; $num = []; for ($i = 0; $i < 3; $i++) { $r = rand(0, 10); $num[] = $r; $s += $r; } } |
Для чего в PHP 5 используется тип данных “указатель“?
Такого типа я не знаю.
Какой будет результат выполнения этого скрипта?
1 2 3 4 5 6 7 8 9 10 |
<?php function foo() { static $count = 4; return ++$count; } print foo(); print foo(); print foo(); ?> |
567
Какие магические методы знаешь? Что это вообще такое?
Магические методы вызываются неявным образом при определенных условиях.
__construct – конструктор
__destruct – деструктор
__toString – вызывается при преобразовании в строку
__get – чтение из недоступного свойства
__set – запись в недоступное свойство
__clone – вызывается при клонировании
__invoke – вызывается при обращении к объекту как к функции
__call – вызов недоступного метода
__callStatic – вызов недоступного статического метода
__isset – вызывается при использовании isset()
__unset — вызывается при использовании unset()
__sleep – вызывается при сериализации
__wakeup – вызывается при десериализации
Как можно переадресовать пользователя на другую страницу?
header(‘Location: http://yandex.ru/‘)
Чему равно $b в данном отрезке кода:
1 2 3 4 5 6 |
<?php $a = 100; print_r(--$a + ++$a -$a + ++$a); $b = --$a + ++$a -$a + ++$a * 2; print_r($b); ?> |
304
Ответы на тесты по MySQL
Что такое первичный ключ?
Это поле, значение которого является уникальным идентификатором записи таблицы. Это поле проиндексировано, а его значение сохраняется в каждом индексе.
Что такое mysql_pconnect? Чем он отличается от mysql_connect?
mysql_pconnect устанавливает постоянное соединение с базой данных, которое не закрывается после завершения работы скрипта.
Что такое MyISAM и InnoDB?
Это системы хранения данных в MySQL.
Чем они отличаются?
MyISAM – нет транзакций и внешних ключей, каждая таблица в своем файле, при записи блокируется вся таблица. Если только вставка или чтение, то быстрее InnoDB.
InnoDB — есть транзакции, внешние ключи, больше соответствует реляционной модели. Блокировка на уровне строк. Быстрее при смешанных операциях SELECT, INSERT, UPDATE.
Есть две таблицы: users — таблица с пользователями (users_id, name) orders — таблица с заказами (orders_id, users_id, status)
- Выбрать всех пользователей из таблицы users, у которых ВСЕ записи в таблице orders имеют status = 0;
- Выбрать всех пользователей из таблицы users, у которых больше 5 записей в таблице orders имеют status = 1;
1 2 3 4 5 6 7 8 |
SELECT u.* FROM users u WHERE users_id NOT IN ( SELECT users_id FROM orders o WHERE o.status <> 0 ) |
1 2 3 4 5 6 7 8 9 10 11 |
SELECT u.* FROM users u INNER JOIN ( SELECT users_id, COUNT(*) cnt FROM orders o WHERE o.status = 1 GROUP BY users_id ) q ON q.users_id = u.users_id WHERE q.cnt > 5 |
Какая разница между LEFT, RIGHT и INNER JOIN
INNER — выбираются только те строки, которые есть одновременно в объединяемых таблицах
LEFT — все из левой, отсутствующие в правой заполняются NULL
RIGHT — все из правой, отсутствующие в левой заполняются NULL
Что делает команда EXPLAIN?
Предоставляет информацию о порядке и методе связывания таблиц.
Как вывести все поля из таблицы my_table
1 |
SELECT * FROM my_table |
Вывести всех производителей за исключением тех, которые находятся в Китае, Таджикистане и России; табл.: manufacture (id, country, count, date_add, tag)
1 2 3 4 |
SELECT * FROM manufacture WHERE country NOT IN ('Китай', 'Таджикистан', 'Россия') |
Мы не помним как точно пишется “Mercedes“ или “Mersedes“, но нужно из таблицы выбрать автобусы именно этой марки. Как быть? табл.: bus (id, name)
1 2 3 4 |
SELECT * FROM bus WHERE name LIKE 'Mer_edes' |
Порядок транзакции
1 2 3 4 5 6 |
SET AUTOCOMMIT=0; START TRANSACTION; SELECT * FROM t FOR UPDATE; UPDATE t SET c=1; ROLLBACK; COMMIT; |
Напишите пример процедуры возвращающей конкатенацию входных параметров (2х входных параметров) типа varchar, с проверкой на наличие значений (not null), и сообщением в качестве возвращаемого значения, в случае если один из параметров не прошел проверку.
1 2 3 4 5 6 7 8 |
CREATE FUNCTION func1(`par1` VARCHAR, IN `par2` VARCHAR) RETURNS VARCHAR BEGIN IF `par1` IS NULL OR `par2` IS NULL THEN RETURN 'Ошибка'; ELSE RETURN `par1` || `par2`; END IF; END; |
Что такое триггер? Возможные применения?
Хранимая процедура, которая вызывается при наступлении определенного события (INSERT, UPDATE, DELETE), до или после (BEFORE или AFTER). Применяются чтобы выполнить дополнительные операции. Например, записать в журнал дату изменения записи.
PDO. Что это?
PHP Data Objects — расширение для универсального доступа к различным БД. Для каждой БД используется родной драйвер, а программный интерфейс одинаков. PDO предоставляет объектно-ориентированный подход для работы с БД.