Михаил Базаров: Сообщения

Михаил Базаров

Дата последнего входа: сегодня в 15:23
Дата регистрации: 7 Февраля 2012 21:17
День рождения: 7 ноября
Пол: Мужской
Михаил Базаров -> Всем
13 января 7:52
Ошибка "Mysql query error: (1146) Table '.b_sale_trading_platform' doesn't exist (400)" при просмотре заказа в Битрикс

Если, при попытке просмотреть подробную информацию о заказе, получаете ошибку
"Mysql query error: (1146) Table '.b_sale_trading_platform' doesn't exist (400)"

Ошибка может возникнуть при обновлении ядра Битрикс, если прыгаете с версии 17 на 20 и выше.

Удалите, лишний файл /bitrix/modules/sale/lib/tradingplatform.php
Его не должно быть в ядре, после этого проблема решится.

Возможно файл появился после восстановления сайта из резервной копии или перезагрузки файлов ядра.
Ранее этот файл по ошибке был добавлен, но с версии sale 17.8.25 (18.0.3) его убрали.

PS: Если, при просмотре заказа, видите только:
"Произошла ошибка, включите расширенный вывод ошибок в .settings.php"
Откройте файл /bitrix/.settings.php и переключите "debug" = "false" в "debug" = "true"



Михаил Базаров -> Всем
19 декабря 2019 6:10
Скрипт для иммитации боковой панели, выезжающей\исчезающей при протягивании пальцем по экрану.
Пригодится для мобильных версий сайтов или мобильных приложений на cordova

Подробнее тут https://github.com/mango/slideout/releases/
Файлы:
slideout-1.0.1.zip (30.02 КБ)
Mango/slideout
A touch slideout navigation menu for your mobile web apps. - Mango/slideout
Михаил Базаров -> Всем
17 декабря 2019 15:23
Pull to refresh, не большой скрипт  для обновления страницы, при перетягивании, на мобильных телефонах.
Можно использовать и в мобильном приложении на cordova/phonegap

API методы тут
https://github.com/BoxFactura/pulltorefresh.js
Файлы:
pull_ref.min.js (9.45 КБ)
BoxFactura/pulltorefresh.js
A quick and powerful plugin for your pull-to-refresh needs in your webapp. - BoxFactura/pulltorefresh.js
Михаил Базаров -> Всем
28 ноября 2019 11:17
Установить/скопировать значение свойства элемента из другого свойства, при создании или редактирования элемента инфоблока.

У нас есть свойство инфоблока с кодом ATT_PRICE
И есть свойство с кодом ATT_TEST

Задача: при редактировании элемента копировать значение из ATT_PRICE в ATT_TEST

Добавляем в init.php
AddEventHandler("iblock", "OnAfterIBlockElementUpdate", "OnAfterIBlockEl");
AddEventHandler("iblock", "OnAfterIBlockElementAdd", "OnAfterIBlockEl");
function OnAfterIBlockEl(&$arFields) {
  if (CModule::IncludeModule("iblock")):
     $getProperty = CIBlockElement::GetList (
         Array("ID" => "ASC"),
         Array("IBLOCK_ID" => $arFields['IBLOCK_ID'], "ID" => $arFields['ID']),
        false,
        false,
        Array(
           'PROPERTY_ATT_PRICE'
         )
    );
    while($ar_fields = $getProperty->GetNext())
    {
         $setProperty= $ar_fields['PROPERTY_ATT_PRICE_VALUE'];
    }
   endif;
CIBlockElement::SetPropertyValuesEx (
      $arFields['ID'],$arFields['IBLOCK_ID'],array (
             'ATT_TEST' => $setProperty
          )
     );
}
Здесь: с помощью  CIBlockElement::GetList получили значение свойства ATT_PRICE для элемента с ID = $arFields['ID'] (текущий редактируемый/добавляемый элемент)
С помощью CIBlockElement::SetPropertyValuesEx установили значение ATT_PRICE в ATT_TEST
Михаил Базаров
Не большое улучшение. Так как работаем с одним, конкретным элементом- за раз. Можно заменить
CIBlockElement::GetList на CIBlockElement::GetByID - будет работать бодрее и так правильнее
<?
AddEventHandler("iblock", "OnAfterIBlockElementUpdate", "OnAfterIBlockEl");
AddEventHandler("iblock", "OnAfterIBlockElementAdd", "OnAfterIBlockEl");
function OnAfterIBlockEl(&$arFields) {
if (CModule::IncludeModule("iblock")):
 $res = CIBlockElement::GetByID($arFields['ID']);
 if($obRes = $res->GetNextElement())
 {
     $ar_res = $obRes->GetProperty("ATT_PRICE");
     $setProperty = $ar_res['VALUE'];
 }
endif;

CIBlockElement::SetPropertyValuesEx (
  $arFields['ID'],$arFields['IBLOCK_ID'],array (
    'ATT_TEST' => $setProperty
   )
);
}
?>
Михаил Базаров -> Всем
4 ноября 2019 9:34
Ускорение работы сайта на 1С-Битрикс
Файл использованный в заметке
https://camouf.ru/blog-note/9223/index...de_areas=Y
Фото:
Файлы:
blog_usk_bx.txt (5.28 КБ)
Nip4FunU2@gmail.com
Михаил Базаров, а вы mod_pagespeed протестировали на совместимость с композитом? А то я протестировал, и вот какой результат:
Для групп которым композит не работает показывается mod_pagespeed и переназваные img и тд.
А вот для групп с композитом ситуация иная, сначала подрубается на пол секунды то что отдает mod_pagespeed, но потом сразу композит перекрывает весь DOM своим контентом в котором остались старые пути без конвертации.

Я так понял что композит делает слепок до отработки mod_pagespeed, и следовательно не может сохранить его с изменениями и потом отдавать.
Что думаете по этому поводу?
Михаил Базаров
Да пробовал, мне вообще не понравилось что творит этот mod_pagespeed
Именно с композитом проблем не было, но он картинки сильно портит, и какие-то не лепые названия им дает.
Плюс, с обработкой скриптов и css - не все гладко проходит.
Самое главное, особо ускорения не дает.
В целом, пока, забил его использовать- нужно побольше времени поизучать, прежде чем использовать на реальных проектах.  
Михаил Базаров -> Всем
20 ноября 2019 4:38
Cordova пробросить API Cordova внутрь InAppBrowser

Если Вы создаете мобильное приложение на Cordova и работаете не с локальными файлами, а открываете внешний сайт.
По сути, скрываете все управляющие элементы браузера и иммитируете полноценное приложение.

Скорее всего используете плагин InAppBrowser, но в нем не будут работать API плагинов Cordova:
То есть, из этой оболочки не получите доступа к железу и настройкам телефона.

Что бы решить эту проблему нужно установить плагин remote-injection
cordova plugin add cordova-plugin-remote-injection

Он, встраивает скомпилированные ресурсы приложения (cordova и ее плагины), внутрь оболочки InAppBrowser.

После этого можно использовать API Cordova прямо на встроенном сайте.

Дополнительно:
Что бы псевдо приложение, по сути сайт, открывался при старте Cordova можно добавить в config.xml
<content src="АДРЕС_СТАРТОВОЙ_СТРАНИЦЫ" />
<allow-navigation href="АДРЕС_САЙТА/* />

Если нужно внедрить еще какой-то еще скрипт, по мимо самой Cordova
<preference  name="CRIInjectFirstFiles"  value = "ПУТЬ_К_ФАЛУ/file.js " />

PS: И еще пара плагинов, которые не озвучены в документации:

cordova plugin add cordova-plugin-contacts - обеспечивает доступ к базе данных контактов устройства.
cordova plugin add cordova-plugin-device-motion - доступ к акселерометру устройства.
cordova plugin add cordova-plugin-firebase - работа с push через firebase
cordova plugin add cordova-plugin-android-imei - получение IMEI (Только Андроид)
cordova.plugins.IMEI(function (err, imei) {
        console.log('imei', imei)
})

Плагин управления клавиатурой
cordova plugin add https://github.com/driftyco/ionic-plug...yboard.git
Этот плагин может многое, описание на github
Главное, для чего его можно использовать:
Не сжимать страницу при появлении клавиатуры
cordova.plugins.Keyboard.disableScroll(true);

Плагин переключающий UIWebVue на WKWebView (первый вот вот устареет)
cordova plugin add cordova-plugin-wkwebview-engine

Файлы:
all_plugins.txt (967 Б)
ionic-team/ionic-plugin-keyboard
Ionic Keyboard Plugin for Cordova. Contribute to ionic-team/ionic-plugin-keyboard development by creating an account on GitHub.
Михаил Базаров -> Всем
25 марта 2019 10:50
Форма авторизации с использованием vue js для Битрикс

Готовый шаблон всплывающей формы авторизации.
Просто распаковываем в шаблон своего сайта и выводим в нужной части сайта компонент
system.auth.form и применить этот шаблон (auth)

В основном шаблоне сайта, подключите vue из ядра
\Bitrix\Main\UI\Extension::load("ui.vue");

На его месте появится кнопка, вызывающая шаблон авторизации.
Стилей по минимуму, подгоняйте под себя.

Так же внутри файл для отправки формы (index.php)- результат успешного или не успешного входа.
Этот файл обязательно удалите, или переместите в папку /personal/ он просто для примера (или любую другую папку - в форме подправьте путь)



Фото:
Файлы:
auth.zip (5.19 КБ)
Валерий
При вставке <?Asset::getInstance()->addJs('/bitrix/js/ui/vue.min.js');?>
У меня вообще ошибка, на скрине предоставил.

Видимо у меня вообще система полетела? И что не подскажите?

Вообщем полная жесть на ночь глядя(((
Файлы:
0 Б
Михаил Базаров
Перед этим подключением, включите
use Bitrix\Main\Page\Asset;
Валерий
Эх видимо не судьба((

Та же ошибка.Uncaught ReferenceError: Vue is not defined

Vue.component("modal",{template:"#auth_template"});BX.Vue.create({el:"#auth_form",data:{showModal:false}});
Михаил Базаров -> Всем
26 июня 2019 10:47
При клике на маленькую фотографию меняется большая.

Мини скриптик, может кому пригодится для каталога товаров или новостей при использовании дополнительных картинок (обычно MORE_PHOTO).
Вместо штатного, монструозного магнифера

PHP
<div class="more_photos">
     <a href="<? echo $arResult['DETAIL_PICTURE']['SRC'] ?>" class="current">
           <img src="<? echo $arResult['DETAIL_PICTURE']['SRC'] ?>" alt="<? echo $arResult['NAME'] ?>">
    </a>
    <?
    if (count($arResult["MORE_PHOTO"]) > 0) {
       foreach ($arResult["MORE_PHOTO"] as $PHOTO) {
       $renderImage = CFile::ResizeImageGet($PHOTO, Array("width" => 200, "height" => 200), BX_RESIZE_IMAGE_EXACT, false);
   ?>
      <a href="<?= $PHOTO["SRC"]; ?>" alt="<? echo $arResult['NAME'] ?>">
               <img src="<?= $PHOTO["SRC"]; ?>" alt="<? echo $arResult['NAME'] ?>">
      </a>
      <? }
   } ?>
</div>
JS
$(".more_photos").on("click", "a", function () {
     $(this).addClass("current").siblings().removeClass("current")
     $(".main_photo img").attr("src", $(this).prop("href"))
     return false;
});
CSS
Тут уж сами под свой дизайн. Например, как на картинке
.more_photos {
      float: left;
     width: 100px;
}

 .more_photos a {
     display: block;
     margin-bottom: 10px;
     text-decoration: none;
     width: 100%;
     height: 100px;
     border: 3px #fff solid;
     box-shadow: 0px 0px 1px #ccc;
     transition: all .25s ease-out;
}

   .more_photos a:hover {
     border: 3px #f6f6f6 solid;
}
   .more_photos a.current {
     border: 3px #D68189 solid;
}

.main_photo {
     float: right;
     width: calc(100% - 110px);
}

 .main_photo img {
     width: 100%;
     transition: all .25s ease-out;
}

PS: само собой, на сайте должен быть подключен jquery
Фото:
Валерий
Михаил Базаров, нет все указанно. Даже попробовал создав другое свойство.
<div class="more_photos">
<a href="<? echo $arResult['DETAIL_PICTURE']['SRC'] ?>" class="current">
  <img src="<? echo $arResult['DETAIL_PICTURE']['SRC'] ?>" alt="<? echo $arResult['NAME'] ?>">
</a>
<?
if (count($arResult["PHOTOS"]) > 0) {
  foreach ($arResult["PHOTOS"] as $PHOTO) {
  $renderImage = CFile::ResizeImageGet($PHOTO, Array("width" => 200, "height" => 200), BX_RESIZE_IMAGE_EXACT, false);
  ?>
 <a href="<?= $PHOTO["SRC"]; ?>" alt="<? echo $arResult['NAME'] ?>">
  <img src="<?= $PHOTO["SRC"]; ?>" alt="<? echo $arResult['NAME'] ?>">
 </a>
 <? }
  } ?>
</div>
Файлы:
0 Б
0 Б
0 Б
Михаил Базаров
Тогда, странно. Подсказать не могу, видимо: какая-то мелочь упущена. Но какая не понятно, нужно в живую смотреть
Валерий
Михаил Базаров, каким то образом все таки разобрался с отображением. Чтобы отображались фотографии с свойства MORE_PHOTO, но теперь нет самой большой картинки, которая должна меняться.

Ваш код вставил:
<div class="more_photos">
     <a href="<? echo $arResult['DETAIL_PICTURE']['SRC'] ?>" class="current">
           <img src="<? echo $arResult['DETAIL_PICTURE']['SRC'] ?>" alt="<? echo $arResult['NAME'] ?>">
    </a>
    <?
    if (count($arResult["MORE_PHOTO"]) > 0) {
       foreach ($arResult["MORE_PHOTO"] as $PHOTO) {
       $renderImage = CFile::ResizeImageGet($PHOTO, Array("width" => 200, "height" => 200), BX_RESIZE_IMAGE_EXACT, false);
   ?>
      <a href="<?= $PHOTO["SRC"]; ?>" alt="<? echo $arResult['NAME'] ?>">
               <img src="<?= $PHOTO["SRC"]; ?>" alt="<? echo $arResult['NAME'] ?>">
      </a>
      <? }
   } ?>
</div>

Но большой картинки все равно нет.
Файлы:
0 Б
Михаил Базаров -> Всем
14 мая 2018 9:03
Установить вебсервер на Ubuntu 18 LTS, оптимизированный под битрикс.

Выполняем обновление:
apt-get update
apt-get upgrade

Перезагружаем сервак: reboot

Данный вебсервер использую только для локальной разработки. Собственно, запущен на моем рабочем ноутбуке
под Кubuntu 18LTS. Что бы работать с разрабатываемыми сайтами быстро и в отсутствии интернета.
Для продакшена, нужно настраивать более тонко, хотя и так заработает.

Ставим апач:
sudo apt-get install apache2

Добавляем апач в автозагрузку:
sudo systemctl enable apache2

Ставим PHP 7.2.5:
sudo apt-get install php7.2-cli

Проверяем что он встал:
php -v (покажет версию php)

Перезапускаем апач:
sudo systemctl restart apache2

Ставим базу данных (Mysql 5.7):
sudo apt install mysql-server
Сконфигурировать Mysql, все команды выполняем поочереди
sudo mkdir /var/run/mysqld; sudo chown mysql /var/run/mysqld
sudo mysqld_safe --skip-grant-tables&
sudo mysql --user=root mysql

Устанавливаем пароль пользователя root базы данных
mysql> update user set authentication_string=PASSWORD('PASSWORD') where user='root';
flush privileges;

Установка phpmyadmin
sudo apt-get install phpmyadmin php-mbstring php-gettext
В процессе попросит выбрать сервер (apache2) и пароль root базы данных

Все, базовый сервер готов. Можете поднастроить конфигурацию php
в файле /etc/php/7.2/cli/php.ini
Но я передпочитаю доводить под конкретный сайт, в файле виртуального хоста.


И конфигурацию базы данных
в файле /etc/mysql/mysql.conf.d/mysqld.cnf
Свой, заточенный под битрикс, приложу в архиве. Но очень внимательно, зависит от объема
оперативной памяти на сервере. Должен нормально запуститься если больше 4-х.
Если меньше, подкрутите этот конфиг (параметры выедающие память) под себя.


СОЗДАНИЕ ВИРТУАЛЬНОГО ХОСТА

Создать папку для сайта
mkdir /var/www/site.ru/public_html

Создать запись виртуального хоста
nano /etc/apache2/sites-available/site.ru.conf
с содержимым (повторюсь, конфиг php подгоняю под конкретный сайт.
В php.ini у меня все по умолчанию). Данное содержимое под Битрикс Бизнес
<VirtualHost *:80>
ServerName site.ru
ServerAlias site.ru
ServerAdmin webmaster@localhost
DocumentRoot /var/www/site.ru/public_html/

<Directory /var/www/site.ru/public_html/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
DirectoryIndex index.php index.html index.htm

php_admin_value short_open_tag On
php_admin_value mbstring.func_overload 2
php_admin_value mbstring.internal_encoding UTF-8
php_admin_value date.timezone Europe/Moscow
php_admin_value opcache.revalidate_freq 0
php_admin_value opcache.max_accelerated_files 100000
php_admin_value display_errors On
php_admin_value max_input_vars 10000
php_admin_value upload_max_filesize 8M
Require all granted
</Directory>

ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Добавить сайт (включить)
sudo a2ensite site.ru

Перезагрузить апач (любая из трех, рекомендуется последняя команда)
sudo systemctl restart apache2

Создаем пользователя базы данных с полными привелегиями (так как root заблокирован и пусть таким остается). Команды выполняем поочереди
sudo mysql --user=root mysql
CREATE USER 'USER_NAME'@'localhost' IDENTIFIED BY 'PASSWORD';
GRANT ALL PRIVILEGES ON * . * TO 'USER_NAME'@'localhost';
FLUSH PRIVILEGES;

Все. Простой веб сервер готов. Использую на локальном компьютере для разработки.
Для продакшена нужно настраивать параметры более тонко, особенно в плане
безопасности (директории для хранения сессий итд запреты/разрешения).
Плюс есть резон установить nginx и memcache (если позволяет оперативка)

Но об этом позже.

Видео инструкция, по данной заметке
https://www.youtube.com/watch?v=W-2mXox4ukU
Фото:
Файлы:
mysqld.cnf (3.16 КБ)
Локальный вебсервер в подсистеме Linux в Windows 10
Делается по заметке https://camouf.ru/club/user/1/blog/144/ Настраиваем локальный веб-сервер, для разработки сайтов. Осваиваем подсистему Linux в Windows 10 ...
Михаил Базаров
Скрипт для добавления виртуального хоста
#!/bin/bash
#************************************************#
# Скрипт создает новый сайт, вклюает его в       #
#************************************************#
# Основа взята тут http://ubuntu-favorite-os.blogspot.co...u1010.html

echo -e "33[1mВведите название проекта (Например example.com):33[0m";
read NAME_OF_PROJECT

#создаем папки проекта
sudo mkdir /home/camouf/SITES/$NAME_OF_PROJECT

#даем полные права (только для локальной разработки- не пускайте в инет)
sudo chmod -R 777 /home/camouf/SITES/$NAME_OF_PROJECT/

#добавляем правила в конфигурационый файл апача
add_to_apache_conf="
<VirtualHost *:80>
ServerName ${NAME_OF_PROJECT}
ServerAdmin webmaster@localhost
DocumentRoot /home/camouf/SITES/${NAME_OF_PROJECT}/
<Directory /home/camouf/SITES/${NAME_OF_PROJECT}/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
DirectoryIndex index.php index.html index.htm

php_admin_value short_open_tag On
php_admin_value mbstring.func_overload 2
php_admin_value mbstring.internal_encoding UTF-8
php_admin_value date.timezone Europe/Moscow
php_admin_value opcache.revalidate_freq 0
php_admin_value opcache.max_accelerated_files 100000
php_admin_value display_errors On
php_admin_value max_input_vars 10000
php_admin_value upload_max_filesize 8M
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>"

#добавляем новый хост
#echo "$add_to_hosts_conf" >> /etc/hosts
touch /etc/apache2/sites-available/${NAME_OF_PROJECT}.conf
echo "$add_to_apache_conf" >> /etc/apache2/sites-available/${NAME_OF_PROJECT}.conf

#включаем конфигурацию сайта
sudo a2ensite ${NAME_OF_PROJECT}

#перезапускаем апач
sudo systemctl restart apache2
chmod -R 777 /home/camouf/SITES/${NAME_OF_PROJECT}

echo "Сайт готов"
Сергей Стефанович
Михаил Базаров, а чего ты не пробуешь Debian 10 + LEMP ?
Михаил Базаров
Сергей Стефанович, а даже не знаю. Без разницы, как по мне
Михаил Базаров -> Всем
7 сентября 2019 12:28
Свойство: привязка к Яндекс:Картам - вывести из нескольких элементов на одну карту

Подробнее:
https://camouf.ru/blog-note/7803/

Авторизация

На сайте работает вход через социальные сети. Просто, выберите наиболее удобную сеть и авторизация произойдет автоматически:
Проходя авторизацию, Вы безоговорочно принимаете условия политики конфеденциальности