Впервые для себя попробовал множественное наследование на php 7. Встала задача засунуть данные из ORM классов в модуль поиска. Множественное наследование пригодилось весьма кстати. Получилась, на мой взгляд, простая, удобная конструкция. ORM классы, которые нужно индексировать, имеют поля active, name, preview_text или description. По аналогии с инфоблоками, на основе этих полей мне нужно индексировать данные.
С начало нужен trait содержащий необходимые методы для удобного управления индексированием в модуле search
<?php
namespace Vendor\Module;
use Bitrix\Main\Entity;
use Bitrix\Main\Loader;
trait Search
{
/**
* (Пере)индексирует запись
* @param int $id
* @param array arFields массив $arFields необходимый для метода CSearch::Index
* @return bool
* @throws \Bitrix\Main\LoaderException
*/
public static function reIndex(int $id, array $arFields)
{
if (!Loader::includeModule('search')) return false;
$arFields['SITE_ID'] = ['s1'];
$arFields['DATE_CHANGE'] = date('d.m.Y H:i:s');
\CSearch::Index(
__CLASS__,
$id,
$arFields
);
return true;
}
/**
* Удаляет запись из поискового индекса модуля search
* @param int $id
* @return bool
* @throws \Bitrix\Main\LoaderException
*/
public static function delIndex(int $id)
{
if (!Loader::includeModule('search')) return false;
\CSearch::DeleteIndex(
__CLASS__,
$id
);
return true;
}
public static function reIndexAll()
{
if (!Loader::includeModule('search')) return false;
\CSearch::DeleteIndex(__CLASS__, '%');
foreach (self::getList()->fetchAll() as $row) {
if ($row['active'] == 'Y'){
self::reIndex($row['id'], [
"TITLE" => $row['name'],
"BODY"=> $row['description'] ?: $row['preview_text'],
"PARAM1" => $row['parent_id']
]);
} else {
self::delIndex($row['id']);
}
}
}
/**
* Обертка для вызова из функции событий ORM класса.
* @param Entity\Event $event
* @throws \Bitrix\Main\LoaderException
*/
protected static function updateSearchIndex(Entity\Event $event)
{
$fields = $event->getParameter("fields");
$id = $event->getParameter("primary")["id"];
if (isset($fields['active']) && isset($fields['name']) &&
(isset($fields['description']) || isset($fields['preview_text']))
) {
if ($fields['active'] == 'Y') {
$arFields = [
"TITLE" => $fields['name'],
"URL" => '#',
"BODY"=> $fields['description']
];
if (isset($fields['parent_id'])) {
$arFields["PARAM1"] = $fields['parent_id'];
}
self::reIndex($id, $arFields);
} else {
self::delIndex($id);
}
}
}
}
reIndex(int $id, array $arFields) - принимает два параметра id самой записи ORM-а и массив параметров для метода CSearch::Index модуля поиска delIndex(int $id) - принимает id записи самого ORM-а (не id в модуле search) reIndexAll() - (пере)индексирует все записи ORM класса updateSearchIndex(Entity\Event $event) - метод используется в методах событий ORM - классов. После изменения/добавления и принимает $event этих событий
в качестве $MODULE_ID необходимый для метода CSearch::Index используется имя запускаемого ORM класса. Если мне нужны какие то другие поля или логика индексирования , всегда можно переопределить нужные методы в классе самого ORM-а.
Теперь собственно пример ORM класса
<?php
namespace Vendor\Module;
use Bitrix\Main\Entity;
use Bitrix\Main\Type;
class TestTable extends Entity\DataManager
{
use Search; //наследуем trait
....
public static function onAfterDelete(Event $event)
{
$primary = $event->getParameter("primary");
self::delIndex($primary['id']);
parent::onAfterDelete($event);
}
public static function onAfterAdd(Entity\Event $event)
{
self::updateSearchIndex($event);
parent::onAfterAdd($event);
}
public static function onAfterUpdate(Entity\Event $event)
{
self::updateSearchIndex($event);
parent::onAfterUpdate($event);
}
}
Предлагайте свои или давайте обсудим уже внесённые. Приоритеты пока не расставлены, но я бы посоветовал по технологии книги «Номер 1» Игоря Манна оценить каждый из пунктов по пятибалльной шкале в отношении наличия каждого навыка лично у вас. А также дать вторую оценку о необходимости развивать этот навык в первую очередь. Итак, поехали, что должен уметь фрилансер:
1) Работать по тайм-трекеру. Уметь оценивать своё рабочее время «на глазок» или по часам конечно хорошо, но на выполнение отдельных мелких задач иногда уходит слишком много времени, хотя мы этого даже не замечаем. Нужно научиться работать по таймеру – начал задачу, запустил таймер. Пауза или закончил задачу – таймер остановлен. Кроме того, открытая тайм-трекинговая система позволяет сразу видеть временные затраты вашим заказчикам, а следовательно, возникнет меньше вопросов о том, что именно вы делали сегодня или сколько задач вы выполнили.
2) Быстро и вдумчиво знакомиться с ТЗ. В этом наверняка у каждого будет свой подход. Например, мой главный критерий: «Если пунктов много – это будет стоить дорого, либо разбиваем документ на несколько документов». Потому что уследить все детали в объёмном ТЗ порой просто невозможно. Это можно преодолеть, назвав заведомо более высокую цену, но и тут позже не исключены неловкие ситуации. К тому же, заказчик как-то не любит задумываться, что на изучение документа тоже уходит ваше время, которое иногда стоит не так уж и дёшево.
3) Быстро отфильтровать предлагаемые задачи (техзадание) по уровню своих навыков. Заказчики часто любят собирать множество задача в один длинный список, и особеннр любят вставлять в самом конце таких заданий что-то вроде, «а ещё создать мобильную версию сайта» или а ещё «переделать весь дизайн как-нибудь покрасивше». Кроме того в конце часто даётся какое-нибудь резюме, главная концепция или колючевой фактор. Поэтому не поленитесь заглянуть сразу в конец задания, я думаю в 30% случаев вас там ждёт удивительный поворот событий. Но может быть и так , что среди полусотни заданий, которые вы прекрасно знаете и выполняете кроется какая-нибудь зловредная правка js-модуля или разработка совершенно нового функционала, разбираться с которыми вам придётся очень долго (Если вообще осилите). Такие пункты нужно сразу отсекать и сообщать, что их вы выполнить на данном этапе не сможете. Мы все не боги, чтобы знать 20 языков программирования или технологий, и создавать код на них одновременно.
4) Из пункта 3 вытекает важный навык быстро оценить время, затрачиваемое на выполнение задач. Здесь также у каждого должны быть своя методика. Я обычно делаю так ( интуиция меня подводит крайне редко). Сперва оцениваю стоимость работы в целом. Затем проставляю напротив каждой задачи время в часах или сумму, за которую я хотел бы её выполнить (кратно получасу, не стесняясь немного увеличивать в большую сторону). Потом суммирую итоговые часы и умножаю их на стоимость работы за час, либо сразу суммирую стоимость отдельных задач. После чего проверяю, та ли это сумма, которую я ожидал изначально. Если цифры сходятся, значит примерно так оно и есть. Можно ещё немного увеличить на всякие непредвиденные траты времени, общение или осложнения в процессе разработки.
5) Ценить своё время. Разговоры по скайпу, в мессенджерах, обмен документами и письмами, чтение ТЗ, объяснение почему это здесь так не сработает и предложение своих вариантов решения – это тоже ваше время. И оно должно оплачиваться. Особенно если речь идёт о случайных заказчиках и небольших задачах. Да, это очень сколький момент, т.к. наши работодатели этого не понимаю и понимать не хотят. Но если вы себя уважаете, вы как минимум должны хоть часть своих временных затрат на переговоры и подготовку к выполнению включить в стоимость работы.
6) Грамотно писать. Да, сейчас время тотальной неграмотности, я уже не так сильно обращаю внимание на неверные окончания и неправильные безударные гласные, но открою маленький секрет. Неграмотный текст выдаёт дилетанта с головой. Если со мной общается грамотный человек, я сразу понимаю, что этот человек «старой закалки» или как минимум человек, который следит за тем, что он делает – значит скорее всего это уже взрослый. В вот 15-20 летние разработчики будут писать всякую кашу. А теперь как вы думаете, кому отдаст предпочтение заказчик? Разработчику с опытом, или вчерашнему школьнику? Ещё один важный момент – всегда проверяйте письма перед их отправкой. Не забудьте лишний раз перечитать и исправить комментарий в месенджере, если от этого зависит ваш престиж. Особенно если ошибка в имени заказчика!
7) Грамотно общаться. Да, это не одно и то же, что грамотно писать. Умение построить диалог, наладить контакт, убедить клиента – от этого никуда не деться. Так же, как и в реальной жизни.
8 ) Нормальные каналы связи. Хорошая вебкамера с качественным микрофоном (то, чего у меня нет до сих пор), скоростной и бесперебойный интернет (то чего у меня тоже не совсем хватает). Создайте профессиональный электронный ящик с уникальным никнеймом, подключите уже наконец скайп, телеграм, ватсапп, хотя бы два месенджера, где удобнее и проще общаться с заказчиком. Да и не только на десктоп или ноутбук, но и на телефон. Клиент должен до вас достучаться. Чем удобнее ему будет общаться с вами, тем больше вам гарантирована работа с ним. И да (мужики), не забудьте одеть футболку во время сеанса по видеосвязи!
9) Правильно и красиво заполненное портфолио. Согласен, для бэк-енд разработчика – портфолио это какая-то глупость. Вы же не дизайнер, вы не рисуете сайты. Вы их создаёте. Что показывать? Исходный код – пожалуйста! Хоть все четыре километра листинга. Я думаю, клиент ничего в нём не поймёт. Но где тогда гарантия, что этот красивый сайт создали именно вы? Мне кажется нет никакого шанса предоставить такую гарантию кроме как дать честное слова и может быть доступ в административную часть, если вы не боитесь рисковать. А даже если и вы создали этот прекрасный сайт, то кто даст другую гарантию, что через два дня после закрытия проекта или последней задачи, какой-нибудь другой ушлый программист не снесёт его до основания или полностью не заменит ваш функционал новым? Но интернет состоит в основном из сайтов. И тем не менее о сайтах (а следовательно и о вас тоже ) судят по одёжке. Поэтому пожалуйста позаботьтесь о том, чтобы у вас было качественное и достойное портфолио. Чтобы в нём содержались действительно стоящие разработки (хотя бы даже и сделанные не вами).
10) Правильно распределять рабочее время, выделять время на отдых. Учитесь планировать. Старый добрый тайм-менеджмент никто не отменял. И обязательно не забывайте, что отдых для программиста – это один из важнейших составляющих эффективной и полноценной работы.
11) Отсюда вытекает необходимость Заботиться о себе и своём здоровье. Физкультуру ещё никто не отменял. Скачайте на телефон упражнения для поддержания тонуса и делайте каждый день. Обязательно отрывайтесь от монитора и делайте упражнения для глаз, больше ходите, двигайтесь. Человек должен развиваться не только умственно, но также социально, духовно и физически.
12) Постоянно учиться. Вы PHP программист 80 уровня, умеющий самостоятельно настроить сервер и написать чистейший java script для работы во всех браузерах? Честь вам и хвала! А давно ли вы сверялись с тем, что вообще происходит в интернете? В курсе о новых фреймворках, движках, CMS, языках программирования, трендах, способах SEO-продвижения, новинках на западе и т.п. ? Уверен, всего всё-равно не объять. Но настоящий профессионал никогда не стоит на месте и постоянно развивается.
На этом пока все. Пишите, о чём забыл, что нужно дополнить.
Аллоха! В версии 4.0 модуля "Свойства-таблицы", помимо мелких исправлений, присутствует одно большое нововведение - тип колонки "Файл" (загружаемый).
Как это работает: вы создаете колонку типа "Файл" в настройках свойства:
Файл может быть множественным (т.е. любое количество файлов в одной ячейке таблицы). Если галка "Множественное" не установлена, можно будет загрузить только один файл в ячейке. При этом можно указать, в какую подпапку в папке "/upload/" будут загружаться файлы, можно для каждого свойства указать отдельную, можете указать iblock если хотите, но по умолчанию, если ничего не указывать, файлы будут загружаться в папку "/upload/grain.tables/". Вы можете установить ограничения по расширениям файлов.
Сам интерфейс колонки с файлами выглядит так (слева - колонка с множественными файлами):
Второе небольшое нововведение - это галочка "Прямое подключение скриптов". Если ее установить, то стили и скрипты для интерфейсов таблиц будут подключаться инлайном, т.е. вставляться прямо в код. В некоторых случаях, например в интерфейсе универсальных списков в публичной части, или в интерфейсах "Битрикс 24" - это единственный способ заставить таблицы работать (раньше для этого было нужно немного изменить шаблон).
Модуль REST в БУСе. Как с ним работать. В 18 версии БУС появился модуль rest открывающий возможность получать с сайта данные по rest api. Как по мне так rest api в БУС не хватало достаточно сильно, особенно учитывая всевозможные fron-end технологии типа react/vue с серверным рендерингом. Вообще кастомизация некоторых компонентов битрикса это ад адский, к примеру компонент оформления заказа. Поэтому разделение back-end и front-end + серверный рендеринг мне кажется очень удобным и гибким подходом. Да, на back-end можно сделать вывод нужных данных в json и этого уже хватит для большинства задач. Но вот когда надо не просто отдать данные о товарах или новостях, а сделать оформление заказа или отслеживание тех-же заказов, то на реализацию подобного потребуется больше времени нежели простой вывод списка новостей в json. У меня скоро стартует проект по разработке мобильного приложения и хотелось уже узнать, как работать с rest в БУСе. Лучше ведь делать на том, что есть «в коробке» т.к. хочется верить, что там все продумано с учетом всех особенностей платформы. В поддержке мне не помогли разобраться с модулем, сказав, что документация в разработке, а принципиально rest бус - это rest b24. Я до этого не работал с b24 api и поэтому не знал, как и что там устроено. Для начала работы с Б24 через rest нужно создать приложение через специальную форму, но вот как создать приложение в БУСе? В админке БУСа нету раздела с приложениями. Я напрямую задал вопрос в поддержку "Как добавить приложение в БУСе (REST) ?" и получил ответ:
Вы можете разместит компонент bitrix:rest.marketplace.localapp на странице и добавлять приложения в БУСе
Что я и сделал. Разместив компонент, мы увидим точно такую же форму добавления приложения, как и в Б24. Указываем название приложения, ставим галочку «Приложение использует только API», указываем права доступа, указываем ссылку на приложение, жмем «сохранить». Для прав доступа я указал только user т.к. почти все остальное из Б24 и для моих целей не подходит и в списке не хватает многого, например sale (как я выяснил позже доступа к iblock, catalog нету в принцепе). В ответ получаем «Код приложения», «Ключ приложения». Теперь все как в Б24 за исключением нескольких мелочей. Отправляем запрос на https://<ваш сайт>/oauth/authorize/?client_id=< Код приложения >. Нас кинет на авторизацию, если мы не авторизованы. Потом нас кинет на url, который мы указали при его создании с GET параметрами. Далее получаем токен как в б24. Получив токен, мы можем работать с rest. Если модуль rest установлен, то уже можно запрашивать url /rest/ к Вашему сайту. В файле /bitrix/modules/rest/services/rest/index.php уже размещен компонент который отвечает за арботу с rest, bitrix:rest.provider с указанием url /rest/ в качестве url для rest. А внутри этого компонента вызывается другой компонент bitrix:rest.server, в котором указано, что он использует класс CRestProvider. В CRestProvider описаны несколько методов для rest напрмиер methods, который выводит список доступных методов согласно вашему уровню доступа, указанному при создании приложения. Если передать этому методу параметр FULL=true, то получим все возможные методы на данным момент. Для того чтобы получить список платежных систем я так понимаю служит метод sale.paysystem.list, но при его вызове получаем ошибку sale.paysystem.list. Для получения списка платежных систем нужно иметь доступ к sale и pay_system. Но в списке уровней доступа нету этих пунктов. А раскуривать коды компонента добавить эти уровни чет уже и не хочется, сложно все это. Похоже, что все это абсолютно не пригодно к использованию.
Добрый вер. Проблема избита всем всё понятно но тем не менее, я в коде особо не селён может кто конкретно указазать куда внедрить в файле class.php следующий код код. как в итоге будет выглядеть файл /class.php с данным кодом ?
<?$APPLICATION->IncludeComponent("bitrix:menu", "top", Array( "ROOT_MENU_TYPE" => "top", // Тип меню для первого уровня "MENU_CACHE_TYPE" => "A", // Тип кеширования "MENU_CACHE_TIME" => "3600", // Время кеширования (сек.) "MENU_CACHE_USE_GROUPS" => "N", // Учитывать права доступа ... "CACHE_SELECTED_ITEMS" => "N", // Не создавать кеш меню для каждой страницы ), false );?>
Добрый день. Столкнулась с такой проблемой. Создала копию ужесуществующего инфоблока на сайте. Все сделала точь-в-точь как и было. Создала страницу. Страница со списком элементов работает корректно. А при входе в элемент открывается карта сайта https://prnt.sc/kpewa2, при этом в чпу отображается путь к моему элементу. Т.е. элемент есть, но его как бы нет. Доступ открыт. Элементы активны.
Ниже ставлю код. Может кто подскажет, что я не так сделала. Или кто сталкивался с такой проблемой? Возможно я что-то еще забыла добавить, заменить? Очень надеюсь на вашу помощь
В публичной части сайта создаем пользовательское свойство какой-либо сущности. На момент написания статьи я делал для списков и компании. Если делать то же самое из админки, то есть возможность задать код сразу на этапе создания, но свойство не будет отображаться в публичной части. Это поправимо, просто обратите внимание на те таблицы, о которых идет речь, а лучше все же создавайте свойства из публичной части.
Заходим в Админку - Рабочий стол - Настройки - Настройки продукта - Пользовательские поля
Такой код неудобен тем, что будет различным на тестовом сервере и на боевом, придется записывать его в конфигах, что не всем приемлемо. Запоминаем код. Ищем в базе данных сайта таблицу b_user_field, сортируем записи по ID, находим свою запись, жмем изменить, записываем нормальное имя, пусть это будет UF_CRM_COUNTRY
Ищем таблицу b_user_option, сортируем записи по ID, в числе верхних вылезет запись типа такой как ниже на картинке. Меняем найденное значение на наше.
Далее нужно найти таблицу типа b_uts_crm_company - если наше поле для компании, типа b_uts_iblock_28 - для инфоблока ID=28 и т.д. Увидим, что в таблице один из столбцов имеет название, совпадающее с кодом нашего поля.
Переименовываем столбец SQL-запросом в админке типа такого:
alt er table `b_uts_crm_company` change UF_CRM_1535640144809 UF_CRM_COUNTRY TEXT
Казалось бы стандартная задача, если описать ее без углубления в тех процесс компании то нужно сделать:
Процесс 1:
ИМ Bitrix> CRMB24 > Bank> CRMB24 > ИМ Bitrix
Клиент делает заказ в интернет магазине (для оформления в кредит применяем правила корзины по платёжной системе), далее стандартным обменом заказ выгружается в в Б24 Коробку, после менеджер обрабатывает заказ (наличие, актуальность цены итд) и следующим шагом нам необходимо передать информацию в банк да передать так, что бы потом словить ответ, отсортировать по направлению сделки, видеть воронку, отчет итд итп. Мы уже опускаем факт звонка, писем и СМС/Viberсообщений клиенту.
Процесс 2:
ЗаказCRM B24 > Bank > CRM B24
Тут все проще, создаем сделку, выбираем товар.
Почему проще?
- Мы можем свободно создать руками сделку в нужно нам направлении, проследить заполнение всех полей и принимать решением к примеру бизнес процессом, но!
(Данный процесс опишем немного позже, но в нем мы используем свой класс расчета цены позиций товара)
Проблемы с которыми мы обязательно столкнемся в варианте Процесса 1:
- Сделки пришедшие из ИМ Битрикс всегда попадают в направление Общие.
- Цена на товар будет уже с учетом всех скидок и наценок пришедших с ИМ Битрикс.
- При импорте заказа с ИМ Битрикс не запускаются Бизнес процессы помечены как « - запуск - При создании».
- Дополнительную информацию или поля заказа стандартный модуль обмена не передает.
- Нет возможности редактировать сделку для смены к примеру варианта кредитования или количества месяцев.
- Нет возможности запустить Бизнес процесс во время обработки заказа (исключаем вариант смены статуса или изменения заказа с подпиской на запуск БП после изменения документа);
Проблемы с которыми мы обязательно столкнемся в варианте Процесса 2:
- Стоимость товара нельзя динамически менять в зависимости от условий.
- Нет возможности редактировать сделку для смены к примеру варианта кредитования или количества месяцев.
- Нет возможности запустить Бизнес процесс во время обработки заказа (исключаем вариант смены статуса или изменения заказа с подпиской на запуск БП после изменения документа);
Решаем проблемы по мере их поступления ) максимально использую стандартные механизмы.
Мы будем считать, что поля сделки созданной из ИМ Битрикс мы уже разнесли, в первую очередь нам нужно сменить направление сделки. Направление сделки на сегодня (август 2018 года) сменить бизнес процессом нет возможности. Запустить бизнес процесс при создании сделки пришедшей из ИМ Битрикс также нет вариантов, а техподдержка лишь создает заявки в отдел разработки, так как быть? Авоттак:
init.php
$BPID – ID бизнес процесса
AddEventHandler("crm", "OnAfterCrmDealAdd", Array("MyCrmDealAdd", "My_CrmDealAdd"));
class MyCrmDealAdd {
function My_CrmDealAdd(&$arFields) {
//AddMessage2Log('arFields:'.print_r($arFields, true));
if (\Bitrix\Main\Loader::IncludeModule('bizproc') && \Bitrix\Main\Loader::includeModule('crm'))
{
$dbpId = CBPDocument::StartWorkflow(
$BPID,
array('crm', "CCrmDocumentDeal", 'DEAL_'.$arFields["ID"]),
array(),
$arErrorsTmp
);
}
}
Тем самым мы будем запускать Бизнес процесс при создании любой сделки, тут лучше добавить проверку на то, что сделка эта относится к сделкам из ИМ Битрикс например смотря на поле «ORIGIN_ID» в нем будет IDзаказа пришедшего из ИМ Битрикс.
Да, кстати бизнес процесс который мы запускаем делает следующее:
1. Добавляет в название пометку «Кредит»
2. Меняет на закрытый от всех статус «Кредит»
3. Копирует сделку и устанавливает новое Направление сделки
4. Удаляет текущую сделку при успешном выполнении выше пройдённых действий.
Зачем удалять? Да попросту потому, что если оставляем сделку при редактировании скопированной сделки и сохранении товаров, запускается метод синхронизации цены и синхронизирует старую сделку в направлении Общие, программная деактивация не помогает, потому удаляем).
И вот мы уже имеем сделку в нужном нам направлении сделок, остается запустить после проверки бизнес процесс. Да тут вроде все просто, создаем промежуточный статус и подписываемся на него для запуска процесса, но нет! Заказчик говорит хочу кнопочку, что бы она отображалась только там, где условия наши проходят, и что бы обновления ставились потом, можете? Можем )
И вот нам нужно запустить Бизнес процесс менеджером, но как? У нас по сути есть варианты использовать RestAPI, Webhook, или в лоб посредством аякс запроса прямо из сделки, да мы еще сможем и проверить можно ли менеджеру показать эту кнопку, а еще мы сможем.... да по сути что угодно и не внося изменения в код, просто добавив это средствами javascriptпрямо в интерфейс сделки.
Пишем бизнес процесс в котором проверяем статус сделки, есть ли для этой сделки уже созданные счета, если нет создаем счет, получаем на него ссылку и передаем в отправку прям в банк, помечая письмо. Попутно запускаем процесс ожидания ответа от банка по этой заявке, переводим в соответствующий статус сделку.
Пишем скрипт генерирующий нам доступные кнопки и вуаля....
После установки обновлений Битрикса 14.08.2018 перестало работать автоопределение города по IP в форме заказа. Путём исследований удалось установить, что необходимо передавать в bitrix:sale.order.ajax параметр
Восстановление файлов диска коробочного Битрикс24 из бекапа
Смоделирую ситуацию: на портале сотрудником удалена папка с множеством файлов, удалена конечно же через "удалить навсегда". Портал продолжает работать несколько недель и накапливает данные, через время обнаруживается, что файлы все таки нужны и их нужно восстановить. Восстановить весь портал из бекапа нельзя, т.к. потеряются новые накопленные данные. Сразу оговорюсь, задачи сохранить связи файлов с задачами и сообщениями не было, нужно только восстановить копии файлов в любое место диска.
Первая мысль была очевидна: развернуть бекап локально, найти удаленные файлы и написать скрипт для переноса файлов на рабочий портал, пользуясь API (Без API Есть большой риск потерять где-либо связи между таблицами диска в БД). Но нашелся вариант проще...
Используем сетевой диск и приложение битрикс24. 1) На развернутой версии бекапа находим удаленную папку с файлами, далее, для диска на котором они находятся (в моем случае диск группы) в меню открываем подсказку по сетевому диску 2) по описанию от битрикс необходимо создать сетевой диск, используя путь к папке диска http://localhost:6448/workgroups/group/999/disk/path/ Можно сделать это через проводник windows, нажав в контекстом меню "Компьютер" -> "Подключить сетевой диск". Сетевой диск создался успешно через ссылку "Подключение к сайту, на котором можно хранить документы и изображения" Теперь у нас есть папка на ПК со всеми файлами и структурой файлов диска. 3) Устанавливаем декстоп приложение Битрикс24. Создаем папку на диске рабочего портала в которую будем восстанавливать файлы. Подключаем ее к диску и папка появляется у нас на компьютере в папке приложения. 4) Копируем файлы из папки в папку, синхронизируем файлы и всё. Все файлы восстановлены на рабочий портал.
Важно. В моем случае копирование не удалось из-за большой вложенности папок и больших имен файлов, выдавало системную ошибку об ограничении на размер. В этом случае проще всего установить Far и подключить сетевой диск в нем, тогда никаких ограничений windows не будет. Подключить сетевой диск можно через командную строку, введя net use z: http://localhost:6448/workgroups/group/999/disk/path /user:login password
Всем добрый день! Помогите пожалуйста решить задачу обертывания ссылкой из свойства инфоблока заголовка элемента. В интернет не смог найти решение, предложений много, но не одно не работает(((
Почему-то не получается в 18 версии, ранее делал так все работало:
Да и вот еще какая странность, решил вывести массивы и вот свойства ссылки LINK я там не нашел. Вывожу массив <? echo "<pre>"; print_r($arResult); echo "</pre>";?> и ничего не понимаю(((
Обвинили в некомпетентности, хотя со стороны Андрея Волкова и Якущева Дмитрия Сергеевича это кидалово обыкновенное. Прилагаю переписку к отзыву https://yadi.sk/d/1yNGqHuh3ZFcTt.
Обещали закончить все работы в срок, в день дедлайна (который сместился на 3 дня) как они говорят не продемонстрировали готовой работы. Наплевательское отношение со стороны разработчиков, неприкрытый обман и не понятно почему, со своей стороны все было оплачено сразу и мгновенно.
Прилагаю переписку к отзыву https://yadi.sk/d/1yNGqHuh3ZFcTt , если кто то еще пострадал от их действий или может посодействовать в их розыске, пишите в личку. Либо по контактам которые будут по ссылке в Яндекс диске, со скринами переписки. Ни в коем случае не отправляйте предоплату!
Прошел почти месяц, с того момента как они мне обещают сделать все работы и закончить, говорят что якобы 95 процентов работ сделано и осталось только 5, эти 5 процентов мы делаем с 14.07.2018. Попросили убрать негативный отзывы, сославшись на что что очень портит им имидж. Но я я и думал, после этого пошли просто отписки и ухмылки.
Вид мошенничества - берут предоплату, делают видимость работы и затягивают сроки разработки, ссылаются на все что угодно но не объективные причины. Деньги не возвращают, работы не предоставляют. В итоге пишут что "Как сделаем, так и сделаем, ждите". Далее выкручиваются и говорят что - то одного нет, то другого, то настроения нет, то они опечалены отзывом. Хотя
Прилагаю контактные данные мошенников, за любую информацию в розыске вознаграждение. Возможность есть еще кто то кто пострадал от действий этой группы людей.
ИП ЯКУЩЕВ ДМИТРИЙ СЕРГЕЕВИЧ ОГРН 310631810300057 ИНН 861005310079 Адрес : 443031, г.Самара, Ул. Ново-вокзальная, д. 161 А-13 АО "Райфайзенбанк" Номер счёта: 40802810100001641458 ул. Дербенёвская, д.17 - адрес
Далее в переписке, на по ссылкам на их решениях на маркет плейсе, нашел их почту на которую они ссылались https://yadi.sk/i/EeOuPEr13ZqNh9 . По домену нашел сайт http://master-bitrix.ru, после того как я позвонил туда, мужчина Александр Наумов стал мне написывать и просить показать портфолио, потом сослался на связях в битриксе хотел помочь посодействовать. У него такие же работы в портфолио.
Alexandr Naumov Email: st.80@inbox.ru Пол:Мужской День рождения:09.04.1978 Мобильный телефон:+79653426146 Город:Moskwa Компания:Dvernik Рабочий телефон:+74994992401 Должность:direktor
Если есть люди, которые пострадали от действий этих людей, пишите в личку. Все доказательства, все чеки, договоренности могу предоставить. А так же копии переписок и тд.
Возникла сложность при настройке Янлекс.Кассы в мобильном приложении (и сайт и мобильное приложение на Битрикс).
Вообще изначально планировалось, что пользователи могли добавлять в ЛК свои карты и в дальнейшем при оплате только выбирать, с какой именно хотят списать средства (например, как в приложении Яндекс Такси), без дополнительного ввода данных и переходов на стороние ресурсы.
К сожалению, функционал банковских карт в Битрикс может работать только с обработчиком платежной системы authorize.net и более ни с чем, а существующие обратчики от Яндекс.Кассы такого функионала не поддерживают (если ошибаюсь - поправьте).
И вроде как это всё не беда, ознакомившись с докой по ЯК видно, что есть очень удобные инструменты для того, чтобы всё это можно было разработать самому (YandexCheckout.js, Yandex.Checkout API PHP Client), вот только, чтобы хотябы получить возможность всё это попробовать, пощупать - цитирую:
Причём сканирование это нужно проходить раз в пол года, стоит оно довольно неприличную сумму и нет никакой возможности подключить всё это на тестовой площадке, подключение только сразу на бою... Причём информации в открытом доступе о необходимости всех этих шагов я так и не нашёл, стало ясно только после долгого и муторного общения с ТП ЯК.
Ответ ТП Битрикса по этому поводу: если Яндекс просит пройти, значит, нужно пройти. В принципе логично, но ставятся под сомнения все заявления на конференциях и выступлениях о том, что у них всё схвачено с Яндекс Кассой, но одной волне и интеграция с ними - это просто.
Посему было решено пойти по другому пути, отказаться от хранения карт (у себя или на стороне Яндекса), получения токенов для оплаты и оставить стандартную платежку, но и тут есть проблемы - Если мы отправляем пользователя на форму оплаты - он не может вернуться обратно.
Т.е. сценарий такой: 1. Оформление заказа 2. Переход на страницу оплаты (открывается в бразузере, а не в приложении) 3. Переход по кнопке "Вернуться в магазин" происходит в браузере, а не обратно в приложение
Собственно проблемма в том, как реализовать, чтобы страница оплаты открывалась в приложении. ну или хотя бы послее нее перекидывало обратно в приложение. ТП Битрикса, к сожалению, ничем помочь не смогла и отправила за помощью сюда, на форумы.
Мб у кого-то уже была подобная задача? Буду рад ознакомиться и услышать любой опыт, советы, подсказки по интеграции ЯК в мобильном приложении. Спасибо!
UPD. Спасибо Артёму Морозову за подсказу в личке, для того чтобы платежка открывалась не в браузере, а в самом приложении достаточно использовать:
Я думаю, что периодически многие сталкиваются с отладкой ошибки, возникающей при перекодировке ваших модулей в маркеплейсе в демо-режим. Некоторый функционал по сперва непонятным причинам отваливается.
Делюсь найденными наблюдениями, а также как это можно избежать и учесть.
Оказывается, нельзя использовать одноименные параметры функций и переменные-члены классов внутри. вот пример обработчика из файла include.php реального модуля :
public function OnBuildGlobalMenu(&$aGlobalMenu, &$aModuleMenu)
{
/* @var $adminMenu \CAdminMenu */
global $adminMenu;
if (! is_array($adminMenu->aGlobalMenu)) {
return;
}
битрикс кодировщик превращает данный код в файле include.php для демо-версии в подобное:
public function OnBuildGlobalMenu(&$_319480480, &$_678570816)
{
global $adminMenu;
if (!is_array($adminMenu->_319480480)) {
return;
}
естественно, поля класса $adminMenu->_319480480 просто нет, и событие не работает.
поэтому следует избегать совпадение имен параметров и используемых полей объектов внутри методов, дабы избежать подобной коллизии (по крайней мере в кодируемых для демо-режима файлах include.php и install.php).
PS возможно, это пофиксят в кодировщике, это было бы предпочтительнее.
Просили ли вас клиенты такой функционал как аксессуары, или вывод сопутки по каким то условиям отбора?
Долго откладывали планы по реализации такого вот модуля На наш взгляд любые вопросы такого плана должны быть встроены в любой продукт e-commerce как must have функционал
Подготовили специальный модуль КРОСС-ПРОДАЖИ (пока не публикуем, причина ниже)
Уже подключили данный модуль для нашего решения BXReady: Флагман
P.S. Ведется работа по адаптации данного модуля и для других решений (только после реализации еще ряда функций модуля, которые держим пока в серкете) Пока же модуль кросс-продажи доступен пока исключительно для решения BXReady: Флагман.
Также принимаем предложения по методикам использования сопутки с целью увеличения чека
Разработчики сайта работали в другом часовом поясе (МСК+1) и в связи с этим приходится менять на московский. Что пришлось сделать: 1. Перевели системное время (...и ничего не заработало, только date в командной строке стал выдавать МСК)
2. Исправили настройки php.ini (заказы в Битрикс стали падать с нормальным временем)
3. Перезапустили rsyslog (без этого задачи cron выполнялись со сдвигом)
4. Перезапустили БД (заказы шли по московскому, но в истории изменений МСК+1)
Может ещё что надо?..Напрашивается мораль - при изменении часов, Unix как и Windows в некоторых случаях нужно полностью перегружать.
Столкнулся с тем, что на странице оформления заказа количество товаров Вебвизор закрывает звёздочками. В техподдержке посоветовали добавить CSS класс ym-record-keys
Если в шаблоне одного компонента, подключается другой компонент, обязательно при подключении 4-м параметром нужно передавать переменную $component. Иначе возможно странное поведение, когда ваши компоненты работают только если отключить кэширование Битрикс. См: https://dev.1c-bitrix.ru/community/blogs/vad/1820.php
необходимо, чтобы дочерний компонент знал, что его вызывает родительский компонент. Делается это через передачу в параметрах ф-ии $APPLICATION->IncludeComponent() объекта текущего компонента (переменная $component, доступная в шаблоне)
В очередной раз столкнулся с непониманием пользователей (а затем, как выяснилось, и собственным ), в каких же случаях непрочитанные на портале уведомления будут продублированы в почту.
Когда-то уже порядочно давно, когда ещё не было модного P&P, но веб-мессенжер уже начинался, всё было относительно просто - если юзер онлайн на портале, когда прилетело уведомление, то уведомление в почту ему (наиболее вероятно) не придёт.
Но модуль развивался, получил в комплект Push&Pull, коммуникации изменились...
Коллеги, мне стало интересно, что знаете (или считаете, что знаете) вы по этому поводу: В каких случаях пользователь получит дополнительное уведомление в почту, что у него есть новые сообщения или уведомления в веб-мессенджере?
Речь идёт о коробке, чтобы не говорить об очевидном, исключим самые простые случаи - когда юзер оффлайн и когда подключен xmpp, так как в первом получит очевидно, а во втором - очевидно не получит. Ну и как исходные данные - естественно, у пользователя в настройках мессенджера включены уведомление на e-mail.
А потом разберёмся, почему такой вопрос возникает и почему он довольно важен.
Шеленков Евгений , твоё мнение особенно интересно. Только по честному, не заглядывая в код, навскидку
Из папки /etc/httpd/conf.d переносим файл phpMyAdmin.conf в папку /etc/httpd/bx/conf В конфиге после строчки <Directory /usr/share/phpMyAdmin/> добавляем
php_admin_value mbstring.func_overload 0
Разрешаем доступ либо с определенного либо с любого IP:
<RequireAny>
Require all granted
</RequireAny>
Итоговый вид директивы:
<Directory /usr/share/phpMyAdmin/>
AddDefaultCharset UTF-8
php_admin_value mbstring.func_overload 0
<IfModule mod_authz_core.c>
# Apache 2.4
<RequireAny>
Require all granted
</RequireAny>
</IfModule>
<IfModule !mod_authz_core.c>
# Apache 2.2
Order Deny,Allow
Deny from All
Allow from 127.0.0.1
Allow from ::1
</IfModule>
</Directory>
Перезапускаем Apache
systemctl restart httpd
Пропишем линк на папку phpMyAdmin
cd /home/bitrix/www
sudo ln -s /usr/share/phpMyAdmin
Вместо линка на папку можно прописать в /etc/nginx/bx/conf/bitrix.conf
location /phpMyAdmin {
root /usr/share;
}
Перезапускаем nginx
systemctl reload nginx
Важно – в *nix файловая система регистр зависимая!