метка: Bitrix

Резайл (Thumbnail) изображения в bitrix №2

Метод создает уменьшенную копию изображения sourcePath.

bool
CreateThumbnail(
 string sourcePath,
 string previewPath,
 int maxWidth,
 int maxHeight
);
sourcePath Абсолютный путь к исходному изображению, для которого необходимо сделать уменьшенную копию.
previewPath Абсолютный путь к файлу, в который будет сохранена уменьшенная копия изображения.
maxWidth Максимальная ширина уменьшенного изображения.
maxHeight Максимальная высота уменьшенного изображения
<?
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/classes/general/wizard.php");

$success = CWizardUtil::CreateThumbnail($_SERVER["DOCUMENT_ROOT"]."/big.gif",$_SERVER["DOCUMENT_ROOT"]."/small.gif", 100, 100);

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");
?>

access denied: /bitrix/modules/main/admin/define.php

Вот пришли опять люди ко мне  с поисковиков по запросу «access denied: /bitrix/modules/main/admin/define.php»

Дорогие горе разработчики! Хватит вбивать в запросы «access denied: /bitrix/modules/main/admin/define.php» Мне кажется тут логично поставить права на запись в файл и все у Вас заработает.

Ресайз изображений Bitrix

Ресайз изображений Bitrix

Встала задача делать миниатурки из изображений загруженных в анонсе и изображений загруженных в дополнительное свойство PHOTO.
В этом нам поможет CFile::ResizeImageGet. Синтаксис у него таков

array CFile::ResizeImageGet(
    mixed file,
    array arSize,
    const resizeType = BX_RESIZE_IMAGE_PROPORTIONAL,
    bool bInitSizes = false
);

file — сомо изображение
arSize — массив с размерами для изображения
resizeType — тип масштабирования:
—— BX_RESIZE_IMAGE_EXACT — масштабирует в прямоугольник $arSize без сохранения пропорций
—— BX_RESIZE_IMAGE_PROPORTIONAL — масштабирует с сохранением пропорций, размер ограничивается $arSize
—— BX_RESIZE_IMAGE_PROPORTIONAL_ALT — масштабирует с сохранением пропорций, размер ограничивается $arSize, улучшенна обработка вертикальных картинок.

Пример работы на свойстве PHOTO

$e=CIBlockElement::GetProperty($arResult["IBLOCK_ID"],$arResult['ID'],array(),array("CODE"=>"PHOTO"));
while($xx=$e->Fetch())
{	if($x=CFile::GetFileArray($xx['VALUE']))
	{	$y=CFile::ResizeImageGet(
			$xx['VALUE'],
			array("width" => 150, "height" => 150),
			BX_RESIZE_IMAGE_EXACT,
			false
		);
		$k=$xx["DESCRIPTION"];
		echo'<a href="'.$x['SRC'].'"><img src="'.$y["src"].'" alt="'.$k.'" title="'.$k.'"/></a>';
	}
}

Привер на превьюшке из анонса

$renderImage = CFile::ResizeImageGet($arElement["PREVIEW_PICTURE"], Array("width" => 114, "height" => 114), BX_RESIZE_IMAGE_EXACT, false);
echo '<img title="'.$arElement["NAME"].'" alt="'.$arElement["NAME"].'" src="'.$renderImage["src"].'" />';

Динамический фильтр по свойству bitrix

Имеем информационный блог в котором определёно свойство-список «Производитель» со списком всех производителей продукций публикуемой в каталоге. На сайт подключаем компонент каталог и к нему прикрепляем наш информационный блок. В настройках выставляем в блоке «Настройки фильтра» в графе «Свойства:» пункт «Производитель». После сохранения у нас должна появиться страница с выводом каталога. При переходе в какую либо категории каталога появляется фильтр со списком наших производителей. Как известно в списке фильтрации будут присутствовать все производители которые есть в свойстве информационного блока, но зачем мне весь список производителей если на странице три продукта двух производителей. Ну конечно же незачем.

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

Решение:
В комплексном компоненте в инклуде компонента фильтра добавляем еще один элемент в котором будет храниться идентификатор раздела в котором находиться данный пользователь. В моем случае он называется «CN». Далее открываем на редактирование шаблон фильтрации предварительно скопировав его себе в шаблон или удобное Вам место. В нем я заменил содержимое элемента таблицы


#PHP CODE#
$rsItems = CIBlockElement::GetList(
	false,
	array(
		"IBLOCK_TYPE"=>$arParams["IBLOCK_TYPE"],
		"IBLOCK_ID"=>$arParams["IBLOCK_ID"],
		"IBLOCK_LID"=>SITE_ID,
		"ACTIVE"=>"Y",
		"SECTION_ID"=>$arParams["CN"],
	),
	array("PROPERTY_COMPANY"),
	false,
	array(
		"ID",
		"NAME",
		"PROPERTY_COMPANY",
	)
);
echo '<select name="arrFilter_pf[COMPANY]"><option value="">(все)</option>';
while($arItem = $rsItems->GetNext()){
	echo '<option value="'.$arItem['PROPERTY_COMPANY_ENUM_ID'].'">'.$arItem['PROPERTY_COMPANY_VALUE'].'</option>';
}
echo '</select>';

Вот так вот у меня теперь на страницы категории выводиться в список только те производители чей товар присутствует на странице.

Продление жизни демки bitrix

За контроль демки отвечают хэшированные значения дат в базе данных и в одном из фалов.
1. Ставим на локалке новый битрикс
2. Вытаскиваем из таблицы b_option

NAME=>admin_passwordh VALUE=>FVkQfGYUBgYtCUVcBhcECgsTAQ==


Вот как раз вот это значение VALUE ставим в действующий битрикс.
3. В файле /bitrix/modules/main/admin/define.php

define("TEMPORARY_CACHE", "ARtsfwYHb2MMdAgebRtkG2sA");


забираем хэш и ставим нужный битрикс.
4. Очищаем /bitrix/managed_cache/
Все. Теперь демка продлилась на соответствующий срок.

Создание виртуальных хостов в виртуальной машине Битрикс

Предположим, у нас есть вебсервер с настроенной связкой Apache — Nginx, например, Bitrix Virtual Appliance, и мы хотим сделать на этом сервере дополнительный виртуальный хост (или несколько хостов).

  1. Заведём папку для нашего будущего виртуального хоста. Где она будет находиться — не принципиально. Мне удобнее держать виртуальные хосты в папке /var/vhosts. Допустим, мы создаём хост с именем virtualka1, это значит, что нам надо создать папку /var/vhosts/virtualka1. Внутри нам понадобятся еще 2 папки: www — содержимое этой папки будет доступно из браузера, и log — в этой папке будем держать логии нашей виртуалки. Разумеется все манипуляции делаются от root’а.
  2. Теперь созданную нами папку надо сделать доступной для пользователя bitrix, от которого обычно и осуществляется вся работа с сайтом. Для этого, находясь в папке /var/vhosts, мы выполняем команду
    chown –R bitrix:bitrix virtualka1/

    Теперь пользователь bitrix может делать с этой папкой всё. Для большего удобства, создадим символическую ссылку на эту папку в домашней директории пользователя:

    ln –s /var/vhosts/virtualka1 /home/bitrix
  3. Переходим к настройке серверов Nginx и Apache. Конфиги будем располагать таким образом, что насторйка каждого виртуального хоста будет храниться в отдельном файле в папке sites-available. А в папке sites-enabled будут лежать симлинки на конфиги тех виртуалок, которые нам нужны. Таким образом можно будет легко разобраться где какой конфиг лежит и, при необходимости, отключить ненужные путём удаления симлинка.Nginx

    Находим файл /etc/nginx/nginx.conf и добавляем в самый конец перед закрывающей скобкой } такую строчку:

    include /etc/nginx/sites-enabled/*;

    Это заставит nginx грузить конфиги из папки sites-enabled. Разуемеется папки sites-available и sites-enabled должны существовать в директории /etc/nginx, если их нет, то надо создать. Теперь в папке sites-available создаём файл virtualka1 с таким содержимым:

    server {
      listen 80;
      server_name virtualka1;
      server_name_in_redirect off;
      access_log /var/vhosts/virtualka1/log/nginx_access.log common;
      index index.php;
      error_page 500 502 503 504 /500.html;
      error_page 404 = /404.php;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $host:80;
      client_max_body_size 1024M;
      client_body_buffer_size 4M;
      root /var/vhosts/virtualka1/www;
    
      location / {
        expires 3d;
        proxy_pass http://127.0.0.1:8888;
      }		
    
      location ~ (/|\.php)$ {
        proxy_pass http://127.0.0.1:8888;
      }
    
    }    

    Всё, осталось сделать симлинк на наш конфиг в папку /etc/nginx/sites-enabled/.

    Apache

    Проконтролируем, чтобы в конце файла /etc/apache2/apache2.conf была строчка Include /etc/apache2/sites-enabled/, а так же, чтобы были папки /etc/apache2/sites-available и/etc/apache2/sites-enabled. Если все хорошо, то в папке /etc/apache2/sites-available создаём файлvirtualka1 с таким содержимым:

    <VirtualHost *:8888>
    
      ServerName virtualka1
    
      ServerAdmin webmaster@localhost
    
      DocumentRoot /var/vhosts/virtualka1/www
    
      ErrorLog /var/vhosts/virtualka1/log/apache2_error.log
      CustomLog /var/vhosts/virtualka1/log/apache2_access.log combined
    
    </VirtualHost>
    

    Делаем симлинк на созданный конфиг в папку /etc/apache2/sites-enabled/.

  4. Осталось перезапустить сервера:
    /etc/init.d/nginx restart
    /etc/init.d/apache2 restart
    

Всё, виртуалка должна работать. Проверялось на BVA 1.6.

Есть один нюанс: исходные конфиги виртуалок битрикса намного больше, потому что заточены специально под него (например, там есть специальная настройка для HTML-кэшa). Я повыкидывал из них всё, на мой взгляд, не нужное, ведь у меня на этих виртуалках далеко не всегда крутиться битрикс :)

Для тех, кому лень вручную всё это делать

Мне вот лень, поэтому я написал себе скриптик. В качестве единственного параметра он принимает название виртуалки, оно же название БД, оно же логин к БД и пароль к БД. Да, скрипт автоматически создаёт и базу тоже.

Способ применения:

crSite.sh virtualka1

Не забываем разрешить скрипту исполняться.

crSite

(с)