Поиск

Найдены 8 статей по слову "bitrix"

Битрикс редиректит на старый домен

После переноса сайта на другой домен или ip-адрес он может начать редиректить, при заходе на него, на старый сайт.

Ситуация может быть в конструкции кода редиректа, например:

<?php
header('Location: http://oldsite.example')

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

> DELETE FROM b_module WHERE `ID`='security';

Query OK, 1 row affected (0.001 sec)

Источник: http://blog.ispsystem.info/2019/05/bitrix.html

bitrix

Отправка почты через mail() из php

Крайне не рекомендую использовать php-функцию mail() для отправки почты. Лучше все-таки отправлять ее через smtp с возможностью настройки из приложения всех необходимых данных.

Но в случае, чтобы тот же битрикс не ругался, можно проделать это следующим образом:

1. Устанавливаем sendmail

apt install sendmail -y

2. Вносим изменения в /etc/hosts:

127.0.0.1 localhost localhost.localdomain yourdomain
...

3. Перезапускаем конфиг (на все вопросы отвечаем утвердительно):

sendmailconfig

4. Перезагружаем все:

service nginx restart
service sendmail restart
service php7.0-fpm restart

5. Готово, можно проверять:

<?php

echo  mail(
    "mymail@yandex.ru",
    "test message",
    "test message",
    "From:no-reply@gmail.com"
);

bash bitrix devops linux php

Починить все базы данных и таблицы MySQL

В терминале (не в консоли mysql) выполните следующую команду:

$ mysqlcheck -u root -p -A --auto-repair

Пример ответа:

...
website.b_adv_banner_2_country                     OK
website.b_adv_banner_2_day                         OK
website.b_adv_banner_2_group                       OK
website.b_adv_banner_2_page                        OK
website.b_adv_banner_2_site                        OK
website.b_adv_banner_2_stat_adv                    OK
website.b_adv_banner_2_weekday                     OK
...

Для поиска: repair database, repair table.

bash bitrix mysql sql

Табличный вид заказа в письме в битриксе версии 18

Вот таким образом можно сделать табличный вид заказа с торговыми предложениями и самими товарами в письме. Для вывода таблицы в шаблоне нового заказа необходимо использовать переменную #ORDER_TABLE_ITEMS#. Картинки тоже прилагаются.

Файл init.php:

<?
AddEventHandler("sale", "OnOrderNewSendEmail", "ModifyOrderSaleMails");

function ModifyOrderSaleMails($orderID, &$eventName, &$arFields) {
    if(CModule::IncludeModule("sale") && CModule::IncludeModule("iblock")) {
        $strOrderList = "";
        $dbBasketItems = CSaleBasket::GetList(
            array("NAME" => "ASC"),
            array("ORDER_ID" => $orderID),
            false,
            false,
            array("PRODUCT_ID", "ID", "NAME", "QUANTITY", "PRICE", "CURRENCY")
        );
        $strOrderList = "
                <style>
                    table.example {
                        border-collapse: collapse;
                        width: 585px;
                    }
                    table.example td {
                        border:1px solid black;
                    }
                    table.example td.num {
                        width: 30px;
                        text-align: center;
                    }
                </style>
                <table class=\"example\">
                    <tr>
                        <td class=\"num\" align=\"center\">№</td>
                        <td align=\"center\">Фото товара</td>
                        <td align=\"center\">Наименование</td>
                        <td align=\"center\">Количество</td>
                        <td align=\"center\">Цена, руб.</td>
                        <td align=\"center\">Cумма, руб.</td>
                    </tr>";
        $i = 0;
        while ($arProps = $dbBasketItems->Fetch()) {
            $i += 1;
            // image
            $offer = CIBlockElement::GetById(IntVal($arProps["PRODUCT_ID"]))->GetNext();
            $pictureId = $offer["PREVIEW_PICTURE"];
            if (is_null($pictureId)) {
                $realProductInfo = CCatalogSku::GetProductInfo(IntVal($arProps["PRODUCT_ID"]));
                $realProduct = CIBlockElement::GetById(IntVal($realProductInfo["ID"]))->GetNext();
                $pictureId = $realProduct["PREVIEW_PICTURE"];
            }
            $thumb = CFile::ResizeImageGet(
                $pictureId,
                array("width" => 200, "height" => 200),
                BX_RESIZE_IMAGE_PROPORTIONAL,
                false
            );
            $thumb = $thumb["src"];
            // sum
            $summ = $arProps['QUANTITY'] * $arProps['PRICE'];
            $strOrderList .= "<tr><td class=\"num\">".$i."</td><td><img src=\"http://".$_SERVER['SERVER_NAME'] . $thumb."\"></td><td>".$arProps['NAME']."</td><td>".$arProps['QUANTITY']."</td><td>".number_format((float)$arProps['PRICE'], 2, '.', '')."</td><td>".number_format((float)$summ, 2, '.', '')."</td><tr>";
        }
        echo "</table>";
        // пишем в переменную для письма
        $arFields["ORDER_TABLE_ITEMS"] = $strOrderList; 
    }
}
?>

Подобным образом можно добавить и другие переменные к письму.

bitrix php

Красивая пагинация на битриксе / bitrix pagination

Сделал свою пагинацию на битриксе. Получилось вот так.
Минусы:
- Код некачественный. Если есть идеи по оптимизации, пишите в комментариях, поправлю.
- Игнорирует пагинацию в “обратном порядке”. Не увидел смысла в ней, поэтому отказался.

Тут можно изменять только один параметр:
$countPagesDisplay - это количество отображаемых страничек снизу (помимо первой, последней, стрелок и “…”).

Выглядит вот так:

http://localhost:8001/media/uploads/2018/11/09/pagination.png

<?
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();

if(!$arResult["NavShowAlways"])
{
    if ($arResult["NavRecordCount"] == 0 || ($arResult["NavPageCount"] == 1 && $arResult["NavShowAll"] == false))
    return;
}

// begin zadavaemie parametri

$countPagesDisplay = 3; // kolichestvo otobrajaemih stranic v paginacii

// end zadavaemie parametri

function addLeftBorder($lb) {
    if ($lb > 1) {
        $lb = $lb - 1;
    }
    return $lb;
}

function addRightBorder($rb,$max) {
    if ($rb < $max) {
        $rb = $rb + 1;
    }
    return $rb;
}

$i = 1;
$left_border = $arResult["NavPageNomer"];
$right_border = $arResult["NavPageNomer"];
$max = $arResult["NavPageCount"];

while($i < $countPagesDisplay) {
    if($i % 2 == 0) {
        $lb = $left_border;
        $left_border = addLeftBorder($left_border);
        if ($left_border == $lb) {
            $rb = $right_border;
            $right_border = addRightBorder($right_border, $max);
            if ($right_border == $rb) {
                $i = $countPagesDisplay;
            }
        }
    } else {
        $rb = $right_border;
        $right_border = addRightBorder($right_border, $max);
        if ($right_border == $rb) {
            $lb = $left_border;
            $left_border = addLeftBorder($left_border);
            if ($left_border == $lb) {
                $i = $countPagesDisplay;
            }
        }
    }
    $i++;
}
$arResult["nStartPage"] = $left_border;
$arResult["nEndPage"] = $right_border;

//echo "<pre>"; print_r($arResult);echo "</pre>";

$strNavQueryString = ($arResult["NavQueryString"] != "" ? $arResult["NavQueryString"]."&amp;" : "");
$strNavQueryStringFull = ($arResult["NavQueryString"] != "" ? "?".$arResult["NavQueryString"] : "");

?>
<div class="paginator">

<font class="text">

<?if ($arResult["NavPageNomer"] > 1):?>

    <?if($arResult["bSavePage"]):?>
        <a href="<?=$arResult["sUrlPath"]?>?<?=$strNavQueryString?>PAGEN_<?=$arResult["NavNum"]?>=<?=($arResult["NavPageNomer"]-1)?>">&larr;</a>
        <a href="<?=$arResult["sUrlPath"]?>?<?=$strNavQueryString?>PAGEN_<?=$arResult["NavNum"]?>=1">1</a>
    <?else:?>
        <?if ($arResult["NavPageNomer"] > 2):?>
            <a href="<?=$arResult["sUrlPath"]?>?<?=$strNavQueryString?>PAGEN_<?=$arResult["NavNum"]?>=<?=($arResult["NavPageNomer"]-1)?>">&larr;</a>
        <?else:?>
            <a href="<?=$arResult["sUrlPath"]?><?=$strNavQueryStringFull?>">&larr;</a>
        <?endif?>
        <?if ($arResult["nStartPage"] != 1):?>
            <a href="<?=$arResult["sUrlPath"]?><?=$strNavQueryStringFull?>">1</a>
        <?endif?>
    <?endif?>

<?else:?>
    &larr;&nbsp;
<?endif?>

<?if ($arResult["nStartPage"] > 2):?>
    <a href="<?=$arResult["sUrlPath"]?>?<?=$strNavQueryString?>PAGEN_<?=$arResult["NavNum"]?>=<?=($arResult["nStartPage"]-1)?>">...</a>
<?endif?>

<?while($arResult["nStartPage"] <= $arResult["nEndPage"]):?>
    <?if ($arResult["nStartPage"] == $arResult["NavPageNomer"]):?>
        <span><?=$arResult["nStartPage"]?></span>
    <?elseif($arResult["nStartPage"] == 1 && $arResult["bSavePage"] == false):?>
        <a href="<?=$arResult["sUrlPath"]?><?=$strNavQueryStringFull?>"><?=$arResult["nStartPage"]?></a>
    <?else:?>
        <a href="<?=$arResult["sUrlPath"]?>?<?=$strNavQueryString?>PAGEN_<?=$arResult["NavNum"]?>=<?=$arResult["nStartPage"]?>"><?=$arResult["nStartPage"]?></a>
    <?endif?>
    <?$arResult["nStartPage"]++?>
<?endwhile?>

<?if ($arResult["nEndPage"] < ($arResult["NavPageCount"] - 1)):?>
    <a href="<?=$arResult["sUrlPath"]?>?<?=$strNavQueryString?>PAGEN_<?=$arResult["NavNum"]?>=<?=($arResult["nEndPage"]+1)?>">...</a>
<?endif?>

<?if($arResult["NavPageNomer"] < $arResult["NavPageCount"]):?>
    <?if($arResult["nEndPage"] < $arResult["NavPageCount"]):?>
        <a href="<?=$arResult["sUrlPath"]?>?<?=$strNavQueryString?>PAGEN_<?=$arResult["NavNum"]?>=<?=$arResult["NavPageCount"]?>"><?=$arResult["NavPageCount"]?></a>
        <a href="<?=$arResult["sUrlPath"]?>?<?=$strNavQueryString?>PAGEN_<?=$arResult["NavNum"]?>=<?=($arResult["NavPageNomer"]+1)?>">&rarr;</a>
    <?else:?>
        <a href="<?=$arResult["sUrlPath"]?>?<?=$strNavQueryString?>PAGEN_<?=$arResult["NavNum"]?>=<?=($arResult["NavPageNomer"]+1)?>">&rarr;</a>
    <?endif?>
<?else:?>
    &nbsp;&rarr;
<?endif?>

</div>
bitrix

Делаем теги и ссылки к ним в статьях битрикса

Можно решить эту задачу так. Для этого в конец компонента bitrix:news (скопировав его) следует вставить функцию:

<?
function addLinkForTag($tagname) {
    $taglink = str_replace(' ','+',$tagname); // Пробелы должны заменяться плюсами
    return '<a href="/search/?tags='.$taglink.'">'.$tagname.'</a>'; // Добавляем ссылку. Внимание, у вас ссылка может быть не "/search/", а какая-либо другая!
}
?>

И для тех же статей (при условии, что все стандартно) в компоненте bitrix:news.list можно написать что-либо подобное:

<?foreach($arItem["FIELDS"] as $code=>$value):?> // Это уже было - стандартный перебор свойств каждой новости
    <small>
    <?
    if (GetMessage("IBLOCK_FIELD_".$code) == 'Теги') { // Желательно написать как-нибудь по другому, но на данный момент идей как правильно - нет :)
        if(CModule::IncludeModule("search")) { // Необходимо подключить модуль поиска. Без него работать не будет
            $tags_array = tags_prepare($value, "s1"); // Распиливаем теги в массив
            echo GetMessage("IBLOCK_FIELD_".$code).': '; // Выводим название "Теги"
            $tags_array = array_map("addLinkForTag",$tags_array); // Применяем функцию для создания ссылок для элементов массивов
            $result_tags = implode(", ", $tags_array); // Соединяем все обратно в одну строку
            echo $result_tags; // Выводим результат
        }
    } else { // Если у нас не Тег, то просто выводим как обычно "ключ" : "значение" (эта строка была по умолчанию)
        echo GetMessage("IBLOCK_FIELD_".$code).': '.$value;
    }
    ?>
    </small>
    <br />
<?endforeach;?>

Затем создаем страницу в битриксе и вставляем в нее компонент поиска bitrix:search.page. Собственно, ссылка на него и будет ссылкой, на которую надо поменять мой “/search/”.

bitrix

Обработка отправления почты в bitrix

Возникла задача - отправлять письмо о заказе, кроме клиента, на два разных ящика. Притом, ящики должны были чередоваться (в той организации два конкурирующих менеджера). Сразу возник алгоритм, что при отправке письма проверять, четный или нечетный ID заказа, и в зависимости от этого, отправлять письмо на тот, или иной ящик.
Больше всего времени пришлось затратить на поиск документации, к какому событию привязывается отправление почты. В оф. документации поиск ничего не дал - но, оказалось, что плохо искал, т.к. там эта информация была.

Для написания пригодилось знать следующее:

Событие http://dev.1c-bitrix.ru/api_help/main/events/onbeforeeventadd.php вызывается в момент добавление почтового события в таблицу b_event. Как правило, задача обработчика данного события - изменить или добавить какое-либо значение, передаваемое в макросы почтового шаблона.

Порядок выполнения страницы (в данном случае не слишком пригодилось, но однозначно полезная информация).

Почтовая система

Итак, сам код. Его надо разместить в /bitrix/php_interface/init.php.

<?
AddEventHandler("main", "OnBeforeEventAdd", array("MailCheredator", "OnBeforeEventAddHandler"));

class MailCheredator {
    function OnBeforeEventAddHandler(&$event, &$lid, &$arFields) {
        $arFields["SALE_EMAIL"] = "sale_mail@example.ru";
        $arFields["BCC"] = "";
        if (intval($arFields["ORDER_ID"]) % 2 == 1) {
            $arFields["EMAIL"] = $arFields["EMAIL"]. ",email1@example.ru";
        } else {
            $arFields["EMAIL"] = $arFields["EMAIL"]. ",email2@example.ru";
        }
    }
}
?>

Здесь,
SALE_EMAIL - в моем случае, адрес, с которого отправляется письмо (у вас может быть другой!).
BCC - сюда отправляются копии письма, которые не должен видеть тот, кому отправляется письмо (можно было email1 и email2 сюда записать).
EMAIL - адрес, куда отправится письмо. Можно перечислять через запятую.

bitrix

Просмотр всех свойств элемента инфоблока

Пригодится для просмотра в API битрикса всех данных об элементах инфоблока. А потом найденное можно будет изменить. Подробности можно прочитать тут: http://dev.1c-bitrix.ru/api_help/iblock/classes/ciblockelement/getlist.php

<?
$arFilter = Array(
    "IBLOCK_ID"=>IntVal(2), //id инфоблока
    "ACTIVE"=>"Y", // только активные
    "SECTION_ID"=>38, // id раздела в инфоблоке
    "INCLUDE_SUBSECTIONS"=>"Y" // чтобы включались подразделы
);
$res = CIBlockElement::GetList(Array("SORT"=>"ASC", "PROPERTY_PRIORITY"=>"ASC"), $arFilter);
while($ob = $res->GetNextElement())
{
    $arFields = $ob->GetFields();
    echo $arFields["NAME"]."<br />";
    print_r($arFields);
    $arProps = $ob->GetProperties();
    print_r($arProps);
    echo "<br /><br />";
}
?>
bitrix