Pull to refresh

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

Reading time10 min
Views2.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 часов тупой механической работы.

Пользуйтесь. Также у меня есть скрипты конвертации обычного сайта в сайт Битрикс и скрипт формирования структуры сайта из списка разделов(с формированием системы меню). Но об этом в следующий раз.
Tags:
Hubs:
-3
Comments21

Articles

Change theme settings