Как стать автором
Поиск
Написать публикацию
Обновить

Bitrix. Разработка. Как не набивать данные для тестирования вручную.

Время на прочтение10 мин
Количество просмотров2.4K
Многие ругают Битрикс, приводят примеры огромных запросов, плюются на ресурсоёмкость… и я понимаю причины.

Битрикс действительно далеко не идеален, но с моей точки зрения заслуживает внимания. Это сейчас самая зарабатывающая CMS как минимум в России.
Т.е. знание Битрикс — это весомый вклад в карман разработчика.

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

Статья №1. Как не набивать данные для тестирования вручную.
В разработке практически любого проекта возникает проблемма набивки данных для тестирования. Это дело меня лично всегда сильно утомляло.
Окончательно решив, что я разработчик, а не оператор взялся за скрипт.

Итак задача: разработать скрипт для забивки тестовых данных(рыбы) в Инфоблоки проекта на Битрикс.

Рыбу для статей было решено брать на ru.lipsum.com.

Итак что получилось, скрипт:
<?
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
CModule::IncludeModule("iblock");
?>
<?
    
### CONFIG ###
    
$file "delfin_test.dat1";

    
### TOOLS ###
    
function getIpsum$cnt$what)
    {
        
$url "http://www.lipsum.com/feed/html?amount=$cnt&what=$what";
        
$text file_get_contents($url);
        
preg_match("'<div id=\"lipsum\"[^>]*?>(.*?)</div>'si"$text$matches); 
        return 
$matches[1];
    }
?>
<?
    
include( $file );
    
    
$obSect = new CIBlockSection;
    
$obItem = new CIBlockElement;

    while ( list(
$IBLOCK_ID$arrCfg) = each($cfg) )
    {
        
$sectCnt 0;
        
$itemCnt =0;
        
$sect = array();
        
$time strtotime("-60 days");

        if ( 
$arrCfg["sect_count"] > )
        {
            for (
$i 0$i $arrCfg["sect_count"]; $i++)
            {
                
$sectCnt++;
                
$arSect = Array(
                    
"IBLOCK_ID" =>  $IBLOCK_ID,
                    
"NAME" => str_replace("#NUM#",$sectCnt$arrCfg["sect_name_tpl"])
                );

                
$ID $obSect->Add($arSect);
                if ( 
$ID )
                    
$sect[] = $ID;
                else
                  echo 
$obSect->LAST_ERROR;
            }

        }
        else
        {
            
$sect[] = 0;
        }
        
reset($sect);
        while ( list(,
$SECTION_ID) = each($sect) )
        {
            for (
$i 0$i $arrCfg["items_count"]; $i++)
            {
                
$itemCnt++;
                
$arTmp explode(":"$arrCfg["item_preview_txt"]);
                if (
$arTmp[0] == "ipsum")
                {
                    
$arTmp explode("#"$arTmp[1]);
                    
$preview getIpsum($arTmp[0], $arTmp[1]);
                }
                
$arTmp explode(":"$arrCfg["item_detail_txt"]);
                if (
$arTmp[0] == "ipsum")
                {
                    
$arTmp explode("#"$arTmp[1]);
                    
$detail getIpsum($arTmp[0], $arTmp[1]);
                }

                
$arItem = Array(
                    
"ACTIVE" => "Y",
                    
"IBLOCK_ID" =>  $IBLOCK_ID,
                    
"IBLOCK_SECTION" =>  $SECTION_ID,
                    
"NAME" => str_replace("#NUM#",$itemCnt$arrCfg["item_name_tpl"]),
                    
"ACTIVE_FROM" => ConvertTimeStamp($time $itemCnt*24*60*60),
                    
"PREVIEW_TEXT" => $preview,
                    
"DETAIL_TEXT" => $detail,
                    
"PREVIEW_TEXT_TYPE" => "html",
                    
"DETAIL_TEXT_TYPE" => "html",
                );
                
$ID $obItem->Add($arItem);
                if ( 
$ID )
                    
$items[] = $ID;
                else
                  echo 
$obItem->LAST_ERROR;

            }
        }
    }
    
?>



Оговорюсь — версия первая, но работоспособная.

Вот пример конфига:
<?
$cfg 
= Array(
    
=> Array(
        
"sect_count" => 3,
        
"items_count" => 5,
        
"sect_name_tpl" => "Раздел новостей №#NUM#",
        
"item_name_tpl" => "Новость №#NUM#",
        
"item_preview_txt" => "ipsum:20#words",
        
"item_detail_txt" => "ipsum:5#paras",
    ),
    
=> Array(
        
"sect_count" => 0,
        
"items_count" => 15,
        
"item_name_tpl" => "Вакансия №#NUM#",
        
"item_preview_txt" => "ipsum:20#words",
        
"item_detail_txt" => "ipsum:5#paras",
    ),
    
=> Array(
        
"sect_count" => 0,
        
"items_count" => 10,
        
"item_name_tpl" => "Статья №#NUM#",
        
"item_preview_txt" => "ipsum:2#paras",
        
"item_detail_txt" => "ipsum:7#paras",
    ),
    
=> Array(
        
"sect_count" => 0,
        
"items_count" => 10,
        
"item_name_tpl" => "Требование №#NUM#",
        
"item_preview_txt" => "ipsum:5#words",
        
"item_detail_txt" => "ipsum:2#paras",
    ),
    
=> Array(
        
"sect_count" => 0,
        
"items_count" => 10,
        
"item_name_tpl" => "Работа №#NUM#",
        
"item_preview_txt" => "ipsum:3#words",
        
"item_detail_txt" => "ipsum:3#paras",
    ),
    
=> Array(
        
"sect_count" => 5,
        
"items_count" => 8,
        
"item_name_tpl" => "Товар №#NUM#",
        
"sect_name_tpl" => "Раздел товаров №#NUM#",
        
"item_preview_txt" => "ipsum:20#words",
        
"item_detail_txt" => "ipsum:2#paras",
    ),
    
);
?>



Разберём по порядку что и как.

Конфиг:
Каждый элемент массива $cfg — конфтигурация для конкретного инфоблока. Ключ массива — ID инфоблока.
параметры:
«sect_count» — сколько нужно сделать разделов(если нет разделов — 0)
«items_count» => сколько в каждом разделе сделать Элементов.
«sect_name_tpl» => шаблон наименования раздела
«item_name_tpl» => шаблон наименования элемента
«item_preview_txt» => чем заполняем краткое описание элемента*
«item_detail_txt» => чем заполняем полное описание элемента*

* — в данный момент реализован только один формат заполнения — рыба с сайта.
Формат — ipsum:[количество]#[что генерить(words|paras|bytes|lists)]
т.е. ipsum:2#paras значит — 2 параграфа, а ipsum:20#words — 20 слов.

Скрипт для каждого указанного в конфиге инфоблока генерирует указанное количество разделов. В каждом разделе создаёт указанное количество элементов. Заполняет Наименование, Предварительное описание и детальное описание для элементов.

Такжке выставляется дата начала активности(используется как дата публикации обычно) разная для всех элементов.
Дата выставляется следующим образом:
дата для первого элемента в разделе — 60 дней назад.
для каждого последующего элемента в разделе добавляется 1 день.

В результате работы скрипта получаем рыбу в базе проекта за 10минут. Обычно это может занять до 4-5 часов тупой механической работы.

Пользуйтесь. Также у меня есть скрипты конвертации обычного сайта в сайт Битрикс и скрипт формирования структуры сайта из списка разделов(с формированием системы меню). Но об этом в следующий раз.
Теги:
Хабы:
Всего голосов 15: ↑6 и ↓9-3
Комментарии21

Публикации

Ближайшие события