Лет 5 назад я работал с системой контроля версий - это была SVN. Такая себя громоздкая и неповоротливая. Но все же система контроля версий.
И вот на новом месте работы появилась потребность на крупных проектах вводить релизную систему, т.е. необходимо настраивать систему контроля версий, заводить репозитории и т.д.
Очень пугала неизвестность, т.к. практического опыта работы с mercurial или git не было. И из-за этого вопрос всё откладывался и откладывался...
Но на практике оказалось, что всё достаточно просто и с этим вопросом (при отсутствии знаний Git совсем) можно разобраться за пару дней, а с наличием знаний и вовсе за час-два.
В своем посте хочу привести пример настройки репозитория в самом простом варианте.
Зачем вам репозиторий? Если у вас нет репозитория, то ваша работа с сайтом, это как операция на открытом сердце. Любая ваша ошибка нарушает работоспособность сайта. Пока сайт в разработке, это вроде некритично, но вот после запуска - это становится огромной проблемой!
Приведу два примера
Пример 1 Есть одна виртуальная машина или сервер (это не важно для нас сейчас). В папке /home/bitrix/www - располагается файловая структура вашего сайта, например, site.com. Для разработки нам необходима копия сайта /home/bitrix/ext_www/dev.site.com, на домене dev.site.com В обеих папках у нас будут локальные репозитории Git, которые будут работать с удаленным репозиторием.
Пример 2 Отличается тем, что файловая структура сайтов лежит на разных серверах. Например, сервер 1 /home/bitrix/www, site.com сервер 2 /home/bitrix/www, dev.site.com
Настройка репозиториев
1. Проверяем есть ли у нас Git На виртуальной машине версии 5 все уже установлено. Подключаетесь к вашему серверу по ssh, авторизовываетесь под пользователем bitrix и вводите команду
>git
Если вы увидели вывод информации о гит, все нормально. Если сообщение, что команда системе не известна, тогда понадобится проинсталировать пакет. В этом посте я этот вопрос рассматривать не буду.
Если Вы проводили инсталяцию git самостоятельно, то не забудьте запретить доступ к папка git вашего сайта в настройках nginx и apache (htaccess).
2. Настраиваете файл .gitignore Создаете в корне сайта файл .gitignore и настраиваете его. Приведу пример, в котором мы исключаем из репозитория все что относится к ядру сайта и включаем, только то что нужно. Коллеги в комментариях подсказали, что можно и вовсе исключить из индекса папку bitrix, для этого нужно использовать папку /local
/.gitignore
/.htaccess
/*.htaccess
/.htaccess*
/urlrewrite.php
/web.config
/*web.config
/*.log
/*.sql
# исключаем из репозитория текстовые файлы, но оставляем robots.txt
/*.txt
!/robots.txt
/sitemap*.xml
/*.dt
/*.tar.gz
/*.gz
/*.tar
/*.bak
/*.old
/*~
*/_*
/_*
/composer.*
# исключаем ВСЮ папку bitrix, но ниже настроим включение нужных папок
# или используйте папку /local, чтобы полностью исключить папку bitrix
/bitrix/*
# включаем папку components, но исключаем components/bitrix
!/bitrix/components
/bitrix/components/bitrix/
# включаем папку php_interface и исключаем файл dbconn.php
!/bitrix/php_interface/
/bitrix/php_interface/dbconn.php
/bitrix/php_interface/*.bak
# включаем папку шаблонов
!/bitrix/templates/
# исключаем служебные и ненужные папки проекта
/dev
/pma
/upload
/verstka
3. Инициализируем репозиторий В командной строке переходите в домашний каталог, в котором лежит ваша папка сайта
>cd /home/bitrix
Инициализируем репозиторий в папке www
>git init www
4. Начинаем работу с локальным репозиторием Чтобы посмотреть что и как у вас настроено Переходите в папку сайта
>cd /home/bitrix/www
Проверяете состояние репозитория
>git status
В результате вы увидите список файлов и папок, которые попадут в репозиторий. Как раз сейчас самое время внести корректировки в файл .gitignore Добавьте или уберите исключения, которые нужны именно для вашего проекта. Если надо проверить индексацию внутри папки сайта, например /bitrix, используйте
>git status bitrix
5. Добавляем файлы в репозиторий После того как вы настроили игнорирование и включение в репозиторий и убедились, что в хранилище попадет только то, что вам необходимо, самое время добавить файлы в репозиторий и сделать первый коммит. Убедитесь что вы в папке вашего сайта
>cd /home/bitrix/www
Файлы можно добавлять выборочно с помощью команды
>git add index.php
Или все сразу
>git add .
После этого можете проверить, что все файлы будут проиндексированы
>git status
на экране будет сообщение, что все проидексировано. Можно делать первый коммит
>git commit -m "first commit"
6. Настройка удаленного репозитория После того как вы настроили работу репозитория локально, надо выгрузить хранилище на сервер. В качестве сервера можно выбрать https://bitbucket.org/ Бесплатный сервис, который предоставляет приватные репозитории. Вы можете выбрать любой сервис, который вам больше по душе. Настройка авторизации на этих сервисах отлично опасана в интернетах, поэтому я не буду раздувать пост и приведу основные команды для настройки начала работы.
Для начала нам понадобится сгенерировать ssh-ключи Это делается командой
>ssh-keygen -t rsa -C "bitrix@имя.сайта"
По умолчанию, если ничего не будете менять, этой командой вы сгенерируете два ключа, приватный id_rsa и публичный id_rsa.pub они будут в папке /home/bitrix/.ssh/
Далее вам нужно взять содержимое публичного ключа и вставить в настройки аккаунта bitbucket.org Вы можете открыть файл приватного ключа в редакторе кода и скопировать одной строкой его содержимое. Или вывести на экран содержимое файла командой
>cat ~/.ssh/id_rsa.pub
Важное замечание! Ключ в bitbucket нужно вставлять в настройках вашего профиля, а не репозитория!
После того как вы настроили ключи, проверьте соединение
>ssh -T git@bitbucket.org
В результате вы должны увидеть сообщение об успешно коннекте к сервису.
Если увидите ошибку, то выполняйте соединение с выводом логов
>ssh -v git@bitbucket.org
или
>ssh -vvv git@bitbucket.org
Возможно проблема, что сгенерированный ключ не будет использоватся для авторизации, тогда покажите ваш приватный ключ системе
>ssh-agent /bin/bash
>ssh-add ~/.ssh/id_rsa
и проверьте соединение еще раз
>ssh -v git@bitbucket.org
Теперь все должно быть хорошо!
7. Передача синхронизация репозитория Сервисы тоже отлично подсказывают как синхронизировать репозитории и выдают команды для вашего проекта, поэтому так же кратко.
В локальном репозитории, нужно добавить связь с удаленным репозиторием
your_company - ваш логин bitbucket.org your_repo - название вашего репозитория в bitbucket.org
Т.к. локальный репозиторий уже подготовлен, то нам осталось его передать в удаленное хранилище
>git push origin master
Этой командой вы отправите вашу основную ветку master из локального в удаленный репозиторий. После вывода сообщения что все закончилось хорого, вы можете пойти в репозиторий bitbucket и полюбоваться структурой папок и файлов через браузер.
8. Настройка второго локального репозитория На данном этапе у нас готовы - локальный репозиторий (обычно это боевой сайт или сайт после разработки, который вот вот станет боевым) - и удаленный репозиторий Т.е. нам не хватает заключающего репозитория для нашей разработки.
Если вы настраиваете репозитории, имея одну рабочую копию сайта, то вам достаточно будет скопировать файловую структуру, это и будет вторым готовым к работе репозиторием. Кратко о процессе: 1. Создаете дополнительный сайт на виртуальной машине с помощью меню виртуальной машины 2. В папку созданного сайта копируете всю структуру
В результате у вас появится файл /home/bitrix/site.com.tar.gz со структурой вашего сайта, который вы можете скопировать на новый сервере и там развернуть
>tar -xf site.com.tar.gz
9. Заключение В итоге мы настроили 1. Локальный репозиторий продакшен сайта /home/bitrix/www 2. Удаленный репозиторий на bitbucket 3. Локальный репозиторий сайта разработки /home/bitrix/ext_www/dev.site.com или папка на другом сервере
Схема работы следущая: 1. Вся разработка ведется на сайте разработки 2. Все изменения отслеживаются командой
>cd /home/bitrix/ext_www/dev.site.com
>git status
3. Все изменения фиксируются командами
>cd /home/bitrix/ext_www/dev.site.com
>git add
и
>git commit
4. Все зафиксированные изменения выгружаются в удаленный репозиторий
I) Как указали выше, папку .git лучше располагать на уровень выше корня сайта. Это не только понизит шансы утечки содержимого .git, но и позволит контролировать служебные механизмы, которым не место в корневом каталоге и подкаталогах сайта: скрипты для запуска по расписанию, unit-тесты и пр.
II) Папку bitrix не стоит включать в .gitignore, так как если не контролировать ядро Битрикс, то:
1. Разработчикам будет уже недостаточно просто склонировать репозиторий для начала работы. Придется добывать недостающие файлы. Причем, если работа над проектом ведется несколько лет, его состояние редко позволит использовать "cp -r", как указано в статье. Как показывает опыт, вместо этого придется заниматься трудоемким избирательным копированием.
2. Разработчики бывают разными и сколько не запрещай, в команде обязательно найдется человек, который поправит что-нибудь в ядре. В этом случае, появляется шанс, что в продуктивную среду уйдет код, который приведет к аварии. Это возможно, если код активно использует измененное ядро, а тестирование функциональности проводилось только на копии этого разработчика.
Если включить файлы ядра в систему контроля версий, то изменения в файлах ядра становится возможным отслеживать и автоматически запрещать на уровне перехватчиков (hooks). Также можно настроить отправку уведомлений таким разработчикам с напоминанием правил работы с Битрикс.
3. Недопустимыми правками часто не брезгуют и операторы заказчика. Если не контролировать файлы ядра, такие изменения в продуктивной среде становится трудно отследить. Хоть Битрикс и сделал для этого собственный инструмент, Git в таких случаях помогает гораздо надежней.
4. Если не контролировать ядро, актуализировать файлы на всех копиях разработки после обновления Битрикс может стать очень затруднительно. Особенно, когда число таких копий приближается к сотне.
5. Порой, очередное обновление Битрикс приводит к ошибкам в существующей функциональности. Git показывает пришедшие с обновлением изменения, что существенно облегчает поиск проблем в таких случаях.
6. Не существует ни одной объективной причины, почему ядро нужно исключать из контроля версий. Многие опасаются, что производительность Git существенно упадет из-за количества файлов в каталоге bitrix. Это напрасное опасение — практика показывает, что Git прекрасно справляется с этой задачей.
III) Не стоит использовать сторонние сервисы (BitBucket, GitHub и прочие) для чужих коммерческих проектов. Это часто противоречит требованиям NDA, может стать причиной утечек кода, а также, учитывая последние законодательные тенденции, и вовсе однажды оказаться незаконным.
В качестве отрицательного примера можно привести блокировку GitHub на несколько дней в начале декабря. Некоторым компаниям это едва ли не парализовало работу.
При этом, для того чтобы сделать центральный репозиторий, достаточно выбрать подходящий сервер (желательно внутри сети) и набрать там команду git init --bare. И все. В итоге, получается полноценный репозиторий, доступ к которому всегда находится под полным контролем.
Кроме того, собственный центральный репозиторий позволяет гибко управлять обвесом: выбирать любимые протоколы, веб-интерфейсы, системы контроля доступа и рабочие процессы.
Угрюмова Юлия, вы добавили линк на репозиторий с чужим логином, я не знаю где вы его взяли. обычно в битбакете в самом репозитории есть кнопка клонировать и там есть линк в 2х форматах: ssh и https.
вы можете изменить адрес git remote set-url origin git://new.url.here
или удалить git remote delete origin И добавить по новой
Коллеги, подскажите видел статью, но потерял её и не могу найти. Что надо сделать что бы в гит так же улетала информация при изменении страницы через CMS Bitrix когда меняешь страничку "Изменить в режиме PHP кода". Это ведь реализуемо ?
Нужно было срочно на винде конвертнуть файлы из windows-1251 в UTF-8.К своему удивлению не нашел сходу ничего рабочего под винду. Попробовал Штирлиц и EncodingMasterPC. Ничего не сработало так как надо: выбрал папку, нажал конвертировать и получил переконвертированые файлы.
По этому, накидал очень быстро очень простой скрипт на пэхапе, который запустил локально и конвертнул все что надо.
Сюда выкладываю больше как в хранилище, чтобы у меня самого был рабочий пример под рукой, который не нужно долго искать. Уверен, что в интернете полно подобных решений, но в своем я больше уверен, да и задача такая, что быстрее самому написать, чем искать готовое.
And so you code..
<?
@set_time_limit(0);
define('PATH4CLEAR', 'D:\decode');
define('SEP', '\\');
if (!file_exists(PATH4CLEAR) || !is_dir(PATH4CLEAR))
die("Указанный путь не существует!");
$exclude = array(
".",
"..",
);
$convertExtensions = array('php', 'html', 'htm', 'css', 'csv', 'js', 'txt', 'log');
function GetAllFilesFromDir($dir)
{
global $exclude, $convertExtensions;
if (!file_exists($dir) || in_array($dir, $exclude))
return false;
$struct = scandir($dir);
$result = array();
if (count($struct)>0)
{
foreach($struct as $file)
{
if (is_dir($dir . SEP . $file))
{
if (!in_array($file, $exclude) && !in_array(($dir . SEP . $file), $exclude))
$result = array_merge($result, GetAllFilesFromDir($dir . SEP . $file));
}
else
{
$buf = array();
$buf['src'] = $dir . SEP . $file;
$buf['convert'] = true;
$buf['extension'] = false;
$p = strrpos($file, '.');
if ($p !== false)
$buf['extension'] = strtolower(substr($file, $p+1));
$buf['convert'] = (in_array($buf['extension'], $convertExtensions)) ? true : false;
$result[] = $buf;
}
}
}
return $result;
}
$structure = GetAllFilesFromDir(PATH4CLEAR);
$toConvert = 0;
$nonConvert = 0;
foreach($structure as $file)
{
if ($file['convert'])
$toConvert++;
else
$nonConvert++;
}?>
<h1>В указанной директории всего <?=count($structure)?> файлов.</h1>
<h2>Конвертации подлежат <?=$toConvert?> из <?=count($structure)?> файлов.</h2>
<h2>Без изменений останется <?=$nonConvert?> из <?=count($structure)?> файлов.</h2>
<?
//echo "<pre>"; print_r($structure); echo "</pre>";
$toConvert = 0;
$isConverted = 0;
foreach($structure as $file)
{
if ($file['convert'])
{
$toConvert++;
$content = file_get_contents($file['src']);
$content = iconv('windows-1251', 'UTF-8', $content);
if (file_put_contents($file['src'], $content) !== false)
$isConverted++;
}
}
?>
<h1>Переконвертировано <?=$isConverted?> из <?=$toConvert?> файлов.</h1>
Добрый день, коллеги! Уже неоднократно отвечал на форуме на вопрос "как выгрузить данные из 1С в уже существующий инфоблок на сайте?". И есть мой ответ на форуме. Но решил опубликовать здесь, в надежде что ответ на этот вопрос будет проще найти.
Инструкция на тот случай, когда вы выгрузили данные и увидели, что они выгрузились в отдельный новый инфоблок.
Идете в настройки модуля инфоблоков и ставите там галку "Показывать код загрузки из внешних источников" /bitrix/admin/settings.php?lang=ru&mid=iblock&mid_menu=1 Тогда у вас в редактировании инфоблока появится поле Внешний код (оно же XML_ID)
Идете в тот новосозданный инфоблок и смотрите у него "Внешний код" (XML_ID, EXTERNAL_ID, GUID, ГУИД), записываете, хотя бы, в буфер обмена.
Идете в свой старый существующий инфоблок и прописываете ему нужный "Внешний код", тот что в новом инфоблоке из 1С. В новом инфоблоке "Внешний код" удаляете или меняете, или, вовсе удаляете инфоблок.
Запускаете обмен.
При обмене у вас данные будут попадать в ваш существующий инфоблок.
Есть нюансы, про которые стоит помнить:
при обмене может учитываться тип инфоблока тогда нужно помимо Внешнего кода изменить тип инфоблока По умолчанию привязка к типу инфоблока выставляется в настройках Рабочий стол > Магазин > Настройки магазина > Интеграция с 1С /bitrix/admin/1c_admin.php?lang=ru Обратите внимание на параметры "Тип инфо-блока" и "При выгрузке учитывать тип инфоблока" При включенной опции "При выгрузке учитывать тип инфоблока" меняется символьный код инфоблока без опции bd72d8f9-55bc-11d9-848a-00112f43529a с опцией cat-bd72d8f9-55bc-11d9-848a-00112f43529a где cat - символьный код типа инфоблока
Есть еще одно решение В качестве внешнего кода указать FUTURE-1C-CATALOG и при первой же выгрузке из 1С данные попадут в этот инфоблок. (Решение подсказано Максимом Смирновым на форуме)
Если проставить FUTURE-1C-CATALOG в Инфоблок каталога, то товары в него грузятся. Но что нужно ставить в инфоблок торговых предложений? Ставьте в ИБ предложений FUTURE-1C-OFFERS (Подсказал Александр Ягольник)
Привет всем. Решился начать вести блог, так как появились задачи, решением которых хотелось бы поделиться, и думаю, что эти решения нужны не только мне. Перейдем к делу Исходные данные - Инфоблок новостей. - Публичный раздел новостей, реализованный компонентом news (кастомизированным).
Постановка задачи: В детальном просмотре новости вывести баннер. Баннер нужно вывести после основного текста новости, перед дополнительными свойствами.
Решение Первая мысль, которая пришла в голову - это вставить вызов $APPLICATION->ShowBanner(...) в шаблон news.detail. Такое решение даже работало некоторое время, а именно, до тех пор, пока не включили кеширование. Если включить кеширование, а в шаблоне вызывать ShowBanner, то всё, что было в кеше до этого скинется. Т.е. у меня попадало в кеш всё после вызова баннера, остальное (то что ДО) пропадало.
В результате общения с ТП битрикса родилось следующее решение: 1. В шаблон вывода новости вставляется маркер, например #BANNER_INSIDE_NEWS# 2. Создается обработчик события OnEndBufferContent. 3. В обработчике маркер заменяется на нужную строку.
Затруднение вызвало то, что $APPLICATION->ShowBanner не возвращает строку. Порывшись в исходниках, выяснил, что $APPLICATION->ShowBanner вызывает CAdvBanner::Show, а CAdvBanner::Show как раз таки и возвращает строку.
В итоге получилось следующее решение
AddEventHandler("main", "OnEndBufferContent", "ShowBannerInsideNews");
function ShowBannerInsideNews(&$content)
{
if (CModule::IncludeModule("advertising"))
{
if (strpos($content, '#BANNER_INSIDE_NEWS#') !== false)
{
$content = str_replace('#BANNER_INSIDE_NEWS#', CAdvBanner::Show('...'), $content);
}
}
}
'...' - нужный тип баннера
С удовольствием выслушаю ваши предложения и замечания. Надеюсь этот материал будет вам полезен.
Была проблема вывода баннера в зависимости от раздела (без обхода и отключения кэш)... 3 года назад. Проблема связана с КЭШ. Много и долго писал в поддержку... Но воз и ныне там. Пытался общаться с другими разработчиками, так же предлагали порнографию и костыли... Реальные проблемы, разработчиков не интересуют. Единичные обращения уходят в доработку, да и то, лишь те, которые требуют минимум усилий, либо те, что уже давно присутствуют у конкурентов и востребованы у каждого второго! Ваше решение - слишком узконаправленное и малоинтересное. Статья пустая, опубликована с целью - "засветиться", "блеснуть". Разминайте мозг на серьёзных решениях.
Вообще тема чёткая, аккуратный хак подключения любого кастом модуля, внутри кастом модуля мы уже далее может для б24 например asset файл подцепить, в неём необходимые стили, скрипты подвещивающие аккуратно доп.функционал в стандартные формы, чтобы не терять возможность обновления и не трогать стандартный интерфейс родных элементов системы.
Приветствую. Хочу поделится радостью: удалось оптимизировать работу MySQL.
В БУС монитор производительности на мощном сервере показывал следуюшее:
База данных MySQL (запись) 72 5 600 количество запросов на запись в секунду
База данных MySQL (чтение) 5 869 7 800 количество запросов на чтение в секунду
База данных MySQL (изменение) 4 251 5 800 количество запросов на изменение в секунду
Чего я только с настройками мускуля не крутил, ничего сильно ощутимого результата не давало.
Но нашлась все-таки одна настроечка, которая ну очень сильно меня обрадовала: innodb_flush_log_at_trx_commit=2 После того как я ее прописал, получил следующие циферки:
База данных MySQL (запись) 4 395 5 600 количество запросов на запись в секунду
База данных MySQL (чтение) 6 220 7 800 количество запросов на чтение в секунду
База данных MySQL (изменение) 4 643 5 800 количество запросов на изменение в секунду
Увелечение скорости записи в 60 раз меня ну очень обрадовало.
innodb_flush_log_at_trx_commit - Вам кажется, что InnoDB в сто раз медленнее MyISAM? Вероятно, вы забыли изменить значение этого параметра. Значение по умолчанию 1 означает, что после каждой завершенной транзакции (или после изменения состояния транзакции) лог должен быть сброшен на диск. Это достаточно дорогая операция, особенно если у вас нет Battery backed up cache. Многие приложения, особенно те, в которых раньше использовался MyISAM будут хорошо работать при значении 2, который означает, что не надо сбрасывать буфер на диск, а следует отправить его в кэш операционной системы. Лог по-прежнему будет сбрасываться на диск каждую секунду и максимум, что вы можете потерять - это 1-2 секунды записей. Значение 0 обеспечивает более высокую скорость, но и более низкую надежность. Есть вероятность потерять транзакции даже при падении mysql-сервера. При значении равном 2 единственная возможность потерять данные - это фатальный сбой операционной системы.
Немного передохнем и продолжим оптимизировать. Надеюсь тема не баян, и будет полезна. Обновление Руководство по настройке и установке уже рекомендует ставить innodb_flush_log_at_trx_commit=0
Павел Зюкин написал: Ибо даже в данном примере до норматива всё же не дотягивает.
Это 2012 год, с сервером на WinSrv2008 и IIS7. Там все проблемы от ужасно медленной NTFS были.
Павел Зюкин написал: Интересно как можно ещё ускорить работу базы данных?
Я давно этим вопросом не занимаюсь и не считаю себя в нем большим спецом. Но что касается конфигов, базово это ОЗУ чтоб база влезала, быстрые ssd диски, тюнинг размеров буферов InnoDB. Ну и страница диагностики /bitrix/admin/perfmon_db_server.php?lang=ru
Обсуждение данной темы меня привели к некоторым умозаключениям.
Но давайте по порядку, и так, задача: Имеем стандартный компонент и какую-то логику, которая зависит от кеша компонента либо кеширование мешает реализовать данную логику (Пример, тема форума выше). Необходимо менять идентификатор кеша в зависимости от своего параметра и при этом желательно не модифицировать сам компонент.
За все время работы с битриксом, я часто кастомизировал компонент, только из-за того, чтобы добавить какой-нибудь ключ в идентификатор кеша компонента.
А сегодня (не знаю почему не задумался об этом раньше) вдруг подумал: ведь механизм автокеширования в компонентах 2.0 устроен так, что зависит от массива настроек ($arParams) вызова компонента, а это третий параметр в методе подключения компонента $APPLICATION->IncludeComponent(). Соответственно, я могу повлиять на параметры вызова компонента, следовательно я могу изменить идентификатор кеша. Для этого даже не нужно описывать дополнительный параметр в файле parameters.php, а просто добавить ключ и значение в массив параметров вызова компонента (Но при редактирование параметров компонента из публички параметры не описанные в parameters.php потрутся. Можете описать параметр в parameters.php своего шаблона, чтобы не трогать стандартный компонент.)
Интересно будет услышать мнения разработчиков и мнения битрикс-разработчиков.
P.S.: вопрос вроде очевидный, но нигде не видел подобных мыслей
Столкнулся с проблемой - а как сделать разные кеши для поддоменов? В системе один сайт, а поддомены реализованы через соответствующее дополнение.
Добавил в параметры компонента "Каталог" новое поле и соответствующий параметр в код вызова компонента <?$APPLICATION->IncludeComponent( "bitrix:catalog", "catalog_inner", array( .......... "CACHE_GROUPS" => "N",
Но кэш все равно генерируется один и тот же для разных поддоменов. Версия Битрикс - 20.0.450 Понимаю, что текущее обсуждение давно устарело, но вдруг...
Напишу решение здесь, раз нашел) Может еще кому-то пригодится, да и самому, чтобы не забыть))) В компоненте catalog.section.list, который подключается во время работы комплексного компонента catalog (у меня это файл section_horizontal.php в шаблоне комплексного компонента catalog), есть вызов
Второй параметр - массив параметров для формирования уникального ID кеша... И в нем нет никаких параметров, кроме фильтра и зависимости от группы пользователей.
Что нужно сделать (что сделал я, помимо правок компонента, указанных в предыдущем сообщении): 1. Скопировал компонент catalog.section.list в свое пространство имен 2. Добавил параметр $arParams в массив, влияющий на ID кеша
3. В файле section_horizontal.php изменил вызов компонента catalog.section.list на свой и (внимание!) добавил параметр, который получаем из комплексного компонента catalog:
4. Для большей наглядности в .parameters.php шаблона компонента catalog изменил PARENT своего параметра, чтобы добавить его в блок настроек кеширования
Всем привет! Отношения к Битрикс данный пост не имеет. Просто полезная функция по форматированию строки (цены) с разделением на тысячные на яваскрипте. На оригинальность не претендую
function formatPrice (price)
{
var result = '';
if (typeof(price) != 'undefined')
{
if (typeof(price) == 'number')
price = price.toS tring();
if (price.length > 0)
{
var testPrice = /^([\d]+)|([\d]+\.|,[\d]+)$/;
if (testPrice.test(price))
{
var str, integral, decimal, delim, regex;
regex = /\.|,[\d]+$/ig;
delimPos = price.search(regex);
if (delimPos >= 0)
{
integral = price.substr(0, delimPos);
decimal = price.substr(delimPos+1);
}
else
{
integral = price;
decimal = '';
}
str = integral;
var blockSize = 3;
if (str.length > blockSize)
{
while (str.length > 0)
{
if (str.length > blockSize)
{
result = ' ' + str.substr((blockSize*(-1)), blockSize) + result;
str = str.substr(0, (str.length - blockSize));
}
else
{
result = str + result;
str = '';
}
}
result = decimal.length > 0 ? result+'.'+decimal : result;
}
else
{
result = str + (decimal.length > 0 ? '.'+decimal : '');
}
}
else
{
result = price;
}
}
}
return result;
}
Сегодня коллеги озвучили задачу: Необходимо выбрать все элементы инфоблока у которых дублируются символьные коды. Да так чтоб и идентификаторы элементов в этом же запросе выбрались. Т.е. нужно всё выбрать одним запросом. А потом уже обновить коды у элементов.
Я говорю: "Да, легко!", и пишу запрос:
sel ect
CODE, COUNT(ID) as CNT, GROUP_CONCAT(ID) as IDList
fr om
b_iblock_element
WHERE
IBLOCK_ID = 1
GROUP BY CODE
HAVING CNT > 1
Ребята говорят: "Клёво, конечно, но не по феншую! Надо бы на API." Тут мы вспоминаем про D7, DataManager и registerRuntimeField. Даже показывают куски кода с попыткой решения задачи. Мы добавляем туда 1 строку и задача решена!
А запрос API сгенерировало такой же как и у меня практически
SELECT
`iblock_element`.`CODE` AS `CODE`,
count(`iblock_element`.`CODE`) AS `cnt`,
GROUP_CONCAT(`iblock_element`.`ID`) AS `IDList`
FR OM `b_iblock_element` `iblock_element`
WH ERE `iblock_element`.`IBLOCK_ID` = 1
GROUP BY `iblock_element`.`CODE`
HAVING count(`iblock_element`.`CODE`) > 1
В общем, теперь можно и без прямых SQL-запросов решать нетривиальные задачи с помощью API.
Александр Гусев написал: чем хуже прямой запрос, по сравнению с таким кодом? ))
C точки зрения разработки, хуже тем что это запрос, а не код на API. Но то чтобы написать этот код на API пришлось изрядно попыхтеть - это да, отталкивает )
Александр Гусев написал: чем хуже прямой запрос, по сравнению с таким кодом? ))
Если задача на один раз посмотреть дубли - можно и прямым запросом, быстро и по хардкору) Если это часть какого-то функционала - лучше API. Таблицы при обновлении могут смениться, а API поддерживает обратную совместимость. По крайней мене старается поддерживать.
Сделаю здесь для себя небольшое хранилище полезных SQL-запросов, которые частенько приходится использовать. Надеюсь это будет полезно кому-то кроме меня.
Все запросы можно выполнить в консоле запросов /bitrix/admin/sql.php?lang=ru
Выбрать элементы инфоблока, которые привязаны больше чем к одной секции нужно указать идентификатор инфоблока e.IBLOCK_ID = 13
select
e.ID as ID
,e.ACTIVE as E_ACTIVE
,e.NAME as NAME
,e.IBLOCK_ID as IBLOCK_ID
,count(se.IBLOCK_ELEMENT_ID) as cnt
,GROUP_CONCAT(se.IBLOCK_SECTION_ID) as sections
from
b_iblock_section_element se
left join b_iblock_element e on e.ID = se.IBLOCK_ELEMENT_ID
left join b_iblock_section s on s.ID = se.IBLOCK_SECTION_ID
where
e.IBLOCK_ID = 13
group by se.IBLOCK_ELEMENT_ID
having (cnt > 1)
order by cnt desc
Выбрать все товары для которых установлено несколько значений одного типа цены Устанавливаем фильтр по идентификатору типа цены p.CATALOG_GROUP_ID = 10
select
p.PRODUCT_ID
,b.NAME
,b.CODE
,b.TIMESTAMP_X
,count(p.PRODUCT_ID) as cnt
from
b_catalog_price p
left join b_iblock_element b on p.PRODUCT_ID = b.ID
where
p.CATALOG_GROUP_ID = 10
group by p.PRODUCT_ID
having cnt > 1
order by cnt desc
Проверить есть ли в базе пользователи с одинаковыми логинами
select
login
,count(login) as cnt
from
b_user
group by login
having cnt > 1
order by cnt desc
Почему же не корректен? Запрос как раз таки и вернет товары у которых этот режим включен, т.к. >1 цены по 1 типу цен и есть расширенный режим.
У нас была проблема, что на сайте в каталоге задублировались товары. Это вызвало то, что как раз включился режим расширенного управления ценой и туда вписалась одна цена для пустого количества товара. Что порадило дублирование элементов в списках в админке и в каталоге в публичке. Чтобы отловить такие товары из тысяч использовали этот запрос.
Мы, видимо, по разному понимаем терминологию. Режим расширенного управления ценами - это зависимость цены от количества товара (т.е. у записей совпадает только значение CATALOG_GROUP_ID). Дублирование цен - это две и более записи в базе с одинаковыми комбинациями значений полей CATALOG_GROUP_ID, QUANTITY_FROM и QUANTITY_TO. Если задача скрипта - выбрать и то, и то - он свою задачу выполняет. Если же он предназначен для поиска именно дубликатов цен - для расширенного режима управления ценами будет ложное срабатывание.
Проблема была в том что было заполнено поле с ценой, а поля QUANTITY_FROM и QUANTITY_TO были пустые. Расширенный режим у нас на сайте не используется, поэтому нам нужно было получить товары у которого большей одной записи по конкретному типу цен. Отслеживать дубли цен - совсем другая задача
У нас есть хранилище, которым все активно пользуются. Там лежат планы, документы, отчеты и много чего еще. Так вот мне поднадоело каждый раз нажимать Update, когда открываю папку с хранилищем и я решил сделать так, чтобы обновления происходили без моего участия. Покурил доки и сделал следующее: в планировщике заданий Windows я создал задачу, которая выполняется в рабочие дни с 9 до 21 с интервалом в 1 час и запускает процесс tortoiseproc /command:update /path:d:\svn /closeonend:3
Эта штука запускает апдейт и закрывает информационное окно автоматически, если нет ошибок, конфликтов и слияний.
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».