Месяца сменяются месяцами, дни сменяются днями, время летит просто не заметно и вот уже пятый номер журнала Веб-Аналитик.ИНФО готов к выходу в свет. В этом августовском номере издания мы подготовили для вас ряд интересных и эксклюзивных интервью. Для рубрики журнала «Хостинг» было сделано интервью с генеральным директором Parking.ru Игорем Федотченко, который рассказал нам много интересного о своей хостинг-компании и планах на будущее. Рубрика «Веб-Разработки» порадует всех читателей журнала интервью с Антоном Долганиным, который недавно получил статус 1С-Bitrix Most Valuable Professional. Данный статус введен компанией 1С-Битркс буквально месяц назад, и призван отмечать разработчиков и специалистов, внесших огромный вклад в развитие продукта CMS Битрикс. В рамках рубрики «CMS» мы побеседовали с Олегом Никитиным, техническим директор компании «Страта Технологии», разработчик Twilight CMS.
Возвращает только элементы с 3 инфоблока , если вызвать для каждого инфоблока отдельно, то работает нормально. Кто нибудь сталкивался с подобной проблемой
Недавно компания 1С-Битрикс ввела новый статус для разработчиков и партнеров: 1С-Bitrix Most Valuable Professional (1С-Bitrix MVP). Такие статусы весьма популярны на западе, в частности у нас наиболее известен статус Microsoft Most Valuable Professional, который ежегодно присуждается компанией Microsoft за достижения в различных областях.
Как поясняют в самой компании, далее цитирую: Статус 1С-Bitrix MVP – это признание огромного вклада конкретных специалистов в общее дело, принятия ценностей компании, готовности поделиться своими знаниями и опытом с коллегами и сообществом в целом. 1С-Битрикс рассчитывает, что таких специалистов со временем будет становиться больше. Специалист со статусом 1С-Bitrix MVP сможет принимать участие в процессе обсуждения разработок и планов на разработку продуктов, сможет принимать участие в обсуждении планов развития продуктов «1С-Битрикс» с разработчиками «1С-Битрикс», и получать новые альфа-версии продуктов «1С-Битрикс». Кроме того, ему будет предоставляться доступ к внутренним интранет-ресурсам с возможностью ведения личного блога на сайте «1С-Битрикс» и расширенный доступ к открытым ресурсам на сайтах «1С-Битрикс». Присуждаемый статус действует в течение одного года.
Первым таким специалистом стал Антон Долганин. 25 июня на партнерской конференции 1С-Битрикс в Калининграде ему был вручен этот почетный статус. Я связался с Антоном, и он любезно согласился ответить на наши вопросы в рамках интервью для августовского номера журнала .
Недавно пришел к нам клиент и сказал: «Хочу при редактировании товара указывать скидку на этот товар, только чтобы применялась она исключительно для данного товара, причем была возможность вводить скидку как в процентах, так и фиксированную величину в рублях». Порывшись в скидках увидел, что к скидке можно привязывать товар, на который она будет дейсвовать. Однако, как обычно, процесс выбора товара не совсем удобен.
Немного подумав, родился следующий алгоритм:
Создаем два свойства у инфоблока FIXED_DISCOUNT и PERCENT_DISCOUNT. При срабатывании событий OnAfterIBlockElementAdd и OnAfterIBlockElementUpdate проверяем заполненность этих свойств. Если свойство скидки заполнено - создаем скидку( н.п. percent10 — если в PERCENT_DISCOUNT стоит значение 10) и в список товаров на которые действует эта скидка добавляем ID редактируемого элемента. Если же скидка percent10 уже существует, то просто дописываем товар к ней. Если поля со скидками оказываются пустыми надо проверить, к какой скидке принадлежит редактируемый товар и убрать его из списка. Важный момент! Необходимо проверять есть ли в списке товаров у скидки хотя бы 1 элемент, если нет — то скидку надо удалить, иначе она будет действовать на все товары.
Такой же подход и к фиксированной скидке. Ниже приведен исходный код для реализации ввода процентной скидки в форме редактирования товара. Помещаем его в init.php и не забываем создать свойство типа «строка» или «целое число» с кодом PERCENT_DISCOUNT.
AddEventHandler("iblock", "OnAfterIBlockElementUpdate", Array("CYDiscount", "SetDiscount"));
/* до сохранения элемента сбрасываем скидку, на случай если она изменилась */
AddEventHandler("iblock", "OnBeforeIBlockElementUpdate", Array("CYDiscount", "DropDiscount"));
class CYDiscount
{
function SetDiscount($arFields)
{
if(!CModule::IncludeModule('catalog'))
return;
/* Выбираем элемент который изменяется */
$obs = CIBlockElement::GetByID($arFields["ID"]);
if($res = $obs->GetNextElement())
{
/* Достаем свойства */
$props = $res->GetProperties();
$pdisc = $props["PERCENT_DISCOUNT"]["VALUE"];
/* Проверяем валидность введенной скидки */
if(!$pdisc || !intval($pdisc))
{
/* Удаляем скидку если скидка не целое число или пустое */
CYDiscount::DropDiscount($arFields);
return;
}
$discount = $pdisc;
/* Проверяем размер скидки, чтобы скидка была от 1 до 99 % включительно*/
if($discount == 0 || $discount == 100)
CYDiscount::DropDiscount($arFields);
}
else
return;
/* Выбираем скидку по имени, percent - это префикс для скидки, который использую я, допустим скидки 1% и 10 % будут именть имена percent1 и percent10 соответственно */
$dbProductDiscounts = CCatalogDiscount::GetList( array(), array( "ACTIVE" => "Y", "NAME"=>"percent".$discount) , false, false, array("ID"));
if($arProductDiscounts = $dbProductDiscounts->GetNext())
{
/* Выбираем все товары которые принадлежат данной скидке */
$res = CCatalogDiscount::GetDiscountProductsList( array() , array("DISCOUNT_ID"=>$arProductDiscounts["ID"]));
$ids = array();
/* Собираем новый массив ID товаров, которые уже были в скидке*/
while($el = $res->Fetch())
$ids[] = $el["PRODUCT_ID"];
/* и дописываем к нему ID редактируемого товара */
$ids[] = $arFields["ID"];
/* Обновляем скидку */
CCatalogDiscount::Update($arProductDiscounts["ID"], array("ACTIVE"=>"Y", "PRODUCT_IDS" => $ids));
}
else
{
/* если такой скидки не существует, создаем ее и привязываем к ней 1 товар */
CCatalogDiscount::Add(array("SITE_ID"=>"s1", "ACTIVE"=>"Y", "NAME"=>"percent".$discount, "VALUE_TYPE"=>"P", "VALUE"=>$discount, "CURRENCY"=>"RUB", "PRODUCT_IDS"=>array($arFields["ID"])));
}
}
function DropDiscount($arFields)
{
if(!CModule::IncludeModule('catalog'))
return;
/* Выбираем все скидки */
$dbProductDiscounts = CCatalogDiscount::GetList( array(), array( "ACTIVE" => "Y") , false, false, array("ID", "NAME"));
while($arProductDiscounts = $dbProductDiscounts->GetNext())
{
/* По префиксу проверяем наша ли это скидка */
if(substr_count($arProductDiscounts["NAME"], "percent") == 1)
{
$res = CCatalogDiscount::GetDiscountProductsList( array() , array("DISCOUNT_ID"=>$arProductDiscounts["ID"]));
$ids = array();
/* Заново группируем массив элементов этой скидки */
while($el = $res->Fetch())
$ids[] = $el["PRODUCT_ID"];
$idsn = array();
/* Удираем из массива элемент который редактируется */
for($i=0; $i < count($ids); $i++)
if($ids[$i]!=$arFields["ID"])
$idsn[] = $ids[$i];
/* проверяем, если в скидке нет элементов то удаляем ее, иначе - обновляем */
if(count($idsn)>0)
CCatalogDiscount::Update($arProductDiscounts["ID"], array("ACTIVE"=>"Y", "PRODUCT_IDS" => $idsn));
else CCatalogDiscount::Delete($arProductDiscounts["ID"]);
}
}
}
}
P.S.
В обеих функциях желательно сделать обертку для каких инфоблоков выполнять это действие. Например так:
завести новый тип цены "Цена со скидкой" и при редактировании элемента пересчитывать "Базовую цену" с введенной скидкой и записывать ее в новый тип цены. Но такой вариант отпал по техническим причинам.
Это личный FAQ, который собирается на основании переписки народа на форуме. Авторов ответов проще перечислить одной ссылкой -
Собирается в полуавтоматическом режиме. Написан небольшой user.js, который внедряет дополнительный функционал в разметку страницы форума(отмечаю галочками что нужно сохранить) и делает POST в этот топик по кнопке.
Как наберётся достаточно материала — постараюсь его структурировать.
обновляли версию Битрикс его штатными средствами с версии 6.0 до 9.0. Отказалось работать ЧПУ из-за того что .htaccess не обновляется. Требуется дописать , а лучше переписать полностью:
Часто бывает, что нужно выполнить какую-то тяжелую работу, например, перенести данные. И на такое может уходить не минуты, а часы. Проще разбить на шаги. Делюсь файлом-заглушкой, в который вы без труда сможете вставить любую свою обработку.
В рамках рубрики «Хостинг» журнала , мы берем интервью у руководителей различных хостинг-компаний. Для августовского номера журнала мы подготовили интервью с генеральным директором Parking.ru - Игорем Федотченко, которое я с удовольствием вам представляю до выхода номера в свет (журнал традиционно выходит в начале каждого месяца).
Станислав Горнаков: Добрый день, Игорь! Приветствуем вас на страницах журнала Веб-Аналитик.ИНФО. Игорь, как давно вы на рынке хостинг-услуг, как начинали свой бизнес и почему решили заниматься именно хостингом?
Игорь Федотченко: Услуги хостинга мы начали оказывать в 1999 году. Логика была простая – наша компания занималась разработкой веб-сайтов, и клиентам было удобно иметь дело с одной компанией, с одними людьми по всем вопросам, связанным с созданием и функционированием сайта - от правки текстов и размещения баннеров до технической поддержки. Этот бизнес довольно быстро начал расти, появлялись новые клиенты, и мы приняли решение выделить его в отдельный бизнес-юнит внутри компании, тогда же появился и отдельный бренд – Parking.ru.
При проведении опросов на корпортале иногда возникает проблема: все пользователи заходят на портал под одним IP и поэтому нет возможности дать каждому пользователю проголосовать только один раз, т.к. в опросах сейчас существует только одновременная защита от накруток по ID пользователя и IP-адресу.
Недавно делали сайт крупной городской сети магазинов фототоваров — куча товаров, различные типы продукции, несколько типов цен(ну и, естественно, связь с 1С). Поскольку товары имеют различные характеристики, решили их хранить в разных инфоблоках. При импорте продукции автоматически создаем папки, в них кладём index.php. Но index.php должен быть персонифицирован - указан свой идентификатор инфоблока, выбраны свойства для фильтра, свойства для детального просмотра и т.п., а кое-где должен быть и шаблон компонента другой
Представим ситуацию: у вашей конторы есть много сайтов на Битриксе, есть другие внутренние ресурсы и есть сотрудники (ещё бы). Сайты различные по редакциям — начиная от Старта и далее.
Столкнулся вчера со следующей задачей: имеется инфоблок N, у него есть свойство M типа «Привязка к элементу в виде списка», да к тому же множественное. Необходимо сделать, чтобы на странице добавления элемента инфоблока N можно было добавить элемент M, не перезагружая страницы (чтобы содержимое остальных полей сохранилось).
Убедившись в техподдержке, что стандартного решения нет, я решил изменить страницу редактирования/добавления для инфоблока N. Возможно мой пост поможет кому-то сэкономить время. Покажу сразу, как это работает.
То есть, можем выбрать из списка существующих элементов, а можем в два клика без перезагрузки создать новый.
Представим достаточно типовую ситуацию: клиент - серьезная организация, служба безопасности едва ли вообще готова открыть доступ к своим серверам, даже для разработки. В итоге все, что дают - это собственно 80й порт HTTP, на котором и будет висеть сайт. Про FTP говорят - забудьте, не дадим.
Бывают еще несколько случаев, при которых ни FTP, ни SFTP достать невозможно. Править же пару десятков шаблонов компонентов в админке утомительно.
Тут то нам на помощь и приходит протокол WebDAV, который позволяет стантарными средствами Windows (вобщем-то в других операционках проблем с использованием также нет) подключить хранилище с файлами сайта как обычный сетевой диск. Соответственно на сетевом диске файлы можно править уже привычным редактором кода.
Описание модуля здесь:
Вкратце по установке: в маркетплейсе находим в списке модуль lol.webdavadm, устанавливаем, потом в "Мой компьютер" вызываем команду "Подключить сетевой диск", вводим адрес вида: http://#SITE_NAME#/bitrix/admin/lol_webdavadm_server.php При подключении нужно ввести логин-пароль пользователя с правами администратора.
Модуль бесплатный, распространяется "как есть". В качестве WebDAV сервера используются библиотеки PEAR. Все библиотеки поставляются вместе с модулем, так что ничего дополнительно ставить не нужно.
Решил несколько разнообразить нашу замечательную CAPTCHA. Существует множество различных вариантов CAPTCHA, стандартно используется обычный ввод с картинки. В данной статье мы попытаемся добавить еще 3 варианта 1) Математическое выражение 2) Последовательность 3) Цвет
Речь пойдет о подключении к VMBitrix внешних административных программ, таких как HeidiSQL. Также может быть полезно для установки удаленного доступа к базе данных на виртуальной машине с другого сайта или приложения.
Итак представим что у вас или у вашего клиента большой, высоко-посещаемый сайт. Также представим инфоблок в котором больше 80k элементов. Наверняка у этих элементов есть детальное описание и я уверен 99,9% что ID кэша это ID элемента инфоблока.
Итак у нас получается что в папке допустим /bitrix/cache/object_80k/ - 80 000 папок с кэшем, т.е.
Какой бы у вас не был сервер, поиск папки в общем списке из 80k занимает время. Плюс если сайт посещаемый то вы догадываетесь что происходит, нагрузка на ровном месте, даже в том месте, где мы пытаемся ее уменьшить.
Итак решение, на мой взгляд просто очень красивое и элегантное, его подсказал мой коллега Николай Рыжонин [
Пример:
Итак функция создаст путь вида /object_80k/as/df/ID и тем самым разобьет 80k папок на под папки, тем самым уменьшит время поиска кэша и общую нагрузку на сервер.
Если на сайте есть заполнение веб-формы с полем типа "файл" (например ) то на почту приходит письмо со ссылкой на этой файл такого вида:
.
Когда мы её открываем неавторизированным пользователем то выдает сообщение: "Ошибка! Файл не найден.":
Это не есть хорошо, так как удобнее чтобы резюме сразу шли на hr менеджера, которому совсем не обязательно вводить свой логин и пароль чтобы посмотреть резюме.
К тому же так можно переслать кому угодно это письмо, зная что оно у всех откроется.
Итак, чтобы разрешить просматривать резюме, прикрепленные к веб-форме, и в то же время не дать кому угодно просматривать весь список резюме можно делать так:
1) В настройках группы "все пользователи" или "everyone" убедиться что для веб-форм стоит доступ "по умолчанию" или "доступ закрыт".
2) В настройках вер-формы "резюме" для группы "Everyone" поставить доступ "Работа со всеми результатами в соответствии с их статусами".
После этого по ссылке любой пользователь сможет скачать резюме:
И в то же время у него не получится посмотреть остальные результаты, так как в админке у него не будет доступа к веб-формам.
Ну, и еще в этом случае нужно убедиться что на сайте нету компонентов вроде bitrix:form.result.list (просмотр результатов формы) которые могут показывать результаты веб-форм.
На улице стоит страшная жара, синоптики замечают, что такой знойной погоды в центральных районах России, да и в большинстве других областей и стран ближнего зарубежья давно не было. Нашу работу над журналом спасает только N-количество сплит систем, развешанных в офисе умными техниками. Надеемся, что и в большинстве дата-центров, где вы все храните свои сайты и проекты, искусственный климат в помещении такой же располагающий к работе, как и у нас в офисе.
В июльском номере журнала мы предлагаем вам ряд интересных и поучительных статей. В частности вы узнаете о новом домене .РФ и борьбой с киберсквоттингом, познакомитесь с облачным хостингом Slidebar.ru, изучите руководство по уходу за дисковой подсистемой выделенного сервера, сможете прочитать обзор почтового сервера iRedMail. Мы научим защищать от взлома сайт на Wordpress, расскажем с каким оборудованием российского производства работают наши ИТшники, а также вы самостоятельно сможете создать свой URL Shortener.
Кроме этого, как всегда мы предлагаем интересные интервью. В этом номере вы найдете интервью с Михаилом Ивановским, который является руководителем отдела маркетинга хостинг-провайдера КОМТЕТ. Мы пообщались с Сергеем Котыревым, директором компании «Юмисофт», разработчик UMI.CMS. Также мы публикуем очень интересное интервью с Михаилом Токовининым, руководителем компании QSOFT, который поделился своими мыслями относительно работы с регионами. Напоследок заметим, что у всех наших читателей теперь есть возможность полистать и почитать журнал прямо на сайте издания в разделе «Журналы». Для этих целей используется удобный флеш-сервис, дающий возможность ознакомиться с очередным номером журнала прямо в своем любимом браузере. Ждем ваших откликов и других предложений на форуме издания.
Содержание номера
Наша кремневая долина
Хостинг
Интервью с Михаилом Ивановским [ Руководитель отдела маркетинга. Хостинг-провайдер КОМТЕТ ] .РФ и успехи борьбы с киберсквоттингом Руководство по уходу за дисковой подсистемой выделенного сервера Знакомство с облачным хостингом Slidebar.ru Локальное и удаленное предотвращение атак класса DDoS Hyper-V и устройства хранения данных Блочное кеширование на стороне клиента Обзор и установка почтового сервера iRedMail Nagios: уведомление о критических проблемах по мобильному телефону
Доска объявлений
Куплю, продам хостинг
Каталог
Хостинг-компании
CMS
Интервью с Сергеем Котыревым [ Компания «Юмисофт» Разработчик UMI.CMS Защищаем свой сайт на Wordpress от взлома Django: создание простейшего приложения
Каталог
CMS
Веб-разработки
Интервью с Михаилом Токовининым [ Руководитель компании QSOFT ] Разработка с использованием WEB SQL DB и Local Storage Гаджет для 1С-Битрикс В помощь веб-разработчику: эмуляторы мобильных устройств Visual Studio 2010: четыре полезнейших расширения Работа с веб-сервисом в Pocket Internet Explorer Пишем свой URL Shortener
Каталог
Веб-студии
Интернет
Интервью с Дмитрием Бехтеревым [ Директор по маркетингу Компания Paragon Software] Оборудование российского производства или один день из жизни ИТшника Отслеживаем эффективность рекламы в интернет-магазине Как фрилансеру распознать нежелательного заказчика? Opera FAIL Краткий обзор изменений OpenSUSE 11.3
Скачать журнал бесплатно или почитать журнал online можно здесь:
Иногда бывает нужным вывести что-то в head, но из какой-то компоненты. Ладно, если это скрипты, или css, есть стандартный функционал. Но что делать с более хитрой задачей.