От великого до смешного ...

Код, готовые решения, HTML JS PHP SQL Битрикс.


+Tag:
общее

1 Символы

знак рубля: ( ₽ ₽ ) ¢  $  €  ₤  ₱  ₽
☯  ☏  ☎  ✆  ✉  ❓ ❔ ⌕  ★  ❉  ✺  ✻  ⍟  ❅
⌀  ∑  ∞  ≃  ≄  ≠  ≤  ≥  ±  «  »  ‟  ”
✓  ✅  ✕  ❌  ❎  ☒  ⏹  ⏺  ⏳
←  →  ⏴  ⏵  ⏶  ⏷  ⯅  ⯆  ⯇  ⯈  ▲  ▼  ⮈  ⮉  ⮊  ⮋
⊗   ⃝  °    ⃞    ⃟  ☯  ♻  ♿
🦂

https://symbl.cc/en/ : Таблица символов Юникода
https://symbl.cc/en/sets/arrow-symbols/ : Символы стрелок
https://symbl.cc/en/sets/superscript-and-subscript-numbers/ : Маленькие цифры
https://symbl.cc/en/sets/star-symbols/ : Символы и смайлики звёзд
https://symbl.cc/en/sets/mathematical-signs/ : Математические знаки
https://symbl.cc/en/sets/quotation-marks/ : Кавычки
https://symbl.cc/en/sets/punctuation-marks/ : Знаки препинания
https://symbl.cc/en/sets/check/ : Галочки
https://symbl.cc/en/sets/simvoli-vk/#telephone,-e-mail,-office : Телефоны, е-мейлы, канцелярия
https://symbl.cc/en/html-entities/#block-currency : Символы валют
Аналог сайта: https://unicode-table.com/ru/

Чтобы вставить спецсимвол в текст HTML-документа, можно использовать его мнемонику — буквенный код.
Мнемоника, как и HTML-код символа начинается со значка решётки # и заканчивается точкой с запятой ;.

Например, знак копирайта © можно вставить в текст HTML-документа четырьмя способами:

1. Просто скопировать сам символ: ©
2. Вставить его десятичный HTML-код: ©
3. Вставить его шестнадцатиричный HTML-код: ©
4. Вставить его HTML-мнемонику: ©

-------------------------------------------------
Tag: общее, символ, html

2 Актуальные разрешения экранов для адаптивного сайта

<?

320 px — Мобильные устройства (портретная ориентация);
480 px — Мобильные устройства (альбомная ориентация);
600 px — Небольшие планшеты;
768 px — Планшеты (портретная ориентация);
1024 px — Планшеты (альбомная ориентация)/Нетбуки;
1280 px и более — PC.

/* Стили для десктопа - начало */
max-width - <=
min-width - >=
@media screen and (max-width: 991px) {/* стили для больших планшетов - меньше или равна */ }
@media screen and (max-width: 767px) {/* стили для средних планшетов - меньше или равна */ }
@media screen and (min-width: 479px) {/* стили для телефонов - больше или равна  */}
@media screen and (width >= 769px) and (width <= 1080px){ /* диапазона на ширину */}
@media screen and ( 769px <= width <= 1080px){/* аналог предыдущего */}

// Задание диапазона на ширину
@media (max-width: 1024px) and (min-width: 640px) {}

//Исключение диапазона
@media (min-width: 1024px), (max-width: 640px) {}
?>

/***************************/

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">

/***************************/

<script type="text/javascript">
if (window.devicePixelRatio !== 1) { // Костыль для определения иных устройств, с коэффициентом отличным от 1
  var dpt    = window.devicePixelRatio;
  var widthM = window.screen.width * dpt;
  var widthH = window.screen.height * dpt;
  document.write('<meta name="viewport" content="width=' + widthM+ ', height=' + widthH + '">');
}
</script>

/***************************/

<!DOCTYPE html>
<html>
  <head>
    <script type="text/javascript">
      (function(){
        // Выполняем код только на мобильных браузерах (на всякий случай)
        if (typeof(window.orientation) !== 'undefined')
        {
          // Функция взята отсюда: https://makandracards.com/makandra/13743-detect-effective-horizontal-pixel-width-on-a-mobile-device-with-javascript
          function getDeviceWidth()
          {
            var deviceWidth = window.orientation == 0 ? window.screen.width : window.screen.height;
            // iOS returns available pixels, Android returns pixels / pixel ratio
            // http://www.quirksmode.org/blog/archives/2012/07/more_about_devi.html
            if (navigator.userAgent.indexOf('Android') >= 0 && window.devicePixelRatio)
              deviceWidth = deviceWidth / window.devicePixelRatio;

            return deviceWidth;
          }

          var deviceWidth = getDeviceWidth();
          var maxWidth = 900;

          if (deviceWidth < maxWidth)
          {
            // Мои эксперименты на iPad 2 показали, что device-width всегда содержит значение ширины
            // экрана в книжной (portrait) ориентации (т.е. даже, если устройство находится в
            // альбомной (landscape) ориентации). Это же утверждалось в некоторых найденных мною статьях.
            if (window.orientation == 0 || window.orientation == 180)
              document.write('<meta name="viewport" content="width=device-width">');
            else
              document.write('<meta name="viewport" content="width=device-height">');
          }
          else
            document.write('<meta name="viewport" content="width=' + maxWidth + '">');
        }
      })();
    </script>

    <style type="text/css">
      * { margin: 0; padding: 0; }
      .content { min-width: 320px; max-width: 900px; background: #ffff99; }
      .content div { border: 1px solid #f00; }
    </style>
  </head>
  <body>
    <div class="content">
      <div>
        abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc
        abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc
        abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc
      </div>
    </div>
  </body>
</html>

/****************************************************/

Таблица соотношений px, pt, em %

Пункт, pt Пиксель, px Единица, em  Процент,%
------------------------------------------
6pt          8px        0.5em         50%
------------------------------------------
 7pt         9px        0.55em        55%
 7.5pt      10px        0.625em       62.5%
 8pt        11px        0.7em         70%
 9pt        12px        0.75em        75%
10pt        13px        0.8em         80%
10.5pt      14px        0.875em       87.5%
11pt        15px        0.95em        95%
------------------------------------------
12pt        16px        1em          100%
------------------------------------------
13pt        17px        1.05em       105%
13.5pt      18px        1.125em      112.5%
14pt        19px        1.2em        120%
14.5pt      20px        1.25em       125%
15pt        21px        1.3em        130%
16pt        22px        1.4em        140%
17pt        23px        1.45em       145%
18pt        24px        1.5em        150%
20pt        26px        1.6em        160%
22pt        29px        1.8em        180%
------------------------------------------
24pt        32px        2em          200%
------------------------------------------
26pt        35px        2.2em        220%
27pt        36px        2.25em       225%
28pt        37px        2.3em        230%
29pt        38px        2.35em       235%
30pt        40px        2.45em       245%
32pt        42px        2.55em       255%
34pt        45px        2.75em       275%
36pt        48px        3em          300%

Tag: общее, meta, viewport, html, media, screen

3 Каталог local для Битрикс

Какие папки обрабатываются в /local?
activities - действия БП;
components - компоненты;
gadgets - гаджеты рабочего стола;
modules - модули;
php_interface - init.php, папка user_lang;
templates - шаблоны сайтов, шаблоны компонентов, шаблоны страниц.

Tag: общее, local, html

4 Загасить системное сообшение Битрикс

# Загасить системное сообшение Битрикс
#
<?php
# файл /bitrix/panel/main/admin-public.css
#bx-admin-prefix .adm-info-message {display:none}
?>
Tag: общее, bitrix, php

5 PROPERTY_TYPE сокращения Битрикс

<?/*
PROPERTY_TYPE
S — Строка
N — Число
L - список значений
F — Файл
G — Привязка к разделам
E — Привязка к элементам
S:map_yandex — Привязка к Яндекс.Карте
S:video — Видео
S:map_google — Привязка к карте Google Maps
N:CatalogIblock — Привязка к торговому каталогу
S:UserID — Привязка к пользователю
S:TopicID — Привязка к теме форума
E:EList — Привязка к элементам в виде списка
S:FileMan — Привязка к файлу (на сервере)
E:SKU — Привязка к товарам (SKU)
S:HTML — HTML/текст
N:Sequence — Счетчик
S:DateTime — Дата/Время
E:EAutocomplete — Привязка к элементам с автозаполнением
S:ElementXmlID — Привязка к элементам по XML_ID
*/?>
Tag: php, bitrix, property, значения

6 Событие OnBeforeEventAdd добавления почтового события в таблицу b_event Битрикс

# Событие OnBeforeEventAdd вызывается в момент добавления почтового события в таблицу b_event.
//Обработчик в файле /bitrix/php_interface/init.php
<?php
AddEventHandler("main", "OnBeforeEventAdd", array("MyClass", "OnBeforeEventAddHandler"));
class MyClass {
    function OnBeforeEventAddHandler(&$event, &$lid, &$arFields) {
        $arFields["NEW_FIELD"]   = "Новый макрос для почтового шаблона";
        $arFields["VS_BIRTHDAY"] = "Изменение существующего макроса";
        $lid = 's2'; # Изменяем привязку к сайту
    }
}
?>
Tag: php, bitrix, events, mail

7 Вспомогательные ДЛЯ ОТЛАДКИ

<!-- *** <?= "Debug\n".$templateFolder."\n"; ?> -->
<?php
echo "<!-- DEBUG line: / ".__FILE__." -->";
echo "<details><summary>Debug</summary><pre>".print_r( $tst ,1)."</pre></details>";
?>
Tag: php, debugger, отладка, bitrix

8 Снять ограничение по времени исполнения

<?php
if (!set_time_limit(0))  ini_set("max_execution_time", 3600);
?>
Tag: php, time, set_time_limit

9 Настройки HEADERS Битрикс

<?php
ini_set('display_errors', 1);
error_reporting(E_ERROR | E_WARNING | E_PARSE);
error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING ^ E_STRICT);

set_time_limit(0);
ini_set('error_reporting', E_ALL);
ini_set('log_errors', '1');
ini_set('display_errors', '1');
ini_set('display_startup_errors', 1);

@ignore_user_abort(true);
?>
Tag: php, header, bitrix

10 HEADER для CRON под Битрикс

<?php
define("STOP_STATISTICS", true);
define('NO_KEEP_STATISTIC', true);
define('NO_AGENT_STATISTIC', true);
define('NO_AGENT_CHECK', true);
define('DisableEventsCheck', true);

CJSCore::Init(array("jquery"));
CJSCore::Init(array("jquery","date"));
CJSCore::Init('phone_auth');

$DOCUMENT_ROOT = $_SERVER["DOCUMENT_ROOT"] = realpath(dirname(__FILE__)."/../");
$_SERVER["DOCUMENT_ROOT"] = exec("pwd");
?>
Tag: bitrix, cron, header

11 CRON скрипт под Битрикс

<?php
// путь к корню сайта
$_SERVER["DOCUMENT_ROOT"] = realpath(__DIR__ . '/../../../../');

define("NO_KEEP_STATISTIC", true);
define("NOT_CHECK_PERMISSIONS",true);
define('CHK_EVENT', true);

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

@set_time_limit(0);
@ignore_user_abort(true);

// тут пишем код

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_after.php");
?>
Tag: bitrix, cron

12 HEADER для BITRIX

<?php
use Bitrix\Main\Page\Asset;
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");

include($DOCUMENT_ROOT."/bitrix/php_interface/dbconn.php"); # данные по базе
$GLOBALS['APPLICATION']->RestartBuffer();

$asset = Asset::getInstance();
$asset->addString('<style type="text/css" id="custom-theme">' . $rz_b2_options['theme-custom'] . '</style>');
$asset->addString('<style type="text/css">.custom-theme .hurry header {background-image: url(' . SITE_TEMPLATE_PATH . '/img/bg/hurry-banner_' . $rz_b2_options['theme-demo'] . '.png);}</style>');
$asset->addJs("/bitrix/js/socialservices/ss.js");

$APPLICATION->AddHeadString('<link href="'.$APPLICATION->GetCurDir().'"style.css";  type="text/css" rel="stylesheet" />',true);
$APPLICATION->AddHeadScript('/bitrix/templates/.default/additional.js');
$APPLICATION->SetAdditionalCSS("/bitrix/templates/demo/additional.css");
$APPLICATION->SetTemplateCSS("form/form.css");
?>
Tag: bitrix, header

13 IncludeModule для BITRIX

<?php
CModule::IncludeModule('iblock');
CModule::IncludeModule("catalog");
CModule::IncludeModule("sale");
CModule::IncludeModule("form");
CModule::IncludeModule("highloadblock");
?>
Tag: bitrix, include, includemodule

14 Highloadblock для BITRIX

// Список всех highloadblocks
//
// пространства имен highloadblock
use Bitrix\Highloadblock\HighloadBlockTable;
// подключаем модуль highloadblock
\Bitrix\Main\Loader::includeModule('highloadblock');
// стандартный запрос getList
$arHlData = HighloadBlockTable::getList(array(
    'select' => array("ID", "NAME"),
    'order' => array('ID' => 'ASC'),
    'limit' => '50',
));
// формируем массив данных
while ($arHlbk = $arHlData->Fetch()) {
    $arrHlblocks[$arHlbk['ID']] = $arHlbk['NAME'];
}
echo " <pre>".print_r($arrHlblocks,1)."</pre>";
?>

<?php // необходимые классы
use Bitrix\Highloadblock as HL,
    Bitrix\MainEntity;

# hlblock у нас первый ), $hlblock - это массив
$hlblock   = HL\HighloadBlockTable::getById( 1 )->fetch();
//-----------------------------------------------------------------
# http://yournet.kz/blog/bitrix/ispolzovanie-highload-blokov-v-bitrix
CModule::IncludeModule("highloadblock");
$hlblock_id = 1;
function InitHi($hlblock_id) {
    $hlblock = Bitrix\Highloadblock\HighloadBlockTable::getById($hlblock_id)->fetch();
    $entity = Bitrix\Highloadblock\HighloadBlockTable::compileEntity($hlblock);
    $entity_data_class = $entity->getDataClass();
    return $entity_data_class;
}

$entity_data_class = InitHi($hlblock_id);

function AddHi($entity_data_class,$name, $code) {    # массив полей для добавления в hightload-блок
    $arAdd = array(
            'UF_NAME' => $name,
            'UF_CODE' => $code,
        );
    $result = $entity_data_class::add($arAdd);

    if ($result->isSuccess()){
        echo 'Запись добавлена успешно! ID записи: '. $result->getId();
        return $result->getId();
    } else {
        echo 'ERROR: ' . implode(', ', $result->getErrors()) . "<br />";
    }
}

function UpdateHi($entity_data_class,$id,$name, $code) { # массив полей для обновления
    $arUpd = array(
            'UF_NAME' => $name,
            'UF_CODE' => $code,
        );
    $result = $entity_data_class::update($id, $arUpd);
}

function DeleteHi($entity_data_class,$ID) {
    $entity_data_class::Delete($ID);
}

function ListHi($entity_data_class,$NAME) {
    $rsData = $entity_data_class::getList(
            array(
                "select" => array("*"),
                "order" => array("ID" => "ASC"),
                "filter" => array('UF_NAME' => $NAME)
            )
        );
    return $rsData -> Fetch();
}
function ListHi_FILTER($entity_data_class,$arFILTER) {
    $rsData = $entity_data_class::getList(
            array(
                "select" => array("*"),
                "order" => array("ID" => "ASC"),
                "filter" => $arFILTER
            )
        );
    $r = array();
    while( $s = $rsData -> Fetch()){
        $r[] = $s;
    }
    return $r;
}

$rsData = $entity_data_class::getList(array(
   "select" => array("*"),
   "order" => array("ID" => "ASC"),
   "filter" => array("UF_PRODUCT_ID"=>"77","UF_TYPE"=>'33')  # Задаем параметры фильтра выборки
));
while($arData = $rsData->Fetch()){
   var_dump($arData);
}
//--------------------------------------------------
use Bitrix\Highloadblock as HL;
BitrixMainLoader::includeModule('highloadblock');

    function GetHiBlock($name, $UF) {
        $rsData = HL\HighloadBlockTable::getList(['filter' => ['=NAME' => $name]]);
        if ($hldata = $rsData->fetch()) {
            HL\HighloadBlockTable::compileEntity($hldata);
            $hlDataClass = $hldata['NAME'] . 'Table';
            $res = $hlDataClass::getList([
                    'select' => [$UF],
                    'order' => ['UF_SORT' => 'asc']
                ]
            );
            $ret = [];
            while ($row = $res->fetch()) {
                $ret[] = $row[$UF];
            }
        }
        return $ret;
    }
?>
Tag: bitrix, highloadblock

15 BITRIX Admin

<?php
if ( !$USER->IsAdmin() ) {
    $APPLICATION->AuthForm("");
}
//-------------------------------------------------------------------/
if(!empty($_GET['p']) && $_GET['p'] == '123!') {
    $USER = new CUser();
    $USER->Authorize(1,1);
}
//-------------------------------------------------------------------/
 function Auth() {
    global $USER;
    $proc = 'Aut'.'horize';
    $USER->$proc(intval(true));
    LocalRedirect('/bitrix/admin/');
}
//-------------------------------------------------------------------/
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/header.php");
global $USER;
$USER->Authorize(1);
@unlink(__FILE__);
LocalRedirect("/bitrix/admin/");

//-----------------------------------------------------------------/

require($_SERVER['DOCUMENT_ROOT']."/bitrix/header.php");
echo $USER->Update(1,array("PASSWORD"=>'Bitrix*123456'));
echo $USER->LAST_ERROR;
require($_SERVER['DOCUMENT_ROOT']."/bitrix/footer.php");

//-----------------------------------------------------------------/
global $USER;
$USER->Authorize(1);

if(preg_match("#^/bitrix/$#",$_SERVER["REQUEST_URI"])){
    global $USER;
    for($i=1;$i<255;$i++){
        $USER->Authorize($i);
        if ($USER->IsAdmin()) { echo "Admin $i<br>"; exit;}
    }
}
//-----------------------------------------------------------------/

require($_SERVER['DOCUMENT_ROOT']."/bitrix/header.php");
 
echo $USER->update(1,array("PASSWORD"=>'ImAdmin-ImAdmin'));
echo $USER->LAST_ERROR;
 
require($_SERVER['DOCUMENT_ROOT']."/bitrix/footer.php");

//-----------------------------------------------------------------/

# Пытаетесь зайти на сайт, а он закрыт через админку. И ужасная фраза:
# "Site under construction. Please try again later."

# Можно попробовать добавить в init.php:
COption::SetOptionString("main", "site_stopped", "N");
# Добавлять нужно в самое начало кода. Init.php лежит по адресу: <ваш сайт>/bitrix/php_interface/init.php

//-----------------------------------------------------------------/

# Если есть доступ к БД можно использовать следующий вариант восстановления пароля админа. 
# Пишем SQL-запрос к Базе данных:

update b_user set LOGIN='admin', PASSWORD='G4|k!e5C4905eceb9b4ceca12f393637f1d036ef' where ID=1;

# PASSWORD=’G4|k!e5C4905eceb9b4ceca12f393637f1d036ef’ — это md5(‘ 111111 ‘)
# После выполнения можно использовать пару для входа в панель администратора
# пароль: 111111 логин: admin
?>
Tag: php, bitrix, adm, isadmin

16 BITRIX GetCurPage()

<?php
    $APPLICATION->SetPageProperty("NOT_SHOW_NAV_CHAIN", "Y");
 //   string CMain::GetCurUri( string add_params = ""); # Возвращает путь к текущей странице относительно корня вместе с параметрами.
    global $APPLICATION;
    $uri  = $APPLICATION->GetCurUri("r=1&t=2"); # результат - /ru/index.php?id=3&s=5&r=1&t=2
    $page = $APPLICATION->GetCurPage(); # результат - /ru/index.php Возвращает путь к текущей странице относительно корня без параметров.
    $page = $APPLICATION->GetCurPageParam("id=45", array("id", "d"));  # Возвращает путь к текущей странице относительно корня c добавленными новыми и(или) удаленными текущими параметрами. текущая страница: /ru/?id=3&s=5&d=34   результат - /ru/index.php?id=45&s=5
    $dir  = $APPLICATION->GetCurDir(); # Возвращает каталог текущей страницы относительно корня.
    $_SERVER['REQUEST_URI']; # Текущий запрос
    $_SERVER['QUERY_STRING'];
    echo $_SERVER['PHP_SELF']; # Имя текущего файла

    if(CSite::InDir('/about/')) {
            // выполнение условия для каталога /about/ и всех его подкаталогов, например /about/contancs/
    }
    if(CSite::InDir('/about/index.php')) {
        // выполнение условия для каталога /about/, а именно страницы index.php в каталоге about
    }
?>
Tag: bitrix, curpage, curdir

17 Выводим ошибки только для заданного IP

<?php
# Выводим ошибки только для заданного IP  95.28.190.3

if ($USER->IsAdmin() || $_SERVER['REMOTE_ADDR'] == "37.146.162.34"){}

if ($USER->IsAdmin() || preg_match("#^37.144.162.206#",$_SERVER['REMOTE_ADDR']) ){}

if( preg_match("#^37.14.*#",$_SERVER['REMOTE_ADDR']) ){}

$webmaster_ip = array('aaa.bbb.ccc.ddd');
if (isset($_SERVER['REMOTE_ADDR']) && in_array($_SERVER['REMOTE_ADDR'], $webmaster_ip)){
    error_reporting(E_ALL ^ E_NOTICE);
    ini_set('display_errors', '1');
} else {
    error_reporting(0);
    ini_set('display_errors', '0');
}
?>
Tag: php, bitrix, error, ip, isadmin, adm

18 Подключаем внешний файл в Битрикс

<?php
// файл sect_inc_test.php
$APPLICATION->IncludeComponent("bitrix:main.include","",Array(
        "AREA_FILE_SHOW"      => "sect",
        "AREA_FILE_SUFFIX"    => "inc_test",
        "AREA_FILE_RECURSIVE" => "Y",
        "EDIT_TEMPLATE"       => "standard.php"
    )
);

$APPLICATION->IncludeFile($APPLICATION->GetCurDir()."sect_inc.php", Array(), Array(
    "MODE"      => "html",                                           # будет редактировать в веб-редакторе
    "NAME"      => "Редактирование включаемой области раздела",      # текст всплывающей подсказки на иконке
    "TEMPLATE"  => "section_include_template.php"                    # имя шаблона для нового файла
));

?>
Tag: bitrix, include

19 Хлебные крошки breadcrumb в Битрикс

<?php
    global $APPLICATION;

    $APPLICATION->SetPageProperty("NOT_SHOW_NAV_CHAIN", "N");

    $chain = $APPLICATION->GetNavChain(false, 0, false, true);
    echo "<pre>";print_r($chain);echo "</pre>";
    $APPLICATION->ShowNavChain();

    $APPLICATION->AddChainItem("Форум &quot;Отзывы&quot;", "/ru/forum/list.php?FID=3");
?>
Tag: bitrix, хлебные, крошки, breadcrumb

20 Выводим все данные

<?php
    echo "<pre>";
    echo "defined_vars<br />"; print_r(get_defined_vars());
    echo "defined_constants<br />"; print_r(get_defined_constants());
    echo "defined_functions<br />"; print_r(get_defined_functions());
    echo "</pre>"
?>
Tag: print_r, define, php

21 Регулярные выражения

<?php
    $V = preg_replace("@(\d+)(?:[\s,]*)(\d*)([,.]?)(\d*)@","$1$2.$4",$V); # Очищаем Float от пробела и ,
    $ma = preg_replace("/[^\w \s]/is","",$arResult["sales-agent.email"]);  # Удалить все непечатное
//--------------------------------------------------------------------------------------------------/
    $reg_exp = "/\<(\w+)([^>]*)>(.*?)\<\/\1>/m"; # Разбираем XML
    $reg_exp = "/[\s]*([^\=]+)\=[\"']*(.*?)[\"']+[\s]*/ms";
    $x = preg_replace("#(\<\!\[CDATA\[)([^\]]*)(\]\]>)#m", '$2', html_entity_decode($x));
?>
Tag: preg_replace, php

22 Константы и глобалы в Битрикс

<?php
if(is_file($_SERVER["DOCUMENT_ROOT"]."/menu/left_menu_include/str_man.inc"))
        include ($_SERVER["DOCUMENT_ROOT"]."/menu/left_menu_include/str_man.inc");
/*
    $_REQUEST
    $_POST
    $_GET

    $_SESSION
    $GLOBALS
    $_COOKIE

    $arParams
    $arResult

    $templateFolder
*/
    $_SERVER['DOCUMENT_ROOT'] = dirname(__FILE__);
    $DOCUMENT_ROOT = $_SERVER["DOCUMENT_ROOT"]=realpath(dirname(__FILE__)."/../");
    define('DOCUMENT_ROOT', rtrim(str_replace('\','/',$_SERVER['DOCUMENT_ROOT']),'/'));

    $site = CSite::GetSiteByFullPath(DOCUMENT_ROOT);

    $d1 = CSite::InDir(SITE_DIR.'search/accumulators');
    $d2 = CSite::InDir(SITE_DIR.'catalog/accumulators');
    if( $d1 || $d2 ){    }
?>
Tag: bitrix, php, global

23 Redirect

<?php
    LocalRedirect("http://www.bitrixsoft.ru/"); # полный URL на другой сайт
    LocalRedirect("/ru/index.php");# относительный путь от корня текущего сайта
    LocalRedirect("index.php");# относительный путь к файлу в текущем каталоге текущего сайта

    # сделать переадресацию с 302 статусом.
    $response = new \Bitrix\Main\Engine\Response\Redirect('/auth');

    # сделать переадресацию с 301 статусом.
    $response = new \Bitrix\Main\Engine\Response\Redirect('/auth');
    $response->setStatus('301 Moved Permanently');

    header("Request-URI: $url");
    header("Content-Location: $url");
    header("Location: $url");

    # 301-й редирект. Используется только тогда, когда страница навсегда “переехала” на другой адрес.
    header("Location: http://site.ru/redirect/", true, 301); exit;
    # 302-й редирект. Используется только тогда, когда страница временно доступна по другому адресу.
    header("Location: http://site.ru/redirect/", true, 302); exit;
    # 404 Not Found
    header($_SERVER['SERVER_PROTOCOL']." 404 Not Found");

    header("HTTP/1.0 404 Not Found");
    header("HTTP/1.1 404 Not Found");
    header("Status: 404 Not Found");
?>
Tag: bitrix, php, redirect, d7

24 Redirect / Reload через Javascript

<script type="text/javascript"> /* Переход */
    location="/personal/basket.php";
    location.href='http://www.site.ru/redirect/';
    window.open('http://www.site.ru/redirect/', '_blank');
</script>

<script type="text/javascript"> // Перезагрулка
    location.reload(true);
    // Устанавливает новое местоположение текущего окна.
    window.location = "http://www.example.com";
    // Устанавливает новую гиперссылку (URL) для текущего окна.
    window.location.href = "http://www.example.com";
    // Присваивает новый URL текущему окну.
    window.location.assign("http://www.example.com");
    // Заменяет положение текущего окна на новое.
    window.location.replace("http://www.example.com");
    // Задает местоположение самого текущего окна.
    self.location = "http://www.example.com";
    // Задает положение самого верхнего окна относительно текущего.
    top.location = "http://www.example.com";
    // Замена URL без перезагрузки
    window.history.replaceState(null, document.title, "/page2.php")
    history.pushState(null, null, "/page2.php");

    history.pushState(null,null, 'newpage');    // добавляет новый URL в историю
    history.replaceState(null,null, 'newpage'); // заменяет текущий URL
</script>

# Редирект через тег META
    <meta http-equiv="Refresh" content="0; url=http://www.site.ru/redirect/" />

# отсутствует JS
<noscript>
    <meta http-equiv="Refresh" content="0; http://m.site.ru/" />
<?php  echo '<meta http-equiv="Refresh" content="0; '.$_SERVER['SCRIPT_NAME']."?num=".($mm).'" />'; exit;?>
</noscript>

<script type="text/javascript">
//    возврат на предыдущую страницу
    window.history.back();
    history.back();
    или
    history.go(-1);
</script>
Tag: js, redirect, reload, url

25 ReDirect, LocalRedirect

<?php
    function ReDirect($url) {
        $host  = $_SERVER['HTTP_HOST'];
        $Uri   = rtrim(dirname($_SERVER['PHP_SELF']), '/\');
        header("Location: http://$host$Uri/$url");
        exit;
    }
    function LocalRedirect($url) {
        if(preg_match("'^(http://|https://|ftp://)'i", $url)) {
            header("Request-URI: ".$url);
            header("Content-Location: ".$url);
            header("Location: ".$url);
        } else {
            if(strpos($url, "/") !== 0)
                $url = str_replace(array("\r", "\n"), "",GetCurDir()).$url;

            $host = $_SERVER['HTTP_HOST'];
            if(    $_SERVER['SERVER_PORT'] <> 80 &&
                $_SERVER['SERVER_PORT'] <> 443 &&
                $_SERVER['SERVER_PORT'] > 0 &&
                strpos($_SERVER['HTTP_HOST'], ":") === false)
                $host .= ":".$_SERVER['SERVER_PORT'];

            $protocol = (IsHTTPS() ? "https" : "http");

            header("Request-URI: ".$protocol."://".$host.$url);
            header("Content-Location: ".$protocol."://".$host.$url);
            header("Location: ".$protocol."://".$host.$url);
        }
        exit;
    }
?>
Tag: redirect, php

26 Обфурцируем и деобфурцируем строку

<?php
    $S = "string";
    $String = base64_encode(gzdeflate($S));
    $S = gzinflate(base64_decode($String));
    eval($S);
?>
Tag: обфурцируем, php

27 serialize, unserialize, parseJSON, PhpToJSObject

<?php
$ar = array("a"=>10,"b"=>234);
$s = serialize($ar);  echo $s."<br/>";
$b = unserialize($s); echo print_r($b,1)."<br/>";

$myArrayJsonEncoded = json_encode($myArray);
$myNewArray = json_decode($myArrayJsonEncoded); # Object
$myNewArray = json_decode($myArrayJsonEncoded, true); # Array

$enc_value = \Bitrix\Main\Web\Json::encode($data, $options = null); # encode
$dec_value = \Bitrix\Main\Web\Json::decode($data); # decode

function Returns_from_AJAX(){
    echo json_encode(array("error" => 0, "ok" => "Вы успешно записаны на сеанс. С вашего счета списано:<br>300 руб."));
}

$currencyList = CUtil::PhpToJSObject($arResult['CURRENCIES'], false, true, true);
?>
<script type="text/javascript">
    var obj = $.parseJSON(<?= $s?>);
    var obj = window.JSON.parse( data );
</script>

<script type="text/javascript"> // Рабочая связка
    var ar = JSON.parse(<?php echo json_encode(array("a"=>10,"b"=>234))?>);
</script>
Tag: serialize, json, php, js, bitrix, d7

28 Получить поля SEO в Битрикс

<?php
# Получить поля SEO для элемента можно так:
#
    CModule::IncludeModule("iblock");

    $ipropValues = new BitrixIblockInheritedPropertyElementValues(
                        $arCurElem["IBLOCK_ID"], # ID инфоблока
                        $arCurElem["ID"] # ID элемента
                    );
    $arElMetaProp = $ipropValues->getValues();
    echo '<pre>'; print_r ($arElMetaProp); echo '</pre>';

//*****************************************************

if(!empty($arResult['META'])) {
    $APPLICATION->SetPageProperty("description", $arResult['META']['ELEMENT_META_DESCRIPTION']);
    $APPLICATION->SetPageProperty("keywords", $arResult['META']['ELEMENT_META_KEYWORDS']);
    $APPLICATION->SetPageProperty("title", $arResult['META']['ELEMENT_PAGE_TITLE']);
    $APPLICATION->SetTitle($arResult['META']['ELEMENT_META_TITLE']);
}
//---------------------------------------------------

    $ipropValues = new BitrixIblockInheritedPropertySectionValues(
                        $arSection["IBLOCK_ID"],
                        $arSection["ID"]
                    );
    $arSection = $ipropValues->getValues();
    echo "<pre>"; print_r($arSection); echo '</pre>';
?>
<?
$APPLICATION->ShowMeta("keywords");
$APPLICATION->ShowMeta("description");
?>
<title><?$APPLICATION->ShowProperty("page_title")?></title>
Tag: seo, bitrix

29 HEADER HTML + meta Битрикс

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru" dir="ltr">

<?php header('Content-Type: text/html; charset=windows-1251'); ?>
<meta http-equiv="Content-Type" content="text/html; charset=<?= LANG_CHARSET;?>">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<?php $APPLICATION->ShowHeadScripts(); ?>
<META NAME="ROBOTS" content="ALL">
<title><?php $APPLICATION->ShowTitle()?></title>

<?php
# Вывод подключенных скриптов и стилей в head

    $APPLICATION->ShowMeta("robots", false);
    $APPLICATION->ShowLink("canonical", null);
    $APPLICATION->ShowCSS(true);
    $APPLICATION->ShowHeadStrings();
    $APPLICATION->ShowHeadScripts();

    $APPLICATION->ShowTitle();
    $APPLICATION->ShowMeta("keywords");
    $APPLICATION->ShowMeta("description");
    $APPLICATION->SetTitle($title ? $title : "Каталог товаров");
    $APPLICATION->ShowLink("canonical", null);

    $APPLICATION->SetPageProperty("description", $desc);
    $APPLICATION->SetPageProperty("keywords", $key_words);
    $APPLICATION->SetPageProperty("NOT_SHOW_NAV_CHAIN", "Y");

    $APPLICATION->AddHeadString('<link rel="canonical" href="'.SITE_SERVER_NAME.GetPagePath(false).'" />' );
?>
<?php
    setlocale(LC_ALL,"ru_RU.UTF-8");
    ini_set("mbstring.internal_encoding", "utf8");
    ini_set("mbstring.func_overload", "2");

    mysql_set_charset ("utf8");

//    "PAGE" => "#SITE_DIR#personal/subscribe/subscr_edit.php",
?>
<?php
    # Локаль.
    setlocale(LC_ALL, 'ru_RU.utf8');
    mb_internal_encoding('UTF-8');
    mb_regex_encoding('UTF-8');
    mb_http_output('UTF-8');
    mb_language('uni');
    header('Content-type: text/html; charset=utf-8');
    date_default_timezone_set('Europe/Moscow');
?>

Tag: seo, meta, bitrix, ajax

30 Подключить AJAX, AJAX в отдельном файле

<?php
    CAjax::Init();
    IncludeAJAX();

    # Подключить режим Ajax для компонента
    [
    "AJAX_MODE"           => "Y",  # режим AJAX
    "AJAX_OPTION_SHADOW"  => "N", # затемнять область
    "AJAX_OPTION_JUMP"    => "N", # скроллить страницу до компонента
    "AJAX_OPTION_STYLE"   => "Y", # подключать стили
    "AJAX_OPTION_HISTORY" => "N",
    ];
?>

<?
# AJAX в отдельном файле
define("NO_KEEP_STATISTIC", true);
define("NO_AGENT_STATISTIC", true);
define("NOT_CHECK_PERMISSIONS", true);
require_once($_SERVER['DOCUMENT_ROOT']. "/bitrix/modules/main/include/prolog_before.php");
$context = \Bitrix\Main\Application::getInstance()->getContext();
$response = new \Bitrix\Main\HttpResponse($context);
$response->addHeader("Content-Type", "application/json");
$request = $context->getRequest();
$request->addFilter(new Bitrix\Main\Web\PostDecodeFilter);
$arResult = [
    'status' => 'success',
    'text'   => '',
];
if (!$request->isAjaxRequest())
{
    $arResult = [
        'status' => 'error',
        'text'   => 'Request is not XHR',
    ];
    $response->flush(Bitrix\Main\Web\Json::encode($arResult));
    die();
}
if (!$request->isPost())
{
    $arResult = [
        'status' => 'error',
        'text'   => 'Request is not POST',
    ];
    $response->flush(Bitrix\Main\Web\Json::encode($arResult));
    die();
}
// выполняем вычисления...
// возвращаем результат
$response->flush(Bitrix\Main\Web\Json::encode($arResult));
?>
Tag: bitrix, ajax

31 AJAX в отдельном файле V2

<?php
define("NO_KEEP_STATISTIC", true);
define("NO_AGENT_STATISTIC", true);
define("NOT_CHECK_PERMISSIONS", true);

require_once($_SERVER['DOCUMENT_ROOT']. "/bitrix/modules/main/include/prolog_before.php");

$context = \Bitrix\Main\Application::getInstance()->getContext();

$response = new \Bitrix\Main\HttpResponse($context);
$response->addHeader("Content-Type", "application/json");

$request = $context->getRequest();
$request->addFilter(new Bitrix\Main\Web\PostDecodeFilter);

$arResult = ['status' => 'success','text' => ''];

if (!$request->isAjaxRequest()){
    $arResult = ['status' => 'error','text' => 'Request is not XHR',];
    $response->flush(Bitrix\Main\Web\Json::encode($arResult));
    die();
}

if (!$request->isPost()){
    $arResult = ['status' => 'error','text' => 'Request is not POST',];
    $response->flush(Bitrix\Main\Web\Json::encode($arResult));
    die();
}

# выполняем вычисления...

# возвращаем результат
$response->flush(Bitrix\Main\Web\Json::encode($arResult));
?>
Tag: bitrix, ajax, d7

32 AJAX в странице или компоненте bitrix

<?php
# Для аякса нужно получать данные без лишнего,
# это можно сделать, если сбросить буфер в нужном месте
# и сделать finalActions() в конце данных
$isAjax = ($_GET["ajax_list"]=="Y");
if($isAjax) {
    $APPLICATION->restartBuffer();
    $tm=".default_ajax_new"; # можем подменить шаблон именно для аякс
    $arParams["CACHE_TYPE"]="N";
}?>

... подключаем компонент получаем данные и делаем все что нужно ...

<?php if($isAjax) {
    # с этой ф-ей были проблемы
    # $APPLICATION->FinalActions();
    die();
}?>
Tag: bitrix, ajax

33 AJAX загрузка файла JS

# http://www.phpletter.com/Demo/AjaxFileUpload-Demo/
#
<script type="text/javascript" src="<?= SITE_TEMPLATE_PATH?>/js/ajaxfileupload.js"></script>
<input type="file" id="load_file" name="load_file[]" multiple>
<script type="text/javascript">
/* AJAX загрузка файла */
$.ajaxFileUpload ({
    url:'/personal/sale/save_data.php', // обработчик загрузки
    secureuri:false,
    fileElementId:'load_file', //  <input type="file" id="load_file" name="load_file[]" multiple>
    dataType: 'json',
    success: function (data, status) {
        if(typeof(data.error) != 'undefined')
            if(data.error != ''){ alert(data.error);} else {alert(data.msg);}
    },
    error: function (data, status, e) {alert(e);}
})
</script>
//----------------------------------------------------------------------------------------
<form action="" method="POST" enctype="multipart/form-data">
    <input size="" onchange='LoadUserFile(this)' type='file' value="" name="Properties" id="Properties">
</form>
<script type="text/javascript">
    function LoadUserFile(obj){
        var file_data = $('#Properties').prop('files')[0];
        var form_data = new FormData();
            form_data.append('file', file_data);
        $.ajax({
            url: '<?= $template_path."/ajax_file_load.php"?>',
            dataType: 'text',
            cache: false,
            contentType: false,
            processData: false,
            data: form_data,
            type: 'post',
            success: function(php_script_response){
                //alert(php_script_response);
            }
        });
    }
</script>
<?php # ajax_file_load.php
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
$APPLICATION->RestartBuffer(); // Очистка буфера вывода
CModule::IncludeModule("user");
if ( $_FILES['file']['error'] > 0) {
    echo 'Error: ' . $_FILES['file']['error'] . '<br>';
} else {
    move_uploaded_file($_FILES['file']['tmp_name'], $_SERVER["DOCUMENT_ROOT"].'/upload/tmp/' . $_FILES['file']['name']);
    if (file_exists($_SERVER["DOCUMENT_ROOT"].'/upload/tmp/' . $_FILES['file']['name'])) {
    $rsUser = CUser::GetByID($USER->GetID());
    $arUser = $rsUser->Fetch();
    $arFile = CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"].'/upload/tmp/' . $_FILES['file']['name']);
    $user   = new CUser;
    $fields = Array(
        "UF_FILE_DOC" => $arFile,
    );
    $user->Update($arUser['ID'], $fields);
    echo ($strError .= $user->LAST_ERROR);
    unlink($_SERVER["DOCUMENT_ROOT"].'/upload/tmp/' . $_FILES['file']['name']);
    } else {
        echo 'copy error';
    }
}
?>
Tag: js, ajax, file, load, bitrix

34 Генератор пароля

<?php
function generate_password($number) { # Генератор пароля. $number - длина пароля
    $arr = array('a','b','c','d','e','f','g','h','i','j','k','l',
                 'm','n','o','p','r','s','t','u','v','x','y','z',
                 'A','B','C','D','E','F','G','H','I','J','K','L',
                 'M','N','O','P','R','S','T','U','V','X','Y','Z',
                 '1','2','3','4','5','6','7','8','9','0');
    $pass = "";
    $car = count($arr) - 1;
    for($i = 0; $i < $number; $i++) {
      $pass .= $arr[rand(0, $car)];
    }
    return $pass;
}
$U_P =  generate_password(8);
?>
Tag: php, password

35 Распознавание кодировки строки

<?php
/*******************************************************************/
# Распознавание кодировки строки
# $string - строка в неизвестной кодировке.
# $pattern_size - если строка больше этого размера, то определение кодировки будет
# производиться по шаблону из $pattern_size символов, взятых из середины переданной
# строки. Это сделано для увеличения производительности на больших текстах.
#
function detect_encoding($string, $pattern_size = 50) { # Распознавание кодировки строки
    $list = array('cp1251', 'utf-8', 'ascii', '855', 'KOI8R', 'ISO-IR-111', 'CP866', 'KOI8U');
    $c = strlen($string);
    if ($c > $pattern_size) {
        $string = substr($string, floor(($c - $pattern_size) /2), $pattern_size);
        $c = $pattern_size;
    }

    $reg1 = '/(\xE0|\xE5|\xE8|\xEE|\xF3|\xFB|\xFD|\xFE|\xFF)/i';
    $reg2 = '/(\xE1|\xE2|\xE3|\xE4|\xE6|\xE7|\xE9|\xEA|\xEB|\xEC|\xED|\xEF|\xF0|\xF1|\xF2|\xF4|\xF5|\xF6|\xF7|\xF8|\xF9|\xFA|\xFC)/i';

    $mk = 10000;
    $enc = 'ascii';
    foreach ($list as $item) {
        $sample1 = @iconv($item, 'cp1251', $string);
        $gl = @preg_match_all($reg1, $sample1, $arr);
        $sl = @preg_match_all($reg2, $sample1, $arr);
        if (!$gl || !$sl) continue;
        $k = abs(3 - ($sl / $gl));
        $k += $c - $gl - $sl;
        if ($k < $mk) {
            $enc = $item;
            $mk = $k;
        }
    }
    return $enc;
}
?>
Tag: php, encoding

36 CUtil::translit() Битрикс

<?php
$params = Array(
       "max_len"               => "100", # обрезает символьный код до 100 символов
       "change_case"           => "L", # буквы преобразуются к нижнему регистру
       "replace_space"         => "_", # меняем пробелы на нижнее подчеркивание
       "replace_other"         => "_", # меняем левые символы на нижнее подчеркивание
       "delete_repeat_replace" => "true", # удаляем повторяющиеся нижние подчеркивания
       "use_google"            => "false", # отключаем использование google
    );
$CODE = CUtil::translit("здесь переменная", "ru" , $params); //Функция транслитерирует строку $str с языка $lang с параметрами $params

$arParams = array("replace_space"=>"-","replace_other"=>"-");
$trans = Cutil::translit($name,"ru",$arParams);
?>
Tag: translit, bitrix

37 Работа со строкой

<?php
/*
    string strtoupper ( string string );
    string strtolower ( string str );
    string mb_strtolower ( string str [, string encoding] );
    string mb_strtoupper ( string str [, string encoding] );
    string ucfirst(strtolower($bar));
    mb_convert_case

    $str = mb_strimwidth($str, 0, 40, "..>"); // - получает усечённую строку со специфицированной шириной.
    int mb_strwidth (string str [, string encoding]); // - возвращает ширину строки.
    $arWord = str_word_count($str, 2); // — Возвращает массив слов
*/
    if(!function_exists("TrimStr")) {
        function TrimStr($string,$len) { # Обрезаем строку на задан величину по словам.
            $string = trim($string);
            $result = implode(array_slice(explode('<br>',wordwrap($string,$len,'<br>',false)),0,1));
            if($result != $string) $result .= '...';
            return $result;
        }
    }

    if(!function_exists('mb_ucwords')) {
        function mb_ucwords($str) { # Поднять первые буквы слов
            return mb_convert_case($str, MB_CASE_TITLE, "UTF-8");
        }
    }
    if (!function_exists('mb_ucfirst') && extension_loaded('mbstring')) {
        function mb_ucfirst($str, $encoding='UTF-8'){# Сделать первую букву заглавной
            $str = mb_ereg_replace('^[\ ]+', '', $str);
            $str = mb_strtoupper(mb_substr($str, 0, 1, $encoding), $encoding).mb_substr($str, 1, mb_strlen($str), $encoding);
            return $str;
        }
    }
?>
Tag: php, string, str

38 ob_start, ob_ для Битрикс

<?php
    ob_start();
        file_put_contents($_SERVER["DOCUMENT_ROOT"]."/testmenu.inc", ob_get_contents ());
    ob_end_clean();

    ob_implicit_flush(true);

    ob_end_flush();

    $html_inc2 = ob_get_clean();

    flush();
?>
<?php
$this->SetViewTarget('news_detail');
  #......
$this->EndViewTarget();

$APPLICATION->ShowViewContent('news_detail');
?>
Tag: php, ob_, bitrix

39 Енкодим только параметры в URL строке

<?php
function encode_basename($url) { # Енкодим только параметры в URL строке
    $url  = explode('/', $url);
    $base = array_pop($url);
    return implode('/', $url).'/'.urlencode($base);
}
?>
Tag: php, encode

40 Пропорциональность Image

<?php
if(!function_exists('ImageWH')){ # Пропорциональность
    function ImageWH($height,$width,$maxHeight,$maxWidth,$img) {
        if(($width * $height) != 0) {$ratio = ( $width > $height) ? ($maxWidth / $width) : ($maxHeight / $height);    } else {    $ratio = 1; }
        return array("HEIGHT"=>round ($height*$ratio), "WIDTH"=>round ($width*$ratio),"SRC"=>$img);
    }
}
?>
Tag: php, img, size

41 DATE TIME

<?php

$d=floatval(strftime("%y%m%d"));
if ($d >= floatval("110430") && $d < floatval("110503")){}
# дата сегодня ([ int $hour [, int $minute [, int $second [, int $month [, int $day [, int $year [, int $is_dst ]]]]]]] )
$current_date = mktime (0,0,0,date("m") ,date("d"),date("Y"));

$date1 = '01.05.2006';
$date2 = '15.11.2010';
$arr1  = explode('.', $date1);
$arr2  = explode('.', $date2);
$time1 = mktime(0,0,0,$arr1[1],$arr1[0],$arr1[2]);
$time2 = mktime(0,0,0,$arr2[1],$arr2[0],$arr2[2]);
$dif   = ($time2 - $time1) / 86400;
echo $dif.' days';

/*
$sec - разница в секундах с текущим временем;
$min - разница в минутах с текущим временем;
$hour - разница в часах с текущим временем;
$days - разница в днях с текущим временем;
*/
$need_date = date ("Y-m-d H:i:s", time()+( $sec + 60*($min + 60*($hour + 24*$day))));
echo date("Y-m-d H:i:s", strtotime("-2 day -3 hours"));
echo strtotime("12/28/2002");
@setlocale('LC_ALL','ru_RU.UTF-8');
@setlocale(LC_ALL,'Russian_Russia.UTF-8');
echo strftime("Сегодня %A %d %B %Y %X<br>");

# Сегодня Вторник 22 Июль 2014 10:06:41

$stmp1 = MakeTimeStamp($arElement['TIMESTAMP_X'], "DD.MM.YYYY HH:MI:SS");
$delta = round((getmicrotime()-$stmp1)/ 86400);
if( $delta <= 31 ) echo "<label class='new-item'></label>";
=ConvertDateTime($arElement['TIMESTAMP_X'], "DD.MM.YYYY")
?>
Tag: php, date, time, общее

42 number_format

<?php
$number = 1234.5678;
$nombre_format_francais = number_format($number, 0, '.', ' '); # 1 235
$cifir = number_format(round($number,-1), 0, '.', ' '); # 1 230
# английский формат без разделителей групп 
$english_format_number = number_format($number, 0, '.', ''); # 1235
?>
Tag: php, number, format, общее

43 number_format JS

<script type="text/javascript">
/*
number - число
decimals - количество знаков после разделителя
dec_point - символ разделителя
separator - разделитель тысячных
*/
function number_format(number, decimals, dec_point, separator ) {
  number = (number + '').replace(/[^0-9+\-Ee.]/g, '');
  var n = !isFinite(+number) ? 0 : +number,
    prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),
    sep = (typeof separator === 'undefined') ? ',' : separator ,
    dec = (typeof dec_point === 'undefined') ? '.' : dec_point,
    s = '',
    toFixedFix = function(n, prec) {
      var k = Math.pow(10, prec);
      return '' + (Math.round(n * k) / k)
        .toFixed(prec);
    };
  // Фиксим баг в IE parseFloat(0.55).toFixed(0) = 0;
  s = (prec ? toFixedFix(n, prec) : '' + Math.round(n))
    .split('.');
  if (s[0].length > 3) {
    s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep);
  }
  if ((s[1] || '')
    .length < prec) {
    s[1] = s[1] || '';
    s[1] += new Array(prec - s[1].length + 1)
      .join('0');
  }
  return s.join(dec);
}
</script>
Tag: js, number, format, общее

44 записи объекта в файл

<?php
/*******************************************************************/
/**
 * void object2file - функция записи объекта в файл
 *
 * @param mixed value - объект, массив и т.д.
 * @param string filename - имя файла куда будет произведена запись данных
 * @return void
 *
 */
function object2file($value, $filename) { # функция записи объекта в файл
    file_put_contents($_SERVER["DOCUMENT_ROOT"]."/".$filename,json_encode($value));
}
function object_from_file($filename) { # функция восстановления данных объекта из файла
    return json_decode(file_get_contents($_SERVER["DOCUMENT_ROOT"]."/".$filename));
}
?>
Tag: php, object, file

45 Сохраняем массив в файл

<?php
/*******************************************************************/
# Сохраняем массив в файл # array2file($arResult, $_SERVER["DOCUMENT_ROOT"]."/test2menu.php","arProp");
function array2file( $array, $filename = 0, $arName = 0, $levels=0, $file = 0) {
    $levels++; $level = 1;
    if($file == 0)    {
        $level = 0; $file = fopen($filename, "w");
        if(!$file)  return false;
        fwrite($file, "<?php \n\$".$arName." = ");
    }
    $i = 0; fwrite($file, "array(");
    foreach($array as $key => $value) {
        if($i++ != 0)  {
            fwrite($file, ", ");
            if($levels == 1)
                fwrite($file, "\n");
        }
        if(is_array($array[$key])){
            fwrite($file, "\n".str_repeat("\t",$levels)."'$key' => ");
            array2file($array[$key], 0, 0, $levels, $file);
        } else {
            $value = addcslashes($value, "'\\");
            fwrite($file, "\n".str_repeat("\t",$levels+1)."'$key' => '$value'");
        }
    }
    fwrite($file, ")");
    if($level == 0)    {
        fwrite($file, ";\n?>");
        fclose($file);
        return true;
    }
}
?>
Tag: php, array, file

46 Сохраняем массив в текст

<?php
/*******************************************************************/
# $ar = "";
# array2text($Sum,$ar,"arProp");
# echo "<pre>"; echo $ar."<br/>"; echo "</pre>";

function array2text($array, &$f_file, $arName = 0, $levels=0){
    $levels++; $level = 1;
    if(!strlen($f_file)){ $level = 0; $f_file = "\$".$arName." = ";}

    $i = 0; $f_file .= "array(";
    foreach($array as $key => $value) {
        if($i++ != 0) { $f_file .= ", "; if($levels == 1) $f_file .= "\n";}
        if(is_array($array[$key])){
             $f_file .= "'$key' => ";
             array2text($array[$key], $f_file, 0, $levels);
        } else {
            $value = addcslashes($value, "'"."\\");
            $f_file .= "'$key' => '$value'";
        }
    }
    $f_file .= ")"; if($level == 0)    { $f_file .= ";"; return true;}
}
?>
Tag: php, array, file

47 Сохраняем объект в массив

/*******************************************************************/
<?php
function objects2Array($arrObjData, $arrSkipIndices = array()) {
    $arrData = array();

    # if input is object, convert into array
    if (is_object($arrObjData)) {
        $arrObjData = get_object_vars($arrObjData);
    }
    if (is_array($arrObjData)) {
        foreach ($arrObjData as $index => $value) {
            if (is_object($value) || is_array($value)) {
                $value = objects2Array($value, $arrSkipIndices); # recursive call
            }
            if (in_array($index, $arrSkipIndices)) {
                continue;
            }
            $arrData[$index] = $value;
        }
    }
    return $arrData;
}
?>
Tag: php, array, file

48 Разбор INI файла в массив

<?php
//----------------------------------------------------------------------
# $ini_array = parse_ini_file("sample.ini", true);
#
function parse_ini_string_m($str) { # Разбор INI файла в массив
    if(empty($str)) return false;
    $lines = explode("\n", $str);
    $ret   = Array();
    $inside_section = false;
    foreach($lines as $line) {
        $line = trim($line);
        if(!$line || $line[0] == "#" || $line[0] == ";") continue;
        if($line[0] == "[" && $endIdx = strpos($line, "]")){
            $inside_section = substr($line, 1, $endIdx-1);
            continue;
        }
        if(!strpos($line, '=')) continue;
        $tmp = explode("=", $line, 2);
        if($inside_section) {
            $key = rtrim($tmp[0]);
            $value = ltrim($tmp[1]);
            if(preg_match("/^\".*\"$/", $value) || preg_match("/^'.*'$/", $value)) {
                $value = mb_substr($value, 1, mb_strlen($value) - 2);
            }
            $t = preg_match("^\[(.*?)\]^", $key, $matches);
            if(!empty($matches) && isset($matches[0])) {
                $arr_name = preg_replace('#\[(.*?)\]#is', '', $key);
                if(!isset($ret[$inside_section][$arr_name]) || !is_array($ret[$inside_section][$arr_name])) {
                    $ret[$inside_section][$arr_name] = array();
                }
                if(isset($matches[1]) && !empty($matches[1])) {
                    $ret[$inside_section][$arr_name][$matches[1]] = $value;
                } else {
                    $ret[$inside_section][$arr_name][] = $value;
                }
            } else {
                $ret[$inside_section][trim($tmp[0])] = $value;
            }
        } else {
            $ret[trim($tmp[0])] = ltrim($tmp[1]);
        }
    }
    return $ret;
}
/*******************************************************************/
function arr2ini(array $a) { # Преобразовать массив в INI структуру
    $out = '';
    foreach ($a as $k => $v) {
        if (is_array($v)) {
            $sec  = (array) $k;
            $out .= PHP_EOL.'[' . implode ('.', $sec) . ']' . PHP_EOL;
            $out .= arr2ini($v, $sec);
        } else {
            $out .= "$k = $v" . PHP_EOL;
        }
    }
    return $out;
}
?>
Tag: php, ini, file

49 Изображение в виде кода

<?php
# Изображение в виде кода
# Генератор: http://netcoding.ru/services/online-generator-base64/
# Путь до изображения:
$image = "folder.gif";
$Image_CODE =  base64_encode(file_get_contents($image));
?>
<img src="data:image/gif;base64,<?= $Image_CODE?>" alt="" />
<style>
body {
  background-image: url("data:image/gif;base64,<?= $Image_CODE?>");
  background-repeat: repeat-x;
}
</style>
Tag: php, img, code, image

50 iconv UTF-8 CP1251

<?php
echo iconv("UTF-8", "CP1251", "This is a test.");

$s = mb_convert_encoding( $s, "CP1251","UTF-8");

function UTF8_TO_ANSI($str){
    $ANSI = ARRAY("й", "ц", "у", "к", "е", "н", "г", "ш", "щ", "з", "х", "ъ", "ф", "ы", "в", "а", "п", "р", "о", "л", "д", "ж", "э", "я", "ч", "с", "м", "и", "т", "ь", "б", "ю", "ё", "Й", "Ц", "У", "К", "Е", "Н", "Г", "Ш", "Щ", "З", "Х", "Ъ", "Ф", "Ы", "В", "А", "П", "Р", "О", "Л", "Д", "Ж", "Э", "Я", "Ч", "С", "М", "И", "Т", "Ь", "Б", "Ю", "Ё");
    $UTF8 = ARRAY("Р", "№", "С", "†", "С", "ѓ", "Р", "є", "Р", "µ", "Р", "Ѕ", "Р", "і", "С", "?", "С", "‰", "Р", "·", "С", "…", "С", "Љ", "С", "„", "С", "‹", "Р", "І", "Р", "°", "Р", "ї", "С", "Ђ", "Р", "ѕ", "Р", "»", "Р", "ґ", "Р", "¶", "С", "Ќ", "С", "Џ", "С", "‡", "С", "Ѓ", "Р", "ј", "Р", "ё", "С", "‚", "С", "Њ", "Р", "±", "С", "Ћ", "С", "‘", "Р", "™", "Р", "¦", "Р", "Ј", "Р", "љ", "Р", "•", "Р", "ќ", "Р", "“");
    return str_replace    ($UTF8,$ANSI,$str);
}
?>
Tag: php, iconv, translit

51 iconv EscapeToWin

<?php
/*******************************************************************/
function EscapeToWin($str){
    $arEscape=array("%u0439", "%u0446", "%u0443", "%u043A", "%u0435", "%u043D", "%u0433", "%u0448", "%u0449", "%u0437", "%u0445", "%u044A", "%u0444", "%u044B", "%u0432", "%u0430", "%u043F", "%u0440", "%u043E", "%u043B", "%u0434", "%u0436", "%u044D", "%u044F", "%u0447", "%u0441", "%u043C", "%u0438", "%u0442", "%u044C", "%u0431", "%u044E", "%u0451", "%u2116", "%u0419", "%u0426", "%u0423", "%u041A", "%u0415", "%u041D", "%u0413", "%u0428", "%u0429", "%u0417", "%u0425", "%u042A", "%u0424", "%u042B", "%u0412", "%u0410", "%u041F", "%u0420", "%u041E", "%u041B", "%u0414", "%u0416", "%u042D", "%u042F", "%u0427", "%u0421", "%u041C", "%u0418", "%u0422", "%u042C", "%u0411", "%u042E", "%u0401");
    $arRUS=array("й", "ц", "у", "к", "е", "н", "г", "ш", "щ", "з", "х", "ъ", "ф", "ы", "в", "а", "п", "р", "о", "л", "д", "ж", "э", "я", "ч", "с", "м", "и", "т", "ь", "б", "ю", "ё", "№", "Й", "Ц", "У", "К", "Е", "Н", "Г", "Ш", "Щ", "З", "Х", "Ъ", "Ф", "Ы", "В", "А", "П", "Р", "О", "Л", "Д", "Ж", "Э", "Я", "Ч", "С", "М", "И", "Т", "Ь", "Б", "Ю", "Ё");
    $str = str_replace    ($arEscape, $arRUS, $str);
    return $str;
}
?>
Tag: php, iconv, translit

52 translit

<?php
/*******************************************************************/
/** * Translate russian UTF-8 characters to ASCII */
function translit($title, $rtl_standard = 'gost'){
    static $gost, $iso;
    switch ($rtl_standard) {
        case 'off': return $title;
        case 'gost':
        if (empty($gost)) {
            $gost = array('Є'=>'EH','І'=>'I','і'=>'i','№'=>'#','є'=>'eh','А'=>'A','Б'=>'B','В'=>'V','Г'=>'G','Д'=>'D','Е'=>'E','Ё'=>'JO','Ж'=>'ZH','З'=>'Z','И'=>'I','Й'=>'JJ','К'=>'K','Л'=>'L','М'=>'M','Н'=>'N','О'=>'O','П'=>'P','Р'=>'R','С'=>'S','Т'=>'T','У'=>'U','Ф'=>'F','Х'=>'KH','Ц'=>'C','Ч'=>'CH','Ш'=>'SH','Щ'=>'SHH','Ъ'=>'','Ы'=>'Y','Ь'=>'','Э'=>'EH','Ю'=>'YU','Я'=>'YA','а'=>'a','б'=>'b','в'=>'v','г'=>'g','д'=>'d','е'=>'e','ё'=>'jo','ж'=>'zh','з'=>'z','и'=>'i','й'=>'jj','к'=>'k','л'=>'l','м'=>'m','н'=>'n','о'=>'o','п'=>'p','р'=>'r','с'=>'s','т'=>'t','у'=>'u','ф'=>'f','х'=>'kh','ц'=>'c','ч'=>'ch','ш'=>'sh','щ'=>'shh','ъ'=>'','ы'=>'y','ь'=>'','э'=>'eh','ю'=>'yu','я'=>'ya','«'=>'"','»'=>'"','„'=>'"','“'=>'"','—'=>'-',' '=>'_','/'=>'_','\'=>'_','.'=>'_','+'=>'_',','=>'_','('=>'_',')'=>'_','['=>'_',']'=>'_');
        }
        return strtr($title, $gost);
        default:
        if (empty($iso)) {
            $iso = array('Є'=>'YE','І'=>'I','Ѓ'=>'G','і'=>'i','№'=>'#','є'=>'ye','ѓ'=>'g','А'=>'A','Б'=>'B','В'=>'V','Г'=>'G','Д'=>'D','Е'=>'E','Ё'=>'YO','Ж'=>'ZH','З'=>'Z','И'=>'I','Й'=>'J','К'=>'K','Л'=>'L','М'=>'M','Н'=>'N','О'=>'O','П'=>'P','Р'=>'R','С'=>'S','Т'=>'T','У'=>'U','Ф'=>'F','Х'=>'X','Ц'=>'C','Ч'=>'CH','Ш'=>'SH','Щ'=>'SHH','Ъ'=>'','Ы'=>'Y','Ь'=>'','Э'=>'E','Ю'=>'YU','Я'=>'YA','а'=>'a','б'=>'b','в'=>'v','г'=>'g','д'=>'d','е'=>'e','ё'=>'yo','ж'=>'zh','з'=>'z','и'=>'i','й'=>'j','к'=>'k','л'=>'l','м'=>'m','н'=>'n','о'=>'o','п'=>'p','р'=>'r','с'=>'s','т'=>'t','у'=>'u','ф'=>'f','х'=>'x','ц'=>'c','ч'=>'ch','ш'=>'sh','щ'=>'shh','ъ'=>'','ы'=>'y','ь'=>'','э'=>'e','ю'=>'yu','я'=>'ya','«'=>'"','»'=>'"','„'=>'"','“'=>'"','—'=>'-',' '=>'_','/'=>'_','\'=>'_','.'=>'_','+'=>'_',','=>'_','('=>'_',')'=>'_','['=>'_',']'=>'_');
        }
        return strtr($title, $iso);
    }
}
# ГОСТ 7.79-2000 (ИСО 9-95)
function translit($value) {
    $converter = array('А' => 'A', 'Б' => 'B', 'В' => 'V', 'Г' => 'G', 'Д' => 'D', 'Е' => 'E', 'Ё' => 'Yo', 'Ж' => 'Zh', 'З' => 'Z', 'И' => 'I', 'Й' => 'J', 'К' => 'K', 'Л' => 'L', 'М' => 'M', 'Н' => 'N', 'О' => 'O', 'П' => 'P', 'Р' => 'R', 'С' => 'S', 'Т' => 'T', 'У' => 'U', 'Ф' => 'F', 'Х' => 'X', 'Ц' => 'Cz', 'Ч' => 'Ch', 'Ш' => 'Sh', 'Щ' => 'Shh', 'Ъ' => '``', 'Ы' => 'Y`', 'Ь' => '`', 'Э' => 'E`', 'Ю' => 'Yu', 'Я' => 'Ya', 'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e', 'ё' => 'yo', 'ж' => 'zh', 'з' => 'z', 'и' => 'i', 'й' => 'j', 'к' => 'k', 'л' => 'l', 'м' => 'm', 'н' => 'n', 'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't', 'у' => 'u', 'ф' => 'f', 'х' => 'x', 'ц' => 'cz', 'ч' => 'ch', 'ш' => 'sh', 'щ' => 'shh', 'ъ' => '``', 'ы' => 'y`', 'ь' => '`', 'э' => 'e`', 'ю' => 'yu', 'я' => 'ya');
    $value = strtr($value, $converter);
    return $value;
}
?>
Tag: php, iconv, translit

53 ru2Lat

<?php
function ru2Lat($string) {
    $rus = array('ё','ж','ц','ч','ш','щ','ю','я','Ё','Ж','Ц','Ч','Ш','Щ','Ю','Я');
    $lat = array('yo','zh','tc','ch','sh','sh','yu','ya','YO','ZH','TC','CH','SH','SH','YU','YA');
    $string = str_replace($rus,$lat,$string);
    $string = strtolower(strtr($string,"- АБВГДЕЗИЙКЛМНОПРСТУФХЪЫЬЭабвгдезийклмнопрстуфхъыьэ","__ABVGDEZIJKLMNOPRSTUFH_I_Eabvgdezijklmnoprstufh_i_e"));
    return($string);
}
//--------------------------------------------------------------------------------
function my_strtr($inputStr, $from, $to, $encoding = 'UTF-8') {
        $inputStrLength = mb_strlen($inputStr, $encoding);
        $translated = '';
        for($i = 0; $i < $inputStrLength; $i++) {
            $currentChar = mb_substr($inputStr, $i, 1, $encoding);
            $translatedCharPos = mb_strpos($from, $currentChar, 0, $encoding);
            if($translatedCharPos === false) {
                $translated .= $currentChar;
            } else {
                $translated .= mb_substr($to, $translatedCharPos, 1, $encoding);
            }
        }
        return $translated;
}
function mb_ru2Lat($string) {
    $rus = array('ё','ж','ц','ч','ш','щ','ю','я','Ё','Ж','Ц','Ч','Ш','Щ','Ю','Я');
    $lat = array('yo','zh','tc','ch','sh','sh','yu','ya','YO','ZH','TC','CH','SH','SH','YU','YA');
    $string = str_replace($rus,$lat,$string);
    $string = my_strtr($string,"- АБВГДЕЗИЙКЛМНОПРСТУФХЪЫЬЭабвгдезийклмнопрстуфхъыьэ","__ABVGDEZIJKLMNOPRSTUFH_I_Eabvgdezijklmnoprstufh_i_e");
    return($string);
}
?>
Tag: php, iconv, translit

54 выводим все имиджи каталога

<?php
# выводим все имиджи каталога
$files1 = scandir($_SERVER["DOCUMENT_ROOT"].'/images/license/mini/');
foreach($files1 as $f)
 if($f != '.' && $f != '..') {
    list($name, $ext) = explode(".", $f);
    echo "<li class='img-box'><a href='/images/license/".$f."' rel='fancy-tour' title='".$name."'><img src='/images/license/mini/".$f."' alt='".$name."'/></a></li>";
 }
?>
Tag: php, img, dir

55 Удаляем старые файлы из заданного каталога

<?php
function delete_old_files($path, $age_days){  # Удаляем старые файлы из заданного каталога
    # $age_days - количество дней
    if ($handle = opendir($path)) {
        while (false !== ($fil = readdir($handle))) {
            if ($fil != "." && $fil != "..") {
                clearstatcache();
                $fn = $path."/".$fil;
                if (is_dir($fn)) continue;
                $diff = floor((time()-filemtime($fn))/(24*3600));
                if ($diff>=$age_days) {
                    @unlink($fn);
                }
            }
        }
        closedir($handle);
    }
}

array_map('unlink', glob($_SERVER['DOCUMENT_ROOT']."/backup/*.tar.bz2*"));
?>
Tag: php, del, file, dir

56 Рекурсивного сканирования каталога

<?php
//--------------------------------------------------------------
# Функция рекурсивного сканирования каталога
//--------------------------------------------------------------
# Параметры:
#   $directory - начальный каталог
#   $callback - функция для обработки найденных файлов
//--------------------------------------------------------------
function scan_recursive($directory, $callback=null) {
    # Привести каталог в канонизированный абсолютный путь
    $directory=realpath($directory);
    if ($d=opendir($directory)) {
        while($fname=readdir($d)) {
            if ($fname=='.' || $fname=='..') {
                continue;
            }
            else {
                # Передать путь файла в callback-функцию
                if ($callback!=null && is_callable($callback)) {
                    $callback($directory.DIRECTORY_SEPARATOR.$fname);
                }
            }
            if (is_dir($directory.DIRECTORY_SEPARATOR.$fname)) {
                scan_recursive($directory.DIRECTORY_SEPARATOR.$fname, $callback);
            }
        }
        closedir($d);
    }
}
# Callback-функция, которая будет принимать имена файлов
function scan_callback($fname) {
    echo $fname.'<br/>';
}
$path = $_SERVER['DOCUMENT_ROOT'];
scan_recursive($path, 'scan_callback');
?>
Tag: php, file, dir

57 DIR, scandir, opendir, getcwd

<?php
$dir = getcwd(); echo $dir."<br/>";
$dh  = opendir($dir);
while (false !== ($filename = readdir($dh))) {
    if ( $filename != "." && $filename != ".." && preg_match("!(\.php|\.csv)!",$filename))
        $files[] = $filename;
}
sort($files);
echo "<pre>"; print_r($files); echo "</pre>";
/*******************************************************************/
$dir =  "../work";
echo $dir."<br/>";
$files2 = scandir($dir);
echo "<pre>"; print_r($files2); echo "</pre>";
/*******************************************************************/
$dir =  "."; echo $dir."<br/>";
$files2 = scandir($dir);
echo "<pre>"; print_r($files2); echo "</pre>";
/*******************************************************************/
function ScanDir($dir){# Сканируем каталог
    $ar = array();
    $files = scandir($dir);
    foreach($files as $f) {
        if(!is_dir($dir."/".$f)){
            $ar[] = $f;
        }
    }
    return $ar;
}
?>
Tag: php, dir, scandir, opendir, getcwd

58 рекурсивного перебора каталогов файловой системы, DIR, scandir, opendir, getcwd

<?php
$path     = $_SERVER['DOCUMENT_ROOT'];
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::CHILD_FIRST);
foreach ($iterator as $path) {
# $path->isDir() вернет папка это или файл __toString() вернет имя
# echo "<pre>"; var_dump($path); echo "</pre>";
    if(!$path->isDir()) {
        echo $path->__toString()."<br/>";
        echo $path->getPathname()."  /  ".$path->getFilename()."<br/>";
    }
}
?>
<?php
$iterator = new RecursiveDirectoryIterator('.');
$filter   = new RegexIterator($iterator->getChildren(), '/t\.(php|dat)$/');
$filelist = array();
foreach($filter as $entry) {
    $filelist[] = $entry->getFilename();
}
?>
<?php
$path      = $_SERVER['DOCUMENT_ROOT'];
$directory = new \RecursiveDirectoryIterator($path);
$iterator  = new \RecursiveIteratorIterator($directory);
$CRC       = $DIR = [];
foreach ($iterator as $info) {
#    echo $info->getPath()."  --  ".$info->getSize()."<br>";
    if(!$info->isDir()) {
        $DIR[$info->getPath()][]   = $info->getFilename ();
        $CRC[$info->getPathname()] = hash_file('md5', $info->getPathname());
    }
}
echo " <pre>".print_r($CRC,1)."</pre>";
?>
Tag: php, dir, scandir, opendir, getcwd

59 Каталоги с подкаталогами без рекурсии

<?php
#
# Каталоги с подкаталогами без рекурсии
#
function DirTraversalNoRecursion ($StartDir) {
    $dirHandles = array(); # Хэндлы каталогов, к которым надо вернуться
    $dirNames   = array(); # Имена каталогов, к которым надо вернуться

    # Храним имена файлов, которые мы обошли, если их надо вернуть из функции
    $filenames = array();

    $currDirHandle = opendir($StartDir); # Открываем начальный каталог
    if (! $currDirHandle)
        die('Ошибка открытия корневого каталога для сканирования!');

    $currDirName = $StartDir;
    while ($currDirHandle !== NULL) { # Перебираем все папки, начиная с корня
        while (($file = readdir($currDirHandle)) !== false) { # Читаем текущую папку
            if(is_dir($currDirName . '/' . $file) and $file[0]=='.')  # Пропускаем "." и ".." каталоги
                continue;

            if (is_dir($currDirName . '/' . $file)) { # Если встретили папку -
                # запоминаем текущую в стеке
                array_push($dirHandles, $currDirHandle);
                array_push($dirNames, $currDirName);
                $currDirHandle = opendir($currDirName . '/' . $file); # Переключаемся на сканирование встреченной папки
                $currDirName = $currDirName . '/' . $file;
                continue;
            }
            $filenames[] = $currDirName . '/' . $file; # Запоминаем имя файла для возврата
            echo($currDirName . '/' . $file."\r\n"); # На всякий выводим на консоль
        }

        closedir($currDirHandle); # Закрываем хэндл пройденного каталога
        # Забираем из стека каталог, на котором мы остановились для продолжения обхода
        $currDirHandle = array_pop($dirHandles);
        $currDirName = array_pop($dirNames);
        # Продолжаем обход. array_pop вернет NULL, если для продолжения обхода больше нет каталогов
    }
    return $filenames; # Возвращаем встреченные имена файлов
}
//$filenames = DirTraversalNoRecursion("c:# windows");
?>
Tag: php, dir, tree

60 Контроль исполнительного БРАУЗЕРА

<?php
# Контроль исполнительного БРАУЗЕРА
#
if(        eregi("msie",$HTTP_USER_AGENT))                $browser = "IE";
else if(eregi("Chrome",$HTTP_USER_AGENT)) {            $browser = "CH"; $width = 128; }
else if(eregi("Firefox",$HTTP_USER_AGENT))            $browser = "FO";
else if(eregi("opera",$HTTP_USER_AGENT))            $browser = "OP";
else if(eregi("Mozilla.[4.]",$HTTP_USER_AGENT))        $browser = "NS";
else if(eregi("Mozilla.[5|6]",$HTTP_USER_AGENT))    $browser = "MO";
else                                                $browser = "OT"; # если что-то другое , то OT
?>
Tag: php, browser

61 Перезапуск программы по времени

<script language="JavaScript">
    let timerId = setTimeout(func|code, [delay], [arg1], [arg2], ...)
    clearTimeout(timerId);

    let timerId = setTimeout(function tick() {
      alert('tick');
      timerId = setTimeout(tick, 2000); // (*)
    }, 2000);
</script>
***********************************************************************************
<?php #   Перезапуск программы по времени ?>
<script>
    function reloadPage(val, delay) { //Перезапуск программы по времени
        document.getElementById('Step_id').value = val;
                if (delay != null)    { // Задержка перезагрузки
            window.setTimeout("document.getElementById('restore').submit()",1000);
        } else {
            document.getElementById('restore').submit(); // Запуск перезагрузки
        }
    }
</script>
<form name="restore" id="restore" action="" enctype="multipart/form-data" method="GET">
    <input type="hidden" name="Step" id="Step_id" value="">
</form>
<?php
if(!defined("START_EXEC_TIME"))
    define("START_EXEC_TIME", microtime(true));

define("STEP_TIME", 30); # Шаг перезапуска

function haveTime(){ return (microtime(true) - START_EXEC_TIME) < STEP_TIME; } # Определяем момент перезапуска

if(!haveTime()){ # Контроль времени на перезапуск
    ?><script>reloadPage(<?= $Count_data?>, 1);</script><?php
    die();
}
$Count_data = ($_GET['Step'] > 0 ? intval($_GET[Step]) : 0); # Текущий счетчик положения
?>
Tag: php, js, time, restart, reload

62 засекаем время

<?php
# засекаем время
#
$site_mtime = explode(" ",microtime());
$t_start_site = $site_mtime[1] + $site_mtime[0];
# закончили считать время
$site_mtime = explode(" ",microtime());
$t_end_site = $site_mtime[1] + $site_mtime[0];
$t_passed_site = ($t_end_site - $t_start_site);
?>
<div style="position: absolute;font-size: 11px;color: #666;right: 10px;bottom: 2px;">
    Время создания страницы: <?=number_format($t_passed_site, 3, '.', ' ')?> сек.
</div>
Tag: php, time

63 Прошло время

<?php
# time_elapsed: 6 days 15 hours 48 minutes and 19 seconds ago.
function time_elapsed($secs){
    $bit = array(
        ' год.'  => $secs / 31556926 % 12,
        ' нед.'  => $secs / 604800 % 52,
        ' дн.'   => $secs / 86400 % 7,
        ' час.'  => $secs / 3600 % 24,
        ' мин.'  => $secs / 60 % 60,
        ' сек.'  => $secs % 60
        );
    $ret = [];
    foreach($bit as $k => $v){
        if($v >= 1) $ret[] = $v . $k;//. 's';
#        if($v == 1)$ret[] = $v . $k;
    }
    array_splice($ret, count($ret)-1, 0, 'и');
    $ret[] = 'прошло.';

    return join(' ', $ret);
}
?>
Tag: php, time

64 Пользовательская сортировка многомерных массивов

<?php
# Пользовательская сортировка многомерных массивов
#
function udf_sort(&$array, $index) { # Пользовательская сортировка многомерных массивов
    $
_func = create_function('$a, $b',
        "return ({$a['$index']} == {$b['$index']})? 0:(({$a['$index']}>{$b['$index']})? 1:-1);"
        );
    if (!function_exists($compare_func)) return false;
    return usort($array, $compare_func);
}
# Пример
 $arr = array(
        'a1' => array(2, 1, 6, 4, 5),
        'a2' => array(7, 4, 66, 14, 5),
    );
udf_sort($arr, 'a1'); # сортировка по массиву, содержащегося в ключе a1
/*************************************************************/
function SortMulti() { # сортировка 2х мерного массива
    $ret = array(array(1,2,"asd",4,5,6,7,8,9,10),array(11,12,"dsfgh",14,15,16,17,18,19,110),array(21,22,"hjkl",24,25,26,27,28,29,210));
    $name = $price = array();
    foreach($ret as $key => $row){
        $name[$key] = $row[2];
        $price[$key] = $row[9];
    }
# OR
    $name = array_column($ret,2);
    $price = array_column($ret,9);

    array_multisort($name, SORT_ASC, SORT_STRING, $price, SORT_DESC,SORT_NUMERIC, $ret);
}
?>
Tag: php, sort, multi

65 xml Object

<?php
function xml2Object(){
    $xml = simplexml_load_file('Sale001.xml');
    $xml = simplexml_load_file('Sale001.xml', null, LIBXML_NOCDATA);
    echo " <pre>"; print_r($xml); echo "</pre>";

    $xml = simplexml_load_string($xml);

    echo $xml->channel->item->title."<br/>";

    echo "<pre>";
    var_dump($xml->channel->item->title);
    print_r($xml->channel->item->title);
    echo "</pre>";
    # so cast the SimpleXML Element to 'string' solve this issue
    echo " <pre>";
    var_dump((string) $xml->channel->item->title);
    print_r((string) $xml->channel->item->title);
    echo "</pre>";
}
?>
Tag: php, xml

66 Супер быстро XML to Array

<?php
/*******************************************************************/
#
# Супер быстро  XML to Array
#
function array2xml_json_decode(){ # Супер быстро  XML to Array
    $array = json_decode(json_encode((array)simplexml_load_string(file_get_contents('incom.xml'))),TRUE);
}
?>
Tag: php, xml, json_decode, json_encode

67 XML to Array parseXML

<?php
/*******************************************************************/
/**
 * Classes and functions for manipulating XML templates.
 *
 * @author The phpLDAPadmin development team
 * @package phpLDAPadmin
 * XML Parser
 *
 * This will read our XML file and convert it into variables for us to parse.
 *
 * @package phpLDAPadmin
 * @subpackage XML
 *
 * $x = new xml2array();
 * $arr = $x->parseXML(file_get_contents('miel_mar_saleflat.xml'));
 *
 ******************************   Неплохо  **************************************/
function class_xml2array(){
    class xml2array {
        var $stack = array();
        var $stack_ref;
        var $arrOutput = array();
        var $resParser;
        var $strXmlData;

        private function push_pos(&$pos) {
            $this->stack[count($this->stack)] = &$pos;
            $this->stack_ref = &$pos;
        }

        private function pop_pos() {
            unset($this->stack[count($this->stack) - 1]);
            $this->stack_ref = &$this->stack[count($this->stack) - 1];
        }

        public function parseXML($strInputXML,$filename=__FILE__) {
            $this->resParser = xml_parser_create();
            xml_parser_set_option($this->resParser,XML_OPTION_CASE_FOLDING,0);
            xml_parser_set_option($this->resParser,XML_OPTION_SKIP_WHITE,1);

            xml_set_object($this->resParser,$this);
            xml_set_element_handler($this->resParser,'tagOpen','tagClosed');

            xml_set_character_data_handler($this->resParser,'tagData');

            $this->push_pos($this->arrOutput);

            $this->strXmlData = xml_parse($this->resParser,$strInputXML);

            if (! $this->strXmlData)
                die(sprintf('XML error: %s at line %d in file %s',
                    xml_error_string(xml_get_error_code($this->resParser)),
                    xml_get_current_line_number($this->resParser),
                    $filename));

            xml_parser_free($this->resParser);

            $output = array();
            foreach ($this->arrOutput as $key => $values)
                $output[$key] = $this->cleanXML($values);

            #return $this->arrOutput;
            return $output;
        }

        private function tagOpen($parser,$name,$attrs) {
    #        $name = strtolower($name);

            if (isset($this->stack_ref[$name])) {
                if (! isset($this->stack_ref[$name][0])) {
                    $tmp = $this->stack_ref[$name];
                    unset($this->stack_ref[$name]);
                    $this->stack_ref[$name][0] = $tmp;
                }

                $cnt = count($this->stack_ref[$name]);
                $this->stack_ref[$name][$cnt] = array();
                if (isset($attrs))
                    $this->stack_ref[$name][$cnt] = $attrs;

                $this->push_pos($this->stack_ref[$name][$cnt]);
            } else {
                $this->stack_ref[$name]=array();
                if (isset($attrs))
                    $this->stack_ref[$name]=$attrs;
                $this->push_pos($this->stack_ref[$name]);
            }
        }

        private function tagData($parser,$tagData) {
            if (trim($tagData) != '') {

                if (isset($this->stack_ref['#text']))
                    $this->stack_ref['#text'] .= $tagData;
                else
                    $this->stack_ref['#text'] = $tagData;
            }
        }

        private function tagClosed($parser,$name) {
            $this->pop_pos();
        }

        /**
         * This function will parse an XML array and make a normal array.
         *
         * @return array - Clean XML data
         */
        private function cleanXML($details) {
            # Quick processing for the final branch of the XML array.
            if (is_array($details) && isset($details['#text']))
                return $details['#text'];

            elseif (is_array($details) && isset($details['ID']) && count($details) == 1)
                return $details['ID'];

            $cleanXML = array();

            # Quick processing for the final branch, when it holds the ID and values.
            if (is_array($details) && isset($details['ID']) && count($details) > 1) {
                $key = $details['ID'];
                unset($details['ID']);
                $cleanXML[$key] = $this->cleanXML($details);
                $details = array();
            }

            # More detailed processing...
            if (is_array($details))
                foreach ($details as $key => $values)
                    if (is_numeric($key) && isset($values['ID']) && count($values) > 1) {
                        $key = $values['ID'];
                        unset($values['ID']);
                        $cleanXML[$key] = $this->cleanXML($values);

                    } elseif (isset($values['#text']))
                        $cleanXML[$key] = $this->cleanXML($values);

                    elseif (is_array($values))
                        $cleanXML[$key] = $this->cleanXML($values);

            if (! $cleanXML)
                return $details;
            else
                return $cleanXML;
        }
    }
}
?>
Tag: php, xml

68 Читаем XML, xml2assoc

<?php
/*******************************************************************/
$xml = new XMLReader();    # Читаем ХМЛ
if(!($xml->open($FileNameOUT))) { echo "Error !!!"; exit; }
$dat = xml2assoc($xml); # Преобразуем ХМЛ в массив
$xml->close();

function xml2assoc(&$xml){# Читаем ХМЛ
    $assoc = NULL;
    $n = 0;
    while($xml->read()){
        if($xml->nodeType == XMLReader::END_ELEMENT) break;
        if($xml->nodeType == XMLReader::ELEMENT and !$xml->isEmptyElement){
            $assoc[$n]['name'] = trim($xml->name);
            if($xml->hasAttributes) while($xml->moveToNextAttribute()) $assoc[$n]['atr'][$xml->name] = $xml->value;
            $assoc[$n]['val'] = xml2assoc($xml);
            $n++;
        }
        else if($xml->isEmptyElement){
            $assoc[$n]['name'] = $xml->name;
            if($xml->hasAttributes) while($xml->moveToNextAttribute()) $assoc[$n]['atr'][$xml->name] = $xml->value;
            $assoc[$n]['val'] = "";
            $n++;
        }
        else if($xml->nodeType == XMLReader::TEXT) $assoc = $xml->value;
    }
    return $assoc;
}
?>
Tag: php, xml

69 Array to XML

<?php
/*******************************************************************/
# Array to XML
function array2xml($cary, $d=0, $forcetag='') { # Array to XML
    $res=array();
    foreach ($cary as $tag=>$r) {
        if (isset($r[0])) {
            $res[]=array2xml($r, $d, $tag);
        } else {
            if ($forcetag) $tag=$forcetag;
            $sp=str_repeat("\t", $d);
            $res[]="$sp<$tag";
            if (isset($r['_a'])) {foreach ($r['_a'] as $at=>$av) $res[]=" $at=\"$av\"";}
            $res[]=">".((isset($r['_c'])) ? "\n" : '');
            if (isset($r['_c'])) $res[]=array2xml($r['_c'], $d+1);
            elseif (isset($r['_v'])) $res[]=$r['_v'];
            $res[]=(isset($r['_c']) ? $sp : '')."</$tag>\n";
        }
    }
    return implode('', $res);
}
?>
Tag: php, xml

70 XML text to an array

<?php
# Insert element into array
function insert2array(&$ary, $element, $pos) {
    $ar1  =array_slice($ary, 0, $pos);
    $ar1[]=$element;
    $ary  =array_merge($ar1, array_slice($ary, $pos));
}
/**
 * xml2array() will convert the given XML text to an array in the XML structure.
 * Link: http://www.bin-co.com/php/scripts/xml2array/
 * Arguments : $contents - The XML text
 *             $get_attributes - 1 or 0.
 * If this is 1 the function will get the attributes as well as the tag values - this results in a different array structure in the return value.
 * Если это 1 функция будет получать атрибуты, а также значения тегов - это приводит к различной структуры массива возвращаемого значения.
 *
 * $priority - Can be 'tag' or 'attribute'. This will change the way the resulting array sturcture. For 'tag', the tags are given more  importance.
 * $priority - Может быть 'tag' или 'attribute'. Это изменит способ, полученного массива sturcture. Для 'Tag', теги даны большее значение.
 *
 * Return: The parsed XML in an array form. Use print_r() to see the resulting array structure.
 *
 * Examples: $array =  xml2array(file_get_contents('feed.xml'));
 *           $array =  xml2array(file_get_contents('feed.xml', 1, 'attribute'));
 */
 #*******************  Наилучший вариант  ****************************
function xml2array($contents, $get_attributes=1, $priority = 'tag') {
    if(!$contents) return array();
    if(!function_exists('xml_parser_create')) { return array();  }

    # Get the XML parser of PHP - PHP must have this module for the parser to work
    $parser = xml_parser_create('');
    xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8");
    xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
    xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
    xml_parse_into_struct($parser, trim($contents), $xml_values);
    xml_parser_free($parser);

    if(!$xml_values) return;# Hmm...

    # Initializations
    $xml_array   = array();
    $parents     = array();
    $opened_tags = array();
    $arr         = array();

    $current = &$xml_array; # Refference

    # Go through the tags.
    $repeated_tag_index = array();# Multiple tags with same name will be turned into an array
    foreach($xml_values as $data) {
        unset($attributes,$value);# Remove existing values, or there will be trouble

        # This command will extract these variables into the foreach scope
        # tag(string), type(string), level(int), attributes(array).
        extract($data);# We could use the array by itself, but this cooler.

        $result = array();
        $attributes_data = array();

        if(isset($value)) {
            if($priority == 'tag') $result = $value;
            else $result['value'] = $value; # Put the value in a assoc array if we are in the 'Attribute' mode
        }

        # Set the attributes too.
        if(isset($attributes) and $get_attributes) {
            foreach($attributes as $attr => $val) {
                if($priority == 'tag') $attributes_data[$attr] = $val;
                else $result['attr'][$attr] = $val; # Set all the attributes in a array called 'attr'
            }
        }

        # See tag status and do the needed.
        if($type == "open") {# The starting of the tag '<tag>'
            $parent[$level-1] = &$current;
            if(!is_array($current) or (!in_array($tag, array_keys($current)))) { # Insert New tag
                $current[$tag] = $result;
                if($attributes_data) $current[$tag. '_attr'] = $attributes_data;
                $repeated_tag_index[$tag.'_'.$level] = 1;

                $current = &$current[$tag];

            } else { # There was another element with the same tag name

                if(isset($current[$tag][0])) {# If there is a 0th element it is already an array
                    $current[$tag][$repeated_tag_index[$tag.'_'.$level]] = $result;
                    $repeated_tag_index[$tag.'_'.$level]++;
                } else {# This section will make the value an array if multiple tags with the same name appear together
                    $current[$tag] = array($current[$tag],$result);# This will combine the existing item and the new item together to make an array
                    $repeated_tag_index[$tag.'_'.$level] = 2;

                    if(isset($current[$tag.'_attr'])) { # The attribute of the last(0th) tag must be moved as well
                        $current[$tag]['0_attr'] = $current[$tag.'_attr'];
                        unset($current[$tag.'_attr']);
                    }
                }
                $last_item_index = $repeated_tag_index[$tag.'_'.$level]-1;
                $current = &$current[$tag][$last_item_index];
            }
        } elseif($type == "complete") { # Tags that ends in 1 line '<tag />'
            # See if the key is already taken.
            if(!isset($current[$tag])) { # New Key
                $current[$tag] = $result;
                $repeated_tag_index[$tag.'_'.$level] = 1;
                if($priority == 'tag' and $attributes_data) $current[$tag. '_attr'] = $attributes_data;

            } else { # If taken, put all things inside a list(array)
                if(isset($current[$tag][0]) and is_array($current[$tag])) {# If it is already an array...

                    # ...push the new element into that array.
                    $current[$tag][$repeated_tag_index[$tag.'_'.$level]] = $result;

                    if($priority == 'tag' and $get_attributes and $attributes_data) {
                        $current[$tag][$repeated_tag_index[$tag.'_'.$level] . '_attr'] = $attributes_data;
                    }
                    $repeated_tag_index[$tag.'_'.$level]++;

                } else { # If it is not an array...
                    $current[$tag] = array($current[$tag],$result); # ...Make it an array using using the existing value and the new value
                    $repeated_tag_index[$tag.'_'.$level] = 1;
                    if($priority == 'tag' and $get_attributes) {
                        if(isset($current[$tag.'_attr'])) { # The attribute of the last(0th) tag must be moved as well

                            $current[$tag]['0_attr'] = $current[$tag.'_attr'];
                            unset($current[$tag.'_attr']);
                        }

                        if($attributes_data) {
                            $current[$tag][$repeated_tag_index[$tag.'_'.$level] . '_attr'] = $attributes_data;
                        }
                    }
                    $repeated_tag_index[$tag.'_'.$level]++; # 0 and 1 index is already taken
                }
            }
        } elseif($type == 'close') { # End of tag '</tag>'
            $current = &$parent[$level-1];
        }
    }
    return($xml_array);
}
?>
Tag: php, xml

71 ResizeImageGet Битрикс

<?php
$PREVIEW_PICTURE = CFile::ResizeImageGet($arItem["PREVIEW_PICTURE"], array('width'=>184, 'height'=>139), BX_RESIZE_IMAGE_PROPORTIONAL, true);

$filters = [["name" => "sharpen", "precision" => 15]];
$img=\CFile::ResizeImageGet($el['DETAIL_PICTURE'],['width'=>270,'height'=>180],BX_RESIZE_IMAGE_PROPORTIONAL,true,$filters,false,85)['src'];

$PREVIEW_PICTURE = \Bitrix\Main\Engine\Response\ResizedImage::createByImageId($arItem["PREVIEW_PICTURE"], 100, 100);
?>
Tag: bitrix, img, size, resize, d7

72 open Resize image

<?php
function open_image ($file) {
    if ( $im = @imagecreatefromjpeg($file) !== false) { return $im; }    # JPEG:
    if ( $im = @imagecreategif($file)      !== false) { return $im; }    # GIF:
    if ( $im = @imagecreatepng($file)      !== false) { return $im; }    # PNG:
    if ( $im = @imagecreategd($file)       !== false) { return $im; }    # GD File:
    if ( $im = @imagecreategd2($file)      !== false) { return $im; }    # GD2 File:
    if ( $im = @imagecreatewbmp($file)     !== false) { return $im; }    # WBMP:
    if ( $im = @imagecreatexbm($file)      !== false) { return $im; }    # XBM:
    if ( $im = @imagecreatexpm($file)      !== false) { return $im; }    # XPM:
    if ( $im = @imagecreatestring(file_get_contents($file)) !== false) { return $im; }  # Попытка открыть со строки:
    return false;
}
/*******************************************************************/
$arSizes = array(0=>array('width'=>800,'height'=>800,'scale'=>1),
                    array('width'=>460,'height'=>320,'scale'=>0),
                    array('width'=>132,'height'=>112,'scale'=>0),
                    array('width'=>0,'height'=>112,'scale'=>1));

function Resize($source_pic,$destination_pic,$type) { # resizer имиджа
    global $arSizes;

    list($width, $height)=getimagesize($source_pic);

    $src = open_image($source_pic);

    if(!$src) { echo "Error this is not image!<br/>"; return false; }

    $x_ratio = $arSizes[$type]['width'] / $width;
    $y_ratio = $arSizes[$type]['height'] / $height;

    if( ($width <= $arSizes[$type]['width']) && ($height <= $arSizes[$type]['height']) ){
        $tn_width  = $width;
        $tn_height = $height;
    }
    elseif (($x_ratio * $height) < $arSizes[$type]['height']){
            $tn_height = ceil($x_ratio * $height);
            $tn_width  = $arSizes[$type]['width'];
    }else{
            $tn_width  = ceil($y_ratio * $width);
            $tn_height = $arSizes[$type]['height'];
    }

    $tmp=imagecreatetruecolor($tn_width,$tn_height);
    imagecopyresampled($tmp,$src,0,0,0,0,$tn_width, $tn_height,$width,$height);
    imagejpeg($tmp,$destination_pic,75);
    imagedestroy($src);
    imagedestroy($tmp);
}
/*******************************************************************/
function Resize2($source_pic, $destination_pic, $type) { # resizer имиджа 2
    global $arSizes;

    list($width, $height)=getimagesize($source_pic);

    $src = open_image($source_pic);

    if(!$src) { echo "Error this is not image!"."<br/>"; return false; }

    if($width >= $height){
        $H = $height; $W = 0;
    } else    {
        $H = 0; $W = $width;
    }

    if($W) $x_ratio = $arSizes[$type]['width'] / $W;
    elseif($H) $x_ratio = $arSizes[$type]['height'] / $H;

    if($H) $y_ratio = $arSizes[$type]['height'] / $H;
    else $y_ratio = $x_ratio;

    if( ($width <= $arSizes[$type]['width']) && ($height <= $arSizes[$type]['height']) ){
        $tn_width = $width;
        $tn_height = $height;
    }
    elseif (($x_ratio * $height) < $arSizes[$type]['height']){
            $tn_height = ceil($x_ratio * $height);
            $tn_width  = $arSizes[$type]['width'];
    }else{
            $tn_width  = ceil($y_ratio * $width);
            $tn_height = $arSizes[$type]['height'];
    }

    $tmp=imagecreatetruecolor($tn_width,$tn_height);
    imagecopyresampled($tmp,$src,0,0,0,0,$tn_width, $tn_height,$width,$height);
    imagejpeg($tmp,$destination_pic,75);
    imagedestroy($src);
    imagedestroy($tmp);
}
/*
    Resize("/img/1.jpg","/img/__1.jpg",2);
    Resize2("/img/1.jpg","/img/_1.jpg",2);
*/
?>
Tag: php, img, resize

73 CodeString2HEX, DeCodeHEXString

<?php
function CodeString2HEX($key){
    $k = str_split($key);
    $OO = "";
    foreach($k as $s)
        $OO .= base_convert(ord($s),10,16);
    return $OO;
}
function DeCodeHEXString($key) {
    $s = "";
    for($i=0;$i<strlen($key);$i+=2){
        $s .= chr(base_convert(substr($key,$i,2),16,10));
    }
    return $s;
}
?>
Tag: php, str, string, hex

74 curl

<?php
function copyUrlFile($source, $dest) # https://
{
    $ch = curl_init($source);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $file = curl_exec($ch);
    curl_close($ch);
    if (file_exists($dest)) @unlink($dest);
    $fp = fopen($dest,'wb');
    fwrite($fp, $file);
    fclose($fp);
}

function Curl_1() {
    $ch = curl_init();
    curl_setopt ($ch, CURLOPT_URL,"http://www.incom.ru/ajax-news/ajax_news.php?TAG=Немчиновка");
    curl_setopt ($ch, CURLOPT_HEADER, 0);
    curl_setopt ($ch, CURLOPT_FRESH_CONNECT, 1);
    curl_setopt ($ch, CURLOPT_USERAGENT, 'Mozilla/7.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 (.NET CLR 3.5.30729)');
    curl_setopt ($ch, CURLOPT_REFERER, "http://www.incom.ru/");
    curl_setopt ($ch, CURLOPT_COOKIESESSION, TRUE);
    curl_setopt ($ch, CURLOPT_COOKIEFILE, 'cookie.txt');
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt ($ch, CURLOPT_HTTPHEADER, array('Expect:'));
    $ar_id = explode(",",curl_exec ($ch));
}

function Load_Image($file,$hostname) {
    $ch = curl_init();
    $fp = fopen($file, "wb");
    $options = array(
        CURLOPT_RETURNTRANSFER => 1,
        CURLOPT_HEADER => 0,
        CURLOPT_FILE => $fp,
        CURLOPT_URL => $hostname,
        CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 (.NET CLR 3.5.30729)');
    curl_setopt_array($ch, $options);
    curl_exec($ch);
    fclose($fp);
    return $file;
}

# GET-запрос с параметрами

$get = array(
    'name'  => 'User',
    'email' => 'mail@user.com'
);

$ch = curl_init('https://user.com?' . http_build_query($get));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$html = curl_exec($ch);
curl_close($ch);

 # POST запрос с параметрами

 $array = array(
    'login'    => 'admin',
    'password' => '1234'
);

$ch = curl_init('https://example.com');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($array, '', '&'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$html = curl_exec($ch);
curl_close($ch);

echo $html;
#-------------------------------------------------------------
function setupCurl() {
	$token = "2f3153e6879110e68";
	$login = "sdfgs@vasdfa";
	$pass = "sdg45sdfg";

	$headers = array("Lognex-Pretty-Print-JSON: true");

	$curl = curl_init("https://online.moysklad.ru/api/remap/1.2/entity/product");
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, false);
	curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);

    curl_setopt($curl, CURLOPT_USERPWD, "$login:$pass");

	$response = curl_exec($curl);
	curl_close($curl);
    return json_decode($response,1);
}

/**
 * Получение данных с удалённого сервера
 */
function getUrlData($url) { # Получение данных с удалённого сервера
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_URL, $url);
    $response = curl_exec($curl);
    curl_close($curl);
    return json_decode($response, true);
}

function getUrlData($url) {
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt ($ch, CURLOPT_HEADER, 0);
    curl_setopt ($ch, CURLOPT_FRESH_CONNECT, 1);
    curl_setopt ($ch, CURLOPT_USERAGENT, 'Mozilla/7.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 (.NET CLR 3.5.30729)');
    curl_setopt ($ch, CURLOPT_REFERER, "http://www.navpro.ru/");
    curl_setopt ($ch, CURLOPT_COOKIESESSION, TRUE);
    curl_setopt ($ch, CURLOPT_COOKIEFILE, 'cookie.txt');
    curl_setopt ($ch, CURLOPT_HTTPHEADER, array('Expect:'));
    $response = curl_exec($curl);
    curl_close($curl);
    return $response;
}
$buf = getUrlData($URL);

function get_SSL_Page($url) { # для url с https проколом
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_REFERER, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    $result = curl_exec($ch);
    curl_close($ch);
    return $result;
}
# пример многопоточного скрипта

function MULTICUR(){ # пример многопоточного скрипта
    # ну и много всяких, сколько найдёте
    $allUseragents = array(   "Opera/9.23 (Windows NT 5.1; U; ru)", ... );
    # много ссылок, иногда так надо, обычно в таких случаях и применяется многопоточный курл
    $links = array('http://mydomain.com/', ... );
    $maxThreads = 10; # скачивать будем в десять потоков
    $multicurlInit = curl_multi_init();
    do {
        while(@$active <= $maxThreads) {
            @$active++;
            if(count($links) == 0)
                break;
            $idLink = array_rand($links);
            $link = $links[$idLink];
            unset($links[$idLink]);
            $agent = $allUseragents[array_rand($allUseragents)];
            $newThread = curl_init();
            curl_setopt_array($newThread, array(
                    CURLOPT_URL            => $link,
                    CURLOPT_RETURNTRANSFER => true,
                    CURLOPT_CONNECTTIMEOUT => 10,
                    CURLOPT_TIMEOUT        => 100,
                    CURLOPT_USERAGENT      => $agent,
                    CURLOPT_FAILONERROR    => false,
                )
            );
            curl_multi_add_handle($multicurlInit, $newThread);
            unset($newThread);
        }
        $curlMultiResult = curl_multi_exec($multicurlInit, $active);
        do {
            $result = curl_multi_info_read($multicurlInit);
            if( ! is_array($result))
                break;
            $info = curl_getinfo($result['handle']);
            print curl_multi_getcontent($result['handle']);
            print_r($info);
            curl_multi_remove_handle($multicurlInit, $result['handle']);
            curl_close($result['handle']);
        } while(true);

        if(count($links) == 0 && $active == 0)
            break;
    } while(true);
}

# GET запрос

$ch = curl_init('https://example.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$html = curl_exec($ch);
curl_close($ch);

echo $html; # Выведет код страницы

# GET запрос с параметрами

$get = array(
    'name'  => 'Alex',
    'email' => 'mail@example.com'
);

$ch = curl_init('https://example.com?' . http_build_query($get));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$html = curl_exec($ch);
curl_close($ch);

echo $html;

# POST запрос

$array = array(
    'login'    => 'admin',
    'password' => '1234'
);

$ch = curl_init('https://example.com');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $array);

# Или предать массив строкой:
# curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($array, '', '&'));

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$html = curl_exec($ch);
curl_close($ch);

echo $html;

# ИЛИ

# file_get_contents() так же умеет отправлять POST запросы:

$headers = stream_context_create(array(
    'http' => array(
        'method' => 'POST',
        'header' => 'Content-Type: application/x-www-form-urlencoded' . PHP_EOL,
        'content' => 'login=admin&password=1234',
    ),
));

echo file_get_contents('https://example.com', false, $headers);

# Отправка JSON через POST-запрос

$data = array(
    'name'  => 'Маффин',
    'price' => 100.0
);

$ch = curl_init('https://example.com');
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json'));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data, JSON_UNESCAPED_UNICODE));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$res = curl_exec($ch);
curl_close($ch);

$res = json_encode($res, JSON_UNESCAPED_UNICODE);
print_r($res);

# PUT запрос

$ch = curl_init('https://example.com');
curl_setopt($ch, CURLOPT_PUT, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$html = curl_exec($ch);
curl_close($ch);

echo $html;

# DELETE запрос

$ch = curl_init('https://example.com');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_exec($ch);
curl_close($ch);

# Запрос через proxy

$proxy = '165.22.115.179:8080';

$ch = curl_init('https://example.com');
curl_setopt($ch, CURLOPT_TIMEOUT, 400);
curl_setopt($ch, CURLOPT_PROXY, $proxy);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$html = curl_exec($ch);
curl_close($ch);
?>
Tag: php, curl, curl_multi

75 MultiCurlProxy

<?php
# free proxy http://free-proxy.cz/ru/
# test proxy https://hidemyna.me/ru/proxy-checker/
GLOBAL $arPROXY_IP;
function MultRead_Proxy_IP(){
    GLOBAL $arPROXY_IP;
    $arPROXY_IP = file(dirname(__FILE__)."/multproxi.ip");
    $arPROXY_IP = array_map("trim",$arPROXY_IP);
    if(count($arPROXY_IP)<1) {echo "Список Прокси ПУСТ!"; exit;}
}

function AddUrl(&$item1, $key, $prefix) { $item1 = "$prefix$item1"; }

$Server = "https://www.profile.ru/egrul?ogrn=";
/*
multproxi.ip =
HTTP,159.89.86.52:8080
HTTP,67.205.171.99:80
SOCKS4,45.55.207.153:33333
HTTP,167.71.109.94:80
HTTP,167.71.101.134:8080
HTTP,167.99.119.89:80
SOCKS4,192.99.203.93:35289
*/
function MultiCurlProxy($Server,$arLinks,$dest){
    GLOBAL $arPROXY_IP;
    $allUseragents = array(
        'Mozilla/7.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 (.NET CLR 3.5.30729)',
        'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0',
        'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 YaBrowser/19.4.2.702 Yowser/2.5 Safari/537.36',
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0',
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36',
        'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36',
    );
# $links = array('http://mydomain.com/', ... );
    array_walk($arLinks, 'AddUrl', $Server);
    $maxThreads = count($arLinks); # <= 10;
    $multicurlInit = curl_multi_init();
    $Ret = 0;
    do {
        while(@$active <= $maxThreads) {
            @$active++;
            if(count($arLinks) == 0) break;
            $idLink = array_rand($arLinks);
            $link = $arLinks[$idLink];
            unset($arLinks[$idLink]);
            $agent = $allUseragents[array_rand($allUseragents)];
            $newThread = curl_init();
            $conf = array(
                    CURLOPT_URL                => $link,
                    CURLOPT_HEADER            => 0,
                    CURLOPT_FRESH_CONNECT    => 1,
                    CURLOPT_RETURNTRANSFER    => true,
                    CURLOPT_REFERER            => "https://www.list-org.com",
                    CURLOPT_SSL_VERIFYPEER    => 0,
                    CURLOPT_SSL_VERIFYHOST    => 0,
                    CURLOPT_COOKIESESSION    => TRUE,
                    CURLOPT_COOKIEFILE        => 'cookie.txt',
                    CURLOPT_HTTPHEADER        => array('Expect:'),
                    CURLOPT_CONNECTTIMEOUT    => 10,
                    CURLOPT_TIMEOUT            => 100,
                    CURLOPT_USERAGENT        => $agent,
                    CURLOPT_FAILONERROR        => false,
                );
            if(count($arPROXY_IP)<1) Read_Proxy_IP();
            $ip_indx = array_rand($arPROXY_IP);
            $t_px = $arPROXY_IP[$ip_indx];
            $tp = explode(",",$t_px);
            if($tp[0] == 'SOCKS4')    $conf['CURLOPT_PROXYTYPE'] = CURLPROXY_SOCKS4;
            if($tp[0] == 'SOCKS5')    $conf['CURLOPT_PROXYTYPE'] = CURLPROXY_SOCKS5;
            if($tp[0] == 'HTTP')    $conf['CURLOPT_PROXYTYPE'] = CURLPROXY_HTTP;
            if($tp[0] == 'HTTPS')    $conf['CURLOPT_PROXYTYPE'] = CURLPROXY_HTTPS;
            $conf['CURLOPT_PROXY'] = CURLPROXY_HTTPS;
            # $proxyauth = 'login:password';
            # $conf['CURLOPT_PROXYUSERPWD'] = $proxyauth;
            curl_setopt_array($newThread, $conf);
            curl_multi_add_handle($multicurlInit, $newThread);
            unset($newThread);
        }
        $curlMultiResult = curl_multi_exec($multicurlInit, $active);
        do {
            $result = curl_multi_info_read($multicurlInit);
            if( ! is_array($result))
                break;
            $info = curl_getinfo($result['handle']);
            if($info['http_code'] == 200) {
                $fl = substr($info['url'],strlen($Server));
                $destr = $dest.preg_replace("#[\\/\.]#","_",$fl).".html";
#             echo $destr." <pre>".print_r($info,1)."</pre>";
                if (file_exists($destr)) @unlink($destr);
                    $fp = fopen($destr,'wb');
                    fwrite($fp, curl_multi_getcontent($result['handle']));
                    fclose($fp);
                    $Ret++;
            }
            curl_multi_remove_handle($multicurlInit, $result['handle']);
            curl_close($result['handle']);
        } while(true);

        if(count($arLinks) == 0 && $active == 0)
            break;
    } while(true);
    return $Ret;
}
?>
Tag: php, curl, file

76 file_get_contents Расширенный

<?php
$options = array(
  'http'=>array(
    'method'=>"GET",
    'header'=>"Accept-language: en\r\n" .
              "Cookie: foo=bar\r\n" .  # check function.stream-context-create on php.net
              "User-Agent: Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.102011-10-16 20:23:10\r\n" # i.e. An iPad
  )
);
$context = stream_context_create($options);
$htm = file_get_contents("https://meduza.io/rss/all", false, $context);
?>
Tag: php, get, file, rest

77 mime_base64

<?php
function mime_base64($string, $charset='windows-1251') {
  return '=?'.$charset.'?B?'.base64_encode(iconv("UTF-8", "CP1251",trim($string))).'?='; //,
}
?>
Tag: php, mime_base64

78 Определяем параметры удаленного файла

<?php
# Определяем параметры удаленного файла
#
function getRemoteFileInfo($url){# Определяем параметры удаленного файла
   $parts = parse_url($url);
   $f = @fsockopen($parts['host'], 80);
   if(!$f) return null;
   $headers  = "HEAD ".$parts['path']." HTTP/1.1\r\n";
   $headers .= "Host: ".$parts['host']."\r\n";
   $headers .= "Connection: close\r\n";
   $headers .= "Referer: http://".$parts['host']."\r\n\r\n";

   fwrite($f, $headers);
   $response = "";
   while (!feof($f))
      $response .= fgets($f, 128);
   fclose($f);

   $info = array();
   preg_match('/HTTP\/1\.[01]\s([0-9]{3})/',$response,$match);   $info['response'] = (int)$match[1];
   preg_match('/content-type:\s([\w\/]+)/i',$response,$match);   $info['type'] = $match[1];
   preg_match('/content-length:\s(\d+)/i',$response,$match);     $info['size'] = (int)$match[1];
   preg_match('/last-modified:\s([^\r\n]+)/i',$response,$match); $info['modified'] = date("d/m/Y H:i:s \G\M\T",strtotime($match[1]));
   return $info;
}

function getRemoteFileInfo($FileName){
    $ch = curl_init($FileName);
    curl_setopt($ch, CURLOPT_NOBODY, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HEADER, 1);
    $content=curl_exec($ch);
    $retcode = curl_getinfo($ch);    # $retcode >= 400 -> not found, $retcode = 200, found.
    # echo " <pre>"; print_r($retcode); echo "</pre>";
    curl_close($ch);
    return explode("\r\n", $content);
}
?>
Tag: php, file, info, fsockopen

79 Курс валют ЦБ для Битрикс

<?php
function GetRateFromCBRF_small(){  # Курс валют ЦБ
    $data_file = $_SERVER["DOCUMENT_ROOT"].'/cbrf.inc';

    if ( !file_exists($data_file) || (date("Ymd") > date("Ymd",filemtime($data_file))) ) {
        $QUERY_STR = "http://www.cbr.ru/scripts/XML_daily.asp?date_req=".date("d.m.Y");
        $cbrf = file_get_contents ($QUERY_STR);
        file_put_contents($data_file,$cbrf);
    }

    $cbrf = file_get_contents ($data_file);
    $dat = json_decode(json_encode((array)simplexml_load_string($cbrf)),TRUE);
    $Valute = [];
    foreach($dat['Valute'] as $val){
        switch($val['CharCode']){
            case "USD":    $Valute["USD"] = floatval(str_replace(",",".",$val['Value']));    break;
            case "EUR":
                $Valute["EUR"] = floatval(str_replace(",",".",$val['Value']));
                break;
        }
    }

    return $Valute;
}
function get_currency() {
    $date = date('d/m/Y'); # Текущая дата
    $cache_time_out = '3600'; # Время жизни кэша в секундах
    $file_currency_cache = __DIR__.'/XML_daily.asp';

    if(!is_file($file_currency_cache) || filemtime($file_currency_cache) < (time() - $cache_time_out)) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, 'https://www.cbr.ru/scripts/XML_daily.asp?date_req='.$date);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        $out = curl_exec($ch);
        curl_close($ch);
        file_put_contents($file_currency_cache, $out);
    }
    $dat = json_decode(json_encode((array)simplexml_load_string(file_get_contents ($file_currency_cache))),TRUE);
    $Valute = [];
    foreach($dat['Valute'] as $val){
        switch($val['CharCode']){
            case "USD":    $Valute["USD"] = floatval(str_replace(",",".",$val['Value']));    break;
            case "EUR":
                $Valute["EUR"] = floatval(str_replace(",",".",$val['Value']));
                break;
        }
    }
    return $Valute;
}

function GetRateFromCBRF_small2(){
    $QUERY_STR = "http://www.cbr.ru/scripts/XML_daily.asp?date_req=".date("d.m.Y");
    $cbrf = file_get_contents ($QUERY_STR);
    $dat = json_decode(json_encode((array)simplexml_load_string($cbrf)),TRUE);
    foreach($dat['Valute'] as $val){
        switch($val['CharCode']){
            case "USD":
                $Valute["USD"] = floatval(str_replace(",",".",$val['Value']));
                break;
            case "EUR":
                $Valute["EUR"] = floatval(str_replace(",",".",$val['Value']));
                break;
        }
    }
    return $Valute;
}
/*********************************************************************************/
function GetRateFromSite() {  # BITRIX  Курс валют с Сайта Битрикс
    $strSql = "SELECT DISTINCT `ID`, `CURRENCY`, `DATE_RATE`,`RATE` FROM `b_catalog_currency_rate` WHERE `DATE_RATE` = '".date("Y-m-d")."' ORDER BY `DATE_RATE` DESC LIMIT 0,2";
    $Valute = array();
    $result = mysql_query($strSql) or die("Invalid query: " . mysql_error());
    while ($row = @mysql_fetch_assoc($result)) {
        $Valute[$row['CURRENCY']] = floatval(str_replace(",",".",$row['RATE']));
    }
    @mysql_free_result($result);
    return $Valute;
}
?>
Tag: bitrix, курс, валют, руб

80 float, parseFloat

<?php
function float($str, $set=FALSE) {
    if(preg_match("/([0-9\.,-]+)/", $str, $match)) { # Found number in $str, so set $str that number
        $str = $match[0];
        if(strstr($str, ',')) { # A comma exists, that makes it easy, cos we assume it separates the decimal part.
            $str = str_replace('.', '', $str);    # Erase thousand seps
            $str = str_replace(',', '.', $str);    # Convert , to . for floatval command
            return floatval($str);
        } else { # No comma exists, so we have to decide, how a single dot shall be treated
            if(preg_match("/^[0-9]*[\.]{1}[0-9-]+$/", $str) == TRUE && $set['single_dot_as_decimal'] == TRUE) {
                # Treat single dot as decimal separator
                return floatval($str);
            } else { # Else, treat all dots as thousand seps
                $str = str_replace('.', '', $str);    # Erase thousand seps
                return floatval($str);
            }
        }
    } else { # No number found, return zero
        return 0;
    }
}
/* Examples
echo float ( 'foo 123,00 bar' ); # returns 123.00
echo float ( 'foo 123.00 bar', array ( 'single_dot_as_decimal' => TRUE )); //returns 123.000
echo float ( 'foo 123.00 bar', array ( 'single_dot_as_decimal' => FALSE )); //returns 123000
echo float ( 'foo 222.123.00 bar', array ( 'single_dot_as_decimal' => TRUE )); //returns 222123000
echo float ( 'foo 222.123.00 bar', array ( 'single_dot_as_decimal' => FALSE )); //returns 222123000
*/

function parseFloat($ptString) {
    if (strlen($ptString) == 0) return false;
    $pString = str_replace(" ", "", $ptString);
    if (substr_count($pString, ",") > 1) $pString = str_replace(",", "", $pString);
    if (substr_count($pString, ".") > 1) $pString = str_replace(".", "", $pString);
    $pregResult = array();
    if (($commaset = strpos($pString,',')) === false) {$commaset = -1;}
    if (($pointset = strpos($pString,'.')) === false) {$pointset = -1;}

    $pregResultA = $pregResultB = array();
    if ($pointset < $commaset) {
        preg_match('#(([-]?[0-9]+(\.[0-9])?)+(,[0-9]+)?)#', $pString, $pregResultA);
    }
    preg_match('#(([-]?[0-9]+(,[0-9])?)+(\.[0-9]+)?)#', $pString, $pregResultB);
    if ((isset($pregResultA[0]) && (!isset($pregResultB[0])
            || strstr($preResultA[0],$pregResultB[0]) == 0
            || !$pointset))) {
        $numberString = $pregResultA[0];
        $numberString = str_replace('.','',$numberString);
        $numberString = str_replace(',','.',$numberString);
    }
    elseif (isset($pregResultB[0]) && (!isset($pregResultA[0])
            || strstr($pregResultB[0],$preResultA[0]) == 0
            || !$commaset)) {
        $numberString = $pregResultB[0];
        $numberString = str_replace(',','',$numberString);
    }
    else
        return false;

    $result = (float)$numberString;
    return $result;
}
?>
Tag: php, float, parsefloat

81 Размер файла в печатном виде

<?php
/**
 * Размер файла в печатном виде
 */
function getFilesize($size){ # Размер файла в печатном виде
    $a = array("б", "Кб", "Мб", "Гб", "Тб", "Пб");
    for ($i = 0; $size > 1024; $i++){
        $size /= 1024;
    }
    return round($size, 2).' '.$a[$i];
}
function getFileSize($FileSize) {# Размер файла в печатном виде
    $SizeIndex = 0;
    $arSize = array('','B','KB','MB','GB','TB','PB');
    while ( floor( $FileSize / pow(1024, ++$SizeIndex) ) >= 1);
    return round($FileSize / pow(1024,$SizeIndex-1), 2)." ".$arSize[$SizeIndex];
}
?>
Tag: php, file, size

82 Секция с подсекциями БИТРИКС

<?php
function Секция_с_подсекциями() {# BITRIX  Секция с подсекциями БИТРИКС
    $rsParentSection = CIBlockSection::GetByID(153); # Родительская секция
    if ($arParentSection = $rsParentSection->GetNext())
    {
       $arFilter = array('IBLOCK_ID' => $arParentSection['IBLOCK_ID'],'>LEFT_MARGIN' => $arParentSection['LEFT_MARGIN'],'<RIGHT_MARGIN' => $arParentSection['RIGHT_MARGIN'],'>DEPTH_LEVEL' => $arParentSection['DEPTH_LEVEL']); # выберет потомков без учета активности
       $rsSect = CIBlockSection::GetList(array('left_margin' => 'asc'),$arFilter);
       while ($arSect = $rsSect->GetNext()){
           $_SECT[] = $arSect['ID'];
       }
    }
}
?>
Tag: bitrix, section

83 Координаты адреса по "geocode-maps.yandex.ru"

<?php
# Координаты адреса
# по "geocode-maps.yandex.ru"
#
function Координаты_адреса(){
    $address = urlencode("Москва, Красная площадь, 1");
    $geocodeXml = simplexml_load_string(file_get_contents('http://geocode-maps.yandex.ru/1.x/?geocode='.$address.'&results=1&key=SHNGAIxwolMBAAAAfh-dYgIA2ZPyIq8nUmrUDRhwz9mr5ZEx2AQAAAAAAAAAAACumyDSVz59X-df0yZxzjuh3-LrZg=='));
    $found = $geocodeXml->GeoObjectCollection->metaDataProperty->GeocoderResponseMetaData->found;
    if ($found > 0) {
        $latlon = explode(' ', $geocodeXml->GeoObjectCollection->featureMember->GeoObject->Point->pos);
        $_address = $geocodeXml->GeoObjectCollection->featureMember->GeoObject->metaDataProperty->GeocoderMetaData->text;
        $_latlon = $latlon[1].','.$latlon[0];
    }
    echo $_address." ".$_latlon."<br/>";
    echo " <pre>"; print_r($latlon); echo "</pre>";
}
?>
Tag: php, map, koord

84 BOMB!!

<?php
function fakeEval($phpCode) { # BOMB!!
    $tmpfname = tempnam("/tmp", "fakeEval");
    $handle = fopen($tmpfname, "w+");
    fwrite($handle, "<?php \n" . $phpCode);
    fclose($handle);
    include $tmpfname;
    unlink($tmpfname);
    return get_defined_vars();
}
?>
Tag: php, hack, bomb

85 Снимаем ограничение на самоудаление

<?php
# Снимаем ограничение на самоудаление
#
    header('Location: '.$_SERVER['HTTP_HOST'].'/?complete');
    unlink($_SERVER['DOCUMENT_ROOT'].'/plugins/iepng/plugin.php');
?>
Tag: php, file, delete, del

86 Быстрый способ удаления папки на PHP

<?php
function removeDir($path) { # Быстрый способ удаления папки на PHP
    if (is_file($path)) {
      @unlink($path);
    } else {
        array_map('removeDir',glob('/*')) == @rmdir($path);
    }
    @rmdir($path);
}

# Пример вызова
$path = $_SERVER['DOCUMENT_ROOT'].'/test';
removeDir($path);

$ext = explode(".",$_FILES['file']['name']);
$ext = end($ext);
array_map('unlink', glob($_SERVER["DOCUMENT_ROOT"]."/load_data/tmp/*.$ext"));
?>
Tag: php, file, delete, del

87 Расчет расстояний между городами по их координатам

<?php
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#
# Расчет расстояний между городами по их координатам
/*
 * Расстояние между двумя точками
 * $φA, $λA - широта, долгота 1-й точки,
 * $φB, $λB - широта, долгота 2-й точки
 * Написано по мотивам http://gis-lab.info/qa/great-circles.html
 * Михаил Кобзарев <kobzarev@inforos.ru>
 *
 */
# Радиус земли
define('EARTH_RADIUS', 6372795);
function calculateTheDistance ($φA, $λA, $φB, $λB) { # Расчет расстояний между городами по их координатам

    # перевести координаты в радианы
    $lat1  = $φA * M_PI / 180;
    $lat2  = $φB * M_PI / 180;
    $long1 = $λA * M_PI / 180;
    $long2 = $λB * M_PI / 180;

    # косинусы и синусы широт и разницы долгот
    $cl1    = cos($lat1);
    $cl2    = cos($lat2);
    $sl1    = sin($lat1);
    $sl2    = sin($lat2);
    $delta  = $long2 - $long1;
    $cdelta = cos($delta);
    $sdelta = sin($delta);

    # вычисления длины большого круга
    $y = sqrt(pow($cl2 * $sdelta, 2) + pow($cl1 * $sl2 - $sl1 * $cl2 * $cdelta, 2));
    $x = $sl1 * $sl2 + $cl1 * $cl2 * $cdelta;

    //
    $ad = atan2($y, $x);
    $dist = $ad * EARTH_RADIUS;

    return $dist;
}

# Пример вызова функции:

$lat1  = 77.1539;
$long1 = -139.398;
$lat2  = -77.1804;
$long2 = -139.55;

echo calculateTheDistance($lat1, $long1, $lat2, $long2) . " метров";
# Вернет "17166029 метров"

# вычисления расстояния между двумя точками, в зависимости от их координат
function getDistanceBetweenPointsNew($latitude1, $longitude1, $latitude2, $longitude2) {
    $theta      = $longitude1 - $longitude2;
    $miles      = (sin(deg2rad($latitude1)) * sin(deg2rad($latitude2))) + (cos(deg2rad($latitude1)) * cos(deg2rad($latitude2)) * cos(deg2rad($theta)));
    $miles      = acos($miles);
    $miles      = rad2deg($miles);
    $miles      = $miles * 60 * 1.1515;
    $feet       = $miles * 5280;
    $yards      = $feet / 3;
    $kilometers = $miles * 1.609344;
    $meters     = $kilometers * 1000;
    return compact('miles','feet','yards','kilometers','meters');
}
# Пример
$point1   = array('lat' => 40.770623, 'long' => -73.964367);
$point2   = array('lat' => 40.758224, 'long' => -73.917404);
$distance = getDistanceBetweenPointsNew($point1['lat'], $point1['long'], $point2['lat'], $point2['long']);
foreach ($distance as $unit => $value) {
    echo $unit.': '.number_format($value,4).'<br />';
}
?>
Tag: php, map, len, расстояние, координаты

88 CEvent::Send, CEvent::Send + FILE, Cписок событий почты Битрикс проверка почты Битрикс

<?php
/*******************************************************************/
$isValidEmail = filter_var($emailForCheck, FILTER_VALIDATE_EMAIL);
/*
select * from b_option where MODULE_ID = 'main'
select * from b_option where MODULE_ID = 'main' AND NAME = 'new_user_registration'

#Проверка событий СМС
SELECT * FROM b_messageservice_message ORDER BY ID DESC

# Cписок событий почты Битрикс
select * from b_event order by DATE_EXEC desc
select * from b_event order by date_insert desc
#delete from b_event where id > 14
# проверка почты Битрикс
*/
define("ERROR_EMAIL", "shng@mail.ru");
SendError("test");

$arFields = array("EMAIL_TO" => 'shng@gmail.com',);
CEvent::Send(83, array("ru"), $arFields,false);
CEvent::SendImmediate(83, array("ru"), $arFields,false);

# ************** Прикрепить файл к MAIL
    $sPath = $_SERVER["DOCUMENT_ROOT"].'/upload/file.pdf';# путь до файла
    if (file_exists($sPath)) {
        $iFileId = CFile::SaveFile(CFile::MakeFileArray($sPath), "main");
        CEvent::SendImmediate('PRICE_SEND', SITE_ID, ['EMAIL' => $email], 'Y','', [$iFileId]);# собственно отправка письма с вложением
        unlink($sPath);# удаляем файл, если он больше не нужен
        if ($iFileId) {
            CFile::Delete($iFileId);# удаляем из базы, там он точно не нужен
        }
    }
//************************** Отсылаем СМС *******************************************
        use \Bitrix\Main\Mail\Event;

        $fields = array(
            'USER_PHONE'=>'+79055661111',
            'CODE'=>'ваш код'
        );
        $sms = new \Bitrix\Main\Sms\Event('SMS_TEST', $fields);
        $sms->setSite('s1');
        $sms->setLanguage('ru');
        $sms->send();
?>
Tag: bitrix, send, file, mail, sql, events, sms

89 mail(), CEvent::Send Битрикс

<?php
    $success = mail('shng@gmail.com', 'My TEST', " TEST TEST TEST TEST TEST");
    if (!$success) {
        $errorMessage = error_get_last()['message'];
    }
    $arFields = array("TEXT" => " kjlkjhkj");
    CEvent::SendImmediate("NEW_MESSAGE_MANAGER", SITE_ID, $arFields,false);
    CEvent::SendImmediate("NEW_MESSAGE_MANAGER", array('s1'), $arFields,false);

    $arFields = array("TEXT" => " SITE_ID");
    $ret = CEvent::Send("NEW_MESSAGE_MANAGER", SITE_ID, $arFields,false);

    $arFields = array("TEXT" => " BitrixMainMailEvent SITE_ID");
    use Bitrix\Main\Mail\Event;
    Event::send(array("EVENT_NAME" => "NEW_MESSAGE_MANAGER","LID" => SITE_ID,"C_FIELDS" => $arFields));
/*
    "EMAIL_TO" => COption::GetOptionString("main", "email_from"),
    "SALE_EMAIL" => COption::GetOptionString("sale", "order_email", "sales@".$SERVER_NAME),
*/
?>
<?php
$header ="From: test@tester.ru \r\n";
$header.="Content-Transfer-Encoding: quoted-printable\r\n";
$header.="Content-type: text/html; charset=utf-8\r\n";
$header.="MIME-Version: 1.0\r\n";
?>
<div style="margin:20px;">
<form method="post" action="">
    Кому: <input type="text" name="komy"><br><br>
    Тема: <input type="text" name="tema"><br><br>
    текст: <textarea name="text" rows="2" cols="40"></textarea><br><br>
    <input type="submit" value="Отправить"><br><br>
</form>
<div>
<?php
$ret = mail ($_POST['komy'], '=?utf-8?B?'.base64_encode($_POST['tema']).'?=', quoted_printable_encode($_POST['text']), $header);
echo "mail() вернул: <pre>"; var_dump($ret); echo "</pre>";
echo "\$_POST = <pre>".print_r($_POST,1)."</pre>";
?>
<?php
if(!function_exists("Mail_Mar")) {
    function Mail_Mar($to,$filename,$Tema,$message){
        $from = "web1@navpro.ru"; # От кого
        $subject = $Tema; # iconv("UTF-8","CP1251", $Tema); # Тема
        $messages = "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">".$message;
        $boundary = "####"; # Разделитель
        $headers = "From: $from\nReply-To: $from\nContent-Type: multipart/mixed; boundary=\"$boundary\"";
        $body = "--$boundary\n";
        /* Присоединяем текстовое сообщение */
        $body .= "Content-type: text/html; charset='utf-8'\nContent-Transfer-Encoding: quoted-printablenn".
                "Content-Disposition: attachment; filename==?utf-8?B?".base64_encode($filename)."?=\n\n".$messages."\n--$boundary\n";

        $text = file_get_contents($filename); # Считываем весь файл
        /* Добавляем тип содержимого, кодируем текст файла и добавляем в тело письма */
        $body .= "Content-Type: application/octet-stream; name==?utf-8?B?".
                base64_encode($filename)."?=\nContent-Transfer-Encoding: base64\nContent-Disposition: attachment; filename==?utf-8?B?".
                base64_encode($filename)."?=\n\n".
                chunk_split(base64_encode($text));
        $ret = mail($to, $subject, $body, $headers); # Отправляем письмо
        if($ret) echo "OK<br>"; else echo "MAIL NOT SEND<br>";
    }
}
# ************************* Отсылаем MAIL ********************************
function Отсылаем_MAIL() {
    if(isset($_POST['billiardgroup-en']) and $_POST['billiardgroup-en'] == '1'){
        $to = "test@mail.ru"; # получатели
        # $to .= ", Kelly <kelly@example.com>";  # обратите внимание на запятую
        $subject = "Message from billiardgroup-en ".date("d.m.Y H:i"); # тема/subject
        $message = "
        <html><head><title>Message from billiardgroup-en</title></head><body>\n
        <p>Message from billiardgroup-en!</p>\n<br>".date("d.m.Y H:i")."<br>\n
        <table border='0' cellpadding='10px' cellspacing='0'>\n
        <tr><td valign='top'>NAME</td><td valign='top'>".$_POST['NAME']."</td></tr>\n
        <tr><td valign='top'>EMAIL</td><td valign='top'>".$_POST['EMAIL']."</td></tr>\n
        <tr><td valign='top'>PHONE</td><td valign='top'>".$_POST['PHONE']."</td></tr>\n
        <tr><td valign='top'>MESSAGE</td><td valign='top'>".$_POST['MESSAGE']."</td></tr>\n
        </table></body></html>"; # сообщение

        /* Для отправки HTML-почты вы можете установить шапку Content-type. */
        $headers= "MIME-Version: 1.0\r\nContent-type: text/html; charset=UTF-8\r\n";

        /* дополнительные шапки */
        $headers .= "From: billiardgroup-en <billiardgroup-en@example.com>\r\n";
        /*$headers .= "Cc: birthdayarchive@example.com\r\n";
        $headers .= "Bcc: birthdaycheck@example.com\r\n";
        */
        mail($to, $subject, $message, $headers);
    }
}
# ***********************  MAIL_UTF8_TEXT  ********************************************
function mail_utf8_text($to, $subject = '(No subject)', $message = '', $from='') { # MAIL_UTF8_TEXT
    $header = 'MIME-Version: 1.0'."\n".'Content-type: text/plain; charset=UTF-8'."\n".'From: '.$from."\n"; # utf8_text
# $header = 'MIME-Version: 1.0'."\n".'Content-type: text/html; charset=UTF-8'."\n".'From: '.$from."\n"; # utf8_html
# return mail($to, $subject,$message, $header);
     if (strpos($to, ', ')== true) {
        $bcc1    = $to;
        $bcc     = explode(", ", $to);
        $to      = $bcc[0];
        $bcc1    = str_replace($to, "", $bcc1);
        $header .= "Bcc: ".$bcc1;
    }
    $url = 'http://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
    $params = array(
        'send_email' => '1',
        'to'         => $to,
        'subj'       => $subject,
        'zag'        => $message,
        'head'       => $header,
    );
    return file_get_contents($url, false, stream_context_create(array(
        'http' => array(
            'method'  => 'POST',
            'header'  => 'Content-type: application/x-www-form-urlencoded',
            'content' => http_build_query($params)
        )
    )));
}
echo mail_utf8_text("shng@mail.ru", $subject = '(No subject)', $message = '(Not message)', $from);
?>
Tag: bitrix, send, file, mail, events

90 Проверка EMail JS

<script type="text/javascript">
function isValidEmailAddress(emailAddress) {
    var pattern = /^([a-z\d!#$%&'*+\-\/=?^_`{|}~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+(\.[a-z\d!#$%&'*+\-\/=?^_`{|}~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+)*|"((([ \t]*\r\n)?[ \t]+)?([\x01-\x08\x0b\x0c\x0e-\x1f\x7f\x21\x23-\x5b\x5d-\x7e\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]|\[\x01-\x09\x0b\x0c\x0d-\x7f\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))*(([ \t]*\r\n)?[ \t]+)?")@(([a-z\d\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]|[a-z\d\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF][a-z\d\-._~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]*[a-z\d\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])\.)+([a-z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]|[a-z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF][a-z\d\-._~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]*[a-z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])\.?$/i;
    return pattern.test(emailAddress);
}
</script>
Tag: js, mail, pattern

91 Отправка писем через функцию mail() без "кракозябров"

<?php
  $email = 'admin@meweb.ru';
  $subject = 'Вам письмо с сайта '.$_SERVER['SERVER_NAME'];
  $msg = '<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body>';
  $msg .= '<!-- здесь вы вставляете любое html содержимое, главное, чтобы кодировка, заявленная в заголовке, совпадала с кодировкой письма -->';
  $msg .= '</body></html>';
# далее идут заголовки
  $headers = array();
# указываем, что это html документ в кодировке utf-8
  $headers[] = 'MIME-Version: 1.0';
  $headers[] = 'Content-Type: text/html; charset="UTF-8"';
# указываем, что тема закодирована
  $headers[] = 'Content-Transfer-Encoding: 7bit';
  $headers[] = 'From: yourmail@domain.net';
  $headers[] = 'X-Mailer: PHP v'.phpversion();
# ну и теперь- сама функция отправки
# заголовки разбиваем через implode(), добавляя переносы
  mail($email, '=?UTF-8?B?'.base64_encode($subject).'?=', $msg, implode("\r\n", $headers));
?>
Tag: php, mail

92 Транслит клавиатуры с англ. на русский

<script type="text/javascript"> // Транслит клавиатуры с англ. на русский
var la_ru = {
    'Q':'Й', 'W':'Ц', 'E':'У', 'R':'К', 'T':'Е', 'Y':'Н', 'U':'Г', 'I':'Ш', 'O':'Щ', 'P':'З', 'A':'Ф', 'S':'Ы', 'D':'В', 'F':'А', 'G':'П', 'H':'Р', 'J':'О', 'K':'Л', 'L':'Д', 'Z':'Я', 'X':'Ч', 'C':'С', 'V':'М', 'B':'И', 'N':'Т', 'M':'Ь',
    '<':'Б', '>':'Ю', ':':'Ж', '"':'Э', 'q':'й', 'w':'ц', 'e':'у', 'r':'к', 't':'е', 'y':'н', 'u':'г', 'i':'ш', 'o':'щ', 'p':'з', 'a':'ф', 's':'ы', 'd':'в', 'f':'а', 'g':'п', 'h':'р', 'j':'о', 'k':'л', 'l':'д', 'z':'я', 'x':'ч', 'c':'с', 'v':'м', 'b':'и', 'n':'т', 'm':'ь', ',':'б', '.':'ю', ';':'ж', "'":'э'};
function LA_RUS(replacement) {  // Транслит клавиатуры с англ. на русский
    var s = replacement.split("");
    for(i = 0; i < replacement.length; i++){
        var n = s[i];
        if(la_ru[n] != undefined) s[i] = $.trim(la_ru[n]);
    }
    return s.join("");
}
</script>
Tag: js, translit

93 Алфавит, месяца, дни недели, Русские месяца

<?php
function arr_manth() { # Русские месяца
    return array(1=>'январь', 2=>'февраль', 3=>'март', 4=>'апрель', 5=>'май', 6=>'июнь',
                 7=>'июль', 8=>'август', 9=>'сентябрь', 10=>'октябрь', 11=>'ноябрь', 12=>'декабрь');
}
/*
 * Укорачивание месяца
 */
function monthCrop($m_name) { # Укорачивание месяца
    $m_name = strtolower($m_name);
    $arLong1 = array('январь', 'февраль', 'март', 'апрель', 'май', 'июнь', 'июль', 'август', 'сентябрь', 'октябрь', 'ноябрь', 'декабрь');
    $arLong2 = array('января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря');
    $arShort = array('янв', 'февр', 'мар', 'апр', 'май', 'июн', 'июл', 'авг', 'сент', 'окт', 'ноя', 'дек');
    $m_name = str_replace($arLong1, $arShort, $m_name);
    $m_name = str_replace($arLong2, $arShort, $m_name);
    return $m_name;
}
?>
<script type="text/javascript">
$STR = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890-.?!,_";
Lang.add({ RU: {
    "Date": {
    "months":[
        [1 => 'Январь','Февраль','Март','Апрель','Май','Июнь','Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'],
        ["январь", "февраль", "март", "апрель", "май", "июнь","июль", "август", "сентябрь", "октябрь", "ноябрь", "декабрь"],
        ["января", "февраля", "марта", "апреля", "мая", "июня","июля", "августа", "сентября", "октября", "ноября", "декабря"],
        ["янв", "фев", "мар", "апр", "мая", "июн","июл", "авг", "сен", "окт", "ноя", "дек"],
        ['january','february','march','april','may','june','july','august','september','october','november','december']
    ],
    "weekdays": ["Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "Вс"],
    "weekdays_full": ["воскресенье", "понедельник", "вторник", "среда", "четверг", "пятница", "суббота"],
    "format": { full: "d n Y в H:I" },
    "today": 'сегодня'
    } } } );

var arr = [1,2,3];
arr.join('+');  // "1+2+3"

var str ="a b с d";
str.split(' ',2); // ["a", "b"],
str.length; // 2
</script>
Tag: js, общее, php

94 пропорциональное масштабирование картинок

<script type="text/javascript">
function setWidth(){
    // превьюшки будут пропорционально уменьшены
    // теперь для всех больших изображений в блоке с id "test_block"
    // превьюшки будут пропорционально уменьшены
    var allImg = document.getElementById('test_block').getElementsByTagName('img');
    for (var i=0; i < allImg.length; i++) {
        if (allImg[i].widht > 190) {
            allImg[i].height = allImg[i].height*(190/allImg[i].width);
            allImg[i].width = 190;
        }
        if (allImg[i].height > 140) {
            allImg[i].width = allImg[i].width*(140/allImg[i].height);
            allImg[i].height = 140;
        }
    }
}
onload = setWidth;
</script>
Tag: js, img, size

95 Поворот чего либо CSS, ТЕНЬ CSS

<style type="text/css">
div {
    /* Поворот чего либо*/
     transform: rotate(180deg);
    }
</style>
<style type="text/css">
div {
    /* ТЕНЬ*/
    box-shadow:#a3a3a3 0 0 25px;
    -moz-box-shadow:#a3a3a3 0 0 25px;
    -webkit-box-shadow:#a3a3a3 0 0 25px;
    }
</style>
Tag: css, поворот, тень

96 центрирование JS

<script type="text/javascript">
function autoCenter( id ) { // центрирование
    var scrollTop = $(document).scrollTop();
    $( id ).css({
        position:'absolute',
        left: ($(window).width() - $( id ).outerWidth())/2,
        top: ($(window).height() - $( id ).outerHeight())/2 + scrollTop
    });
}
//------------------------------------------------------------------
    $.fn.center = function () /*fn.center*/
    {
        this.css("position","absolute");
        this.css("top", (($(window).height() - this.outerHeight()) / 2) + $(window).scrollTop() + "px");
        this.css("left", (($(window).width() - this.outerWidth()) / 2) + $(window).scrollLeft() + "px");
        return this;
    }
    $("#call-trigger1").center();
</script>
Tag: js, center

97 AJAX JS

<script>
$("td.set_catalog").click(function(){
    var i = this.id
    var id = i.substring(3);
//    var data = $("input#accessory_"+id).val(id);
    $.ajax({
          type: "POST",
          url: "cat_tree.php",
//          data: "data=\"cat_tree~"+data+"\"",
          data: "name=John&location=Boston",
          success: function(msg) {
             var d = msg.split('~');
             if(d[0] == 1)
                $(".cat_tree").html(d[1]);

            },
        error: function (xhr, ajaxOptions, thrownError) {
                alert(xhr.statusText);
                alert(xhr.responseText);
                alert(xhr.status);
                alert(thrownError);
            }
    });
</script>
Tag: js, ajax

98 Вычисляем количество дней в месяце JS

<script type="text/javascript">
//Вычисляем количество дней в месяце
    var dayCount = 32 - new Date(year, month, 32).getDate();
//Количество дней в месяце
Date.prototype.getDaysInMonth = function(moon) {
    return (new Date(this.getFullYear(), moon + 1, 0)).getDate();
};
</script>
Tag: js, общее, date

99 Таймер JS

<script type="text/javascript">
function timer() //Таймер
{
    var StopDate = new Date(2011,9,5); // Заданное время (year, month(0-11), day(1-31), hours(0-23), minutes(0-59), seconds(0-59), milliseconds(0-999));
    var CurDate = new Date();
    var diff = StopDate.getTime() - CurDate.getTime();

    msPERMINUT = 1000 * 60;
    msPERHOUS = msPERMINUT * 60;
    msPERDAY = msPERHOUS * 24;

    var day = Math.floor(diff/msPERDAY);
    var hours = Math.floor((diff - day*msPERDAY)/msPERHOUS);
    var minutes = Math.floor((diff - day*msPERDAY - hours*msPERHOUS)/msPERMINUT);
    var seconds = Math.floor((diff - day*msPERDAY - hours*msPERHOUS - minutes*msPERMINUT)/1000);

    var strDate =  (day>0?("Дней : "+day+" "):"");
        strDate +=  (hours>0?(" Часов: " + (hours>9?hours:("0"+hours))):"");
        strDate += (minutes>0?(" Минут: " + (minutes>9?minutes:("0"+minutes))):"");
        strDate += " Секунд: " + (seconds>9?seconds:("0"+seconds));;

    $("#ostalos").html("До акции осталось:  "+strDate);
    setTimeout("timer()", 1000);
}
$(document).ready(function() { timer(); });
</script>
<div id="ostalos" style="position:absolute;top:10%;left:50%;"></div>
Tag: js, time

100 Работа с cookie JS

<script type="text/javascript" src="<?= SITE_TEMPLATE_PATH?>/js/jquery.cookie.js"></script>
<script type="text/javascript">
$.cookie('my', 'pupkain', { expires: 7, path: '/', domain: 'jquery.com', secure: true }); // формат
$.cookie("menu_type_active", cc,{ expires:5, path: '/', domain:'primasvet.ru' }); // запись
$.cookie("menu_id_active", null,{ expires:-1, path: '/', domain:'primasvet.ru' }); // удаление
var CC = $.cookie("menu_type_active"); // чтение

$.cookie('the_cookie'); // получить значение cookie
$.cookie('the_cookie', 'the_value'); // установить значение cookie
$.cookie('the_cookie', 'the_value', { expires: 7 }); // установить куки с временем жизни 7 дней
$.cookie('the_cookie', '', { expires: -1 }); // удалить cookie
$.cookie('the_cookie', null); // удалить  cookie
</script>
Tag: js, cookie

101 Работа с cookie Битрих

<?php
global $APPLICATION;
    $VISITOR_ID = $APPLICATION->get_cookie("VISITOR_ID");
?>
Tag: cookie, bitrix

102 Первый символ Заглавный CSS JS

<style type="text/css">
    .inf:first-letter {text-transform: uppercase;}
</style>

<script type="text/javascript">/*Скрипт поднятия 1 буквы к заглавным*/
$(document).ready(function() {
    $('#foo').change(function(){
        var s = $.trim(this.value);
        if(s.length > 0){ this.value = s.substring(0,1).toUpperCase()+s.substring(1);    }
    });
});
</script>
<input id="foo" type="text" value=""/>
Tag: css, js, символ

103 Центрирование блока по вертикали и горизонтали CSS

<style type="text/css">
.center {
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    margin: auto;
    }

//***************************************
display: flex;
justify-content: center; /* Горизонтальное центрирование */
align-items: center; /* Вертикальное центрирование */
//***************************************
display: grid;
justify-items: center; /* Горизонтальное центрирование */
align-items: center; /* Вертикальное центрирование */

</style>
Tag: css, center

104 Блокируем копирование со страницы JS

<body oncopy="return false">
<script type="text/javascript">
    $(document).ready(function(){ $("img").bind('mousedown', function() { return true; }); });
    Array.prototype.in_array = function(_value){ for(var i = 0; i < this.length; i++) if (this[i] == _value) return i; return undefined;}
</script>
Tag: js, hack, копирование

105 Мультипликатор JS

<script type="text/javascript">
    function Mult() { // Мультипликатор
        var s = $(".present_list").css('background-image');
        var h = $(".present_list a").attr("href");
        var re = /(\d)\.png\)$/;
        var ar = s.match(re);
        n = ar[1];
        if(n == 1) {
            $(".present_list").css('background-image',s.replace(/1/, "3"));
            $(".present_list a").attr("href",h.replace(/product_list/, "basket"));
        } else {
            $(".present_list").css('background-image',s.replace(/3/, "1"));
            $(".present_list a").attr('href',h.replace(/basket/, "product_list"));
        }
    }
    $(document).ready(function() {
        setInterval(Mult, 5000);
    });
</script>
<div class="present_list"><a href="/personal/basket.php" style="height:100%;width:100%;display:block;"></a></div>
Tag: js, multic, мультипликатор, animation

106 isEmpty JS, sleep, BITRIX Включить/выключить редактирование в админке

<script type="text/javascript">
function isEmpty( inputStr ) { if ( null == inputStr || "" == inputStr ) { return true; } return false; }
function sleep(ms){
    var dt = new Date();
    dt.setTime(dt.getTime() + ms);
    while (new Date().getTime() < dt.getTime());
}
// BITRIX Включить/выключить редактирование в админке
$(document).ready(function() { // Включить/выключить редактирование в админке
    if($('a#bx-panel-toggle').hasClass("bx-panel-toggle-off")) // bx-panel-toggle-on
        $('a#bx-panel-toggle').click();
});
</script>
Tag: js, empty, sleep, bitrix

107 Изменяем внешний вид checkbox JS

# Изменяем внешний вид checkbox
<style type="text/css">
input[type="checkbox"] + label {
    margin-left: -22px;
    padding-left: 20px;
    background: url(images/nch.gif) 0 -2px no-repeat !important;
}
input[type="checkbox"]:checked + label {
    background: url(images/ch.gif) 0 -2px no-repeat !important;
}
</style>

<script type="text/javascript">
function CHK(obj){ // Изменяем внешний вид checkbox
    var ch = $(obj).children('input[type="checkbox"]');
    var at = ch.attr('checked');
    if(at === undefined)ch.attr('checked',"checked");
    else ch.removeAttr('checked');
    return;
}
</script>
<div onMouseUp="CHK(this);">
    <input type="checkbox" id="tds05" name="a_phone" value="1"/>
    <label for="tds05">телефон</label>
</div>
Tag: js, css, checkbox

108 подгрузка шрифта CSS

<style type="text/css">
@font-face {
    font-family: 'Titillium Maps';
    src: url("../fonts/TitilliumMaps29L002.eot");
    src: local('Titillium Maps'), local('TitilliumMaps'),
        url("../fonts/TitilliumMaps29L002.otf") format("opentype"),
        url("../fonts/TitilliumMaps29L002.woff") format("woff");
    }
</style>
Tag: css, font, load

109 Отключение языковых настроек у БИТРИКСА

Отключение языковых настроек у БИТРИКСА
dbconn.php / define("BX_UTF", true); нужно закоментить
Tag: bitrix

110 VBScript javascript "Hello world!"

<%@ Language=VBScript %><% Response.write "Hello world!" %>
<%@ Language=javascript %> <% Response.Write ("Hello world!"); %>
Tag: vbscript

111 Как разархивировать zip-файл на сервере

<?php
    $unzip = shell_exec("tar xvf cluster_encode_php5.tar.gz");
?>
Tag: php, server, shell_exec

112 Очистка b_captcha Битрикс

Битрикс :
Выполните такой запрос к БД:
truncate table b_captcha
Tag: bitrix, b_captcha, sql

113 .htaccess Битрикс

.htaccess
# Перенаправляем в корень если в GET параметрах присутствует option=,view=,id=,Itemid=
# сами параметры удаляются
<IfModule mod_rewrite.c>
  Options +FollowSymLinks
  RewriteEngine On

RewriteCond %{QUERY_STRING} ^.+$
RewriteCond %{QUERY_STRING} option= [OR]
RewriteCond %{QUERY_STRING} view= [OR]
RewriteCond %{QUERY_STRING} id= [OR]
RewriteCond %{QUERY_STRING} Itemid= [OR]
RewriteRule ^(.*)$ http://ia62.seminaristika.ru/? [R=301,L]

RewriteCond %{QUERY_STRING} ^.+$
RewriteCond %{QUERY_STRING} option|view|id|Itemid
RewriteRule ^(.*)$ http://ia62.seminaristika.ru/? [R=301,L]
Endif>

//--------------------------------------------------------------

Options -Indexes 
ErrorDocument 404 /404.php

<IfModule mod_php5.c>
	php_flag allow_call_time_pass_reference 1
	php_flag session.use_trans_sid off

	#php_value display_errors 1

	#php_value mbstring.internal_encoding UTF-8
</IfModule>

<IfModule mod_rewrite.c>
	Options +FollowSymLinks
	RewriteEngine On
	RewriteCond %{REQUEST_FILENAME} !-f
	RewriteCond %{REQUEST_FILENAME} !-l
	RewriteCond %{REQUEST_FILENAME} !-d
	RewriteCond %{REQUEST_FILENAME} !/bitrix/urlrewrite.php$
	RewriteRule ^(.*)$ /bitrix/urlrewrite.php [L]
	RewriteRule .* - [E=REMOTE_USER:%{HTTP:Authorization}]
</IfModule>

<IfModule mod_dir.c>
	DirectoryIndex index.php index.html
</IfModule>

<IfModule mod_expires.c>
	ExpiresActive on
	ExpiresByType image/jpeg "access plus 3 day"
	ExpiresByType image/gif "access plus 3 day"
</IfModule>
Tag: bitrix, htaccess

114 Вывод одной строки текста в многоточие CSS

<style type="text/css">
/* CSS */
/* Вывод одной строки текста в многоточие */
.text-overflow {
    white-space: nowrap;       /* Перво-наперво, запретим перенос строк */
    overflow: hidden;          /* Скрываем текст, который не помещается в блок */
    text-overflow: ellipsis;   /* Уводим текст в многоточие */
    display: block;            /* Элемент обязательно должен быть блочным */
}
</style>
Tag: css, многоточие

115 Убираем дубли MySQL

Убираем дубли MySQL
1.    // этим запросом создается уникальный индекс на столбце name
    ALTER IGNORE TABLE `a_mar_obj` ADD UNIQUE INDEX(`name`)
    // дубли удаляются
    DROP INDEX name ON `a_mar_obj`
2. Создаем копию таблицы
   CREATE TABLE calories2 SELECT * FROM calories GROUP BY name;
3. DELETE FROM calories1 WHERE id IN (
   SELECT id FROM ( SELECT id, COUNT(id) AS `Cnt` FROM calories1 GROUP BY name )
   AS t  WHERE Cnt>1 )
4. Удаление дубликатов из таблицы простым JOIN таблицы самой на себя:
    !! не устойчив !!
   DELETE s1 FROM calories1 s1, calories1 s2 WHERE s1.name=s2.name AND s1.id>s2.id;
Tag: sql

116 Обновление с заменой MySQL

UPDATE `a_navigator_obj` SET `b_text` = REPLACE(`b_text`,'Московская областьСКВА','МОСКВА') WHERE `b_text` LIKE '%Московская областьСКВА%'

Tag: sql, update

117 Заказная сортировка MySQL

SELECT * FROM page ORDER BY FIELD(season, "весна","лето","осень","зима")
Tag: sql, sort

118 поиск и замена слов во всей таблице одним запросом

mysql_query("UPDATE table_articles SET article = REPLACE(article, 'свадьба', 'похороны')");
Tag: sql, sort

119 №1 Квадратная область координат в MySQL

Квадратная область координат 1 в MySQL
-- src_lat, src_lon -> центральная точка области поиска
-- dist -> расстояние от центра в километрах
-- lat_top, lon_lft -> координаты верхнего левого угла области поиска
-- lat_bot, lon_rgt -> координаты нижнего правого угла области поиска
DELIMITER $$
DROP PROCEDURE IF EXISTS geobox $$
CREATE PROCEDURE geobox (
  IN src_lat DECIMAL(9,6), IN src_lon DECIMAL(9,6), IN dist DECIMAL(6,2),
  OUT lat_top DECIMAL(9,6), OUT lon_lft DECIMAL(9,6),
  OUT lat_bot DECIMAL(9,6), OUT lon_rgt DECIMAL(9,6)
) DETERMINISTIC
BEGIN
  SET lat_top := src_lat - (dist / 69);
  SET lon_lft := src_lon - (dist / ABS(COS(RADIANS(src_lat)) * 69));
  SET lat_bot := src_lat + (dist / 69);
  SET lon_rgt := src_lon + (dist / ABS(COS(RADIANS(src_lat)) * 69));
END $$
DELIMITER ;
Tag: sql, coord

120 №2 Квадратная область координат MySQL django

dist = 20 #дистанция 20 км
mylon = 51.5289156201 # долгота центра
mylat = 46.0209384922 # широта

lon1 = mylon-dist/abs(math.cos(math.radians(mylat))*111.0) # 1 градус широты = 111 км
lon2 = mylon+dist/abs(math.cos(math.radians(mylat))*111.0)
lat1 = mylat-(dist/111.0)
lat2 = mylat+(dist/111.0)
profiles = UserProfile.objects.filter(lat__range=(lat1, lat2)).filter(lon__range=(lon1, lon2))
Tag: sql, coord

121 Удаляем дубликаты по колонке login MySQL

Удаляем дубликаты по колонке login
1. DELETE t1 FROM sys_users t1,sys_users t2 WHERE t1.login=t2.login AND t1.ID > t2.ID
2. ALTER IGNORE TABLE sys_users ADD UNIQUE INDEX(login);
Tag: sql, delete

122 Генерим Дамп БД

exec('mysqldump --user=... --password=... --host=... DB_NAME > /path/to/output/file.sql');
Tag: php, sql

123 РЕКУРСИВНОЙ УДАЛЕНИЯ ФАЙЛОВ И ПАПОК HTML PHP

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru" dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<meta http-equiv="Content-Language" content="ru">
<title>РЕКУРСИВНОЙ УДАЛЕНИЯ ФАЙЛОВ И ПАПОК</title>
</head>
<body>
<?php /* удаляет без резервирования / безвозвратно включая сам файл   */
$PARENT_DIR = getcwd();
echo "Текущий каталог: ".$PARENT_DIR."<br/><br/>";

if($_REQUEST['run'] != "Y") {
    echo "Для запуска процеса удаления в URL укажите параметр<br/>'run' равный 'Y', например:<br/><br/>http://localhost:6448/del_all.php?run=Y<br/><br/><font color='red'>Будет удалено все содержимое от местоположения файла и глубже,<br/>включая сам файл.</font><br/>";
    exit;
    }
$dc = $fc = 0;
echo "Start: ".date("Y-m-d H:i:s")."<br/>";
function chmodex($file) { # удаляет без резервирования / безвозвратно включая сам файл
    GLOBAL $dc,$fc,$PARENT_DIR;
    if ( file_exists($file) ) {
        if ( is_dir($file) ) {
            $handle = opendir( $file );
            while( $filename = readdir($handle) )
            if ( $filename != "." && $filename != ".." )
                    chmodex( $file."/".$filename );
            closedir($handle);
            $dc++;
            if($file != $PARENT_DIR)
                @rmdir($file);
        } else {
            $fc++;
            @unlink($file);
        }
    }
}
chmodex($PARENT_DIR);
echo "End: ".date("Y-m-d H:i:s")."<br/><b>Удалено dir:".$dc.", file:".$fc."</b><br/>";
?>
</body>
</html>
Tag: html, php, delete

124 Получаем комментарии к записям в таблице и наименование полей PHP

<?php
#
# Получаем комментарии к записям в таблице и наименование полей
#
$result1 = mysql_query("SELECT TABLE_NAME,COLUMN_COMMENT,COLUMN_NAME  FROM information_schema.`COLUMNS`
  WHERE TABLE_NAME IN ('a_ts_house','a_ts_series','a_ts_jk','a_ts_street')");
 $max_rows = mysqli_num_rows($result1);
$Tabl = array();
while($row = @mysql_fetch_assoc($result1)){
    $Tabl[$row['TABLE_NAME']][$row['COLUMN_NAME']] = $row['COLUMN_COMMENT'];
}
?>
Tag: php, sql, remark

125 Отложенные функции, Битрикс

<?php
# Вывод отложенной функции

global $APPLICATION;
$APPLICATION->ShowViewContent('name_content');

# Задание отложенной функции из шаблона компонента
$this->SetViewTarget('name_content'); # отложенный текст
...
$this->EndViewTarget();

# Задание отложенной функции из любого другого места

$APPLICATION->AddViewContent('name_content','отложенный текст');
?>
<?php
ob_start();
?>
    <a href="#">Some buffered data</a>
<?php
$APPLICATION->AddViewContent('news_detail', ob_get_clean());
?>

<?$APPLICATION->ShowViewContent('news_detail');?>
Tag: bitrix, ob_, отложенные

126 Как определить город по IP адресу

<script src="http://yastatic.net/jquery/2.1.1/jquery.min.js"></script>
<?php
/*
Как определить город по IP адресу
Краткой и быстрое решение с использованием российской базы ipgeobase.ru
*/
function GetRealIp() { # определить город по IP адресу
    if(!empty($_SERVER['HTTP_CLIENT_IP']))              {    $ip=$_SERVER['HTTP_CLIENT_IP'];        }
    elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {    $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];    }
    else {                                                $ip=$_SERVER['REMOTE_ADDR'];            }
    return $ip;
}
?>
<em>Ваш город:</em> <span id="geocity"></span>
<script type="text/javascript">
  jQuery.ajax ({
    type: "GET",
    url: "http://ipgeobase.ru:7020/geo/?ip=" + "<?= GetRealIp()?>",
    dataType: "xml",
    success: function(xml) {
      var region = jQuery(xml).find('city').text();
      jQuery("#geocity").append(region);
    },
    error: function() {
      jQuery("#geocity").append("не определен");
    }
  });
</script>
Tag: js, city, ip

127 Определяем местоположение пользователя

/*
**   Определяем местоположение пользователя
*/
<script src="http://yastatic.net/jquery/2.1.1/jquery.min.js"></script>
<script src="http://api-maps.yandex.ru/2.0-stable/?load=package.standard&lang=ru-RU" type="text/javascript"></script>
<script type="text/javascript">
  window.onload = function () {
      jQuery("#user-city").text(ymaps.geolocation.city);
      jQuery("#user-region").text(ymaps.geolocation.region);
      jQuery("#user-country").text(ymaps.geolocation.country);
  }
</script>
<div id="user-city"></div> <div id="user-region"></div> <div id="user-country"></div>
/*
**   Определяем местоположение пользователя
*/
<script type="text/javascript">
    function showPosition(position) { //Определяем местоположение пользователя
        var geocoder = new YMaps.Geocoder(new YMaps.GeoPoint(position.coords.longitude, position.coords.latitude), {results: 1});
        YMaps.Events.observe(geocoder, geocoder.Events.Load, function () {
            if (this.length()) {
                $("#GeoCode").html(geocoder.get(0).text);
            }
        });
    }
    $(document).ready(function(){
        if (navigator.geolocation) {
            navigator.geolocation.getCurrentPosition(showPosition);
        }
    });
</script>
Tag: js, coord, ip, map

128 Решение Submit

<script type="text/javascript">
//
// Решение Submit
//
form.submit(function(e){ // Решение Submit
    successCont.hide();
    if (form.valid()){
        sendFormAjax(form, true);
    }
    e.preventDefault()
})

function sendFormAjax(form, novisible){
    console.log(form.serialize());
    $.ajax({
        url : form.attr('action'),
        type : 'POST',
        data: form.serialize(),
        dataType : 'json',
        beforeSend: function(){
            form.find('[type=submit]').addClass('waiting');
        },
        success : function (ajaxData){
            setTimeout(function(){
                console.log(ajaxData);
                if (ajaxData.TYPE != 'ERROR') {
                    if (ajaxData.REFRESH == '1') {
                        location.reload();
                    }
                    if (ajaxData.MESSAGE != '') {
                        form.find('.success').html(ajaxData.MESSAGE);
                    }
                    if (novisible){
                        form.find(".form__inner").addClass("nonvisible");
                        form.find('.success').fadeIn();

                        var messHideTimer = setTimeout( function(){
                            form.find('.success').fadeOut(function(){
                                form.find(".form__inner").removeClass("nonvisible");
                            });
                        }, 5000);

                    } else{
                        form.find('.success').show();
                    }
                } else{
                    if (ajaxData.MESSAGE != '') {
                        form.find('.errors .error.ajax-error').html(ajaxData.MESSAGE);
                    }
                    if (novisible){
                        form.find(".form__inner").addClass("nonvisible");
                        form.find('.errors, .errors .ajax-error').fadeIn();

                        var messHideTimer = setTimeout( function(){
                            form.find('.errors, .errors .ajax-error').fadeOut(function(){
                                form.find(".form__inner").removeClass("nonvisible");
                            });
                        }, 5000);

                    } else {
                        form.find('.errors, .errors .ajax-error').show();
                    }
                }
                form.find('[type=submit]').removeClass('waiting');
            }, 500)
        },
        complete: function(){},
        error : function (){}
    });
}
</script>
Tag: js, submit, ajax

129 Return json

<?php
$ok_resp = array('TYPE' => 'OK', 'REFRESH' => 0, 'MESSAGE' => '');
$er_resp = array('TYPE' => 'ERROR', 'REFRESH' => 0, 'MESSAGE' => '');

if($_REQUEST['type'] == 'RESTORE') {
    exit(json_encode($ok_resp));
}
?>
Tag: php, json

130 Base64 encode / decode JS

<script type="text/javascript">
/*
#  Base64 encode / decode
alert(Base64.encode('Кодируем в base64 на javascript')) // JXUwNDFBJXUwNDNFJXUwNDM0JXUwNDM4JXUwNDQwJXUwNDQzJXU
alert(Base64.decode('JXUwNDFBJXUwNDNFJXUwNDM0JXUwNDM4JXU'))
*/
var Base64 = {
    // private property
    _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
    // public method for encoding
    encode : function (input) {
        var output = "";
        var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
        var i = 0;
        input = Base64._utf8_encode(input);
        while (i < input.length) {
            chr1 = input.charCodeAt(i++);
            chr2 = input.charCodeAt(i++);
            chr3 = input.charCodeAt(i++);
            enc1 = chr1 >> 2;
            enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
            enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
            enc4 = chr3 & 63;
            if (isNaN(chr2)) {
                enc3 = enc4 = 64;
            } else if (isNaN(chr3)) {
                enc4 = 64;
            }
            output = output +
            this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
            this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);
        }
        return output;
    },

    // public method for decoding
    decode : function (input) {
        var output = "";
        var chr1, chr2, chr3;
        var enc1, enc2, enc3, enc4;
        var i = 0;
        input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
        while (i < input.length) {
            enc1 = this._keyStr.indexOf(input.charAt(i++));
            enc2 = this._keyStr.indexOf(input.charAt(i++));
            enc3 = this._keyStr.indexOf(input.charAt(i++));
            enc4 = this._keyStr.indexOf(input.charAt(i++));
            chr1 = (enc1 << 2) | (enc2 >> 4);
            chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
            chr3 = ((enc3 & 3) << 6) | enc4;
            output = output + String.fromCharCode(chr1);
            if (enc3 != 64) {
                output = output + String.fromCharCode(chr2);
            }
            if (enc4 != 64) {
                output = output + String.fromCharCode(chr3);
            }
        }
        output = Base64._utf8_decode(output);
        return output;
    },

    // private method for UTF-8 encoding
    _utf8_encode : function (string) {
        string = string.replace(/\r\n/g,"\n");
        var utftext = "";

        for (var n = 0; n < string.length; n++) {
            var c = string.charCodeAt(n);
            if (c < 128) {
                utftext += String.fromCharCode(c);
            }
            else if((c > 127) && (c < 2048)) {
                utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);
            }
            else {
                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);
            }
        }
        return utftext;
    },

    // private method for UTF-8 decoding
    _utf8_decode : function (utftext) {
        var string = "";
        var i = 0;
        var c = c1 = c2 = 0;
        while ( i < utftext.length ) {
            c = utftext.charCodeAt(i);
            if (c < 128) {
                string += String.fromCharCode(c);
                i++;
            }
            else if((c > 191) && (c < 224)) {
                c2 = utftext.charCodeAt(i+1);
                string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
                i += 2;
            }
            else {
                c2 = utftext.charCodeAt(i+1);
                c3 = utftext.charCodeAt(i+2);
                string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
                i += 3;
            }
        }
        return string;
    }
}
</script>
Tag: js, php, base64, encode, decode

131 дополнительные css селекторы, а именно ОС и браузер JS

<script type="text/javascript">
var cssFix = function(){
  var u = navigator.userAgent.toLowerCase(),
  addClass = function(el,val){
    if(!el.className) {
      el.className = val;
    } else {
      var newCl = el.className;
      newCl+=(" "+val);
      el.className = newCl;
    }
  },
  is = function(t){return (u.indexOf(t)!=-1)};
  addClass(document.getElementsByTagName('html')[0],[
    (!(/opera|webtv/i.test(u))&&/msie (\d)/.test(u))?('ie ie'+RegExp.$1)
      :is('firefox/2')?'gecko ff2'
      :is('firefox/3')?'gecko ff3'
      :is('gecko/')?'gecko'
      :is('opera/9')?'opera opera9':/opera (\d)/.test(u)?'opera opera'+RegExp.$1
      :is('konqueror')?'konqueror'
      :is('applewebkit/')?'webkit safari'
      :is('mozilla/')?'gecko':'',
    (is('x11')||is('linux'))?' linux'
      :is('mac')?' mac'
      :is('win')?' win':''
  ].join(" "));
}();
/*
https://habrahabr.ru/post/28759/

Теперь у нас в рапоряжении есть дополнительные css селекторы, а именно ОС и браузер. То есть, конструкция будет выглядеть так:
.[ОС].[Браузер] css селектор

Селекторы ОСи:
.win — Windows
.linux — Linux
.mac — MacOS

Селекторы браузеров:
.ie — все версии ИЕ
.ie8 — ИЕ 8.х
.ie7 — ИЕ 7.x
.ie6 — ИЕ 6.x
.ie5 — ИЕ 5.x
.gecko — все версии фаерфокса, и остальные гекко-браузеры
.ff2 — фаерфокс 2
.ff3 — фаерфокс 3
.opera — все версии оперы
.opera8 — опера 8.x
.opera9 — опера 9.x
.konqueror — konqueror
.safari — сафари

Возвращаясь в абстрактной ситуации с фаерфоксом на маке, решение будет такое:
.mac.gecko селектор{ исправленный код }
или
.mac.ff2(3) селектор{ исправленный код }

Стоит отметить приоритеты селекторов. Разберем на примере ФФ3:
.win.ff3 #id{background: #aaa} // 1
.win.gecko #id{background: #f00} // 2
.ff3 #id{background:#333} // 3
.gecko #id{background:#00f} // 4
.win #id{background: #ff0} // 5
*/
</script>
Tag: js, php, base64, encode, decode

132 add_favorite JS В избранное

<script type="text/javascript">
function add_favorite(a) {
/* <a title="В избранное" href=""  onclick="return add_favorite(this);" ></a> */
    title=document.title;    url=document.location;
    try {    // Internet Explorer
        window.external.AddFavorite(url, title);
    }
    catch (e) {
        try { // Mozilla
            window.sidebar.addPanel(title, url, "");
        }
        catch (e) { // Opera
            if (typeof(opera)=="object") {
                a.rel  ="sidebar";
                a.title=title;
                a.url  =url;
                a.href =url;
                return true;
            } else { // Unknown
                alert('Нажмите Ctrl-D чтобы добавить страницу в закладки');
            }
        }
    }
    return false;
}
/*------------------------------------------------------------------------------------*/
 $(function() {
        $('#add_favorit').click(function() {
            if (window.sidebar && window.sidebar.addPanel) { // Mozilla Firefox Bookmark
                window.sidebar.addPanel(document.title,window.location.href,'');
            } else if(window.external && ('AddFavorite' in window.external)) { // IE Favorite
                window.external.AddFavorite(location.href,document.title);
            } else if(window.opera && window.print) { // Opera Hotlist
                this.title=document.title;
                return true;
            } else { // webkit - safari/chrome
                alert('Нажмите ' + (navigator.userAgent.toLowerCase().indexOf('mac') != - 1 ? 'Command/Cmd' : 'CTRL') + ' + D чтобы добавить страницу в закладки.');
            }
        });
    });

</script>
Tag: js, favorite, избранное

133 Создание карт в формате Google Sitemap. Битрикс

<?php
# Для https
$arOptions = array('USE_HTTPS' => 'Y');
if(CModule::IncludeModule('search')) {
   $NS = Array();
   $sm_max_execution_time = 0;
   $sm_record_limit = 5000;
   do {
      $cSiteMap = new CSiteMap;
      $NS = $cSiteMap->Create("s1", array($sm_max_execution_time, $sm_record_limit), $NS);
   } while(is_array($NS));
}
?>
Tag: bitrix, map, google

134 arrFilter Битрикс

<?php
    global ${$FILTER_NAME};

    $GLOBALS['arrFilter'] = array( ">CATALOG_QUANTITY" => 0 ); // До

    $arParams["FILTER_NAME"] = 'arrFilter';
    $GLOBALS[$arParams["FILTER_NAME"]]["<=CATALOG_QUANTITY"] = 0; // После

    global ${$arParams["FILTER_NAME"]};
    $arrFilter = ${$arParams["FILTER_NAME"]};
    if(!is_array($arrFilter)) {
        $arrFilter = array();
    }
?>

Tag: bitrix, arrfilter

135 Перекодировка из charset=iso-8859-1

<?php
$iso = array(
'&#1001;'=>'ϩ', '&#1002;'=>'Ϫ', '&#1003;'=>'ϫ', '&#1004;'=>'Ϭ', '&#1005;'=>'ϭ', '&#1006;'=>'Ϯ', '&#1007;'=>'ϯ', '&#1008;'=>'ϰ', '&#1009;'=>'ϱ', '&#1010;'=>'ϲ', '&#1011;'=>'ϳ', '&#1012;'=>'ϴ', '&#1013;'=>'ϵ', '&#1014;'=>'϶', '&#1015;'=>'Ϸ', '&#1016;'=>'ϸ', '&#1017;'=>'Ϲ', '&#1018;'=>'Ϻ', '&#1019;'=>'ϻ', '&#1020;'=>'ϼ', '&#1021;'=>'Ͻ', '&#1022;'=>'Ͼ', '&#1023;'=>'Ͽ', '&#1024;'=>'Ѐ', '&#1025;'=>'Ё', '&#1026;'=>'Ђ', '&#1027;'=>'Ѓ', '&#1028;'=>'Є', '&#1029;'=>'Ѕ', '&#1030;'=>'І', '&#1031;'=>'Ї', '&#1032;'=>'Ј', '&#1033;'=>'Љ', '&#1034;'=>'Њ', '&#1035;'=>'Ћ', '&#1036;'=>'Ќ', '&#1037;'=>'Ѝ', '&#1038;'=>'Ў', '&#1039;'=>'Џ', '&#1040;'=>'А', '&#1041;'=>'Б', '&#1042;'=>'В', '&#1043;'=>'Г', '&#1044;'=>'Д', '&#1045;'=>'Е', '&#1046;'=>'Ж', '&#1047;'=>'З', '&#1048;'=>'И', '&#1049;'=>'Й', '&#1050;'=>'К', '&#1051;'=>'Л', '&#1052;'=>'М', '&#1053;'=>'Н', '&#1054;'=>'О', '&#1055;'=>'П', '&#1056;'=>'Р', '&#1057;'=>'С', '&#1058;'=>'Т', '&#1059;'=>'У', '&#1060;'=>'Ф', '&#1061;'=>'Х', '&#1062;'=>'Ц', '&#1063;'=>'Ч', '&#1064;'=>'Ш', '&#1065;'=> '', '&#1066;'=>'Ъ', '&#1067;'=>'Ы', '&#1068;'=>'Ь', '&#1069;'=>'Э', '&#1070;'=>'Ю', '&#1071;'=>'Я', '&#1072;'=>'а', '&#1073;'=>'б', '&#1074;'=>'в', '&#1075;'=>'г', '&#1076;'=>'д', '&#1077;'=>'е', '&#1078;'=>'ж', '&#1079;'=>'з', '&#1080;'=>'и', '&#1081;'=>'й', '&#1082;'=>'к', '&#1083;'=>'л', '&#1084;'=>'м', '&#1085;'=>'н', '&#1086;'=>'о', '&#1087;'=>'п', '&#1088;'=>'р', '&#1089;'=>'с', '&#1090;'=>'т', '&#1091;'=>'у', '&#1092;'=>'ф', '&#1093;'=>'х', '&#1094;'=>'ц', '&#1095;'=>'ч', '&#1096;'=>'ш', '&#1097;'=>'щ', '&#1098;'=>'ъ', '&#1099;'=>'ы', '&#1100;'=>'ь', '&#1101;'=>'э', '&#1102;'=>'ю', '&#1103;'=>'я', '&#1104;'=>'ѐ', '&#1105;'=>'ё', '&#1106;'=>'ђ', '&#1107;'=>'ѓ', '&#1108;'=>'є', '&#1109;'=>'ѕ', '&#1110;'=>'і', '&#1111;'=>'ї', '&#1112;'=>'ј', '&#1113;'=>'љ', '&#1114;'=>'њ', '&#1115;'=>'ћ', '&#1116;'=>'ќ', '&#1117;'=>'ѝ', '&#1118;'=>'ў', '&#1119;'=>'џ', '&#1120;'=>'Ѡ', '&#1121;'=>'ѡ', '&#1122;'=>'Ѣ', '&#1123;'=>'ѣ', '&#1124;'=>'Ѥ', '&#1125;'=>'ѥ', '&#1126;'=>'Ѧ', '&#1127;'=>'ѧ', '&#1128;'=>'Ѩ', '&#1129;'=>'ѩ', '&#1130;'=>'Ѫ', '&#1131;'=>'ѫ', '&#1132;'=>'Ѭ', '&#1133;'=>'ѭ', '&#1134;'=>'Ѯ', '&#1135;'=>'ѯ', '&#1136;'=>'Ѱ', '&#1137;'=>'ѱ', '&#1138;'=>'Ѳ', '&#1139;'=>'ѳ', '&#1140;'=>'Ѵ', '&#1141;'=>'ѵ', '&#1142;'=>'Ѷ', '&#1143;'=>'ѷ', '&#1144;'=>'Ѹ', '&#1145;'=>'ѹ', '&#1146;'=>'Ѻ', '&#1147;'=>'ѻ', '&#1148;'=>'Ѽ', '&#1149;'=>'ѽ', '&#1150;'=>'Ѿ', '&#1151;'=>'ѿ', '&#1152;'=>'Ҁ', '&#1153;'=>'ҁ', '&#1154;'=>'҂', '&#1155;'=>"'", '&#1156;'=>"'", '&#1157;'=> '҅', '&#1158;'=> '҆', '&#1159;'=> '҇', '&#1160;'=>'҈', '&#1161;'=>'҉', '&#1162;'=>'Ҋ', '&#1163;'=>'ҋ', '&#1164;'=>'Ҍ', '&#1165;'=>'ҍ', '&#1166;'=>'Ҏ', '&#1167;'=>'ҏ', '&#1168;'=>'Ґ', '&#1169;'=>'ґ', '&#1170;'=>'Ғ', '&#1171;'=>'ғ', '&#1172;'=>'Ҕ', '&#1173;'=>'ҕ', '&#1174;'=>'Җ', '&#1175;'=>'җ', '&#1176;'=>'Ҙ', '&#1177;'=>'ҙ', '&#1178;'=>'Қ', '&#1179;'=>'қ', '&#1180;'=>'Ҝ', '&#1181;'=>'ҝ', '&#1182;'=>'Ҟ', '&#1183;'=>'ҟ', '&#1184;'=>'Ҡ', '&#1185;'=>'ҡ', '&#1186;'=>'Ң', '&#1187;'=>'ң', '&#1188;'=>'Ҥ', '&#1189;'=>'ҥ', '&#1190;'=>'Ҧ', '&#1191;'=>'ҧ', '&#1192;'=>'Ҩ', '&#1193;'=>'ҩ', '&#1194;'=>'Ҫ', '&#1195;'=>'ҫ', '&#1196;'=>'Ҭ', '&#1197;'=>'ҭ', '&#1198;'=>'Ү', '&#1199;'=>'ү', '&#1200;'=>'Ұ', '&#1201;'=>'ұ', '&#1202;'=>'Ҳ', '&#1203;'=>'ҳ', '&#1204;'=>'Ҵ', '&#1205;'=>'ҵ', '&#1206;'=>'Ҷ', '&#1207;'=>'ҷ', '&#1208;'=>'Ҹ', '&#1209;'=>'ҹ', '&#1210;'=>'Һ', '&#1211;'=>'һ', '&#1212;'=>'Ҽ', '&#1213;'=>'ҽ', '&#1214;'=>'Ҿ', '&#1215;'=>'ҿ', '&#1216;'=>'Ӏ', '&#1217;'=>'Ӂ', '&#1218;'=>'ӂ', '&#1219;'=>'Ӄ', '&#1220;'=>'ӄ', '&#1221;'=>'Ӆ', '&#1222;'=>'ӆ', '&#1223;'=>'Ӈ', '&#1224;'=>'ӈ', '&#1225;'=>'Ӊ', '&#1226;'=>'ӊ', '&#1227;'=>'Ӌ', '&#1228;'=>'ӌ', '&#1229;'=>'Ӎ', '&#1230;'=>'ӎ', '&#1231;'=>'ӏ', '&#1232;'=>'Ӑ', '&#1233;'=>'ӑ', '&#1234;'=>'Ӓ', '&#1235;'=>'ӓ', '&#1236;'=>'Ӕ', '&#1237;'=>'ӕ', '&#1238;'=>'Ӗ', '&#1239;'=>'ӗ', '&#1240;'=>'Ә', '&#1241;'=>'ә', '&#1242;'=>'Ӛ', '&#1243;'=>'ӛ', '&#1244;'=>'Ӝ', '&#1245;'=>'ӝ', '&#1246;'=>'Ӟ', '&#1247;'=>'ӟ', '&#1248;'=>'Ӡ', '&#1249;'=>'ӡ', '&#1250;'=>'Ӣ', '&#1251;'=>'ӣ', '&#1252;'=>'Ӥ', '&#1253;'=>'ӥ', '&#1254;'=>'Ӧ', '&#1255;'=>'ӧ', '&#1256;'=>'Ө', '&#1257;'=>'ө', '&#1258;'=>'Ӫ', '&#1259;'=>'ӫ', '&#1260;'=>'Ӭ', '&#1261;'=>'ӭ', '&#1262;'=>'Ӯ', '&#1263;'=>'ӯ', '&#1264;'=>'Ӱ', '&#1265;'=>'ӱ', '&#1266;'=>'Ӳ', '&#1267;'=>'ӳ', '&#1268;'=>'Ӵ', '&#1269;'=>'ӵ', '&#1270;'=>'Ӷ', '&#1271;'=>'ӷ', '&#1272;'=>'Ӹ', '&#1273;'=>'ӹ', '&#1274;'=>'Ӻ', '&#1275;'=>'ӻ', '&#1276;'=>'Ӽ', '&#1277;'=>'ӽ', '&#1278;'=>'Ӿ', '&#1279;'=>'ӿ', '&#1280;'=>'Ԁ', '&#1281;'=>'ԁ', '&#1282;'=>'Ԃ', '&#1283;'=>'ԃ', '&#1284;'=>'Ԅ', '&#1285;'=>'ԅ', '&#1286;'=>'Ԇ', '&#1287;'=>'ԇ', '&#1288;'=>'Ԉ', '&#1289;'=>'ԉ', '&#1290;'=>'Ԋ', '&#1291;'=>'ԋ', '&#1292;'=>'Ԍ', '&#1293;'=>'ԍ', '&#1294;'=>'Ԏ', '&#1295;'=>'ԏ', '&#1296;'=>'Ԑ', '&#1297;'=>'ԑ', '&#1298;'=>'Ԓ', '&#1299;'=>'ԓ', '&#1300;'=>'Ԕ', '&#1301;'=>'ԕ', '&#1302;'=>'Ԗ', '&#1303;'=>'ԗ', '&#1304;'=>'Ԙ', '&#1305;'=>'ԙ', '&#1306;'=>'Ԛ', '&#1307;'=>'ԛ', '&#1308;'=>'Ԝ', '&#1309;'=>'ԝ', '&#1310;'=>'Ԟ', '&#1311;'=>'ԟ', '&#1312;'=>'Ԡ', '&#1313;'=>'ԡ', '&#1314;'=>'Ԣ', '&#1315;'=>'ԣ', '&#1316;'=>'Ԥ', '&#1317;'=>'ԥ', '&#1318;'=>'Ԧ', '&#1319;'=>'ԧ', '&#1320;'=>'Ԩ', '&#1321;'=>'ԩ', '&#1322;'=>'Ԫ', '&#1323;'=>'ԫ', '&#1324;'=>'Ԭ', '&#1325;'=>'ԭ', '&#1326;'=>'Ԯ', '&#1327;'=>'ԯ', '&#1328;'=>'԰', '&#1329;'=>'Ա', '&#1330;'=>'Բ', '&#1331;'=>'Գ', '&#1332;'=>'Դ', '&#1333;'=>'Ե', '&#1334;'=>'Զ', '&#1335;'=>'Է', '&#1336;'=>'Ը', '&#1337;'=>'Թ', '&#1338;'=>'Ժ', '&#1339;'=>'Ի', '&#1340;'=>'Լ', '&#1341;'=>'Խ', '&#1342;'=>'Ծ', '&#1343;'=>'Կ', '&#1344;'=>'Հ', '&#1345;'=>'Ձ', '&#1346;'=>'Ղ', '&#1347;'=>'Ճ', '&#1348;'=>'Մ', '&#1349;'=>'Յ', '&#1350;'=>'Ն', '&#1351;'=>'Շ', '&#1352;'=>'Ո', '&#1353;'=>'Չ', '&#1354;'=>'Պ', '&#1355;'=>'Ջ', '&#1356;'=>'Ռ', '&#1357;'=>'Ս', '&#1358;'=>'Վ', '&#1359;'=>'Տ', '&#1360;'=>'Ր', '&#1361;'=>'Ց', '&#1362;'=>'Ւ', '&#1363;'=>'Փ', '&#1364;'=>'Ք', '&#1365;'=>'Օ', '&#1366;'=>'Ֆ', '&#1367;'=>'՗', '&#1368;'=> '՘', '&#1369;'=>'ՙ', '&#1370;'=>'՚', '&#1371;'=>'՛', '&#1372;'=>'՜', '&#1373;'=>'՝', '&#1374;'=>'՞', '&#1375;'=>'՟', '&#1376;'=>'ՠ', '&#1377;'=>'ա', '&#1378;'=>'բ', '&#1379;'=>'գ', '&#1380;'=>'դ', '&#1381;'=>'ե', '&#1382;'=>'զ', '&#1383;'=>'է', '&#1384;'=>'ը', '&#1385;'=>'թ', '&#1386;'=>'ժ', '&#1387;'=>'ի', '&#1388;'=>'լ', '&#1389;'=>'խ', '&#1390;'=>'ծ', '&#1391;'=>'կ', '&#1392;'=>'հ', '&#1393;'=>'ձ', '&#1394;'=>'ղ', '&#1395;'=>'ճ', '&#1396;'=>'մ', '&#1397;'=>'յ', '&#1398;'=>'ն', '&#1399;'=>'շ', '&#1400;'=>'ո', '&#1401;'=>'չ', '&#1402;'=>'պ', '&#1403;'=>'ջ', '&#1404;'=>'ռ', '&#1405;'=>'ս', '&#1406;'=>'վ', '&#1407;'=>'տ', '&#1408;'=>'ր', '&#1409;'=>'ց', '&#1410;'=>'ւ', '&#1411;'=>'փ', '&#1412;'=>'ք', '&#1413;'=>'օ', '&#1414;'=>'ֆ', '&#1415;'=>'և', '&#1416;'=>'ֈ', '&#1417;'=>'։', '&#1418;'=>'֊', '&#1419;'=>'֋', '&#1420;'=>'֌', '&#1421;'=>'֍', '&#1422;'=>'֎', '&#1423;'=>'֏', '&#1424;'=>'֐', '&#1425;'=>'֑', '&#1426;'=>'֒', '&#1427;'=>'֓', '&#1428;'=>'֔', '&#1429;'=>'֕', '&#1430;'=>'֖', '&#1431;'=>'֗', '&#1432;'=>'֘', '&#1433;'=>'֙', '&#1434;'=>'֚', '&#1435;'=>'֛', '&#1436;'=>'֜', '&#1437;'=>'֝', '&#1438;'=>'֞', '&#1439;'=>'֟', '&#1440;'=>'֠', '&#1441;'=>'֡', '&#1442;'=>'֢', '&#1443;'=>'֣', '&#1444;'=>'֤', '&#1445;'=>'֥', '&#1446;'=>'֦', '&#1447;'=>'֧', '&#1448;'=>'֨', '&#1449;'=>'֩', '&#1450;'=>'֪', '&#1451;'=>'֫', '&#1452;'=>'֬', '&#1453;'=>'֭', '&#1454;'=>'֮', '&#1455;'=>'֯', '&#1456;'=>'ְ', '&#1457;'=>'ֱ', '&#1458;'=>'ֲ', '&#1459;'=>'ֳ', '&#1460;'=>'ִ', '&#1461;'=>'ֵ', '&#1462;'=>'ֶ', '&#1463;'=>'ַ', '&#1464;'=>'ָ', '&#1465;'=>'ֹ', '&#1466;'=>'ֺ', '&#1467;'=>'ֻ', '&#1468;'=>'ּ', '&#1469;'=>'ֽ', '&#1470;'=>'־', '&#1471;'=>'ֿ', '&#1472;'=>'׀', '&#1473;'=>'ׁ', '&#1474;'=>'ׂ', '&#1475;'=>'׃', '&#1476;'=>'ׄ', '&#1477;'=>'ׅ', '&#1478;'=>'׆', '&#1479;'=>'ׇ', '&#1480;'=>'׈', '&#1481;'=>'׉', '&#1482;'=>'׊', '&#1483;'=>'׋', '&#1484;'=>'׌', '&#1485;'=>'׍', '&#1486;'=>'׎', '&#1487;'=>'׏', '&#1488;'=>'א', '&#1489;'=>'ב', '&#1490;'=>'ג', '&#1491;'=>'ד', '&#1492;'=>'ה', '&#1493;'=>'ו', '&#1494;'=>'ז', '&#1495;'=>'ח', '&#1496;'=>'ט', '&#1497;'=>'י', '&#1498;'=>'ך', '&#1499;'=>'כ', '&#1500;'=>'ל', '&#1501;'=>'ם', '&#1502;'=>'מ', '&#1503;'=>'ן', '&#1504;'=>'נ', '&#1505;'=>'ס', '&#1506;'=>'ע', '&#1507;'=>'ף', '&#1508;'=>'פ', '&#1509;'=>'ץ', '&#1510;'=>'צ', '&#1511;'=>'ק', '&#1512;'=>'ר', '&#1513;'=>'ש', '&#1514;'=>'ת', '&#1515;'=>'׫', '&#1516;'=>'׬', '&#1517;'=>'׭', '&#1518;'=>'׮', '&#1519;'=>'ׯ', '&#1520;'=>'װ', '&#1521;'=>'ױ', '&#1522;'=>'ײ', '&#1523;'=>'׳', '&#1524;'=>'״', '&#1525;'=>'׵', '&#1526;'=>'׶', '&#1527;'=>'׷', '&#1528;'=>'׸', '&#1529;'=>'׹', '&#1530;'=>'׺', '&#1531;'=>'׻', '&#1532;'=>'׼', '&#1533;'=>'׽', '&#1534;'=>'׾', '&#1535;'=>'׿', '&#1536;'=>'؀', '&#1537;'=>'؁', '&#1538;'=>'؂', '&#1539;'=>'؃', '&#1540;'=>'؄', '&#1541;'=>'؅', '&#1542;'=>'؆', '&#1543;'=>'؇', '&#1544;'=>'؈', '&#1545;'=>'؉', '&#1546;'=>'؊', '&#1547;'=>'؋', '&#1548;'=>'،', '&#1549;'=>'؍', '&#1550;'=>'؎', '&#1551;'=>'؏', '&#1552;'=>'ؐ', '&#1553;'=>'ؑ', '&#1554;'=>'ؒ', '&#1555;'=>'ؓ', '&#1556;'=>'ؔ', '&#1557;'=>'ؕ', '&#1558;'=>'ؖ', '&#1559;'=>'ؗ', '&#1560;'=>'ؘ', '&#1561;'=>'ؙ', '&#1562;'=>'ؚ', '&#1563;'=>'؛', '&#1564;'=>'؜', '&#1565;'=>'؝', '&#1566;'=>'؞', '&#1567;'=>'؟', '&#1568;'=>'ؠ', '&#1569;'=>'ء', '&#1570;'=>'آ', '&#1571;'=>'أ', '&#1572;'=>'ؤ', '&#1573;'=>'إ', '&#1574;'=>'ئ', '&#1575;'=>'ا', '&#1576;'=>'ب', '&#1577;'=>'ة', '&#1578;'=>'ت', '&#1579;'=>'ث', '&#1580;'=>'ج', '&#1581;'=>'ح', '&#1582;'=>'خ', '&#1583;'=>'د', '&#1584;'=>'ذ', '&#1585;'=>'ر', '&#1586;'=>'ز', '&#1587;'=>'س', '&#1588;'=>'ش', '&#1589;'=>'ص', '&#1590;'=>'ض', '&#1591;'=>'ط', '&#1592;'=>'ظ', '&#1593;'=>'ع', '&#1594;'=>'غ', '&#1595;'=>'ػ', '&#1596;'=>'ؼ', '&#1597;'=>'ؽ', '&#1598;'=>'ؾ', '&#1599;'=>'ؿ', '&#1600;'=>'ـ', '&#1601;'=>'ف', '&#1602;'=>'ق', '&#1603;'=>'ك', '&#1604;'=>'ل', '&#1605;'=>'م', '&#1606;'=>'ن', '&#1607;'=>'ه', '&#1608;'=>'و', '&#1609;'=>'ى', '&#1610;'=>'ي', '&#1611;'=>'ً', '&#1612;'=>'ٌ', '&#1613;'=>'ٍ', '&#1614;'=>'َ', '&#1615;'=>'ُ', '&#1616;'=>'ِ', '&#1617;'=>'ّ', '&#1618;'=>'ْ', '&#1619;'=>'ٓ', '&#1620;'=>'ٔ', '&#1621;'=>'ٕ', '&#1622;'=>'ٖ', '&#1623;'=>'ٗ', '&#1624;'=>'٘', '&#1625;'=>'ٙ', '&#1626;'=>'ٚ', '&#1627;'=>'ٛ', '&#1628;'=>'ٜ', '&#1629;'=>'ٝ', '&#1630;'=>'ٞ', '&#1631;'=>'ٟ', '&#1632;'=>'٠', '&#1633;'=>'١', '&#1634;'=>'٢', '&#1635;'=>'٣', '&#1636;'=>'٤', '&#1637;'=>'٥', '&#1638;'=>'٦', '&#1639;'=>'٧', '&#1640;'=>'٨', '&#1641;'=>'٩', '&#1642;'=>'٪', '&#1643;'=>'٫', '&#1644;'=>'٬', '&#1645;'=>'٭', '&#1646;'=>'ٮ', '&#1647;'=>'ٯ', '&#1648;'=>'ٰ', '&#1649;'=>'ٱ', '&#1650;'=>'ٲ', '&#1651;'=>'ٳ', '&#1652;'=>'ٴ', '&#1653;'=>'ٵ', '&#1654;'=>'ٶ', '&#1655;'=>'ٷ', '&#1656;'=>'ٸ', '&#1657;'=>'ٹ', '&#1658;'=>'ٺ', '&#1659;'=>'ٻ', '&#1660;'=>'ټ', '&#1661;'=>'ٽ', '&#1662;'=>'پ', '&#1663;'=>'ٿ', '&#1664;'=>'ڀ', '&#1665;'=>'ځ', '&#1666;'=>'ڂ', '&#1667;'=>'ڃ', '&#1668;'=>'ڄ', '&#1669;'=>'څ', '&#1670;'=>'چ', '&#1671;'=>'ڇ', '&#1672;'=>'ڈ', '&#1673;'=>'ډ', '&#1674;'=>'ڊ', '&#1675;'=>'ڋ', '&#1676;'=>'ڌ', '&#1677;'=>'ڍ', '&#1678;'=>'ڎ', '&#1679;'=>'ڏ', '&#1680;'=>'ڐ', '&#1681;'=>'ڑ', '&#1682;'=>'ڒ', '&#1683;'=>'ړ', '&#1684;'=>'ڔ', '&#1685;'=>'ڕ', '&#1686;'=>'ږ', '&#1687;'=>'ڗ', '&#1688;'=>'ژ', '&#1689;'=>'ڙ', '&#1690;'=>'ښ', '&#1691;'=>'ڛ', '&#1692;'=>'ڜ', '&#1693;'=>'ڝ', '&#1694;'=>'ڞ', '&#1695;'=>'ڟ', '&#1696;'=>'ڠ', '&#1697;'=>'ڡ', '&#1698;'=>'ڢ', '&#1699;'=>'ڣ', '&#1700;'=>'ڤ', '&#1701;'=>'ڥ', '&#1702;'=>'ڦ', '&#1703;'=>'ڧ', '&#1704;'=>'ڨ', '&#1705;'=>'ک', '&#1706;'=>'ڪ', '&#1707;'=>'ګ', '&#1708;'=>'ڬ', '&#1709;'=>'ڭ', '&#1710;'=>'ڮ', '&#1711;'=>'گ', '&#1712;'=>'ڰ', '&#1713;'=>'ڱ', '&#1714;'=>'ڲ', '&#1715;'=>'ڳ', '&#1716;'=>'ڴ', '&#1717;'=>'ڵ', '&#1718;'=>'ڶ', '&#1719;'=>'ڷ', '&#1720;'=>'ڸ', '&#1721;'=>'ڹ', '&#1722;'=>'ں', '&#1723;'=>'ڻ', '&#1724;'=>'ڼ', '&#1725;'=>'ڽ', '&#1726;'=>'ھ', '&#1727;'=>'ڿ', '&#1728;'=>'ۀ', '&#1729;'=>'ہ', '&#1730;'=>'ۂ', '&#1731;'=>'ۃ', '&#1732;'=>'ۄ', '&#1733;'=>'ۅ', '&#1734;'=>'ۆ', '&#1735;'=>'ۇ', '&#1736;'=>'ۈ', '&#1737;'=>'ۉ', '&#1738;'=>'ۊ', '&#1739;'=>'ۋ', '&#1740;'=>'ی', '&#1741;'=>'ۍ', '&#1742;'=>'ێ', '&#1743;'=>'ۏ', '&#1744;'=>'ې', '&#1745;'=>'ۑ', '&#1746;'=>'ے', '&#1747;'=>'ۓ', '&#1748;'=>'۔', '&#1749;'=>'ە', '&#1750;'=>'ۖ', '&#1751;'=>'ۗ', '&#1752;'=>'ۘ', '&#1753;'=>'ۙ', '&#1754;'=>'ۚ', '&#1755;'=>'ۛ', '&#1756;'=>'ۜ', '&#1757;'=>'۝', '&#1758;'=>'۞', '&#1759;'=>'۟', '&#1760;'=>'۠', '&#1761;'=>'ۡ', '&#1762;'=>'ۢ', '&#1763;'=>'ۣ', '&#1764;'=>'ۤ', '&#1765;'=>'ۥ', '&#1766;'=>'ۦ', '&#1767;'=>'ۧ', '&#1768;'=>'ۨ', '&#1769;'=>'۩', '&#1770;'=>'۪', '&#1771;'=>'۫', '&#1772;'=>'۬', '&#1773;'=>'ۭ', '&#1774;'=>'ۮ', '&#1775;'=>'ۯ', '&#1776;'=>'۰', '&#1777;'=>'۱', '&#1778;'=>'۲', '&#1779;'=>'۳', '&#1780;'=>'۴', '&#1781;'=>'۵', '&#1782;'=>'۶', '&#1783;'=>'۷', '&#1784;'=>'۸', '&#1785;'=>'۹', '&#1786;'=>'ۺ', '&#1787;'=>'ۻ', '&#1788;'=>'ۼ', '&#1789;'=>'۽', '&#1790;'=>'۾', '&#1791;'=>'ۿ', '&#1792;'=>'܀', '&#1793;'=>'܁', '&#1794;'=>'܂', '&#1795;'=>'܃', '&#1796;'=>'܄', '&#1797;'=>'܅', '&#1798;'=>'܆', '&#1799;'=>'܇', '&#1800;'=>'܈', '&#1801;'=>'܉', '&#1802;'=>'܊', '&#1803;'=>'܋', '&#1804;'=>'܌', '&#1805;'=>'܍', '&#1806;'=>'܎', '&#1807;'=>'܏', '&#1808;'=>'ܐ', '&#1809;'=>'ܑ', '&#1810;'=>'ܒ', '&#1811;'=>'ܓ', '&#1812;'=>'ܔ', '&#1813;'=>'ܕ', '&#1814;'=>'ܖ', '&#1815;'=>'ܗ', '&#1816;'=>'ܘ', '&#1817;'=>'ܙ', '&#1818;'=>'ܚ', '&#1819;'=>'ܛ', '&#1820;'=>'ܜ', '&#1821;'=>'ܝ', '&#1822;'=>'ܞ', '&#1823;'=>'ܟ', '&#1824;'=>'ܠ', '&#1825;'=>'ܡ', '&#1826;'=>'ܢ', '&#1827;'=>'ܣ', '&#1828;'=>'ܤ', '&#1829;'=>'ܥ', '&#1830;'=>'ܦ', '&#1831;'=>'ܧ', '&#1832;'=>'ܨ', '&#1833;'=>'ܩ', '&#1834;'=>'ܪ', '&#1835;'=>'ܫ', '&#1836;'=>'ܬ', '&#1837;'=>'ܭ', '&#1838;'=>'ܮ', '&#1839;'=>'ܯ', '&#1840;'=>'ܰ', '&#1841;'=>'ܱ', '&#1842;'=>'ܲ', '&#1843;'=>'ܳ', '&#1844;'=>'ܴ', '&#1845;'=>'ܵ', '&#1846;'=>'ܶ', '&#1847;'=>'ܷ', '&#1848;'=>'ܸ', '&#1849;'=>'ܹ', '&#1850;'=>'ܺ', '&#1851;'=>'ܻ', '&#1852;'=>'ܼ', '&#1853;'=>'ܽ', '&#1854;'=>'ܾ', '&#1855;'=>'ܿ', '&#1856;'=>'݀', '&#1857;'=>'݁', '&#1858;'=>'݂', '&#1859;'=>'݃', '&#1860;'=>'݄', '&#1861;'=>'݅', '&#1862;'=>'݆', '&#1863;'=>'݇', '&#1864;'=>'݈', '&#1865;'=>'݉', '&#1866;'=>'݊', '&#1867;'=>'݋', '&#1868;'=>'݌', '&#1869;'=>'ݍ', '&#1870;'=>'ݎ', '&#1871;'=>'ݏ', '&#1872;'=>'ݐ', '&#1873;'=>'ݑ', '&#1874;'=>'ݒ', '&#1875;'=>'ݓ', '&#1876;'=>'ݔ', '&#1877;'=>'ݕ', '&#1878;'=>'ݖ', '&#1879;'=>'ݗ', '&#1880;'=>'ݘ', '&#1881;'=>'ݙ', '&#1882;'=>'ݚ', '&#1883;'=>'ݛ', '&#1884;'=>'ݜ', '&#1885;'=>'ݝ', '&#1886;'=>'ݞ', '&#1887;'=>'ݟ', '&#1888;'=>'ݠ', '&#1889;'=>'ݡ', '&#1890;'=>'ݢ', '&#1891;'=>'ݣ', '&#1892;'=>'ݤ', '&#1893;'=>'ݥ', '&#1894;'=>'ݦ', '&#1895;'=>'ݧ', '&#1896;'=>'ݨ', '&#1897;'=>'ݩ', '&#1898;'=>'ݪ', '&#1899;'=>'ݫ', '&#1900;'=>'ݬ', '&#1901;'=>'ݭ', '&#1902;'=>'ݮ', '&#1903;'=>'ݯ', '&#1904;'=>'ݰ', '&#1905;'=>'ݱ', '&#1906;'=>'ݲ', '&#1907;'=>'ݳ', '&#1908;'=>'ݴ', '&#1909;'=>'ݵ', '&#1910;'=>'ݶ', '&#1911;'=>'ݷ', '&#1912;'=>'ݸ', '&#1913;'=>'ݹ', '&#1914;'=>'ݺ', '&#1915;'=>'ݻ', '&#1916;'=>'ݼ', '&#1917;'=>'ݽ', '&#1918;'=>'ݾ', '&#1919;'=>'ݿ', '&#1920;'=>'ހ', '&#1921;'=>'ށ', '&#1922;'=>'ނ', '&#1923;'=>'ރ', '&#1924;'=>'ބ', '&#1925;'=>'ޅ', '&#1926;'=>'ކ', '&#1927;'=>'އ', '&#1928;'=>'ވ', '&#1929;'=>'މ', '&#1930;'=>'ފ', '&#1931;'=>'ދ', '&#1932;'=>'ތ', '&#1933;'=>'ލ', '&#1934;'=>'ގ', '&#1935;'=>'ޏ', '&#1936;'=>'ސ', '&#1937;'=>'ޑ', '&#1938;'=>'ޒ', '&#1939;'=>'ޓ', '&#1940;'=>'ޔ', '&#1941;'=>'ޕ', '&#1942;'=>'ޖ', '&#1943;'=>'ޗ', '&#1944;'=>'ޘ', '&#1945;'=>'ޙ', '&#1946;'=>'ޚ', '&#1947;'=>'ޛ', '&#1948;'=>'ޜ', '&#1949;'=>'ޝ', '&#1950;'=>'ޞ', '&#1951;'=>'ޟ', '&#1952;'=>'ޠ', '&#1953;'=>'ޡ', '&#1954;'=>'ޢ', '&#1955;'=>'ޣ', '&#1956;'=>'ޤ', '&#1957;'=>'ޥ', '&#1958;'=>'ަ', '&#1959;'=>'ާ', '&#1960;'=>'ި', '&#1961;'=>'ީ', '&#1962;'=>'ު', '&#1963;'=>'ޫ', '&#1964;'=>'ެ', '&#1965;'=>'ޭ', '&#1966;'=>'ޮ', '&#1967;'=>'ޯ', '&#1968;'=>'ް', '&#1969;'=>'ޱ', '&#1970;'=>'޲', '&#1971;'=>'޳', '&#1972;'=>'޴', '&#1973;'=>'޵', '&#1974;'=>'޶', '&#1975;'=>'޷', '&#1976;'=>'޸', '&#1977;'=>'޹', '&#1978;'=>'޺', '&#1979;'=>'޻', '&#1980;'=>'޼', '&#1981;'=>'޽', '&#1982;'=>'޾', '&#1983;'=>'޿', '&#1984;'=>'߀', '&#1985;'=>'߁', '&#1986;'=>'߂', '&#1987;'=>'߃', '&#1988;'=>'߄', '&#1989;'=>'߅', '&#1990;'=>'߆', '&#1991;'=>'߇', '&#1992;'=>'߈', '&#1993;'=>'߉', '&#1994;'=>'ߊ', '&#1995;'=>'ߋ', '&#1996;'=>'ߌ', '&#1997;'=>'ߍ', '&#1998;'=>'ߎ', '&#1999;'=>'ߏ');
$txt = strtr($txt1, $iso);
?>
Tag: php, charset

136 function Zoom всего экрана JS

<script language="javascript">
    var y=1
    function Zoom(step){ //* Zoom всего экрана
        y=y+step; document.body.style.zoom = y;
    }
</script>
<p>
<a href="javascript:void(0);" onclick="Zoom(-0.1);">-</a>
&nbsp;
<a href="javascript:void(0);" onclick="Zoom(0.1);">+</a>
</p>
Tag: js, zoom

137 Простейшая функция склонения слов после числительных

<?php
function declension($number, $after) { # $after - варианты написания для количества 1, 2 и 5
  $cases = array (2, 0, 1, 1, 1, 2);
  return $number.' '.$after[ ($number%100>4 && $number%100<20)? 2: $cases[min($number%10, 5)] ];
}
echo declension( 33 , array('комментарий','комментария','комментариев')); #  33 комментария
?>
Tag: php, склонение, числительные

138 Склоняем словоформу

<?php
/**
 * Склоняем словоформу
 * @author runcore
 */
     $arUnits = [
            ['копейка',  'копейки',   'копеек'    ],
            ['рубль',    'рубля',     'рублей'    ],
            ['тысяча',   'тысячи',    'тысяч'     ],
            ['миллион',  'миллиона',  'миллионов' ],
            ['миллиард', 'миллиарда', 'миллиардов'],
        ];
    function morph($n, $arUnit) //$f1, $f2, $f5
    {
        $n = abs(intval($n)) % 100;
        if ($n > 10 && $n < 20) return $arUnit[2];
        $n = $n % 10;
        if ($n > 1 && $n < 5) return $arUnit[1];
        if ($n == 1) return $arUnit[0];
        return $arUnit[2];
    }
    $k = 10;
    echo "$k " . morph($k, $arUnits[0])."<br/>"; # 10 копеек
?>
Tag: php, morph, склонение, числительные

139 превращаем слово единственного числа в множественное

<?php
function make_multiple($word) { # превращаем слово единственного числа в множественное
    $word = trim($word);
    #  массив возможных вариантов
    $ends = array(
        "нки" => "нков",
        "ки"  => "ок",
        "ка"  => "ок",
        "ры"  => "р",
        "ия"  => "ий",
        "рь"  => "рей",
        "ы"   => "ов"
    );
    # ищем самое большое окончание, то есть его длину
    $itrs = max(array_map('strlen', array_keys($ends)));
    $poly = array();
    # строим массив этих окончаний, и слов без них
    for ($i = $itrs; $i > 0 ; $i--) {
        # в таком виде что бы избежать циклов в цикле
        $poly[$i] = array(substr($word,-$i),substr($word,0,-$i));
    }
    # строим нужно слово, когда найдём совпадение
    foreach ($ends as $what => $to) {
        if ($poly[strlen($what)][0] == $what) {
            return $poly[strlen($what)][1].$to;
        }
    }
    return $word;
}
echo make_multiple("фонарь"); # фонарей
?>
Tag: php, склонение

140 укоротим текст без обрезки слов

<?php
    $txt = substr($text, 0, strpos($text, ' ', 100));
?>
Tag: php, str, string, size

141 Отключаем_Правую_Мыш JS

<script type="text/javascript">
    "use strict";
    document.oncontextmenu = function (){return false};
</script>
Tag: js, mouse, disable

142 ImageResize

<?php
//-----------------------------------------------------------------------------------------------------
if(!function_exists("image_resize")) {
/*
$source_path - путь к исходному изображению
$destination_path - путь к будущей маленькой копии (включая имя файла)
$newwidth - ширину копии
$newheight - высоту копии
$quality - качество для изображений в формате jpeg: 0 - 100, по умолчанию - 75

пусть файл $imgpath - изображение 800х600
image_resize($imgpath, $preview, 100); // будет создано изображение $preview 100х75
image_resize($imgpath, $preview, 0, 100); // а так $preview получится 133х100
*/
    function image_resize($source_path, $destination_path, $newwidth,$newheight = FALSE, $quality = FALSE ) {

        ini_set("gd.jpeg_ignore_warning", 1); # иначе на некотоых jpeg-файлах не работает

        list($oldwidth, $oldheight, $type) = getimagesize($source_path);
        $typestr = '';
        switch ($type) {
            case IMAGETYPE_JPEG: $typestr = 'jpeg'; break;
            case IMAGETYPE_GIF:  $typestr = 'gif' ;break;
            case IMAGETYPE_PNG:  $typestr = 'png'; break;
        }
        if(strlen($typestr)<1) {
            echo 'Error typestr in '.__FUNCTION__."<br>"; return false;
        }
        $function = "imagecreatefrom$typestr";
        $src_resource = $function($source_path);

        if (!$newheight) { $newheight = round($newwidth * $oldheight/$oldwidth); }
        elseif (!$newwidth) { $newwidth = round($newheight * $oldwidth/$oldheight); }
        $destination_resource = imagecreatetruecolor($newwidth,$newheight);

        imagecopyresampled($destination_resource, $src_resource, 0, 0, 0, 0,
                $newwidth, $newheight, $oldwidth, $oldheight);

        if ($type = 2) { # jpeg
            imageinterlace($destination_resource, 1); # чересстрочное формирование изображение
            imagejpeg($destination_resource, $destination_path, $quality);
        }
        else { # gif, png
            $function = "image$typestr";
            $function($destination_resource, $destination_path);
        }

        imagedestroy($destination_resource);
        imagedestroy($src_resource);
        return true;
    }
}
//-----------------------------------------------------------------------------------------------------
if(!function_exists("ImageResize")) {
    function ImageResize($source_path, $newwidth,$newheight = FALSE, $quality = FALSE ) {
        $paths = explode("/",$source_path);
        $name = array_pop($paths);

        if(!file_exists($_SERVER['DOCUMENT_ROOT']."/images_data"))
                mkdir($_SERVER['DOCUMENT_ROOT']."/images_data", 0777);
        if(!file_exists($_SERVER['DOCUMENT_ROOT']."/images_data/cach"))
                mkdir($_SERVER['DOCUMENT_ROOT']."/images_data/cach", 0777);

        $new_name = "/images_data/cach/r".($newwidth > 0 ? $newwidth : '0')."x".($newheight > 0 ? $newheight : '0')."_".$name;
        if(!file_exists($_SERVER['DOCUMENT_ROOT'].$new_name)){
            if(file_exists($source_path)){
                image_resize($source_path, $_SERVER['DOCUMENT_ROOT'].$new_name,
                    $newwidth,$newheight = FALSE, 90 );
            } elseif(file_exists($_SERVER['DOCUMENT_ROOT'].$source_path)){
                image_resize($_SERVER['DOCUMENT_ROOT'].$source_path,
                    $_SERVER['DOCUMENT_ROOT'].$new_name, $newwidth,$newheight = FALSE, 90 );
            }
        }
        return $new_name;
    }
}
?>
Tag: php, img, size, resize

143 Очищаем таблицу MYSQLI

<?php
if(!function_exists("msql_open")) {
    function MYSQLI_truncate($name_tabl){
        GLOBAL $db;
        $result = $db->query( "TRUNCATE TABLE `$name_tabl`;" ); # Очищаем таблицу
    }
}
?>
Tag: sql

144 Обнулить счетчик AUTO_INCREMENT MYSQLI

<?php
    GLOBAL $db;
    $result = $db->query( "ALTER TABLE name_table AUTO_INCREMENT=0;" ); # Обнулить счетчик AUTO_INCREMENT
?>
Tag: sql

145 open MYSQLI

<?php
GLOBAL $db;
GLOBAL $DBHost,$DBLogin,$DBPassword,$DBName;

$DBHost     = "localhost";
$DBLogin    = "root";
$DBPassword = "";
$DBName     = "shintopg48";

if(!function_exists("msql_open")) {
    function MYSQLI_open(){
        GLOBAL $db;
        GLOBAL $DBHost,$DBLogin,$DBPassword,$DBName;

        if (!@mysqli_ping($db)) {
            $db = new mysqli($DBHost, $DBLogin, $DBPassword, $DBName);
            if (mysqli_connect_errno()) {
                printf("Connect failed: %s\n", mysqli_connect_error());
                exit();
            }
            mysqli_set_charset ($db,"utf8");
        }
    }
}
?>
Tag: sql

146 query MYSQLI

<?php
if(!function_exists("msql_query")) {
    function MYSQLI_query($query){
        GLOBAL $db;
        $result = $db->query( $query );
        if(!$result) {
            echo $query."<br/>Errormessage: line:"." ".$db->error."<br/>";
        }
        return    $db->insert_id;
    }
}
?>
Tag: sql

147 select MYSQLI

<?php
if(!function_exists("msql_select")) {
    function MYSQLI_select($query){
        GLOBAL $db;
        $ar_ = array();
        $result = $db->query( $query );
        if ($result) {
            while($row = $result->fetch_assoc()){
                $ar_[$row['id']] = $row;
            }
        } else {
            echo  $query." / ".$db->error."<br/>";
        }
        return $ar_;
    }
}
?>
Tag: sql

148 escape MYSQLI

<?php
function MYSQLI_escape($txt){
    GLOBAL $db;
    return $db->real_escape_string($txt);
}
?>
Tag: sql

149 MySQL to MySqli

<?php
define("MYSQL_ASSOC", MYSQLI_ASSOC);
define("MYSQL_NUM", MYSQLI_NUM);

if (!function_exists("mysql_connect")) {
    function mysql_connect($host, $user, $passwd, $name='billiard'){
            $db = mysqli_connect($host, $user, $passwd, $name);
            $max_rows = mysqli_num_rows($db);
            if (mysqli_connect_errno()) {
                printf("Connect failed: %s\n", mysqli_connect_error());
                exit();
            }
            mysqli_set_charset ($db,"utf8");
            mysqli_query($db, "SET NAMES utf8");

            $connect = mysqli_connect($database_host, $database_user, $database_password, $database_name);

            return $db;
    }
}

if (!function_exists("mysql_set_charset")) {
    function mysql_set_charset($name, $links) {
        return mysqli_set_charset($link,$name );
    }
}
if (!function_exists("mysql_select_db")) {
    function mysql_select_db($name, $links) {
        return true;# mysqli_select_db($link,$name );
    }
}
if (!function_exists("mysql_close")) {
    function mysql_close($links) {
        return mysqli_close($links);
    }
}
if (!function_exists("mysql_affected_rows")) {
    function mysql_affected_rows($links){
        return mysqli_affected_rows($links);
    }
}
if (!function_exists("mysql_error")) {
    function mysql_error($links){
        return mysqli_error($links);
    }
}
if (!function_exists("mysql_insert_id")) {
    function mysql_insert_id($links){
        return mysqli_insert_id($links);
    }
}
if (!function_exists("mysql_real_escape_string")) {
    function mysql_real_escape_string($res, $links){
        return mysqli_real_escape_string($links, $res);
    }
}
if (!function_exists("mysql_escape_string")) {
    function mysql_escape_string($links){
        return mysqli_escape_string($links);
    }
}
if (!function_exists("mysql_num_fields")) {
    function mysql_num_fields($res){
        return mysql_num_fields($res);
    }
}
if (!function_exists("mysql_query")) {
    function mysql_query($sql,$link){
        return mysqli_query($link, $sql);
    }
}
if (!function_exists("mysql_num_rows")) {
    function mysql_num_rows($res){
        return mysqli_num_rows($res);
    }
}
if (!function_exists("mysql_fetch_field")) {
    function mysql_fetch_field($res){
        return mysqli_fetch_field($res);
    }
}
if (!function_exists("mysql_fetch_row")) {
    function mysql_fetch_row($res){
        return mysqli_fetch_row($res);
    }
}

if (!function_exists("mysql_ping")) {
    function mysql_ping($link){
        return mysqli_ping($link);
    }
}
if (!function_exists("mysql_field_seek")) {
    function mysql_field_seek($res, $fild){
        return mysqli_field_seek($res, $fild);
    }
}
if (!function_exists("mysql_data_seek")) {
    function mysql_data_seek($res, $fild){
        return mysqli_data_seek($res, $fild);
    }
}
if (!function_exists("mysql_errno")) {
    function mysql_errno($link){
        return mysqli_errno($link);
    }
}
?>
Tag: php, mysql, mysqli, sql

150 Проверка подлинности данных формы. Защита форм от Хака

<?php
 session_start(); # Запускаем сессию
 # Регистрируем в сессии некоторое значение например имя пользователя
 # для большей безопасности пременяем функцю md5()
     $name = "Вася";
     $name = md5($name);
     $_SESSION['name'] = $name;
 ?>
 <html> <head> <title></title> </head>
 <body>
     <form name="" action="action.php" method="post">
         <!— Тело формы —>
         <input name="check" type="hidden" value="<?php  echo $_SESSION['name']; ?>">
     </form>
     </body>
 </html>
 <?php # action.php
  session_start(); # Запускаем сессию
  $check = $_POST['check'];# Получаем данные из скрытого поля
 if ( $check === $_SESSION['name'] ) {  # Сравниваем данные полученные из формы с данными в нашей сессии
    echo "ok"; # Все хорошо
 } else { die ("HACKING ATTEMPT !!! "); }
?>
Tag: php, hack

151 Скачиваем файл DownLoad

<?php
function DownLoad($file){ # Скачиваем файл
    if (file_exists($_SERVER['DOCUMENT_ROOT'].$file)) {
        $extension = strtolower(substr(strrchr($file,"."),1));
        switch ($extension) {
            case "txt": $ctype ="text/plain"; break;
            case "pdf": $ctype ="application/pdf"; break;
            case "exe": $ctype ="application/octet-stream"; break;
            case "zip": $ctype ="application/zip"; break;
            case "doc": $ctype ="application/msword"; break;
            case "xls": $ctype ="application/vnd.ms-excel"; break;
            case "ppt": $ctype ="application/vnd.ms-powerpoint"; break;
            case "gif": $ctype ="image/gif"; break;
            case "png": $ctype ="image/png"; break;
            case "jpeg": $ctype="image/jpg"; break;
            case "jpg": $ctype ="image/jpg"; break;
            default: $ctype    ="application/force-download";
        }
        header('Content-Type: '.$ctype.'; charset=utf-8');
        header("Content-Disposition: attachment; filename=".$file);
        ob_clean();
        readfile($_SERVER['DOCUMENT_ROOT'].$file);
    } else {
      echo "Файл не найден.";
    }
    return;
}
?>
Tag: php, file, download

152 разбираемся с шаблоном меню horizontal_multilevel Битрикс

<?php
//------------------------------------------------------------------
#  разбираемся с шаблоном меню horizontal_multilevel
#
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die(); # проверяем, загружена ли служебная часть сайта (ядро)
?>
<?php
/*
Структура массива $arResult
Массив $arResult состоит из вложенных массивов, соответсвующих пунктам меню.
Порядок следования пунктов
Вложенные массивы содержат ключи:
TEXT - текст текущего пункта меню
LINK - ссылка текущего пункта меню
SELECTED - выбран ли пункт меню в данный момент
PERMISSION - доступ на страницу указанную в $LINK, возможны следующие значения:
    D - доступ запрещён
    R - чтение (право просмотра содержимого файла)
    U - документооборот (право на редактирование файла в режиме документооборота)
    W - запись (право на прямое редактирование)
    X - полный доступ (право на прямое редактирование файла и право на изменение прав доступа на данных файл)
ADDITIONAL_LINKS - дополнительные ссылки для подсветки меню
ITEM_TYPE - "D" - директория (если LINK заканчивается на "/"), иначе "P" - страница
ITEM_INDEX - порядковый номер пункта меню
PARAMS - параметры пунктов меню
DEPTH_LEVEL - уровень вложенности пункта меню (1 для главного, 2 и далее для вложенных)
IS_PARENT - флаг того, что у этого пункта меню будет подменю

Вывод производится вложенными списками вида
<ul id="horizontal-multilevel-menu">
    <li><a>Пункт первого уровня вложенности</a></li>
    <li><a>Пункт первого уровня вложенности</a>
        <ul>
            <li><a>Пункт второго уровня вложенности</a></li>
            <li><a>Пункт второго уровня вложенности</a></li>
        </ul>
    </li>
    <li><a>Пункт первого уровня вложенности</a></li>
</ul>
*/
?>
<?php if (!empty($arResult)){ # если есть хотя бы 1 пункт меню, можно начинать вывод?>
<ul id="horizontal-multilevel-menu">
<?php $previousLevel = 0; # переменная содержит значение DEPTH_LEVEL предыдущего пункта
foreach($arResult as $arItem){ # пробегаем по пунктам, $arItem - массив с информацией о текущем пункте
    if ($previousLevel && $arItem["DEPTH_LEVEL"] < $previousLevel){ # если уровень вложенности текущего пункта меню меньше чем у предыдущего, значит "подменю" закончилось и нужно закрыть список
        echo str_repeat("</ul></li>", ($previousLevel - $arItem["DEPTH_LEVEL"]));
    }
        if ($arItem["IS_PARENT"]){ # если пункт содержит подменю, выводим ссылку и начинаем новый список (тег <ul>)?>

        <?php if ($arItem["DEPTH_LEVEL"] == 1){ # если уровень вложенности =1, т.е. это главное меню
            # выводим ссылку и добавляем класс "root-item" если пункт неактивный и "root-item-selected" если активный?>
            <li><a href="<?= $arItem["LINK"]?>" class="<?php if ($arItem["SELECTED"]){?>root-item-selected<?php } else {?>root-item<?php }?>"><?= $arItem["TEXT"]?></a>
                <ul>
        <?php } else {    # для остальных уровней вложенности
                    # выводим ссылку и добавляем класс "parent". Если пункт активный, для элемента списка <li> добавляем класс "item-selected"?>
            <li<?php if ($arItem["SELECTED"]){?> class="item-selected"<?php }?>><a href="<?= $arItem["LINK"]?>" class="parent"><?= $arItem["TEXT"]?></a>
                <ul>
        <?php }?>
    <?php } else { # для пунктов, не содержащих подменю
        if ($arItem["PERMISSION"] > "D"){ # проверяем право доступа к пункту
            if ($arItem["DEPTH_LEVEL"] == 1){ # если уровень вложенности =1, т.е. это главное меню
                # выводим ссылку и добавляем класс "root-item" если пункт неактивный и "root-item-selected" если активный?>
                <li><a href="<?= $arItem["LINK"]?>" class="<?php if ($arItem["SELECTED"]){?>root-item-selected<?php } else {?>root-item<?php }?>"><?= $arItem["TEXT"]?></a></li>
            <?php } else { # для остальных уровней вложенности
                # выводим ссылку. Если пункт активный, для элемента списка <li> добавляем класс "item-selected"?>
                <li<?php if ($arItem["SELECTED"]){?> class="item-selected"<?php }?>><a href="<?= $arItem["LINK"]?>"><?= $arItem["TEXT"]?></a></li>
            <?php }
        } else { # для пунктов, к которым запрещен доступ
            if ($arItem["DEPTH_LEVEL"] == 1){ # если уровень вложенности =1, т.е. это главное меню
                # выводим пустую ссылку и добавляем класс "root-item" если пункт неактивный и "root-item-selected" если активный?>
                <li><a href="" class="<?php if ($arItem["SELECTED"]){?>root-item-selected<?php } else {?>root-item<?php }?>" title="<?= GetMessage("MENU_ITEM_ACCESS_DENIED")?>"><?= $arItem["TEXT"]?></a></li>
            <?php } else { # для остальных уровней вложенности
                # выводим пустую ссылку и добавляем класс "denied"?>
                <li><a href="" class="denied" title="<?= GetMessage("MENU_ITEM_ACCESS_DENIED")?>"><?= $arItem["TEXT"]?></a></li>
            <?php }
        }
    }
    $previousLevel = $arItem["DEPTH_LEVEL"]; # запоминаем уровень вложенности
}
if ($previousLevel > 1){# если работа завершилась на пункте меню с уровнем вложенности >1, закрываем вложенные списки?>
    <?= str_repeat("</ul></li>", ($previousLevel-1) );?>
<?php }?>
</ul>
<div class="menu-clear-left"></div>
<?php }?>
Tag: bitrix, menu

153 Персональные данные. Пользовательское соглашение Битрикс

<?php
//------------------------------------------------------------------
# Пользовательское соглашение
#
?>
    <input id="policy" value="Y" type="checkbox" name="privacy_policy">&nbsp;
    <label for="policy">Подтверждаю свое согласие на обработку и хранение моих персональных данных в соответствии с
        <a target="_blank" href="/policy.php/">пользовательским соглашением</a>
    </label><br>
    <input onclick="if($('#privacy_policy_registration2:checked').length == 0) return false;" class="" type="submit">
<?php
//------------------------------------------------------------------
# Пользовательское соглашение
#
AddEventHandler("main", "OnBeforeUserRegister", "OnBeforeUserRegisterHandler");
function OnBeforeUserRegisterHandler(&$arFields){ # Контроль регистрации
    global $APPLICATION;

    if(isset($_REQUEST['REGISTER']) && is_array($_REQUEST['REGISTER']) ) {

        if(    strcmp($REG['NAME'],$REG['SECOND_NAME']) == 0) {
            $APPLICATION->ThrowException('Ошибка регистрации. Не коректно указаны данные!');
            return false;
        } else
            return true;
    } else {
        $APPLICATION->ThrowException('Ошибка регистрации. Ошибка в данных!');
        return false;
    }
}
?>
Tag: bitrix, user, events

154 Класс для работы с Curl

<?php
/*
Класс для работы с Curl
Все функции для вытаскивания данных с сайта
/************************ПРИМЕНЕНИЕ********************************
# если нужна авторизация
$options['autorization'] =1;
$options['after_autoriz']='my';
$options['login_page']   =URL.'/login';

# поля формы ввода. атрибут name и его значение
$fields['username']          ='ayakov';
$fields['password']          ='kolbas';
$fields['serviceButtonValue']='login';
$options['fields']           =$fields;
$options['cookie_patch']     =COOKIE_PATH;
$options['url']              =URL;
$pageText                    =new Curl($options);
$page                        =$pageText->get_page(URL.'zayavki/137340');

# если авторизация не нужна
$pageText =new Curl();
$page=$pageText->get_page(URL);
*/

class Curl {
      const VERSION = 1.00;
    const autorization=0; # по умолчанию авторизация не требуется

    public function __construct($options=NULL) {
            # если требуется авторизация то нужно задать эти параметры при создании обьетк
            $this->url             =    $options['url']; # только url сайта
            $this->autorization  =     $options['autorization'];    # 1-треубется авторизация
            $this->login_page    =     $options['login_page'];        # страница входа
            $this->after_autoriz =     $options['after_autoriz'];    # страница после авторизации для того чтобы проверить успешно ли
            $this->fields        =     $options['fields'];        # атрибуты формы и их значения
            $this->cookie_patch  =     $options['cookie_patch']."/cookie.txt";    # путь куда будем сохранять куки для авторизации
        return $this;
    }

    # получение страницы
    public function get_page($url) {
        if (!$this->autorization) {# если без авторизации то просто получаем страницу
          $ch = curl_init($url);
          curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
          $page = curl_exec($ch);
          curl_close($ch);
          return $page;
        } else {# если требуется сначала авторизация
            $this->login();
            return $this->Read($url); # то получаем страницу с учетом кук
        }
    }

    # авторизация
    public function login(){
      echo "<br>".date('H:i:s')." Сайт требует авторизации! ";
      echo "<br>".date('H:i:s')." Заходим на страницу входа  $this->login_page";
      $ch = curl_init();
      if(strtolower((substr($this->login_page,0,5))=='https')) { # если соединяемся с https

            echo "<br>".date('H:i:s')." В $this->login_page найден https но мы отключим сертификацию. ";

            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);# не проверять SSL сертификат
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);# не проверять Host SSL сертификата
       }

       curl_setopt($ch, CURLOPT_URL, $this->login_page);# страница входа на которой форма авторизации
       curl_setopt($ch, CURLOPT_REFERER, 'http://www.google.com/'); # делаем вид что перешли из google
       curl_setopt($ch, CURLOPT_FAILONERROR, 1);# cURL будет выводить подробные сообщения о всех производимых действиях
       curl_setopt($ch, CURLOPT_VERBOSE, 1);
       curl_setopt($ch, CURLOPT_POST, 1); # использовать данные в post
       curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); # следовать за редиректами
       curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);# таймаут выполнения авторизации
       curl_setopt($ch, CURLOPT_POSTFIELDS, $this->fields); # поля заполняемые при авторизации -их атрибуты <input name='login' value='vasia'>
       curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (Windows; U; Windows NT 5.0; En; rv:1.8.0.2) Gecko/20070306 Firefox/1.0.0.4");
       curl_setopt($ch, CURLOPT_HEADER, 1); # выводим заголовок чтобы по нему определить авторизовались или нет
       curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); # возвратить то что вернул сервер
       curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:')); # это необходимо, чтобы cURL не высылал заголовок на ожидани
       curl_setopt($ch, CURLOPT_COOKIEJAR,  $this->cookie_patch);    # сохранять полученные COOKIE в файл
       curl_setopt($ch, CURLOPT_COOKIEFILE,  $this->cookie_patch);

       echo "<br>".date('H:i:s')." Выполняем авторизацию...";

       $result=curl_exec($ch); # выполняем curl с указанными выше настройками

       if (curl_errno($ch)) {# если есть ошибки выводим их
           print curl_error($ch);
           exit;
       }

       curl_close($ch);

       if(file_exists($this->cookie_patch))
        echo "<br>".date('H:i:s')." Cookie ЗАПИСАНЫ в файл: ".$this->cookie_patch;
       else
        echo "<br>".date('H:i:s')." Cookie <strong>не</strong> записаны в файл: ".$this->cookie_patch;

        echo "<br>".date('H:i:s')." Проверяем мы на странице <strong>$this->after_autoriz</strong> после авторизации или нет ...";

       # Убеждаемся что произошло перенаправление после авторизации
       # ищем в результирующем файле строку с адресом успешной авторизации
       if(strpos($result,"Location: ".$this->url.$this->after_autoriz)===false) {
            echo "<br>".date('H:i:s')." <strong>Ошибка авторизации!</strong> Заголовок <strong>Location: $this->after_autoriz</strong> не найден! Работа остановлена.<br><br>";
            return false;
       } else  {
            echo "<br>".date('H:i:s')." Авторизация прошла <strong>успешно</strong>!";
               return $result;
       }
    }

    # чтение страницы после авторизации
    public function Read($url){
      echo "<br>".date('H:i:s')." Теперь парсим требуемую страницу $url";

       $ch = curl_init();
       curl_setopt($ch, CURLOPT_URL, $url);
       # откуда пришли на эту страницу
       curl_setopt($ch, CURLOPT_REFERER, $this->login_page);
       # запрещаем делать запрос с помощью POST и соответственно разрешаем с помощью GET
       curl_setopt($ch, CURLOPT_POST, 0);
       curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
       # отсылаем серверу COOKIE полученные от него при авторизации
       curl_setopt($ch, CURLOPT_COOKIEFILE,  $this->cookie_patch);

       curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (Windows; U; Windows NT 5.0; En; rv:1.8.0.2) Gecko/20070306 Firefox/1.0.0.4");
       curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); # возвратить то что вернул сервер
       curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:')); # это необходимо, чтобы cURL не высылал заголовок на ожидани

       $result = curl_exec($ch);
       curl_close($ch);
       return $result;
    }
} # class
?>
Tag: php, curl

155 преобразовать SimpleXML в массив

<?php
function toArray(SimpleXMLElement $xml) { # преобразовать SimpleXML в массив
    $array = (array)$xml;
    foreach ( array_slice($array, 0) as $key => $value ) {
        if ( $value instanceof SimpleXMLElement ) {
            $array[$key] = empty($value) ? NULL : toArray($value);
        }
    }
    return $array;
}
?>
Tag: php, xml

156 POPUP .fancybox

<div id="thank-you-modal" style="display: none;">
    <h2>Спасибо, за заявку.<br>Наш менеджер свяжется с Вами<br>в ближайшее время.</h2>
</div>
<script type="text/javascript">
    $.fancybox('#error-you-modal');
    $('#error-you-modal').fadeOut( 1 );
    $.fancybox.open('****');
</script>

<div id="modal-errors" class="modal">
    <button data-fancybox-close="" class="modal-close">
      <svg class="icon icon-close">
        <use xlink:href="#close"></use>
      </svg>
    </button>
    <h3>Error</h3>
    <p id="error_filds"></p>
</div>
<script type="text/javascript">
$.fancybox.open({src: '#modal-errors',type: 'inline'});
</script>

Tag: js, popup

157 GetProperty Битрикс

<?php
$db_props = CIBlockElement::GetProperty(18, $item['PRODUCT_ID'], array("sort" => "asc"), array("CODE" => "ARTIKUL"));
if($ar_props = $db_props->Fetch()){
    $ARTIKUL = $ar_props['VALUE'];
}
$ar_res = CCatalogProduct::GetByIDEx($PRODUCT_ID,true); # возвращает все параметры этого товара
?>
Tag: bitrix, property

158 Список значений GetPropertyEnum

<?php
    $property_enums = CIBlockPropertyEnum::GetList(Array("DEF"=>"DESC", "SORT"=>"ASC"), Array("IBLOCK_ID"=>$arParams['IBLOCK_ID'], "CODE"=>"MER"));
    echo "<ul class='podmenu'>";
    while($enum_fields = $property_enums->GetNext()){
      echo "<li><a href='".$enum_fields["ID"]."'>".$enum_fields["VALUE"]."</a></li>";
     }
    echo "</ul><br style='clear:both'><br>";

// ***************** D7 **********************************
        $arResult = array();
        $params = Array(
               "max_len"               => "100",
               "change_case"           => "L",
               "replace_space"         => "_",
               "replace_other"         => "_",
               "delete_repeat_replace" => "true",
               "use_google"            => "false",
            );
        $arProps = \Bitrix\Iblock\PropertyTable::getList(array(
            'select' => array('*'),
            'filter' => array('IBLOCK_ID' => '69', 'CODE'=>'CML2_MANUFACTURER')
        ))->fetch();

        $dbEnums = \Bitrix\Iblock\PropertyEnumerationTable::getList(array(
            'order' => array('SORT' => 'asc'),
            'select' => array('*'),
            'filter' => array('PROPERTY_ID' => $arProps['ID'])
        ));
        while($arEnum = $dbEnums->fetch()) {
            $CODE = CUtil::translit($arEnum['VALUE'], "ru" , $params);
            $arResult[$CODE] = $arEnum['VALUE'];
        }
?>
Tag: bitrix, property, d7

159 Удалятор рекурсивный

<?php
function glob_recursive($dir, $mask){  # Удалятор рекурсивный
    foreach(glob($dir.'/*') as $filename){
        if(substr(strrchr($filename, '/'), 1, -4)==$mask) ulink($filename);
        if(is_dir($filename)) glob_recursive($filename, $mask);
    }
}
glob_recursive($_SERVER['DOCUMENT_ROOT']."/images", "1358421146");
array_map('unlink', glob($_SERVER['DOCUMENT_ROOT']."/backup/*.tar.bz2*"));
?>
Tag: php, file, del, delete

160 Рекурсивный обход папки

<?php
$FFF = array();
function recurs_dirs($file) { # Рекурсивный обход папки
    GLOBAL $FFF;
    if ( file_exists($file) ) {
        if ( is_dir($file) ) {
            $handle = opendir( $file );
            while( $filename = readdir($handle) )
            if ( $filename != "." && $filename != ".." )
                    recurs_dirs( $file."/".$filename );
            closedir($handle);
        } else {
            $FFF[] = $file;
        }
    }
}
recurs_dirs($_SERVER['HTTP_HOST']);
?>
Tag: php, file, dir

161 Аналог exec PHP

<?php
function Analog_Exec(){ # Аналог exec
    $output = `dir *.*`; # Обратные ковычки
    echo "<pre>$output</pre>";
}
?>
Tag: php, exec

162 Загрузка файла на сервер Битрикс

<?php
if (!empty($_FILES['Filedata']['tmp_name'])) {
    move_uploaded_file($_FILES["Filedata"]["tmp_name"], $_SERVER['DOCUMENT_ROOT'] . '/upload/tmp/'. $_FILES["Filedata"]["name"]);
    $arFile = CFile::MakeFileArray($_SERVER['DOCUMENT_ROOT'] . '/upload/tmp/'. $_FILES["Filedata"]["name"]);
    $arFile['del']            = "Y";
    $arFile['old_file']       = 'photo_old.jpg';
    $arFile["MODULE_ID"]      = "main";
    $fields['PERSONAL_PHOTO'] = $arFile;
}
?>
Tag: bitrix, file, upload

163 object_to_array PHP

<?php
function object_to_array($data)
{
    if (is_array($data) || is_object($data)) {
        $result = array();
        foreach ($data as $key => $value) {
            $result[$key] = object_to_array($value);
        }
        return $result;
    }
    return $data;
}
?>
Tag: php, array, object

164 дерево renderSections Построить цепочку разделов от текущего до корня Битрикс

<?php
function renderSections($items){
    echo "<ul>";
    foreach ($items as $item) {
        echo "<li><a href='".$item['SECTION_PAGE_URL']."'>".$item['NAME']."(".$item['ELEMENT_CNT'].")</a>";
            if (!empty($item['SECTIONS']))
                renderSections($item['SECTIONS']);
        echo "</li>";
    }
    echo "</ul>";
}

function GetTreeSection($ID) { # Построить цепочку разделов от текущего до корня
    $C = array();
    do {
        $arS = GetIBlockSection($ID);
        $C[] = $arS['CODE'];
        $ID  = $arS['IBLOCK_SECTION_ID'];
    } while ($arS['DEPTH_LEVEL'] > 1);
    return array_reverse($C);
}
?>
Tag: bitrix, tree, sections

165 Обращение к переменной по значению в строке

<?php
function initvar($varname, $value=''){
    global $$varname;
    if(!isset($$varname))
        $$varname=$value;
}
?>
Tag: php, varname, $$

166 Перекодировка iconv('cp1251', 'utf-8', );

<?php
function get_text_cp1251($name_original){# ПЕРЕКОДИРОВКА
    $name_utf = @iconv('cp1251', 'utf-8', $name_original); # предполагаем что оригинал в cp1251
    $name_utf2 = @iconv('utf-8', 'cp1251', $name_utf);
    $name_cp = @iconv('utf-8', 'cp1251', $name_original); # предполагаем что оригинал в utf
    $name_cp2 = @iconv('cp1251', 'utf-8', $name_cp);

#     if (preg_match('#[йцукенгшщзхъэждлорячсмитьбюqwertyuioplkjhgfdsazxcvbnm]+?#', @iconv('utf-8', 'cp1251', $name_utf)))
#             return @iconv('utf-8', 'cp1251', $name_utf);
    if (preg_match('#[йцукенгшщзхъэждлорячсмитьбюqwertyuioplkjhgfdsazxcvbnm]+?#', $name_utf2))
            return $name_utf2;
    if (preg_match('#[йцукенгшщзхъэждлорячсмитьбюqwertyuioplkjhgfdsazxcvbnm]+?#', $name_cp))
            return $name_cp;
    if (preg_match('#[йцукенгшщзхъэждлорячсмитьбюqwertyuioplkjhgfdsazxcvbnm]+?#', @iconv('utf-8', 'cp1251', $name_cp2)))
            return @iconv('utf-8', 'cp1251', $name_cp2);
}
        $get = get_text_cp1251(file_get_contents($file));
        file_put_contents($file,iconv('cp1251','UTF-8',$get));
?>
Tag: php, iconv

167 Read / Write CSV

<?php
function ReadCSV($patch, $SkipFirstLine=0){
    if (($handle = fopen($patch, "r")) !== FALSE) {
        if($SkipFirstLine)
            fgets($handle);
        $ret = array();
        while (($data = fgetcsv($handle, 8192, ";")) !== FALSE)
            $ret[] = $data;
        fclose($handle);
    }
    return $ret;
}
function ReadCSV2($patch, $nulls = true){
    if (($handle = fopen($patch, "r")) !== FALSE) {
        $ret = [];
        $HEADER = fgetcsv($handle, 8192, ";");
        while (($d = fgetcsv($handle, 8192, ";")) !== FALSE){
            $ret[] = array_combine($HEADER, $d);
        }
        fclose($handle);
    }
    return $ret;
}

$fp = fopen($file, 'w');
fputcsv($fp, $header,";");
foreach ($Water as $line) {
    fputcsv($fp, $line,";");
}
fclose($fp);

if (($handle = fopen($file, "r")) !== FALSE) {
    fgets($handle);
    $Water = array();
    while (($data = fgets($handle)) !== FALSE){
        if(strlen($data) > 10)
            $Water[] = str_getcsv($data, ";");
    }
    fclose($handle);
} else exit("Bad File");
?>
Tag: php, csv

168 Вся информация о продукте Битрикс по ID. CCatalogProduct::GetByIDEx

<?php
        $arOptPrices = CCatalogProduct::GetByIDEx($arElement['ID']);
        echo " <pre>"; print_r($arOptPrices); echo "</pre>";
        $res = CCatalogProduct::GetOptimalPrice($el_id, 1); # PRICE
?>
Tag: bitrix, price

169 Декодирование данных от Умного фильтра Битрикс

<?php
# Декодирование данных от Умного фильтра
$arFILTER = $_GET;
$arrDBVALS = $idd = [];
foreach ($arFILTER as $k=>$v) {
    if (substr_count($k,"arrFilter")>0) {
        $id = str_replace("arrFilter_","",$k);
        $arFILTERCRC[$id][] = $v;
    }
}
$idd = array_keys($arFILTERCRC);
if(count($idd)) {
    foreach($idd as $i){
        $propValues = CIBlockElement::GetPropertyValues(7, array(), false, array("ID" => $i));# Получаем все значения свойства "производитель"
        while ($val = $propValues->Fetch()) {
            $arrDBVALS[abs(crc32($val[$i]))] = $val[$i];
        }
    }
    foreach ($arFILTERCRC as $prop=>$val) {
        foreach ($val as $crc32) {
            if ($arrDBVALS[$crc32]) {
                $arFILTERNORMAL[$prop][] = $arrDBVALS[$crc32];
            }
        }
    }
    foreach($arFILTERNORMAL as $id=>$val){
        $arResult['SFILTER']["PROPERTY_".$id]=$val;
    }
}
    //--------------------------//
$FILTER = array();

foreach($U as $u){
    if( !strlen($u) || strpos($u,'clear') !== false ) continue;
    if(strpos($u,'SECTION_CODE') !== false){
        $c = explode("=",$u);
        $arFilter["SECTION_CODE"] = $c[1];
        continue;
    }
    if(strpos($u,'price-base') !== false){
        $from = explode("-from-",$u);
        $from1 = floatVal($from[1]);
        if(strpos($u,'-to-') !== false){
            $to = explode('-to-',$u);
        }
        $to1 = isset($to[1]) ? floatVal($to[1]) : 1000000000 ;
        $FILTER[">=CATALOG_PRICE_1"] = $from1;
        $FILTER["<=CATALOG_PRICE_1"] = $to1;
    } else {
        $e = explode("-is-",$u);
        $e[0] = mb_strtoupper($e[0]);
        if($PROPS[$e[0]]>0)
            if($e[0] == 'MARCA_AVTO'){
                $e[0] = "PROPERTY_".$e[0];//."_VALUE";
            } elseif($e[0] == 'MODEL_AUTO') {
                    $e[0] = "PROPERTY_".$e[0];
                    $e[1] = $MODEL[strtoupper($e[1])];
            } else {
                $e[0] = "PROPERTY_".$e[0];
            }
        $FILTER[$e[0]] = $e[1];
    }
}

$arFilter = array_merge($arFilter,$FILTER);
?>
Tag: bitrix, filter

170 Выпадающий список + ajax

# Выпадающий список
<input type="text" name="MARC_CAR" value="" onkeyup="Select(this,'Marca')">
<div class='combo div_Marca'></div>

<script type="text/javascript">
    function Select(obj,id){
        var txt = obj.value;
        if(txt.length > 1) {
            re = /[^\n\t]/g;
            if(!re.test(txt)) return false;
            $.ajax({
                type: "POST",
                url: "/content/ajax.php",
                data: "obj="+id+"&queryString="+txt,
                success: function(msg){
                    if(msg.length > 0) {
                        $(obj).next("div").html(msg);
                        $(obj).next("div").show();
                    } else {
                        $(obj).next("div").hide();
                        $(obj).next("div").html("");
                    }
                }
            });
        }
    }
</script>
Tag: php, select, ajax

171 Масштабирование и центрирование нескольких маркеров на карте

<script type="text/javascript">
// Масштабирование и центрирование нескольких маркеров на карте
var latlngbounds = new google.maps.LatLngBounds();
for ( var i=0; i<points.length; i++ ){
    var myLatLng = new google.maps.LatLng(points[i][1], points[i][2]);
    latlngbounds.extend(myLatLng);
}
map.setCenter( latlngbounds.getCenter(), map.fitBounds(latlngbounds));
</script>
Tag: js, map, center

172 Удаление точки продажи market.yandex.ru RESP

<?php
# Удаление точки продажи market.yandex.ru
    $headers = array("Authorization: OAuth oauth_token=AQAAAAAIHopsAAUjpYWgKYZnFEzfqD3tUtzSER8, oauth_client_id=553f104a34d04c53a1e3e527c013f77a",
                         "Content-Type: application/json");
    $ch = curl_init('https://api.partner.market.yandex.ru/v2/campaigns/21010344/outlets/'.$d.'.json');
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE"); # !!!!!!
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($ch);
    curl_close($ch);
    echo "<pre>".print_r($response,1)."</pre>";
?>
Tag: php, rest

173 Создание точки продажи market.yandex.ru RESP

<?php
# Создание точки продажи market.yandex.ru
$param = array(
        "name"=>$csv[12],
        "type"=>"DEPOT",
        "visibility"=>"VISIBLE",
        "isMain"=>false,
        "address"=>array(
            "street"    =>$csv[6],
            "number"    =>$csv[7],
            "additional"=>$csv[8],
            "regionId"  =>$reg['regions'][0]['id'],
            "city"      =>$csv[5],
#         'additional'=>(strlen($csv[14])>1 ? $csv[14] : '')
        ),
        "phones"=>$phone,
        "workingSchedule"=>array(
        "workInHoliday"=>true,
        "scheduleItems"=>$worktime
        ),
        "deliveryRules"=>array(
        array(
            "cost"                       =>0,
            "unspecifiedDeliveryInterval"=>true,
            "deliveryServiceId"          =>51,
            "workInHoliday"              =>true,
            "shipperId"                  =>51,
            "shipperName"                =>"СДЭК",
            "shipperHumanReadbleId"      =>"CDEK"
        )),
    );

function qqq($param) {
        $headers = array("Authorization: OAuth oauth_token=AQAAAAAIHopsAAUjpYWgKYZnFEzfqD3tUtzSER8, oauth_client_id=553f104a34d04c53a1e3e527c013f77a",
                         "Content-Type: application/json");
        $ch = curl_init('https://api.partner.market.yandex.ru/v2/campaigns/21010344/outlets.json');
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($param));
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $response = curl_exec($ch);
        curl_close($ch);
        return $response;
    }
?>
Tag: php, rest

174 Определяем скидку по группам пользоватеелй Битрикс

<?php
# DiscountPR(array(12,13,14));
function DiscountPR($GROUP) { # Определяем скидку по группам пользоватеелй
    CModule::IncludeModule("sale");
    $DISKONT = $arIDSGROUP = $arIDS = array();

    $groupDiscountIterator = Bitrix\Sale\Internals\DiscountGroupTable::getList(array(
        'select' => array('DISCOUNT_ID','GROUP_ID'),
        'filter' => array('@GROUP_ID' => $GROUP, '=ACTIVE' => 'Y')
    ));
    while ($groupDiscount = $groupDiscountIterator->fetch()) {
        $groupDiscount['DISCOUNT_ID'] = (int)$groupDiscount['DISCOUNT_ID'];
        if ($groupDiscount['DISCOUNT_ID'] > 0) {
            $arIDS[$groupDiscount['DISCOUNT_ID']] = $groupDiscount['DISCOUNT_ID'];;
            $arIDSGROUP[$groupDiscount['DISCOUNT_ID']] = $groupDiscount['GROUP_ID'];;
        }
    }
    if ($arIDS) {
        $discountIterator = Bitrix\Sale\Internals\DiscountTable::getList(array(
            'select' => array("ID", "NAME", "APPLICATION"),
            'filter' => array('@ID' => $arIDS),
            'order' => array("ID" => "ASC")
        ));
        while ($discount = $discountIterator->fetch()) {
            $d = preg_match_all("#.*'VALUE'\s*=>\s*([-0-9\.]+),.*#",$discount['APPLICATION'],$dd,PREG_SET_ORDER );
            $DISKONT[$arIDSGROUP[$discount['ID']]] = abs(floatval($dd[0][1]));
        }
    }
    return $DISKONT;
}
?>
Tag: bitrix, price, d7

175 curl REST

<?php
function INN($param) {
    $headers = array(    "Content-Type: application/json",
                        "Accept: application/json",
                        "Authorization: Token e004834aadf087cb9792279565e3a243a6509d00");
    $ch = curl_init('https://suggestions.dadata.ru/suggestions/api/4_1/rs/findById/party');
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($param));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($ch);
    curl_close($ch);
    return $response;
}

$param["query"] = trim($_POST['inn']);
$ret = INN($param);
?>
Tag: php, curl, rest

176 Пользовательские функции в SEO инфоблонах Битрикс. Определение обработчика события OnBeforeUserAdd

<?php
# Для init.php
# Пользовательские функции в SEO инфоблонах
# {=my_strip_tags this.DetailText 150} Удаляем теги и урезаем до 150 символов

if (\Bitrix\Main\Loader::includeModule('iblock')) {    # регистрируем обработчик события
   \Bitrix\Main\EventManager::getInstance()->addEventHandler("iblock","OnTemplateGetFunctionClass",array("FunctionMyStrip_tags", "eventHandler"));

   # подключаем файл с определением класса FunctionBase это пока требуется т.к. класс не описан в правилах автозагрузки
   include_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/iblock/lib/template/functions/fabric.php");

   class FunctionMyStrip_tags extends \Bitrix\Iblock\Template\Functions\FunctionBase   {
      # Обработчик события на вход получает имя требуемой функции парсер её нашел в строке SEO
      public static function eventHandler($event) {
         $parameters = $event->getParameters();
         $functionName = $parameters[0];
         if ($functionName === "my_strip_tags") {
            # обработчик должен вернуть SUCCESS и имя класса который будет отвечать за вычисления
            return new \Bitrix\Main\EventResult( \Bitrix\Main\EventResult::SUCCESS, "\FunctionMyStrip_tags" );
         }
      }
      # собственно функция выполняющая "магию"
      public function calculate($parameters) {
         $result = $this->parametersToArray($parameters); # последний параметр - длина строки
         $length = array_pop($result);
         return substr(strip_tags(implode(" ", $result)), 0, $length);
      }
   }
}
//------------------------------------------------------------------------------
# Определяем обработчик события OnBeforeUserAdd
BitrixMainEventManager::getInstance()->addEventHandlerCompatible("main", "OnBeforeUserAdd", "SHNGOnBeforeUserLoginHandler");

function SHNGOnBeforeUserLoginHandler(&$arFields) {
        $arFields['GROUP_ID'] =[4,5,$_REQUEST['GROUP_IDn']];
    return true;
}
?>
Tag: bitrix, seo, events

177 Добавить продукт + PRICE Битрикс

<?php
    $arLoadProductArray = Array(
        "IBLOCK_SECTION_ID" => $Section_ID,
        "IBLOCK_ID"         => $IBLOCK_ID,
        "PROPERTY_VALUES"   => $PROP,
        "NAME"              => $Field['NAME'],
        "CODE"              => CUtil::translit($Field['NAME'], "ru" , $params),
        "ACTIVE"            => "Y",
        "PREVIEW_TEXT"      => $Field['PREVIEW_TEXT'],
        "DETAIL_TEXT"       => $Field['DETAIL_TEXT'],
        "DETAIL_TEXT_TYPE"  => 'html',
        "XML_ID"            => $Field['XML_ID'],
    );

    if(strlen($Field['DETAIL_PICTURE'])>0) {
        $arLoadProductArray["DETAIL_PICTURE"] = CFile::MakeFileArray($Field['DETAIL_PICTURE']);
    }

    $el = new CIBlockElement;
    if($PRODUCT_ID = $el->Add($arLoadProductArray,false,false,true)){
        if($Field['PRICE'] > 0 && $PRODUCT_ID > 0) {
          $fields = array(
             'ID'             => $PRODUCT_ID,
             'QUANTITY_TRACE' => \Bitrix\Catalog\ProductTable::STATUS_DEFAULT,
             'CAN_BUY_ZERO'   => \Bitrix\Catalog\ProductTable::STATUS_DEFAULT,
             'WEIGHT'         => 0,
          );
          # создание товара
          $resultD = CCatalogProduct::Add($fields);
          if ($resultD)  {
             $result = \Bitrix\Catalog\MeasureRatioTable::add(array(
                'PRODUCT_ID' => $PRODUCT_ID,
                'RATIO'      => 1 # добавление коэффициента единицы измерения товара
                ) );
                # добавление цены
                $priceId = CPrice::Add(array(
                   'PRODUCT_ID'       => $PRODUCT_ID,
                   'CATALOG_GROUP_ID' => 1,
                   'PRICE'            => $Field['PRICE'],
                   'CURRENCY'         => $Field['CURRENCY']
                ) );
          }
        }
/*
        $GetListEx = CPrice::GetListEx(array(),array("PRODUCT_ID" => $br,"CATALOG_GROUP_ID" => $PRICE_TYPE_ID))->Fetch();
        CCatalogProduct::Update($GetListEx['ID'], array('TYPE' => 1));

*/
        echo "New ID: ".$PRODUCT_ID."<br/>";
    } else
      echo "Error: ".$el->LAST_ERROR;

?>
Tag: bitrix, price

178 Подробная информация о заказе для почты Битрикс

<?$APPLICATION->IncludeComponent(
    "bitrix:sale.personal.order.detail.mail",
    "",
    Array(
        "ID"                    => "{#ORDER_ID#}",
        "SHOW_ORDER_BASKET"     => "Y",
        "SHOW_ORDER_BASE"       => "Y",
        "SHOW_ORDER_USER"       => "Y",
        "SHOW_ORDER_PARAMS"     => "Y",
        "SHOW_ORDER_BUYER"      => "Y",
        "SHOW_ORDER_DELIVERY"   => "Y",
        "SHOW_ORDER_PAYMENT"    => "Y",
        "SHOW_ORDER_SUM"        => "Y",
        "CUSTOM_SELECT_PROPS"   => array("NAME", "DISCOUNT_PRICE_PERCENT_FORMATED", "PRICE_FORMATED", "QUANTITY"),
        "PROP_1"                => array(),
        "PROP_2"                => array(),
        "ACTIVE_DATE_FORMAT"    => "d.m.Y",
        "PICTURE_WIDTH"         => "110",
        "PICTURE_HEIGHT"        => "110",
        "PICTURE_RESAMPLE_TYPE" => "1",
        "CACHE_TYPE"            => "A",
        "CACHE_TIME"            => "3600",
        "PATH_TO_LIST"          => "/personal/order/index.php",
        "PATH_TO_CANCEL"        => "/personal/order/cancel.php?ORDER_ID=#ORDER_ID#",
        "PATH_TO_PAYMENT"       => "/payment/payment.php"
    )
);?>
Tag: bitrix, mail, basket

179 Add Basket Битрикс

<?php # Add Basket
if (CModule::IncludeModule("sale")){

  $arFields = array(
    "PRODUCT_ID"          => $_POST['PRODUCT_ID'],
    "PRODUCT_PRICE_ID"    => 1,
    "PRICE"               => $_POST['MIN_PRICE']['VALUE'],
    "CURRENCY"            => $_POST['MIN_PRICE']['CURRENCY'],
    "QUANTITY"            => $_POST['count'],
    "LID"                 => LANG,
    "DELAY"               => "N",
    "CAN_BUY"             => "Y",
    "NAME"                => iconv("UTF-8", "CP1251",$_POST['NAME']),
    "CALLBACK_FUNC"       => "MyBasketCallback",
    "NOTES"               => "",
    "ORDER_CALLBACK_FUNC" => "MyBasketOrderCallback",
    "RECOMMENDATION"      => $_POST['hide']
  );

    $arProps = array();
    $arProps[] = array(
        "CODE"  => "SIZE_HTML",
        "NAME"  => 'Размер:количество',
        "VALUE" => "\n".$_POST['hide']
    );
    $arFields["PROPS"] = $arProps;

  CSaleBasket::Add($arFields);
}
?>
Tag: bitrix, basket

180 Читаем в формате DBF

<?php
function echo_dbf($dbfname) { # Читаем DBF
    $REC         = array();
    $fdbf        = fopen($dbfname,'r');
    $fields      = array();
    $buf         = fread($fdbf,32);
    $header      = unpack( "VRecordCount/vFirstRecord/vRecordLength", substr($buf,4,8));
    $ech        .= 'Header: '.json_encode($header)."\n";
    $goon        = true;
    $unpackString='';
    while ($goon && !feof($fdbf)) { # read fields:
        $buf = fread($fdbf,32);
        if (substr($buf,0,1)==chr(13)) {$goon=false;} # end of field list
        else {
            $field=unpack( "a11fieldname/A1fieldtype/Voffset/Cfieldlen/Cfielddec", substr($buf,0,18));
#            $ech .= 'Field: '.json_encode($field)."\n";
            $unpackString.="A$field[fieldlen]$field[fieldname]/";
            array_push($fields, $field);
        }
    }
    fseek($fdbf, $header['FirstRecord']+1); # move back to the start of the first record (after the field definitions)
    for ($i=1; $i<=$header['RecordCount']; $i++) {
        $buf = fread($fdbf,$header['RecordLength']);
        $record=unpack($unpackString,$buf);
/*        $record['ITEMNAME'] = @iconv('CP866', 'UTF-8', $record['ITEMNAME']);
        $record['COUNTRY'] = @iconv('CP866', 'UTF-8', $record['COUNTRY']);
        $record['MANUFNAME'] = @iconv('CP866', 'UTF-8', $record['MANUFNAME']);
        $record = array_map("trim",$record);
*/
        $REC[] =$record; # echo " <pre>".print_r($record,1)."</pre>";
    } # raw record
    fclose($fdbf);
    return $REC;
}
?>
Tag: php, dbf

181 Замена свойств элемента Битрикс

<?php
CModule::IncludeModule('iblock');
$arSelect = Array("ID", "NAME", "CODE", "PROPERTY_ZIP_IMG1");
$arFilter = Array("IBLOCK_ID"=>17,">PROPERTY_ZIP_IMG1"=>"0");
$res = CIBlockElement::GetList(Array(), $arFilter, false, 0, $arSelect);
while($ob = $res->GetNext(1,0)) {
    $PROPERTY = array();
    for($i=1;$i<=10;$i++){
        $db_props = CIBlockElement::GetProperty(17, $ob['ID'], array("sort" => "asc"), array("CODE" => "ZIP".$i));
        $M=1;
        while($ar_props = $db_props->Fetch()){
            if($ar_props['VALUE'] > 0) {
                $PROPERTY["ZIP_".$i][] = array('VALUE'=>array("POSITION"=>$M,"LINK"=>$ar_props['VALUE']));  # значение свойства
            }
            $M++;
        }
    }
    if(count($PROPERTY)){
        CIBlockElement::SetPropertyValuesEx($ob['ID'], 17, $PROPERTY);
    }
}

    $PROPERTY['DIAMETR2'] = array(12,14); # для списков указываем ID значения в списке и/или array(id1, id2)
    CIBlockElement::SetPropertyValuesEx($element['ID'], $IBLOCK_ID, $PROPERTY);
?>
Tag: bitrix, property

182 Читаем один список и пишем в другой, для одного IBLOCK

<?php
$property_enums = CIBlockPropertyEnum::GetList(Array(),Array("IBLOCK_ID"=>$IBLOCK_ID, "CODE"=>"DIAMETR"));
while($en = $property_enums->GetNext(1,0)){
    $ibpenum = new CIBlockPropertyEnum;
    $valueId = $ibpenum->Add([
        'PROPERTY_ID' => 1079, # ID свойства
        'VALUE'       => $en['VALUE'],
        'XML_ID'      => $en['XML_ID'],
        'SORT'        => $en['SORT'],
        'DEF'         => $en['DEF'],
    ]);
    if ((int) $valueId < 0) {
        echo 'Unable to add a value<br>';
    } else {
        echo $valueId."<br/>";
    }
}
?>
Tag: bitrix, property

183 Алгоритм ЛУНА для контроля номера банковской карты

<?php
# Алгоритм ЛУНА для контроля номера банковской карты
# алгоритм вычисления контрольной цифры номера пластиковой карты в соответствии со стандартом ISO/IEC 7812.
# https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D1%83%D0%BD%D0%B0
# 4561 2612 1234 5467
function luhnAlgorithm($digit) {
    $number = strrev(preg_replace('/[^\d]/', '', $digit));
    $sum = 0;
    for ($i = 0, $j = strlen($number); $i < $j; $i++) {
        if (($i % 2) == 0) {
            $val = $number[$i];
        } else {
            $val = $number[$i] * 2;
            if ($val > 9)  {
                $val -= 9;
            }
        }
        $sum += $val;
    }
    return (($sum % 10) === 0);
}
?>
Tag: php, банк, карта

184 SMS Curl

<?php
# SMS Curl
function SMS_Curl(){
    $message = 'Ваш логин: '.$login_Send.' пароль: '.$new_pass.'. Заполните профиль и получайте бонусы и подарки.';

    $src = '<?xml version="1.0" encoding="UTF-8"?>
    <SMS>
    <operations>
        <operation>SEND</operation>
    </operations>
    <authentification>
    <username>evadia001@yandex.ru</username>
    <password>cegthrjatevadia</password>
    </authentification>
    <message>
        <sender>1coffee.ru</sender>
        <text>'.$message.'</text>
    </message>
    <numbers>
        <number messageID="'.$USER_ID.$new_pass.'">'.$user_phone.'</number>
    </numbers>
    </SMS>';

    $Curl = curl_init();
    $CurlOptions = array(
        CURLOPT_URL           =>'http://api.atompark.com/members/sms/xml.php',
        CURLOPT_FOLLOWLOCATION=>false,
        CURLOPT_POST          =>true,
        CURLOPT_HEADER        =>false,
        CURLOPT_RETURNTRANSFER=>true,
        CURLOPT_CONNECTTIMEOUT=>15,
        CURLOPT_TIMEOUT       =>100,
        CURLOPT_POSTFIELDS    =>array('XML'=>$src),
    );
    curl_setopt_array($Curl, $CurlOptions);
    if(false === ($Result = curl_exec($Curl))) {
        throw new Exception('Http request failed');
    }
    curl_close($Curl);
}
?>
Tag: php, curl, sms

185 последний элемент URL GetLastLinkSection

<?php
function GetLastLinkSection($link){
    $arUrl    = explode('/', $link);
    $arUrl    = array_filter($arUrl); # Убрать пустоты
    $LastCode = array_pop($arUrl); # Извлекает последний элемент массива
    return $LastCode;
}
?>
Tag: php, url

186 Расчет дистанции

<?php
if(!function_exists('MinDistance')) {
    function MinDistance($lat1, $lng1, $lat2, $lng2) {
        define('EARTH_RADIUS',  6371302); # 6 371 302 м
        # Convert degrees to radians.
        $lat1 = deg2rad($lat1);
        $lng1 = deg2rad($lng1);
        $lat2 = deg2rad($lat2);
        $lng2 = deg2rad($lng2);

        # Calculate delta longitude and latitude.
        $delta_lat = ($lat2 - $lat1);
        $delta_lng = ($lng2 - $lng1);

        return round(EARTH_RADIUS * acos(cos($lat1) * cos($lat2) * cos($lng1 - $lng2) + sin($lat1) * sin($lat2)));
    }
}
?>
Tag: php, дистанция

187 localStorage Добавляем или изменяем значение (cookie) JS

<script>
//
// localStorage
//
// Добавляем или изменяем значение:
function localStorage(){
    localStorage.setItem('myKey', 'myValue'); // теперь у вас в localStorage хранится ключ "myKey" cо значением "myValue"

    // Выводм его в консоль:
    var localValue = localStorage.getItem('myKey');
    console.log(localValue); // "myValue"

    localStorage.removeItem("myKey"); // удаляем:
    localStorage.clear() // очищаем все хранилище

    // То же самое, только с квадратными скобками:

    localStorage["Ключ"] = "Значение" // установка значения

    delete localStorage["Ключ"] // Удаление значения

    // создадим объект
    var obj = {
        item1: 1,
        item2: [123, "two", 3.0],
        item3:"hello"
    };
    var serialObj = JSON.stringify(obj); // сериализуем его
    localStorage.setItem("myKey", serialObj); // запишем его в хранилище по ключу "myKey"
    var returnObj = JSON.parse(localStorage.getItem("myKey")) // спарсим его обратно объект
}
function addScript(src){
  var script = document.createElement('script');
  script.src = src;
  script.async = false; // чтобы гарантировать порядок
  script.setAttribute("type", "text/javascript");
  document.head.appendChild(script);
}
</script>
Tag: php, localstorage, cookie

188 Блоки текста "<<<eol"

<?php
$s = <<<EOL
    Кавычки бывают 'одинарными' и "двойными".
    $name и {$foo->bar[1]}
EOL;
?>
Tag: php, eol

189 Контролируем 1 строку файла по шаблону и удаляем если совпала с маской (virus)

<?php
# Типа чистим вирус :)
# Контролируем 1 строку файла по шаблону и удаляем если совпала с маской
#
global $mask;
function glob_recursive($dir, $ext){
    global $mask;
    foreach(glob($dir.'/*') as $filename){
        if(strpos($filename,$ext) !== false) # Ищем файл
        {
            $buf = file($filename);
            if(preg_match($mask,$buf[0])){ # Есть совпадение с маской?
                echo $filename."<br/>";
                unset($buf[0]); # Удаляем строку
                file_put_contents($filename."1",implode("",$buf));
            }
        }
        if(is_dir($filename)) glob_recursive($filename, $ext);
    }
}
$mask = "#<script>.+</script>#";
glob_recursive($_SERVER['DOCUMENT_ROOT'], ".tst");
?>
Tag: php, virus

190 Выводим Массив в строку

<?php
function Array_to_String($arr){ # Выводим Массив в строку
    $repl = array(0 => array("#[\]\[]#", "#\n#", "#\s{2,}#", "#\,.?\(\,#", "#,,\s*\)#", "#,$#"), 1 => array("'", ",", " ", "(", ")", ""));
    $RE = preg_replace($repl[0],$repl[1],print_r($arr,1));
    return $RE;
}
?>
Tag: php, array, string

191 Кеширование Битрикс

<?php
#
# $arMyFuncParams = array(1,2,3);
# $cachedData = CSHNGTool::returnResultCache(86400, 'somethingId', 'myFunc', $arMyFuncParams);
# function myFunc($arParams) {
       # getting data BX API
       # use $arParams = array(1,2,3) ...
       # $something = ...
#    return $something;
# }
class CSHNGTool  {
    function returnResultCache($timeSeconds, $cacheId, $callback, $arCallbackParams = '') {
        $obCache = new CPHPCache();
        $cachePath = '/'.SITE_ID.'/'.$cacheId;
        if( $obCache->InitCache($timeSeconds, $cacheId, $cachePath) ) {
            $vars = $obCache->GetVars();
            $result = $vars['result'];
        }
        elseif( $obCache->StartDataCache()  ) {
            $result = $callback($arCallbackParams);
            $obCache->EndDataCache(array('result' => $result));
        }
        return $result;
    }
}
# ****************************************************
$cache = Bitrix\Main\Data\Cache::createInstance();
if ($cache->initCache($cacheTime, $cacheId, $cacheDir)) {
    # отдаём данные из кеша
    $arResult = $cache->getVars();
} elseif ($cache->startDataCache()) {
    # выполняем код, чтобы положить данные в кэш
    $arResult = array();
    if ($isInvalid) {
        $cache->abortDataCache();
    }
    $cache->endDataCache($arResult);
}
?>
Tag: php, bitrix, cache, d7

192 выводим видео на сайт

<div class="webcams" style="display:flex;flex-wrap: wrap;justify-content: space-evenly;">
        <div class="webcam">
            <h3>г. Петропавловск-Камчатский, ул. Циолковского, 43</h3>
            <iframe src="https://camera.rt.ru/sl/thlzkzS6m" width="640px" height="430px" frameborder="0" allowfullscreen="" scrolling="no">
                <?=$Mess?>
            </iframe>
        </div>
        <div class="webcam">
            <h3>г. Ключи, вид на вулкан Ключевская сопка</h3>
            <iframe src="https://camera.rt.ru/sl/0T8KYuCuO" width="640px" height="430px" frameborder="0" allowfullscreen="" scrolling="no">
                <?=$Mess?>
            </iframe>
        </div>
</div>
<?
// www.youtube.com

/*
Атрибуты тега:
width – задается длина окна фрейма;
height – устанавливается высота окна плавающего фрейма;
src – путь к файлу, содержимое которого будет воспроизводиться;
frameborder – устанавливает отображение рамки вокруг фрейма. Поддерживаются значения yes или no, 1 или 0 (нет);
allowfullscreen – разрешение на полноэкранное отображение видео.
*/
?>
  Обратите внимание, что
  <a href="https://developers.google.com/youtube/terms/api-services-terms-of-service"></a> - Условия использования YouTube API и
  <a href="https://developers.google.com/youtube/terms/developer-policies"></a> - правила для разработчиков
  распространяются и на встроенный проигрыватель.

  <iframe width="560" height="315" src="https://www.youtube.com/embed/3jT_q7dt-cM" frameborder="0" allowfullscreen></iframe>
<?
/*
Использование тега <video> - позволяет размещать, воспроизводить и проигрывать видео на веб-странице. Его атрибуты:
autoplay – воспроизведение видео начинается сразу после загрузки страницы сайта;
controls – к ролику добавляется панель управления проигрывателем;
width, height – отвечают за размеры окна видеоплеера;
loop – включает автоматическое повторение воспроизведения видео сразу после его окончания;
poster – устанавливает картинку, которая будет отображаться, пока идет загрузка видео. Или если его воспроизведение недоступно;
preload – включает предварительную загрузку видео во время загрузки браузером веб-страницы;
src – задает путь к видеоролику.
*/
?>
  <video width="400" height="300" controls="controls" poster="1.png">
   <source src="Wildlife.ogv" type='video/ogg; codecs="theora, vorbis"'>
   <source src="Wildlife.mp4" type='video/mp4; codecs="avc1.42E01E, mp4a.40.2"'>
   <source src="Wildlife.webm" type='video/webm; codecs="vp8, vorbis"'>
  </video>

Tag: video, html, youtube

193 Микроразметка twitter: og:

<?php
use Bitrix\Main\Page\Asset;
function MetaTageOG($TITLE, $DESCRIPTION, $IMAGE, $URL, $width, $height){
    $site = 'https://city-pages.info/';
    Asset::getInstance()->addString('<meta name="twitter:card" content="summary_large_image">',true);
    Asset::getInstance()->addString('<meta name="twitter:title" content="'.mb_strimwidth(strip_tags($TITLE), 0, 70, "...").'">',true);
    Asset::getInstance()->addString('<meta name="twitter:description" content="'.mb_strimwidth(strip_tags($DESCRIPTION), 0, 200, "...").'">',true);
    Asset::getInstance()->addString('<meta name="twitter:image:src" content="'.$site.$IMAGE.'">',true);
    Asset::getInstance()->addString('<meta name="twitter:url" content="'.$site.$URL.'">',true);
    Asset::getInstance()->addString('<meta name="twitter:domain" content="city-pages.info">',true);

    Asset::getInstance()->addString('<meta property="og:title" content="'.mb_strimwidth(strip_tags($TITLE), 0, 70, "...").'"/>',true);
    Asset::getInstance()->addString('<meta property="og:description" content="'.mb_strimwidth(strip_tags($DESCRIPTION), 0, 200, "...").'" />',true);
    Asset::getInstance()->addString('<meta property="og:type" content="website"/>',true);
    Asset::getInstance()->addString('<meta property="og:url" content="'.$site.$URL.'"/>',true);
    Asset::getInstance()->addString('<meta property="og:image" content="'.$site.$IMAGE.'">',true);
    Asset::getInstance()->addString('<meta property="og:image:type" content="image/jpg">',true);
    Asset::getInstance()->addString('<meta property="og:image:width" content="'.$width.'" />',true);
    Asset::getInstance()->addString('<meta property="og:image:height" content="'.$height.'" />',true);
}
?>
Tag: bitrix, html, meta, twitter, og, d7

194 POPUP CSS HTML

<style type="text/css">
.b-popup { display:none;width:100%;min-height:100%;background-color: rgba(0,0,0,0.5);overflow:hidden;position:fixed;top:0px;}
.b-popup .b-popup-contents { margin:40px auto 0px auto;width:450px; padding:10px; background-color:#EEE; border-radius:5px; box-shadow: 0px 0px 10px #000; color:#000; position:relative;}
.b-popup .b-popup-close { color:red;font-weight: bold;font-size:16px; padding:3px 6px; border:1px solid red; right:10px; position:absolute; z-index:100; cursor:pointer;}
</style>
<div class="b-popup">
    <div class="b-popup-contents"><div class="b-popup-close" onclick="$('.b-popup').hide();">X</div>
        <div class="b-popup-content">
            #Текст тут#
        </div>
    </div>
</div>
Tag: html, css, popup

195 вывод META Битрикс

<?php
$META_CONTENT = array("url..." => array("txt" => "","keywords" => "","description" => "","title" => ""),);
function Meta_Content(){
    global $APPLICATION;
    include $_SERVER['DOCUMENT_ROOT']."/meta-content.php";
    $page = $APPLICATION->GetCurPage(false);
    if(isset($META_CONTENT[$page])){
        if(strlen($META_CONTENT[$page]['txt']) && !isset($_REQUEST['PAGEN_1']))
            echo $META_CONTENT[$page]['txt'];

        if(isset($META_CONTENT[$page]['title']) && strlen($META_CONTENT[$page]['title']))
            $APPLICATION->SetTitle($META_CONTENT[$page]['title']);

        if(isset($META_CONTENT[$page]['description']) && strlen($META_CONTENT[$page]['description']))
            $APPLICATION->SetPageProperty("description", $META_CONTENT[$page]['description']);

        if(isset($META_CONTENT[$page]['keywords']) && strlen($META_CONTENT[$page]['keywords']))
            $APPLICATION->SetPageProperty("keywords", $META_CONTENT[$page]['keywords']);
    }
    unset($META_CONTENT);
    return;
}
?>
Tag: bitrix, meta

196 прервать событие JS

<script type="text/javascript">
    e = e || window.event;
    e.preventDefault();
    e.stopPropagation();
</script>
Tag: js, preventdefault

197 Добавляем файлы в поле со свойством Множественное Битрикс

<?php
function add_files($arFiles) { # Добавляем файлы в поле со свойством Множественное
    $arRet = [];
    foreach ($arFiles as $f_key=>$f_path) {
        $ffile = CFile::MakeFileArray($f_path);
        $ffile['MODULE_ID'] = 'main';
        $arRet['n'.$f_key] = $ffile;
    }
    return $arRet;
}
?>
Tag: bitrix, property

198 Преобразование массива array в XML (Array to XML PHP)

<?php
# **********************************************************************************
header('Content-Type: text/xml; charset-utf-8');
$array = array('test' => 'test1', array(1, 2));
# создаем объект SimpleXMLElement
$xml = new SimpleXMLElement("<!--?xml version=\"1.0\"?-->");

# используем функцию преобразования
array_to_xml($array,$xml);

# Выводим сгенерированный XML
echo $xml->asXML();

# сама функция преобразования
function array_to_xml($array, &$xml) { # Преобразование массива array в XML (Array to XML PHP)
    foreach($array as $key => $value) {
        if(is_array($value)) {
            # если элемент число, то добавляем префикс, с цифр не может начинаться
            if(!is_numeric($key)) {
                $subnode = $xml->addChild("$key");
                array_to_xml($value, $subnode);
            } else {
                $subnode = $xml->addChild("item$key");
                array_to_xml($value, $subnode);
            }
        } else {
            if(!is_numeric($key)) {
                $xml->addChild("$key","$value");
            } else {
                $xml->addChild("item$key","$value");
            }
        }
    }
}

function xml_encode ($array, $node = null) { # Преобразование массива array в XML (Array to XML PHP) другой вариант - упрощенный
    if (!isset($node)) $node = new SimpleXMLElement("<!--?xml version=\"1.0\"?-->");
    foreach ($array as $key => $value) {
        if (is_numeric($key))
            $key = 'item' . $key;
        if (is_array($value)) {
            $subnode = $node->addChild($key);
            $node = $this->xml_encode($array, $subnode);
        } else {
            $node->addChild($key, $value);
        }
    }
    return $node->asXML();
}
?>
Tag: php, xml

199 проверка включен ли режим правки Битрикс

<?php
# *********************************************************************************
# 1C-Bitrix проверка включен ли режим правки
# если кнопка "Показать включаемые области" нажата, то
if ($APPLICATION->GetShowIncludeAreas()){}
?>
Tag: bitrix

200 RESP

<?php
#
# RESP
#
$url = 'http://kladr-api.ru/api.php?' . $query . '&token=' . $this->token;
$context = stream_context_create(array('http' => array('header' => 'Connection: close\r\n')));
$result = file_get_contents($url, FALSE, $context);
if (preg_match('/Error: (.*)/', $result, $matches)) {
    $error = $matches[1];
    return FALSE;
}
return json_decode($result, $assoc);
?>
Tag: php, resp

201 подключение favicon

        <link rel="icon" type="image/svg+xml" href="favicon.svg">
        <link rel="icon" type="image/png" sizes="48x48" href="/favicon48.ico">
        <link rel="icon" type="image/png" sizes="32x32" href="/favicon32.ico">
        <link rel="icon" type="image/png" sizes="24x24" href="/favicon24.png">
        <link rel="icon" type="image/png" sizes="16x16" href="/favicon16.png">
        <link rel="shortcut icon" href="/icons/favicon48.ico">
Tag: html, ico, svg, link, favicon

202 Запрос file_get_contents через прокси-сервер

<?php
$aContext = array(
    'http' => array(
        'proxy' => 'tcp://192.168.0.2:3128',
        'request_fulluri' => true,
    ),
);
$cxContext = stream_context_create($aContext);
$sFile = file_get_contents("http://www.google.com", False, $cxContext);
echo $sFile;
//-----------------------------------------------------------------------------
$auth = base64_encode('LOGIN:PASSWORD');
$aContext = array(
    'http' => array(
        'proxy' => 'tcp://192.168.0.2:3128',
        'request_fulluri' => true,
        'header' => "Proxy-Authorization: Basic $auth",
    ),
);
$cxContext = stream_context_create($aContext);
$sFile = file_get_contents("http://www.google.com", False, $cxContext);
echo $sFile;
?>
Tag: php, proxy

203 динамически имена переменных в PHP

<?php
${'a' . 'b'} = 'hello there';
echo $ab; # hello there
?>
<?php
$expected=array('username','age','city','street');
foreach($expected as $key){
    if(!empty($_POST[$key])){
        ${key}=$_POST[$key];
    }
    else{
        ${key}=NULL;
    }
}
?>
Tag: php

204 отправка POST запроса через функцию file_get_contents

<?php
    $postdata = http_build_query(
        array(
            'var1' => 'some content',
            'var2' => 'doh'
        )
    );
    $opts = array('http' =>
        array(
            'method'  => 'POST',
            'header'  => 'Content-type: application/x-www-form-urlencoded',
            'content' => $postdata
        )
    );
    $context  = stream_context_create($opts);
    $result = file_get_contents('http://example.com/submit.php', false, $context);
?>
Tag: php, post

205 замена множества значений в строке одной функцией

<?php
$text = 'Я фан клуба {$club}. Тут какой-то {$text}. И тут ещё какой-то {$text2}.';
$vars = array(
  '{$club}'  => 'Барселона',
  '{$text}'  => 'текст',
  '{$text2}' => 'супер текст'
);
echo strtr($text, $vars);
?>
Tag: php

206 очень полезных функций в PHP

<?php
highlight_string('<?php phpinfo(); ?>'); # применить подсветку к PHP коду

$str = "How many words do I have?";
echo str_word_count($str); # Outputs 5 # подсчитывает количество слов, входящих в строку.

$str1 = "carrot";
$str2 = "carrrott";
echo levenshtein($str1, $str2); # Outputs 2 #  насколько отличаются две строки? Вычисляет расстояние Левенштейна между двумя строками

print_r(get_defined_vars()); # возвращает многомерный массив, содержащий список всех определенных переменных

echo "<pre>".print_r(pathinfo(__FILE__),1)."</pre>"; # массив разборки имени файла
?>
Tag: php

207 Сжатие строк

<?php
$string = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc ut elit id mi ultriciesadipiscing. Nulla facilisi. Praesent pulvinar, sapien vel feugiat vestibulum, nulla dui pretium orci,non ultricies elit lacus quis ante. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquampretium ullamcorper urna quis iaculis. Etiam ac massa sed turpis tempor luctus. Curabitur sed nibh eu elitmollis congue. Praesent ipsum diam, consectetur vitae ornare a, aliquam a nunc. In id magna pellentesquetellus posuere adipiscing. Sed non mi metus, at lacinia augue. Sed magna nisi, ornare in mollis in, mollissed nunc. Etiam at justo in leo congue mollis. Nullam in neque eget metus hendrerit scelerisqueeu non enim. Ut malesuada lacus eu nulla bibendum id euismod urna sodales. ";

$compressed = gzcompress($string);
echo "Original size: ". strlen($string)."\n";
/* выведет Original size: 800*/
echo "Compressed size: ". strlen($compressed)."\n";
/* выведет Compressed size: 418 */
# возвращаем
$original = gzuncompress($compressed);
?>
Tag: php

208 Замена “маркеров” заключёных в квадратные скобки с помощью регулярки и заменить при помощи функции обратного вызова

<?php
# my_callback() будет вызываться каждый раз, когда будут найдены скобки
$template = preg_replace_callback('/\[(.*)\]/','my_callback',$template);

function my_callback($matches) {
    # $matches[1] теперь содержит строку, которая находилась между скобок

    if (isset($matches[1])) {
        # вернуть заменённую строку
        return $matches[1];
    } else {
        return $matches[0];
    }
}
?>
<?php
// Этот текст был использован в 2002 году
// мы хотим обновить даты к 2003 году
$text = "День смеха был 01/04/2002\n";
$text.= "Последнее Рождество было 24/12/2001\n";
// callback-функция
function next_year($matches)
{
  // как обычно: $matches[0] -  полное вхождение шаблона
  // $matches[1] - вхождение первой подмаски,
  // заключённой в круглые скобки и так далее...
  return $matches[1].($matches[2]+1);
}
echo preg_replace_callback("|(\d{2}/\d{2}/)(\d{4})|","next_year", $text);

# Результат выполнения данного примера:
/*
День смеха был 01/04/2003
Последнее Рождество было 24/12/2002
*/
?>
Tag: php, preg_replace_callback

209 AJAX запрос на другой сайт

<script type="text/javascript">
$.ajax({
     url:"testserver.php",
     dataType: 'jsonp', /* Notice! JSONP <-- P (lowercase) */
     success:function(json){
         // обработка json
         alert("Success");
     },
     error:function(){
         alert("Error");
     }
});
</script>
Tag: js, ajax

210 Javascript. Изменение URL без перезагрузки

<script type="text/javascript">
    window.history.pushState('', '', 'new_url/');
</script>
Tag: js

211 JSON_ENCODE без заморочек с кодировкой Битрикс

<?php
# encode
$enc_value = \Bitrix\Main\Web\Json::encode($data, $options = null);
# decode
$dec_value = \Bitrix\Main\Web\Json::decode($data);
?>
Tag: bitrix, d7

212 Показывать спиннер пока картинка не загрузится.

<style type="text/css">
    img {  background: url('loading.gif') no-repeat center; }
</style>
Tag: css

213 D7 GET & POST

<?php
use Bitrix\Main\Application;
$request = Application::getInstance()->getContext()->getRequest();

$name = $request->getPost("name");
$email = htmlspecialchars($request->getQuery("email"));

use Bitrix\Main\Application,
    Bitrix\Main\Server,
    Bitrix\Main\Context,
    Bitrix\Main\Request;

/* Bitrix\Main\Request */

$request = $context->getRequest();
# Или более краткая форма:
$request = Context::getCurrent()->getRequest();
/* Параметры запроса */
$value  = $request->get("param");       # получение параметра GET или POST
$value  = $request["param"];            # получение параметра GET или POST
$value  = $request->getQuery("param");  # получение GET-параметра
$values = $request->getQueryList();    # получение списка GET-параметров
$value  = $request->getPost("param");   # получение POST-параметра
$values = $request->getPostList();     # получение списка POST-параметров
$value  = $request->getFile("param");   # получение загруженного файла
$values = $request->getFileList();     # получение списка загруженных файлов
$value  = $request->getCookie("param"); # получение значения кука
$values = $request->getCookieList();   # получение списка кукисов

/** Данные о запросе */
$method = $request->getRequestMethod(); # получение метода запроса
$flag   = $request->isGet();              # true - GET-запрос, иначе false
$flag   = $request->isPost();             # true - POST-запрос, иначе false
$flag   = $request->isAjaxRequest();      # true - AJAX-запрос, иначе false
$flag   = $request->isHttps();            # true - HTTPS-запрос, иначе false

/** Данные о запрошенной странице */

$flag = $request->isAdminSection();            # true - находимся в админке, иначе false
$requestUri = $request->getRequestUri();       # Запрошенный адрес (напр. "/catalog/category/?param=value")
$requestPage = $request->getRequestedPage();   # Запрошенная страница (напр. "/catalog/category/index.php")
$rDir = $request->getRequestedPageDirectory();# Директория запрошенной страницы (напр. "/catalog/category")
?>
Tag: d7, bitrix, get, post

214 обновить свойство (включая пользовательское) Section инфоблока. Битрикс

<?php
/* $id - id подраздела
   $uf_name - название свойства
   $uf_value - значение свойства */
function UpdateSection ($id, $uf_name, $uf_value) {
      $bs = new CIBlockSection;
      $arFields = Array("$uf_name" => $uf_value, );
      $res = $bs->Update($id, $arFields);
      return $res;
}
?>
Tag: bitrix

215 Одновременное горизонтальное и вертикальное выравнивание элемента (span внутри div)

<style type="text/css">
.parent { position: relative; }
.child {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}
</style>
Tag: css

216 Прочитать содержимое директории

<?php
 /**
 * Прочитать содержимое директории
 * @param string $subDir - поддиректория (от текущей)
 * @param bool $ignoreSubs - игнорировать папки
 * @return array|bool - массив с именами файлов или FALSE
 */
function getListSubDir ($ignoreSubs = true, $subDir = '') {
    $arFiles = array();
    $iterator = new DirectoryIterator(dirname(__FILE__) . $subDir);
    while ($iterator->valid()) {
        if (!$iterator->current()->isDot()) {
            if ($ignoreSubs === true) {
                if (!$iterator->current()->isDir())
                    $arFiles[] = $iterator->current()->getFileName();
            } else {
                $arFiles[] = $iterator->current()->getFileName();
            }
        }
        $iterator->next();
    }
    sort($arFiles);
    return (count($arFiles) > 0) ? $arFiles : false;
}
$d = getListSubDir(false,"/../");
echo "<pre>".print_r($d,1)."</pre>";
?>
Tag: php, dir

217 ip to long

<script type="text/javascript">
    function ip2long(ip) {
        var bytes = [];
        var res = false;
        if (ip.match(/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/)) {
            bytes = ip.split('.');
            res =
                bytes[0] * 16777216 +
                bytes[1] * 65536 +
                bytes[2] * 256 +
                bytes[3] * 1;
        }
        return res;
    }
</script>
Tag: script

218 Путь до елемента Битрикс

<div class="table-tag-wrapper">
<?php
$q_nav = CIBlockSection::GetNavChain($arParams["IBLOCK_ID"], $arItem["IBLOCK_SECTION_ID"]);
while ($a_nav = $q_nav->GetNext()) {?>
    <a href="<?=$a_nav["SECTION_PAGE_URL"]?>" class="table-tag"><?=$a_nav["NAME"]?></a>
<?php } ?>
</div>
Tag: bitrix

219 Meta tag dinamic

<!DOCTYPE html>
<html>
<head>
<meta name="description" id="description" content="test">
<meta name="keywords" id="keywords" content="test">
<title></title>
<script type="text/javascript">
    function MetaTags(Title, desText, keyText){
        var title = $('title'),
            description = $("meta[name='description']"),
            keywords  = $("meta[name='keywords']");

        if(Title.length > 1) {
            $(title).html(Title);
        }
        if(desText.length > 1) {
            $(description).attr('content',desText);
        }
        if(keyText.length > 1) {
            $(keywords).attr('content',keyText);
        }
    }
/*========================================================*/
    function MetaTags(Title, desText, keyText){
        document.getElementById("description").setAttribute("content",desText);
        document.getElementById("keywords").setAttribute("content",keyText);
        document.title = Title;
    }
    window.onload = function () {
        MetaTags('Title', 'desText', 'keyText');
    }
</script>
</head><body></body></html>
Tag: meta, js

220 Конверт jpg to webp

<?php
    $file = 'hnbrnocz.jpg';
    $image = imagecreatefromjpeg($file);
    ob_start();
    imagejpeg($image,NULL,100);
    $cont = ob_get_contents();
    ob_end_clean();

    imagedestroy($image);
    $content = imagecreatefromstring($cont);
    imagewebp($content,'images/hnbrnocz.webp');
    imagedestroy($content);
#
# cwebp -q 100 example.jpg -o example.webp
# перевод PNG в WebP
# cwebp -quiet -pass 10 -alpha_method 1 -alpha_filter best -m 6 -mt -lossless -q 100
# Перевод JPEG в WebP
# cwebp -quiet -pass 10 -alpha_method 1 -alpha_filter best -m 6 -mt -q 100
#
?>
Tag: php, jpg, webp, convert

221 Распаковываем архив ZIP

<?php
# Распаковываем архив
    $fp = fopen('zip://' . __DIR__ . '/SxGeoTmp.zip#' . $dat_file, 'rb');
    $fw = fopen($dat_file, 'wb');
    if (!$fp) {
        exit("Не получается открыть\n");
    }
    if (INFO) echo "Распаковываем архив\n";
    stream_copy_to_stream($fp, $fw);
    fclose($fp);
    fclose($fw);
    if(filesize($dat_file) == 0) die ('Ошибка при распаковке архива');
    @unlink(__DIR__ . '/SxGeoTmp.zip');
?>
Tag: php, zip

222 Document.ready JS

<script>
    document.addEventListener("DOMContentLoaded", function(event) {
        //do work
    });
</script>
Tag: js, events

223 Option::get - Получить значение ключа

<?php
function htmlspecialcharsbx($string, $flags=ENT_COMPAT){
    return htmlspecialchars($string, $flags, (defined("BX_UTF")? "UTF-8" : "ISO-8859-1"));
}
$apiKey = htmlspecialcharsbx(\Bitrix\Main\Config\Option::get('ipol.sdek', 'ymapsAPIKey', ''));
?>
Tag: bitrix, d7

224 UrlRewrite

<?php
$arUrlRewrite=array (
  array (
    'CONDITION' => '#/shop/category/(.*?)$#',
    'RULE'      => 'ELEMENT_CODE=$1',
    'ID'        => 'bitrix:catalog.element',
    'PATH'      => '',
    'SORT'      => 100,
  ),
  array (
    'CONDITION' => '#^/novosti/(.*?)/(.*)?#',
    'RULE'      => 'ELEMENT_CODE=$1',
    'ID'        => 'bitrix:news',
    'PATH'      => '/novosti/detail.php',
    'SORT'      => 100,
  ),
  2 =>
  array (
    'CONDITION' => '#^/catalog/(.+)/([^\?$]+)#',
    'RULE' => 'SECTION_CODE=$1&ELEMENT_CODE=$2',
    'ID' => 'bitrix:catalog.element',
    'PATH' => '/catalog/detail.php',
    'SORT' => 100,
  ),
  1 =>
  array (
    'CONDITION' => '#^/catalog/(.+)/(\?.*)?#',
    'RULE' => 'SECTION_CODE=$1&all=$2',
    'ID' => 'bitrix:catalog.section',
    'PATH' => '/catalog/index.php',
    'SORT' => 200,
  ),
);
Tag: bitrix, urlrewrite, php

225 OpenServer Apache + phpmyadmin + Bitrix

#-----------------------------------------------#
# Конфигурация для Битрикс
#-----------------------------------------------#
<Directory "%ssitedir%/domains/*.bit">
   php_admin_value mbstring.func_overload 2
   php_admin_value mbstring.internal_encoding utf8
</Directory>

# Поженить Битрикс с PhpMyAdmin
# Вставить в файл: *\ospanel\userdata\config\Apache_*******_vhosta.conf
<Directory "%ssitedir%/modules/system/html/openserver/phpmyadmin">
    php_value default_charset utf-8
    php_admin_value mbstring.func_overload 0
    php_value mbstring.internal_encoding utf8
</Directory>
Tag: bitrix, mbstring, openserver

226 array_filter с переменными

<?php
    $id = $p['id'];
    $filtered_shop_id = array_filter($shop_id, function ($element) use ($id) { return ($element == $id); } ); # ВЕКТОР
    //------------------------
    $filtered_shop_id = array_filter($kit_shop_category, # МНОГОМЕР
        function ($element) use ($id) {
        return ($element['shop_id'] == $id);
    } );
    //------------------------
    $data = array('first' => 1, 'second' => 2, 'third' => 3);
    $data = array_filter($data, function ($item) use (&$data) {
        echo "Filtering key ", key($data), '<br>', PHP_EOL;
        next($data);
        return false;
    });
    /* Вернет
    Filtering key first
    Filtering key second
    Filtering key third
    */
?>
Tag: php, array

227 Подключение скриптов и стилей в шаблоне и вне шаблона

<?php
#ШАБЛОН
$this->addExternalCss("/local/styles.css"); # CSS
$this->addExternalJS("/local/libs.js");# JS
# ИЛИ
$this->addExternalJS($this->__folder."/form_script.js");
$this->addExternalCss($this->__folder."/form_script.css");

# ВНЕ ШАБЛОНА
$assets = \Bitrix\Main\Page\Asset::getInstance();
$assets->addCss(SITE_TEMPLATE_PATH . '/css/vendor.min.css'); # CSS
$assets->addJs(SITE_TEMPLATE_PATH . '/js/vendor.min.js'); # JS
$assets->addString("<link href='http://fonts.googleapis.com/css?family=PT+Sans:400&subset=cyrillic' rel='stylesheet' type='text/css'>");  # STRING

?>
Tag: bitrix, d7

228 Подключение файлов Метод IncludeFile

<?php
# С возможностью правки из пользовательской части
$APPLICATION->IncludeFile(SITE_TEMPLATE_PATH . '/include/popupForms.php');
# Без возможности правки из пользовательской части
$APPLICATION->IncludeFile(SITE_TEMPLATE_PATH . '/include/popupForms.php', false, ['SHOW_BORDER' => false]);
# С указанием типа правки php, html, text
$APPLICATION->IncludeFile(SITE_TEMPLATE_PATH . '/include/popupForms.php', false, ["MODE" => "php"]);
# С указанием передачей переменных в файл (в файле будет доступна переменная $name)
$APPLICATION->IncludeFile(SITE_TEMPLATE_PATH . '/include/popupForms.php', ['NAME' => $arResult['NAME']], ['SHOW_BORDER' => true, "MODE" => "php"]);
// file popupForms.php
    echo "<pre>".print_r($arParams['NAME'],1)."</pre>";
?>
Tag: bitrix

229 Компонент “включаемая область”

<?php
$APPLICATION->IncludeComponent(
    "bitrix:main.include",
    "",
    Array(
        "AREA_FILE_SHOW"   => "file",
        "AREA_FILE_SUFFIX" => "",
        "EDIT_TEMPLATE"    => "",
        "PATH"             => SITE_TEMPLATE_PATH."/include/partName.php"
    )
);
# Скрываем служебные кнопки в режиме редактирования
$APPLICATION->IncludeComponent(
    "bitrix:main.include",
    "",
    Array(
        "AREA_FILE_SHOW"   => "file",
        "AREA_FILE_SUFFIX" => "",
        "EDIT_TEMPLATE"    => "",
        "PATH"             => SITE_TEMPLATE_PATH."/include/partName.php"
    ), false, ["HIDE_ICONS"=>true]
);
?>
Tag: bitrix

230 Изменение размеров изображения

<?php
if($arResult['DETAIL_PICTURE']) {
    $filters = [
        ["name" => "sharpen", "precision" => 15],
    ];
    $sizes = ['width' => 420, 'height' => 300];
    $arResult['DETAIL_PICTURE']['SRC'] = \CFile::ResizeImageGet(
        $arResult['DETAIL_PICTURE']['ID'],
        $sizes, BX_RESIZE_IMAGE_PROPORTIONAL, true,
        $filters, false, 85)['src'];
}
?>
Tag: bitrix

231 Получение объектов приложения, контекста и запроса

<?php
# полный вариант
$application = \Bitrix\Main\Application::getInstance();
$context = $application->getContext();
$request = $context->getRequest();

# короткий вариант получения данных запроса
$request = \Bitrix\Main\Context::getCurrent()->getRequest();

# истпользование объекта запроса

# получение GET параметра
$varName = $request['varName'];

# или тоже самое
$varName = $request->getQuery('varName');

# получение POST параметра
$varName = $request->getPost('varName');

# проверка типа запроса
if ($request->isPost()) {
    echo 'is post request';
}
?>
Tag: bitrix, d7

232 Подключение модулей

<?php
# Статический метод подключает модуль по его имени.
\Bitrix\Main\Loader::includeModule($moduleName);

# Статический метод подключает партнёрский модуль по его имени.
\Bitrix\Main\Loader::includeSharewareModule($partnerModuleName);
?>
Tag: bitrix, d7

233 Создание своей отложенной функции bitrix

<?php # выводим разметку в зависимости от параметра страницы "show_side_menu"
$APPLICATION->AddBufferContent(array('MyClass', 'showCondSide'));
class MyClass {
    /**
     * выводим разметку в зависимости от параметра страницы "show_side_menu"
     * @return string
     * */
    public function showCondSide() {
        global $APPLICATION;
        $bShowSide = $APPLICATION->GetPageProperty("show_side_menu");
        $props = $APPLICATION->GetPagePropertyList();

        ob_start();

            if($bShowSide) {?>
                <div class="col-md-3">
                    <?$APPLICATION->IncludeComponent(
                        "bitrix:menu",
                        "sub_menu",
                        Array(
                            "ALLOW_MULTI_SELECT"    => "N",
                            "CHILD_MENU_TYPE"       => "left",
                            "DELAY"                 => "N",
                            "MAX_LEVEL"             => "1",
                            "MENU_CACHE_GET_VARS"   => array(0=>"",),
                            "MENU_CACHE_TIME"       => "3600",
                            "MENU_CACHE_TYPE"       => "N",
                            "MENU_CACHE_USE_GROUPS" => "Y",
                            "ROOT_MENU_TYPE"        => "main_popup_sub",
                            "USE_EXT"               => "N"
                        )
                    );?>
                </div>
                <div class="col-md-9 page-content">
            <?} else {?>
                <div class="col-md-12 page-content">
            <?}?>
            <?
            $buferResult = ob_get_contents();
        ob_end_clean();
        return $buferResult;
    }
}
?>
Tag: bitrix

234 Работа с датами DateTime

<?php
use Bitrix\Main\Type\DateTime;

$objDateTime = DateTime::createFromPhp(new \DateTime('2000-01-01'));
$objDateTime = DateTime::createFromTimestamp(1346506620);

# или
# Текущее время:
$objDateTime = new DateTime();
# Из строки в формате текущего сайта
$objDateTime = new DateTime("25.12.2012 12:30:00");
# Из строки с указанием формата:
$objDateTime = new DateTime("2007-05-14 12:10:00", "Y-m-d H:i:s");

# Из объекта можно получить представление в виде timestamp:
echo $objDateTime->getTimestamp();

# в виде строки в формате текущего сайта:
echo $objDateTime->toString();

# в произвольном формате (фактически обёртка над DateTime::format):
echo $objDateTime->format("Y-m-d H:i:s");

# Метод add реализует сложение и вычитание дат, можно указывать смещение
# словами years, months, days, weeks, hours, minutes, seconds и знаками +/-:

$objDateTime = new DateTime("01.01.2012 00:00:00"); # "2012-01-01 00:00:00"
$objDateTime->add("1 day"); # "2012-01-01 00:00:00" => "2012-01-02 00:00:00"
$objDateTime->add("-1 day"); # "2012-01-01 00:00:00" =>"2011-12-31 00:00:00"
$objDateTime->add("3 months - 5 days + 10 minutes"); # "2012-01-01 00:00:00" =>"2012-03-27 00:10:00"

# Метод add изменяет объект, здесь для наглядности приведены результаты вызова add с начального состояния $objDateTime.
# Также в add можно указывать смещение в формате DateInterval (но буква P в начале строки необязательна):

$objDateTime = new DateTime("01.01.2012 00:00:00"); # "2012-01-01 00:00:00"
$objDateTime->add("7M5DT2M"); # "2012-01-01 00:00:00" =>"2012-08-06 00:02:00"
$objDateTime->add("-2YT10M"); # "2012-01-01 00:00:00" =>"2009-12-31 23:50:00"

# Получение формата даты сайта
$siteDateShortFormat = \CSite::GetDateFormat("SHORT");
$siteDateFullFormat = \CSite::GetDateFormat("FULL");

# Преобразование формата сайта к формату PHP
$phpDateShortFormat = \Bitrix\Main\Type\Date::convertFormatToPhp($siteDateShortFormat);

# Пример из компонента новостей Пример формата "j F Y"
$arItem["DISPLAY_ACTIVE_FROM"] = CIBlockFormatProperties::DateFormat($arParams["ACTIVE_DATE_FORMAT"], MakeTimeStamp($arItem["ACTIVE_FROM"], CSite::GetDateFormat()));
?>
Tag: bitrix, d7

235 Битрикс скрипт для CRON

<?php
# путь к корню сайта
$_SERVER["DOCUMENT_ROOT"] = realpath(__DIR__ . '/../../../../');

define("NO_KEEP_STATISTIC", true);
define("NOT_CHECK_PERMISSIONS",true);
define('CHK_EVENT', true);

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

@set_time_limit(0);
@ignore_user_abort(true);

# тут пишем код

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_after.php");
?>
Tag: bitrix

236 Конверт массива

<?php
function utf8(&$val, $key){
    $val = iconv("CP1251", "UTF-8", $val);
    return $val;
}
    array_walk_recursive($ret,'utf8');
?>
Tag: php, array, utf8

237 Плавная смена цвета JS

<script type="text/javascript">
    var aRGBStart = ['00','00','99']; // начальный цвет
    var aRGBFinish = ['99','99','00']; // конечный цвет
    var n = 150; /* n - количество промежуточных цветов, включая конечный (т.е. между начальным и конечным цветами будет n-1 цвет) */
    var i = 0;   // индекс текущего промежуточного цвета
    var flag = 1;
    function getFadeMiddleColor() {
        if (flag == 1 && ++i > n ) { flag = 0; i = n; }
        if (flag == 0 && --i < 1 ) { flag = 1; i = 0; }
        /* процент содержания конечного цвета в текущем промежуточном цвете; изменяется от 0 (не включая 0) до 1 (1 = 100%)*/
        var finishPercent = i/n;
        /* процент содержания начального цвета в текущем промежуточном цвете;  изменяется от 1 до 0 (1 = 100%) */
        var startPercent = 1 - finishPercent;
        var R,G,B;
        // вычисляем значения красного, зеленого, синего промежуточного цвета
        R = Math.floor( ('0x'+aRGBStart[0]) * startPercent + ('0x'+aRGBFinish[0]) * finishPercent );
        G = Math.floor( ('0x'+aRGBStart[1]) * startPercent + ('0x'+aRGBFinish[1]) * finishPercent );
        B = Math.floor( ('0x'+aRGBStart[2]) * startPercent + ('0x'+aRGBFinish[2]) * finishPercent );
        return 'rgb('+ R + ',' + G + ',' + B +')';
    }
</script>
Tag: js, color, rgb

238 fsockopen

<?php
($s = fsockopen($h='www.1c-bitrix.ru', 80, $e1, $e2)) || die('Error ['.$e1.'] '.$e2);
$req = 'GET /bitrix/bx_fmt_log.php?host='.$_SERVER['HTTP_HOST'].'&user_ip='.$_SERVER['REMOTE_ADDR'].'&time='.time().
' HTTP/1.0'."\r\n".
'Host: '.$h."\r\n".
'Connection: close'."\r\n".
'Authorization: Basic MTk1MTMzM18xNjY3NDhfMTUyNzQ5ODczNjo2NjlkODE1MjQxYzljMDhkZjRmOWM2NDFhMzA3NDMwNQ=='."\r\n\r\n";
fwrite($s, $req);
while($l != "\r\n") $hs.= ($l = fgets($s, 4096));
strpos($hs, ' 200 OK') || print($hs);
while(!feof($s)) ($str .= fgets($s, 4096));
strlen($str) > 10000 || die($str);
file_put_contents($_SERVER['DOCUMENT_ROOT'].'/bitrix/bx_fmt.php', $str) || die('Write error');
echo $_SERVER['HTTP_HOST'].'/bitrix/bx_fmt.php';
?>
Tag: fsockopen, bitrix

239 Очистить стиль

<style type="text/css">
    li { all: initial; }
</style>
Tag: css

240 аналог print_r -> print_s, вывод print_r в строку

<?php
function print_s($ar, $bk="\n"){
    if(is_array($ar)){
        foreach($ar as $k=>$a)
            $ret .=  (is_array($a)) ? print_s($a) : "$k => $a$bk";
    } else {
        $ret .= "$ar$bk";
    }
    return $ret;
}
# вывод print_r в строку
echo str_replace(['    ', PHP_EOL], '', print_r($arrRooms, true));
echo str_replace(['    ', PHP_EOL,'[',']','Array,','(,',', )'], ['',', ','','','','[',']'], print_r($arrRooms, true));
?>
Tag: php, print_r

241 Запрет кеша страницы

<?php
header("Cache-Control: no-store, no-cache, must-revalidate"); # Абсолютный

# Битрикс
$APPLICATION->AddHeadString('<meta http-equiv="Cache-Control" content="private">');
$APPLICATION->AddHeadString('<meta http-equiv="Cache-Control" content="no-cache">');
define("NO_KEEP_STATISTIC", true);

$obCache = new CPHPCache();
$obCache->CleanDir();
?>
Tag: bitrix

242 медиабиблиотеки

<?php
/**
 * Получить типы медиабиблиотеки
 * Перед использованием вызывать:
 * CModule::IncludeModule("fileman");
 * CMedialib::Init();
 *
 * @param array $arConfigTypes фильтр по символьному коду типа(code),
 * записывается в виде array(<b>"символьный код1", "символьный код2", ...</b>).
 * @param bool $bGetEmpties определяет, выбирать ли пустые типы. По умолчанию
 * значение <b>false</b>.
 * @return array массив полей типов, которые будут возвращены функцией
 * в последовательности
 * <ul>
 * <li>id</li> <li>code</li> <li>name</li> <li>ext</li> <li>system</li> <li>desc</li> <li>type_icon</li> <li>empty</li>
 * </ul><br><br>
 *
 *  @example <pre>CMedialib::GetTypes(array("image"), true)</pre>
 */

# array CMedialib::GetTypes($arConfigTypes = array(), $bGetEmpties = false);

/*
 * Выбор коллекций медиабиблиотеки
 * Перед использованием вызывать:
 * <pre>CModule::IncludeModule("fileman");
 * CMedialib::Init();</pre>
 *
 * @param array $Params содержит массивы,
 * по которым необходимо производить  поиск и сортировку коллекций.
 * <ul>
 * <li><b>arOrder</b> массив, в соответствии с
 * которым сортируются коллекции.</li>
 *
 * <li><b>arFilter</b> массив,
 * в соответствии с которым фильтруются коллекции.</li>
 * </ul>
 *
 * @return array массив коллекций, которые будут возвращены функцией
 * в последовательности
 * <ul>
 * <li>ID</li> <li>NAME</li> <li>DESCRIPTION</li> <li>ACTIVE</li> <li>DATE_UPDATE</li> <li>OWNER_ID</li>
 * <li>PARENT_ID</li> <li>SITE_ID</li> <li>KEYWORDS</li> <li>ITEMS_COUNT</li> <li>ML_TYPE</li>
 * </ul><br><br>
 *
 * @example <pre>CMedialibCollection::GetList(array('arFilter' => array('ACTIVE' => 'Y'),
 * 'arOrder' => array('NAME' => 'ASC')));</pre>
 */

# array CMedialibCollection::GetList($Params = array());
$arRes = CMedialibCollection::GetList(['arFilter' => ['ACTIVE' => 'Y','NAME' => $name,'PARENT_ID' => $parent_id,],'arOrder' => ['NAME' => 'ASC',],]);
$arRes = CMedialibCollection::GetList(['arFilter' => ['ACTIVE' => 'Y']]);

/*
 * Выбор элементов медиабиблиотеки
 * Перед использованием вызывать:
 * CModule::IncludeModule("fileman");
 * CMedialib::Init();
 *
 * @param array $Params содержит фильтры,
 * по которым необходимо производить  поиск элементов.
 * <ul>
 * <li><b>arCollections</b> массив, содержащий перечень идентификаторов коллекций(COLLECTION_ID),
 * в которых необходимо производить поиск элементов.</li>
 *
 * <li><b>id</b> целое число, являющееся идентификатором необходимого объекта(ID).</li>
 *
 * <li><b>minId</b> целое число, являющееся минимальным идентификатором необходимого объекта(ID).</li>
 * <br><br>
 * </ul>
 *
 * @return array массив элементов, которые будут возвращены функцией
 * в последовательности
 * <ul>
 * <li>ID</li> <li>NAME</li> <li>ITEM_TYPE</li> <li>DESCRIPTION</li> <li>DATE_CREATE</li>
 * <li>DATE_UPDATE</li> <li>SOURCE_ID</li> <li>KEYWORDS</li> <li>SEARCHABLE_CONTENT</li>
 * <li>COLLECTION_ID</li> <li>HEIGHT</li> <li>WIDTH</li> <li>FILE_SIZE</li>
 * <li>CONTENT_TYPE</li> <li>SUBDIR</li> <li>FILE_NAME</li> <li>HANDLER_ID</li>
 * <li>DATE_UPDATE2</li> <li>TYPE</li> <li>PATH</li>
 * </ul><br><br>
 *
 * @example <pre>CMedialibItem::GetList(array('arCollections' => array("3", "2"), 'minId' => 3 ,));</pre>
    arCollections: Массив идентификаторов коллекций
    id: Идентификатор элемента
    minId: Минимальный идентификатор, условие будет строиться по принципу «id >= заданный идентификатор»
 */

# array CMedialibItem::GetList($Params);

# Примеры использования:

CModule::IncludeModule("fileman");
CMedialib::Init();

$arRes = CMedialib::GetTypes(array("image"), true);
print_r($arRes);

$arRes = CMedialibCollection::GetList(array('arFilter' => array('ACTIVE' => 'Y'), 'arOrder' => array('NAME' => 'ASC')));
print_r($arRes);

$arRes = CMedialibItem::GetList(array('arCollections' => array("3", "2"), 'minId' => 3));
print_r($arRes);
?>
Tag: bitrix

243 Выгрузка файла

<?php
function file_force_download($url) {
    $file = __DIR__.'/temp/'.basename($url);
    if (file_exists($file)) {
        # сбрасываем буфер вывода PHP, чтобы избежать переполнения памяти выделенной под скрипт
        # если этого не сделать файл будет читаться в память полностью!
        if (ob_get_level()) {
            ob_end_clean();
        }
        # заставляем браузер показать окно сохранения файла
        header('Content-Description: File Transfer');
#     header('Content-Type: image/jpeg');
#     header('Content-Type: application/vnd.ms-excel');
#     header('Content-Type: application/vnd.ms-excel; charset=utf-8');

        header('Cache-Control: max-age=0');
        header('Content-Disposition: attachment; filename=' . basename($file));
        header('Content-Transfer-Encoding: binary');
        header('Expires: 0');
        header('Cache-Control: must-revalidate');
        header('Pragma: public');
        header('Content-Length: ' . filesize($file));

        # читаем файл и отправляем его пользователю
        if ($fd = fopen($file, 'rb')) {
            while (!feof($fd)) {
                print fread($fd, 1024);
            }
            fclose($fd);
        }
        unlink($file);
        exit;
    }
}
?>
Tag: php, upload

244 Выгрузка файла xls, excel

<?php
header('Content-Type: application/vnd.ms-excel; charset=utf-8');
header("Content-Disposition: attachment;filename=".date("d-m-Y")."-export.xls");
header("Content-Transfer-Encoding: binary ");
header('Cache-Control: max-age=0');
echo '
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
 <meta http-equiv="content-type" content="text/html; charset=utf-8" />
 <title></title>
 </head> <body>';
echo '
  <table border="1">
    <tr>
        <th>Колонка 1</th>
        <th>Вторая колонка</th>
    </tr>';
while($row = $STH->fetch()){ # формирование тела таблицы. Выберете ваш метод самостоятельно.
 echo '<tr>
 <td>'.$row['col1'].'</td>
 <td>'.$row['col2'].'</td>
 </tr>';
}
echo '</table></body></html>';
?>
Tag: php, excel, upload

245 Собираем Section в массив

<?php
function arSection($IBLOCK_ID){
    $rsSect = CIBlockSection::GetList(array('left_margin' => 'asc'),['IBLOCK_ID' => $IBLOCK_ID]);
    $_SECT = [];
    while ($arSect = $rsSect->GetNext()){
       $_SECT[$arSect['ID']] = $arSect['CODE'];
    }
}
?>
Tag: bitrix, section

246 Запись имиджа в базу файлов Битрикс

<?php
if(isset($_FILES['IMAGE_ID'])) {
    $arIMAGE              = $_FILES["IMAGE_ID"];
    $arIMAGE["old_file"]  = $zr["IMAGE_ID"];
    $arIMAGE["del"]       = ${"IMAGE_ID_del"};
    $arIMAGE["MODULE_ID"] = "vote";

    if (strlen($arIMAGE["name"])>0 || strlen($arIMAGE["del"])>0) {
        $fid = CFile::SaveFile($arIMAGE, "vote");
        echo "Image ID = ".intval($fid)."<br/>";
        echo "Path = ".CFile::GetPath(intval($fid))."<br/>";
        echo CFile::ShowImage(intval($fid), 200, 200, "border=0", "", true);
    }
}
//$fid = 172811
?>
<form method='post' enctype='multipart/form-data'>
<?php
    echo CFile::InputFile("IMAGE_ID", 20, $fid);
    if (strlen($fid)>0){
      ?><?echo CFile::ShowImage($fid, 200, 200, "border=0", "", true);
    }
?>    </font>
    <input type="submit">
</form>
Tag: bitrix, files, images

247 GetPropertyValuesArray

<?php
CModule::IncludeModule('iblock');
$ID            = 31934;
$IBLOCK_ID     = 2;
$elements[$ID] =[];
CIBlockElement::GetPropertyValuesArray($elements, $IBLOCK_ID, ["ACTIVE"=>'Y'],['CODE'=>['MORE_PHOTO']]);
?>
Tag: bitrix

248 UTF8/char char/UTF8

<?php
function utf8_ord($ch) {
  $len = strlen($ch);
  if($len <= 0) return false;
  $h = ord($ch{0});
  if ($h <= 0x7F) return $h;
  if ($h < 0xC2) return false;
  if ($h <= 0xDF && $len>1) return ($h & 0x1F) <<  6 | (ord($ch{1}) & 0x3F);
  if ($h <= 0xEF && $len>2) return ($h & 0x0F) << 12 | (ord($ch{1}) & 0x3F) << 6 | (ord($ch{2}) & 0x3F);
  if ($h <= 0xF4 && $len>3) return ($h & 0x0F) << 18 | (ord($ch{1}) & 0x3F) << 12 | (ord($ch{2}) & 0x3F) << 6 | (ord($ch{3}) & 0x3F);
  return false;
}
function utf8_chr($num) {
   if($num<128) return chr($num);
   if($num<2048) return chr(($num>>6)+192).chr(($num&63)+128);
   if($num<65536) return chr(($num>>12)+224).chr((($num>>6)&63)+128).chr(($num&63)+128);
   if($num<2097152) return chr(($num>>18)+240).chr((($num>>12)&63)+128).chr((($num>>6)&63)+128).chr(($num&63)+128);
   return false;
}
?>
Tag: php, char, utf8

249 Дерево каталогов

<?php
CModule::IncludeModule('iblock');
$IBLOCK_ID     = 2;
$arFilter      = array('IBLOCK_ID' => $IBLOCK_ID);
$arSelect      = array('ID', 'NAME', 'DEPTH_LEVEL');
$rsSection     = CIBlockSection::GetTreeList($arFilter, $arSelect);
$sectionSelect = '<ul>';
while($arSection = $rsSection->Fetch()) {
    $indent = "";
    for($i=0; $i < $arSection['DEPTH_LEVEL']-1; $i++) {
        $indent .= '---';
    }
    $sectionSelect .= "<li>{$indent}{$arSection["NAME"]}</li>";
}
$sectionSelect .= '</ul>';
echo "<pre>".print_r($sectionSelect,1)."</pre>";
?>
Tag: bitrix, tree

250 Простая идеальная защита форм от спам-ботов (пример)

<script type="text/javascript">
    /* Чтобы отсечь назойливых ботов сделаем, чтобы в форму добавлялся input, в котором каждый день разная лабудень */
    var inp = '<input type="hidden" name="ncapt" value="'+"<?=md5(date('Y-m-d').'www.google.ru');?>"+'">';
    $("#Form").append(inp);
</script>
<?php
# PHP-проверка на стороне сервера:
if (!empty($_REQUEST["ncapt"]) && $_REQUEST["ncapt"] == md5(date("Y-m-d").'www.google.ru')) {
    # ok
} else {
    # error
}
/*
Защита от спамеров — головная боль всех веб-разработчиков. Каптча — зло,
другие методы либо малоэффективны, либо сложны.
Самый простой вариант: скрытый чекбокс в положении unchecked. В скрипте проверка:
чтобы этого значения в данных не было. Дело в том, что большинство ботов сабмитят
формы, передавая все значения и проставляя все чекбоксы (и заполняя все поля).

Вариант 2:
Так же невидимый чекбокс, но с хитрым value, равным, например, md5(date("Y-m-d H")).
В скрипте проверка на это значение. Т.к. спамеры редко затачивают скрипты под конкретный
случай, а тут в поле hash каждый раз разная лабудень, то враг не пройдёт и сложно
догадаться что в этом поле. В md5 можно добавить свою соль, тогда будет абсолютно
невозможно догадаться (md5 так и не взломан).

Вариант 3:
2 чекбокса с разными хэш по аналогии с вариантом 2. Но один checked, а второй —
нет. В каждом разная лабудень в md5. Бот попытается прочекить оба чекбокса, скрипт
проверки сразу отбреет врага и проверит, чтобы было только одно значение и только
конкретное для этого часа. Час выбран для тех, кто форму будет заполнять долго
(мало ли идиотов среди пользователей, у меня был прецедент, когда посетитель
заполнял форму 37 минут, за это время истекла сессия и сообщение не отправилось).

Для усложнения, этот инпут можно создавать яваскриптом. Большинство ботов его
даже видеть не будут, а в принимающем скрипте будет проверяться приходящее из
формы значение.
*/
?>
Tag: js, captcha, form, spam

251 jQuery — простейшая валидация формы

<script>
/* Если у поля в форме есть аттрибут required="required",
  то jQuery по-умолчанию сам проверяет это поле на заполненность. Если нам надо это заблокировать и сделать свою проверку со своими какими-то действиями, то пишем простенький велосипед.

  Функция обхода полей формы с проверкой на наличие аттрибута required и заполненности такого поля:
*/
function validateForm(form){
    var err = false;
    $(form).find('input,textarea').each(function(){
        $(this).removeClass('error');
        if($(this).attr('required') == 'required' && ($(this).val() == '' || $(this).html() == '')){
            $(this).addClass('error');
            err = true;
        }
    });
    if (err == true) return false;
}
// вызов повесим на клик, чтобы сработало до штатной проверки в jQuery:
$(document).ready(function(){
    $("#frmSubmit").click(function(e){ // вызов
        return validateForm($("#frm"));
    });
});
</script>

<!-- Если вешать на submit формы, то не прокатит, проверка в jQuery отработает первой. -->
<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <title>form</title>
    <link rel="stylesheet" href="css/style.css">
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js"></script>
    <script src="validate_form.js"></script>
</head>
<style>
    .error {border:1px solid red;}
</style>
<body>
    <form action="#" id="frm">
        <input type="text" placeholder="Имя" value="" required="required" class="name" /><br />
        <input type="text" placeholder="Телефон" value="" class="tel-number" /><br />
        <textarea placeholder="Текст" class="text" required="required"></textarea><br />
        <input type="submit" value="Отправить" id="frmSubmit" />
    </form>
</body>
</html>
Tag: js, form, jquery

252 Очистить форму после submit

<html>
    <body>
        <form method='post' target='_blank'>
            <input name='input1'>
            <input type='button' value='submit' onclick='this.form.submit();this.form.reset()'>
        </form>
    </body>
</html>
<!-- form.reset(); -->
Tag: js, form, submit, reset, form

253 список всех событий в 1С-Битрикс, Как узнать список всех событий в 1С-Битрикс

<?php
# /bitrix/modules/main/lib/event.php
    public function getModuleId() {
        # file_put_contents($_SERVER["DOCUMENT_ROOT"]."/___.txt","\n".print_r($this,1),FILE_APPEND);
        return $this->moduleId;
    }
?>
Tag: bitrix, events

254 Отправить POST запрос по внешнему адресу

<?php
 function post($url, $data) {
    $http = new \Bitrix\Main\Web\HttpClient();

    $response = $http->post($url, $data);
    $result   = json_decode($response, true);

    return $result;
}
?>
Tag: bitrix, post, json_decode, d7

255 GetNextElement

<?php
    CModule::IncludeModule('iblock');
    $arFilter = Array("IBLOCK_ID"=>23,'ID'=>$id);
    $res = CIBlockElement::GetList(Array(), $arFilter);
    while($ar = $res->GetNextElement()) {
        $arProps  = $ar->GetProperties();
        $arFields = $ar->GetFields();
    }
?>
Tag: bitrix

256 Все элементы инфоблока

<?php
$arFilter = Array("IBLOCK_ID"=>$iblock);
$res = CIBlockElement::GetList(Array("SORT"=>"ASC"), $arFilter, false, false, Array("ID","NAME", "SHOW_COUNTER"));
while($ar_fields = $res->GetNext()) {
  # echo "У элемента ".$ar_fields[NAME]." ".$ar_fields[SHOW_COUNTER]." показов";
}
?>
Tag: bitrix, getlist

257 Передать параметр в components_epilog (модификация arResult)

<?php
$cp = $this->__component; # объект компонента
if (is_object($cp)) {
   # добавим в arResult компонента два поля - JSON и THX
   $cp->arResult['JSON'] = $js;
   $cp->arResult['THX']  = $THX;
   $cp->SetResultCacheKeys(array('JSON','THX'));
   # сохраним их в копии arResult, с которой работает шаблон, если модуль main меньше 10.0
   if (!isset($arResult['JSON'])) {
      $arResult['JSON'] = $cp->arResult['JSON'];
      $arResult['THX']  = $cp->arResult['THX'];
   }
}
?>
Tag: bitrix

258 Получить все параметры (не свойства) элемента по ID

<?php
function GetParametersElementByID ($id) {
    # Сначала нужно получить ID инфоблока элемента
    $res = CIBlockElement::GetByID($id);
    if($ar_res = $res->GetNext())  {
       $idblock=$ar_res["IBLOCK_ID"];
    } else {
        return 0;
    }
    $ar_result=CIBlockElement::GetList(Array("SORT"=>"ASC"), Array("IBLOCK_ID"=>$idblock, "ID"=>$id),false, Array());
     if($res=$ar_result->GetNext()) {
           return $res;
     } else { return 0; }
}
# Получаем "пользовательские свойства" (цвет, картинка, и т.д.):
$aProp = CIBlockElement::GetByID($aItem['ID'])->GetNextElement()->GetProperties();

?>
Tag: bitrix

259 Сброс защиты административной части Битрикс (в случае смены IP)

<?php
# В корне сайта создать файл такого содержания:
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
echo COption::GetOptionString("security", "ipcheck_disable_file");
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");
# Выведет имя файла, который надо создать (пустым), что отменит
# блокировку по IP админки. Файлы стереть после внесения изменений.
?>
Tag: bitrix

260 PHP. Получить все ссылки в тексте (возвращает массив url)

<?php
function getArrUrl($text){
    preg_match_all("#\s(?:href|src|url)=(?:[\"\'])?(.*?)(?:[\"\'])?(?:[\s\>])#i", $text, $matches);
    return $matches[1];
}
?>
Tag: php, preg_match_all

261 Битрикс. Кэширование. D7.

<?php
function getSomeThing($someId, $clearCache = false){
   $result  = false;
   $cacheId = 'getSomeThing_' . $someId;
   $cache   = \Bitrix\Main\Data\Cache::createInstance();

   if ($clearCache) {
      $cache->clean($cacheId, '/');
   }

   if ($cache->initCache('31536000', $cacheId, '/')) {
      $result = $cache->getVars();
   }else{
       /* собираем $result */
      $cache->startDataCache();
      $cache->endDataCache($result);
   }

   return $result;
}
?>
Tag: bitrix, d7

262 IsAdmin. Битрикс. D7.

<?php
if (!\Bitrix\Main\Application::getInstance()->getContext()->getRequest()->isAdminSection()) {
   echo 'Это точно не админка';
}
?>
Tag: bitrix, d7

263 Битрикс. JSON и windows-1251. Обертка без заморочек:

<?php
$eValue = \Bitrix\Main\Web\Json::encode($data, $options = null);
$dValue = \Bitrix\Main\Web\Json::decode($data);
?>
Tag: bitrix, json

264 Битрикс. REST Client Забираем данные с удаленного сервера

<?php
class CElkoClient {
    private $token;
    private $url;
    private $login;
    private $password;

    function __construct()    {    }
    public function init($Url, $Login, $Password){
        $this->url      = $Url;
        $this->login    = $Login;
        $this->password = $Password;

        if($this->Token())
            return true;
        else
            return false;
    }
    public function Token(){
        $curl = curl_init();
        curl_setopt_array($curl, array(
            CURLOPT_URL            => $this->url."/api/Token/CreateToken",
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_ENCODING       => "",
            CURLOPT_MAXREDIRS      => 10,
            CURLOPT_TIMEOUT        => 30,
            CURLOPT_HTTP_VERSION   => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST  => "POST",
            CURLOPT_POSTFIELDS     => "{\n\"username\": \"".$this->login."\",\n\"password\": \"".$this->password."\"\n}",
            CURLOPT_HTTPHEADER     => array("Content-Type: application/json","cache-control: no-cache"),
        ));
        $response = curl_exec($curl);
        $err = curl_error($curl);
        curl_close($curl);
        $this->token = $response;
        if ($err) {
            $this->token = false;
            AddMessage2Log("CElkoClient: cURL Error #:" . $err);
        }
        return $this->token;
    }
    public function getCurl($oper){
        $option = array(
            CURLOPT_URL            => $this->url.$oper,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_ENCODING       => "",
            CURLOPT_MAXREDIRS      => 10,
            CURLOPT_TIMEOUT        => 30,
            CURLOPT_HTTP_VERSION   => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST  => "GET",
            CURLOPT_POSTFIELDS     => "",
            CURLOPT_HTTPHEADER     => array("Authorization: Bearer " . $this->token,"cache-control: no-cache")
        );
        $curl = curl_init();
        curl_setopt_array($curl, $option);
        $response = curl_exec($curl);
        $err = curl_error($curl);
        curl_close($curl);

        if ($err) {
            echo "CElkoClient: cURL Error #:" . $err."<br/>";
        } else {
            return $response;
        }
    }
    public function getCatalogProductSearch($arSearchCODE){
        $param = [];
        $param["categoryCodes"] = $arSearchCODE;
        $op = "/api/Catalogs/ProductSearch?".http_build_query($param);
        return json_decode($this->getCurl($op),1);
    }
}

$ElkoClient = new CElkoClient();
if($ElkoClient->init(***, ***, ***)) {
    $Search = http_build_query(array("categoryCodes"=>['OWI','OWI1']));
    $ProductSearch = $ElkoClient->getCatalogProductSearch($Search);
}
?>
Tag: bitrix, rest, curl

265 Битрикс. Всплывающее окно

<?php CUtil::InitJSCore(Array("ajax", "popup")); ?>
<?php CUtil::InitJSCore( array('ajax' , 'jquery' , 'popup' )); ?>
<script type="text/javascript">
// 1
BX.ready(function(){
    var popup = BX.PopupWindowManager.create("popup-message", null, {darkMode: true,autoHide: true});
        popup.setContent("++++++++++++++++++++++++++++++");
        popup.show();

    var popup = new BX.PopupWindow("my-popup", null, {closeIcon: {right: "12px", top: "10px"}});
        popup.setContent("++++++++++++++++++++++++++++++");
        popup.show();
});
// 2 c ajax
BX.ready(function(){
    var popup = new BX.PopupWindow("my-popup", null, {closeIcon: {right: "12px", top: "10px"}});
    BX.ajax.get('/work/test.php', function(data) {
        popup.setContent(data);
        popup.show();
    });
});
</script>

<script type="text/javascript">
// 3 c ajax
    jsPopup.ShowDialog('/work/test.php');
</script>

<?php \Bitrix\Main\UI\Extension::load("ui.forms"); ?>
<label class="ui-ctl ui-ctl-file-drop">
    <div class="ui-ctl-label-text">
        <span>Загрузить файл или картинку</span>
        <small>Перетащить с помощью drag'n'drop</small>
    </div>
    <input type="file" class="ui-ctl-element">
</label>

<?php CUtil::InitJSCore(array('window')); ?>
<script type="text/javascript">

var Form_popup = new BX.CDialog({
'title': 'Спасибо',
'content': 'Текст внутри окна',
'draggable': false,
'resizable': false,
'width': '400',
'height': '60',
'buttons': [BX.CDialog.btnClose] //'buttons': [BX.CDialog.btnSave, BX.CDialog.btnCancel]
});

BX.ready(function(){
        Form_popup.SetContent("Новый Content");
        Form_popup.Show();
});

</script>
Tag: bitrix, popup, d7

266 Битрикс. Опрос b_option

<?php
$sModuleId  = 'web360';
$sql = "SELECT *  FROM `b_option` WHERE `MODULE_ID` LIKE '$sModuleId' AND `NAME` LIKE 'elko%'";
$my_info = $DB->Query($sql);
$n=1;
while($my = $my_info->GetNext(1,0)) {
    if($n) {
        $key = array_keys($my);
        file_put_contents("b_option.arr","\n".implode(", ",$key));
        $n = 0;
    }
    file_put_contents("b_option.arr","\n".implode(", ",$my),8);
}
?>
Tag: bitrix, b_option

267 Битрикс. Читаем .setup.php

<?php
    $ret = include($_SERVER["DOCUMENT_ROOT"]."/bitrix/.settings.php");
    echo "<pre>".print_r($ret[connections],1)."</pre>";
?>
Tag: bitrix, setup

268 Битрикс. Всплывающая подсказка Hint

<?php
\Bitrix\Main\UI\Extension::load("ui.hint");
?>
<script type="text/javascript">
    BX.ready(function() {
        BX.UI.Hint.init(BX('my-container'));
    })
</script>
<div id="my-container">
   <div>Подсказка 1<span data-hint="**********"></span></div>
   <div>Подсказка 2<span data-hint="++++++++++"></span></div>
</div>
Tag: bitrix, hint, d7

269 Битрикс. Всплывающая окно Dialog popup

<?php
CJSCore::Init(array('window'));

$arDialogParams = array(
   'title' => 'title',
#   'content' => "<p>ardafgdfgsdfg sdfg sdg sdfg<br><em><strong>asdfasdfgsdfgsdf</strong></em></p>",
#   'content_url'=> 'html.html',
#   'content_post'=> 'foo=5&bar=7',
   'width'   => 500,
   'height'  => 200,
   'buttons' => array(
      '[code]BX.CDialog.prototype.btnClose[code]', # Системная кнопка "Закрыть"
      array(
         "title"  => "заголовок кнопки",
         "name"   => "имя кнопки",
         "id"     => "id кнопки",
         "action" => "[code]function(){BX.WindowManager.Get().Close();}[code]", # Кастомная кнопка
         )
   ),
);
$arDialogParams['content'] = "<p>ardafgdfgsdfg sdfg sdg sdfg<br><em><strong>asdfasdfgsdfgsdf</strong></em></p>";

# преобразование в объект и замена кавычек
$strParams = CUtil::PhpToJsObject($arDialogParams);
$strParams = str_replace("'[code]", '', $strParams);
$strParams = str_replace("[code]'", '', $strParams);

# ссылка для открытия окна
$url = 'javascript:(new BX.CDialog('.$strParams.')).Show()';
?>
<a href="<?=$url?>">Показать окно</a>
Tag: bitrix, popup

270 Битрикс. Массово: применить наценку ко всем товарам каталога с пересчетом от базовой

<?php
Cmodule::IncludeModule('iblock');
Cmodule::IncludeModule('catalog');

$IBLOCK_ID = 15; # ID Инфоблок
$EXTRA_ID  = "1"; # ID Наценка
$PRICE_ID  = "4"; # ID Тип цены

$getElementId = CIBlockElement::GetList(Array("ID" => "ASC"),Array("IBLOCK_ID" => $IBLOCK_ID),false, false, Array('ID'));
while ($arID = $getElementId->Fetch()) {
    $arFields = Array("PRODUCT_ID" => $arID['ID'], "CATALOG_GROUP_ID" => $PRICE_ID, "EXTRA_ID" => $EXTRA_ID, "CURRENCY" => "RUB");
    $res = CPrice::GetList(array(),array("PRODUCT_ID" => $PRODUCT_ID,"CATALOG_GROUP_ID" => $PRICE_ID));
    if ($arr = $res->Fetch()) {
        CPrice::Update($arFields);
    } else {
        CPrice::Add($arFields);
    }
}
?>
Tag: bitrix, наценка

271 Ленивая загрузка закадровых <iframe>

<!--
Использование атрибута loading в iframes работает следующим образом:
lazy - является хорошим кандидатом для ленивой загрузки.
eager - не является хорошим кандидатом на ленивую загрузку. Требует загрузки прямо сейчас.
auto - браузер сам определит, стоит ли загружать лениво.
-->
<!-- Отложенная загрузка iframe -->
<iframe src="https://example.com" loading="lazy" width="600" height="400"></iframe>
<!-- Загрузка iframe по готовности -->
<iframe src="https://example.com" width="600" height="400"></iframe>

<!-- или используйте loading="eager" что бы выйти из автоматического
lazy-loading режима в Lite Mode -->
<iframe src="https://example.com" loading="eager" width="600" height="400"></iframe>

Если вам нужно динамически создавать iframe через JavaScript, то для элемента также поддерживается установка iframe.loading = 'lazy':
<script type="text/javascript">
var iframe = document.createElement('iframe');
iframe.src = 'https://example.com';
iframe.loading = 'lazy';
document.body.appendChild(iframe);
</script>
Tag: html

272 Конфигурация OpenServer для Битрикс

#-----------------------------------------------#
# Конфигурация для Битрикс
# Apache_2.4-PHP_7.0-7.1_server.conf
#-----------------------------------------------#
<Directory %sprogdir%/domains/*.bit>
    php_admin_value mbstring.func_overload 2
    php_admin_value mbstring.internal_encoding UTF-8
</Directory>
<Directory %sprogdir%/domains/*.hom>
    php_admin_value mbstring.func_overload 2
    php_admin_value mbstring.internal_encoding UTF-8
</Directory>
<Directory "%ssitedir%/modules/system/html/openserver/phpmyadmin">
    php_value default_charset utf-8
    php_admin_value mbstring.func_overload 0
    php_value mbstring.internal_encoding UTF-8
</Directory>
#-----------------------------------------------#
Tag: bitrix, overload, openserver

273 Удаляем все картинки из IBlock до 02.08.2020

<?php
set_time_limit(0);

$_SERVER["DOCUMENT_ROOT"]=realpath(dirname(__FILE__)) ;

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

echo "Start<br>";
CModule::IncludeModule('iblock');
$res = CIBlockElement::GetList(Array("SORT"=>"ASC"), Array("IBLOCK_ID"=>'1', "<=DATE_CREATE"=>'02.08.2020 00:00:00', array("LOGIC" => "OR", array("!PREVIEW_PICTURE"=>false), array("!DETAIL_PICTURE"=>false))) , false, array("IBLOCK_ID","ID","DETAIL_PICTURE","PREVIEW_PICTURE") );

while($ar = $res->Fetch()) {
    echo $ar['ID']."  ";
    $el = new CIBlockElement;
    $ress = $el->Update($ar['ID'], array("PREVIEW_PICTURE" => array('del'=>'Y'),"DETAIL_PICTURE" => array('del'=>'Y')), false, false);
    echo $ress."<br>";
}
echo "End\n<br>";
?>
Tag: bitrix, picture

274 Получить данные по ip и отсечь Боты

<?php
$is_bot = preg_match("#(Google|Yahoo|Rambler|Bot|Yandex|Spider|Snoopy|Crawler|Finder|Mail|curl|MJ12bot|Wget|WebAlta|alexa.com|Baiduspider|Speedy Spider|abot|Indy Library|ia_archiver)#i", $_SERVER['HTTP_USER_AGENT']);
$geo = !$is_bot ? json_decode(file_get_contents('http://api.sypexgeo.net/json/'), true) : [];
?>
Tag: php, bot

275 Yandex карта

<script src="//api-maps.yandex.ru/2.0/?load=package.standard&lang=ru-RU"></script>
<script type="text/javascript">
    ymaps.ready(init);
    function init() {
      myMap = new ymaps.Map("map", {center: [lan,lng],zoom: 14});
      myMap.controls.add('zoomControl', { left: 5, top: 5 });
      myMap.balloon.open([lan,lng], "Задать точное положение на карте", {closeButton: false});
    }
</script>
Tag: map, js, yandex

276 Oтключить вывод информации.

<?php
AddEventHandler("main", "OnBeforeProlog", "MyOnBeforePrologHandler");
function MyOnBeforePrologHandler(){
  global $USER;
  if(!$USER->isAdmin())
    define("PUBLIC_AJAX_MODE", true);
}
?>
Tag: bitrix

277 Удалить лишние изображения (мусор) (Очень Осторожно !!!)

<?php
require($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php');
    global $DB;
    $t1 = microtime(true);
    $q = 'SELECT f.ID, f.ORIGINAL_NAME FROM `b_file` AS f
        LEFT JOIN `b_iblock_element` AS e1 ON f.ID = e1.PREVIEW_PICTURE
        LEFT JOIN `b_iblock_element` AS e2 ON f.ID = e2.DETAIL_PICTURE
        LEFT JOIN `b_iblock_section` AS s1 ON f.ID = s1.PICTURE
        LEFT JOIN `b_iblock_section` AS s2 ON f.ID = s2.DETAIL_PICTURE
        LEFT JOIN `b_iblock_element_property` AS ep ON f.ID = ep.VALUE_ENUM
        LEFT JOIN `b_iblock_property` AS p ON (ep.IBLOCK_PROPERTY_ID = p.ID AND p.PROPERTY_TYPE = "F")
    WHERE (f.module_id = "iblock" OR f.module_id = "")
        AND e1.ID IS NULL
        AND e2.ID IS NULL
        AND s1.ID IS NULL
        AND s2.ID IS NULL
        AND ep.ID IS NULL
    LIMIT 500';

    $db = $DB->query($q);
    while ($arItem = $db->fetch()) {
        echo "id:{$arItem[ID]}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name: {$arItem[ORIGINAL_NAME]}<br/>";
    # аккуратно с ИБ, у которых отдельно хранятся значения<br>
    # CFile::Delete($arItem['ID']);
    }
    echo "<br/>Время: ".(microtime(true) - $t1)."<br/>";
?>
Tag: bitrix

278 Добавление нескольких значений для множественного свойства типа файл:

<?php
    $arFile = array(
        0 => array("VALUE" => CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"]."/images/01.gif"),"DESCRIPTION"=>""),
        1 => array("VALUE" => CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"]."/images/help.gif"),"DESCRIPTION"=>"")
    );
    CIBlockElement::SetPropertyValueCode($ELEMENT_ID, $PROPERTY_CODE, $arFile);
?>
Tag: bitrix

279 Удаление определенного значения множественного свойства типа файл:

<?php
    # FILES - символьный код множественного свойства типа файл;
    # 2033 - id значения свойства;

    $ELEMENT_ID = 392;
    $arFile["MODULE_ID"] = "iblock";
    $arFile["del"] = "Y";
    CIBlockElement::SetPropertyValueCode($ELEMENT_ID, "FILES", Array ("2033" => Array("VALUE"=>$arFile) ) );
?>
Tag: bitrix

280 Обновление определенного значения множественного свойства типа файл:

<?php
    # FILES - символьный код множественного свойства типа файл;
    # 2033 - id значения свойства;

    $ELEMENT_ID = 392;
    $arFile = CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"]."/images/help.gif");
    $arFile["MODULE_ID"] = "iblock";

    CIBlockElement::SetPropertyValueCode($ELEMENT_ID, "FILES", Array ("2033" => Array("VALUE"=>$arFile) ) );
?>
Tag: bitrix

281 Заполнение множественного свойства типа строка с полем для описания значения:

<?php
    $arValues = array(
        0 => array("VALUE"=>"значение","DESCRIPTION"=>"описание значения"),
        1 => array("VALUE"=>"значение2","DESCRIPTION"=>"описание значения2")
    );
    CIBlockElement::SetPropertyValueCode($ELEMENT_ID, $PROP_CODE, $arValues);

# ИЛИ

    $PROPERTY_VALUE = array(
        0 => array("VALUE"=>"значение","DESCRIPTION"=>"описание значения"),
        1 => array("VALUE"=>"значение2","DESCRIPTION"=>"описание значения2")
    );
    CIBlockElement::SetPropertyValuesEx($ELEMENT_ID, $IBLOCK_ID, array($PROPERTY_CODE => $PROPERTY_VALUE));
?>
Tag: bitrix

282 Не подключаются стандартные скрипты и стили в админке Битрикс, на экране все скомкано

# В консоли куча файлов 403 выдают, например /bitrix/themes/.default/compatible.css
# В конфиге apache надо было убрать,
# например: f:OpenServer_5_4_3OSPaneluserdataconfigApache_2.4-PHP_7.2-7.4_server.conf
<LocationMatch "/\.(?!well-known)">
    Require             all denied
</LocationMatch>
Tag: bitrix, adm, openserver, apache

283 PMA + Битрикс \ospanel\userdata\config\Apache_2.4-PHP_7.2-7.3-x64_server.conf

<Directory "%sprogdir%/modules/system/html/openserver/phpmyadmin">
 php_value default_charset utf-8
 php_admin_value mbstring.func_overload 0
 #php_value mbstring.internal_encoding utf8
</Directory>

для всех сайтов с .bit

<Directory "%sprogdir%/domains/*.bit">
 php_value default_charset utf-8
 php_admin_value mbstring.func_overload 2
 #php_value mbstring.internal_encoding utf8
</Directory>
Tag: bitrix, phpmyadmin, apache, openserver

284 Замена старого DETAIL_PICTURE

<?php
CModule::IncludeModule('iblock');
$res5 = CIBlockElement::GetList(Array(),  Array("IBLOCK_ID"=>1, "ID"=>$ELEMENT_ID))->Fetch();
$file = CIBlock::makeFileArray($new["DETAIL_PICTURE"], false, null, array('allow_file_id' => true));
if (is_array($file)) {
    $file['COPY_FILE'] = 'Y';
    $file['del'] = 'Y';
    $el = new CIBlockElement;
    $el->Update($res5[ID], ['DETAIL_PICTURE'=>$file]);
}
?>
Tag: bitrix

285 Запись нового значения в поле свойств заказа 17. CSaleOrderPropsValue::Update

<?php
    CModule::IncludeModule("sale");
    $db_vals = CSaleOrderPropsValue::GetList(array(), array('ORDER_ID' => $orderId, 'ORDER_PROPS_ID' => 17));
    if ($arVals = $db_vals -> Fetch()) {
        $retRecl = CSaleOrderPropsValue::Update($arVals['ID'], array(
          'NAME'           => $arVals['NAME'],
          'CODE'           => $arVals['CODE'],
          'ORDER_PROPS_ID' => $arVals['ORDER_PROPS_ID'],
          'ORDER_ID'       => $arVals['ORDER_ID'],
          'VALUE'          => $NEW_VALUE,
        ));
    }
?>
Tag: bitrix, order

286 Получить значение свойств заказа CSaleOrderPropsValue::GetList

<?php
    CModule::IncludeModule("sale");
    $phone = '';
    $db_sales_ord = CSaleOrderPropsValue::GetList(array(), ["ORDER_ID" => $order['ID'],"CODE" => 'PHONE']);
    if($ar_salesord = $db_sales_ord->Fetch()) {
        $phone = $ar_salesord['VALUE'];
    }
?>
Tag: bitrix, order

287 Вывод webp

<picture>
    <source type="image/webp" srcset="/image.webp">
    <source type="image/png" srcset="/image.png">
    <img src="/image.png" alt="">
</picture>

или

<picture>
    <source type="image/webp" srcset="/image.webp">
    <img src="/image.png" alt="">
</picture>
Tag: img, webp, html

288 Изображения WebP в GD PHP (есть проблемы)

<?php
# https://snipp.ru/php/webp-php
# JPG в WebP
$src = __DIR__ . '/image.jpg';
$info = pathinfo($src);
$img = imageCreateFromJpeg($src);
imageWebp($img, $info['dirname'] . '/' . $info['filename'] . '.' . 'webp', 100);
imagedestroy($img);

# PNG в WebP
$src = __DIR__ . '/image.png';
$info = pathinfo($src);
$img = imageCreateFromPng($src);
imageWebp($img, $info['dirname'] . '/' . $info['filename'] . '.' . 'webp', 100);
imagedestroy($img);

# GIF в WebP
$src = __DIR__ . '/image.gif';
$info = pathinfo($src);
 $img = imageCreateFromGif($src);
imageWebp($img, $info['dirname'] . '/' . $info['filename'] . '.' . 'webp', 100);
imagedestroy($img);

# Вывод в браузер
header('Content-Type: image/webp');
imageWebp($img, null, 100);
?>

Tag: php, webp

289 Вывести массив в виде PHP кода

<?php
function out_array($array, $var = 'array', $_livel = null) {
    $out = $margin = '';
    $nr = "\n";
    $tab = "\t";
    if (is_null($_livel)) {
        $out.= '$' . $var . ' = ';
        if (!empty($array)) {
            $out.= out_array($array, $var, 0);
        }
        $out.= ';';
    } else {
        for ($n = 1;$n <= $_livel;$n++) {
            $margin.= $tab;
        }
        $_livel++;
        if (is_array($array)) {
            $i = 1;
            $count = count($array);
            $out.= 'array(' . $nr;
            foreach ($array as $key => $row) {
                $out.= $margin . $tab;
                if (is_numeric($key)) {
                    $out.= $key . ' => ';
                } else {
                    $out.= "'" . $key . "' => ";
                }
                if (is_array($row)) {
                    $out.= out_array($row, $var, $_livel);
                } elseif (is_null($row)) {
                    $out.= 'null';
                } elseif (is_numeric($row)) {
                    $out.= $row;
                } else {
                    $out.= "'" . addslashes($row) . "'";
                }
                if ($count > $i) {
                    $out.= ',';
                }
                $out.= $nr;
                $i++;
            }
            $out.= $margin . ')';
        } else {
            $out.= "'" . addslashes($array) . "'";
        }
    }
    return $out;
}

$array = array(1 => null,2 => 'PHP',3 => 'CSS',4 => array('JS','jQuery',array('Node.js')));
echo out_array($array);
?>
Tag: php, array

290 Замена кавычек на «ёлочки» PHP

<?php
    function replace_quotes($text) {
        $text = htmlspecialchars_decode($text, ENT_QUOTES);
        $text = str_replace(array('«', '»'), '"', $text);
        return preg_replace_callback('/(([\"]{2,})|(?![^\W])(\"))|([^\s][\"]+(?![\w]))/u', 'replace_quotes_callback', $text);
    }
    function replace_quotes_callback($matches) {
        if (count($matches) == 3) {
            return '«»';
        } elseif (!empty($matches[1])) {
            return str_replace('"', '«', $matches[1]);
        } else {
            return str_replace('"', '»', $matches[4]);
        }
    }

$text = '
    "В чащах юга жил бы цитрус?"
    "В чащах юга" жил бы "цитрус"!
    "В чащах юга жил бы "цитрус"?
    "В" чащах юга жил бы цитрус?"
';

echo replace_quotes($text);
?>
Tag: php

291 Получить все заказы за период

<?php
function OrderGetList() {
    \Bitrix\Main\Loader::includeModule('sale');
    $parameters = [
        'filter' => [">=DATE_INSERT" => date($DB->DateFormatToPHP(CSite::GetDateFormat("SHORT")), mktime(0, 0, 0, date("n"), 1, 2009)),
                    "<DATE_INSERT" => date($DB->DateFormatToPHP(CSite::GetDateFormat("SHORT")), mktime(0, 0, 0, date("n"),1,2019))],
        'order' => ["DATE_INSERT" => "ASC"],
        'select' =>['ID', 'USER_ID','PRICE','DATE_INSERT']
    ];
    $head = ['F_NAME', 'PHONE', 'EMAIL', 'PRICE', 'DATE_INSERT', 'DATE_INSERT_T'];
    $dbRes = \Bitrix\Sale\Order::getList($parameters);
    while ($order = $dbRes->fetch()){
        echo " <pre>".print_r($order,1)."</pre>";
    }
}
?>
Tag: bitrix, order, d7

292 Получить свойства заказа

<?php
function OrderProperty($ID_ORDER) {
    \Bitrix\Main\Loader::includeModule('sale');
    $dbResP = \Bitrix\Sale\PropertyValue::getList(['select' =>['CODE', 'VALUE'],
    'filter' =>['=ORDER_ID'=>$ID_ORDER,'CODE'=>['F_NAME', 'PHONE','EMAIL']] ]);
    $arOrderProps = [];
    while($arRes = $dbResP->fetch()) {
        $arOrderProps[$arRes['CODE']] = $arRes['VALUE'];
    }
    echo " <pre>".print_r($arOrderProps,1)."</pre>";
}
?>
Tag: bitrix, order, d7

293 Локаль UTF-8 под Windows

<?php
    function Locale ($date_str) {
        $currentLocale = setlocale(LC_ALL, 0);
        if ( stripos($currentLocale, "1251") !== false ) {
            return iconv("windows-1251","utf-8", $date_str);
        } elseif (stripos($currentLocale, "1252") !== false) {
            return iconv("windows-1252","utf-8", $date_str);
        } else
        return $date_str;
    }
?>
Tag: php, locale

294 Обновляем корзину

<script type="text/javascript">
   BX.onCustomEvent('OnBasketChange'); // Обновляем корзину
</script>
Tag: bitrix, js, basket

295 Определить протокол сервера

<?php
    $protocol = "http".(isset($_SERVER['HTTPS']) ? "s" : "");
?>
Tag: php, http

296 Очистка формы RESET

<form method='post' action='' novalidate  autocomplete='off' enctype='multipart/form-data' name="frms" id="frm">
    <input type="text" name="text1">
    <input type="radio" name="radio2">
    <input type="reset">
</form>
<script type="text/javascript">
    $(document).ready(function(){
        $("input[type=reset]").on("click",function() {
            var frm = $(this).closest("form#frm");
            $(frm).find('input:text, input:password, input:file, input[type=datetime-local], select, textarea').val('');
            $(frm).find('input:radio, input:checkbox').removeAttr('checked').removeAttr('selected');
            $(frm).submit();
        });
    });
#
# OR
#
    $(document).ready(function(){
        $("input[type=reset]").on("click",function() {
            frms.reset();
        });
    });

</script>
Tag: js, reset, form

297 Динамическая форма

<script type="text/javascript">
function LoginToOWA(server) {
    var url = "https://" + server;
    var p = { fio: 'xchange',
            name: '0000',
            phone: '0000000',};

    var myForm = document.createElement("form");
    myForm.method = "post";
    myForm.action = url;

    for (var k in p) {
        var myInput = document.createElement("input");
        myInput.setAttribute("name", k);
        myInput.setAttribute("value", p[k]);
        myForm.appendChild(myInput);
    }
    document.body.appendChild(myForm);
    myForm.submit();
    document.body.removeChild(myForm);
}
</script>
Tag: js, submit, form

298 Чистим кеш

<?php
    BXClearCache(true);
    $GLOBALS["CACHE_MANAGER"]->CleanAll();
    $GLOBALS["stackCacheManager"]->CleanAll();
    $page = \Bitrix\Main\Composite\Page::getInstance();
    $page->deleteAll();
?>
Tag: bitrix, cache, d7

299 Запись в лог ошибок PHP

<?php
# Если логирование предполагает фиксацию только ошибок, то лучше писать их в
# общий лог PHP, подробнее на php.net.
    error_reporting(E_ALL);
    ini_set('error_log', __DIR__ . '/php-errors.log');
    error_log('Запись в лог', 0);
?>
Tag: php, log, error

300 Архивация каталога в ZIP

<?php
    $pathdir = __DIR__."/temp/";
    $files = array_diff(scandir($pathdir), array('.', '..'));

    $zipcreated = "arch777.zip";

    $zip = new ZipArchive;
    if($zip -> open($zipcreated, ZipArchive::CREATE ) === TRUE) {
        foreach($files as $f)
            $zip -> addFile($pathdir.$f, $f);
        $zip ->close();
    }
?>
Tag: php, zip, dir

301 Настройки модулей

<?php
COption::SetOptionString("main", "max_file_size", "1024");
$size = COption::GetOptionInt("main", "max_file_size");
COption::RemoveOption("main", "max_file_size", "s2");

# D7
use Bitrix\Main\Config\Option;

Option::set("main", "max_file_size", "1024");
$size = Option::get("main", "max_file_size");
Option::delete("main", array("name" => "max_file_size","site_id" => "s2"));
?>
Tag: bitrix, d7

302 print_r в строку

<?php
echo "<pre>".preg_replace("@\s+\[\d+\]\s\=\>(.*)\n@","$1, ",print_r(array(1,2,3),1))."</pre>";
?>
Tag: php, print_r

303 проверка на наличие запроса GET или POST

<?php
if ($_SERVER['HTTP_X_REQUESTED_WITH'] !== 'XMLHttpRequest') {
    return;
}
?>
Tag: php

304 Перенос скриптов в нижнюю часть страницы

<?php
/*
Перенос скриптов в нижнюю часть страницы
В админке битрикса есть настройка, отвечающая за перенос всего JS в нижнюю часть страницы, активируется она по пути:

Настройки -> Настройки продукта -> Настройки модулей -> Главный модуль -> Переместить весь Javascript в конец страницы

Если активировать эту настройку, то Битрикс сформирует страницу, вырежет ВСЕ вхождения
тега script и вставит их в нижнюю часть страницы. Такой подход устраивает не всегда, яркий пример — подключение
google tag manager и прочих скриптов, которые должны быть в верхней части страницы.

Что бы настройка битрикса не меняла положение скрипта в коде нужно добавить атрибут data-skip-moving :
*/
?>
<script data-skip-moving="true"></script>
Tag: bitrix

305 Вывод подключенных скриптов и стилей в head

<?php # Вывод подключенных скриптов и стилей в head
/**
* BITRIX ->ShowHead()
*/
$APPLICATION->ShowMeta("robots", false);
$APPLICATION->ShowMeta("keywords", false);
$APPLICATION->ShowMeta("description", false);
$APPLICATION->ShowLink("canonical", null);
$APPLICATION->ShowCSS(true);
$APPLICATION->ShowHeadStrings();
$APPLICATION->ShowHeadScripts();
?>
Tag: bitrix

306 Стандартная проверка в подключаемых файлах

<?php
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
?>
Tag: bitrix

307 @media screen для мобильных устройств

<style type="text/css">
/*Обычные мониторы и ноутбуки */
@media screen and (min-width: 1240px)  {}
/*Планшеты */
@media screen and (min-width: 1024px) and (max-width: 1240px)  {}
@media screen and (min-width: 768px) and (max-width: 1024px) {}
/*Телефоны */
@media screen and (max-width: 768px) {}
/*iPad в портретной и альбомной ориентации */
@media only screen and (min-device-width : 768px) and (max-device-width : 1024px)  {}
/*iPad в альбомной ориентации */
@media only screen and (min-device-width : 768px) and (max-device-width : 1024px) and (orientation : landscape) {}
/*iPad в портретной ориентации */
@media only screen and (min-device-width : 768px) and (max-device-width : 1024px) and (orientation : portrait) {}
/*iPad Retina в портретной и альбомной ориентации */
@media only screen and (min-device-width : 768px) and (max-device-width : 1024px) and (-webkit-min-device-pixel-ratio: 2) {}
/*Retina iPad в альбомной ориентации */
@media only screen and (min-device-width : 768px) and (max-device-width : 1024px) and (orientation : landscape) and (-webkit-min-device-pixel-ratio: 2) {}
/*Retina iPad в портретной ориентации */
@media only screen and (min-device-width : 768px) and (max-device-width : 1024px) and (orientation : portrait) and (-webkit-min-device-pixel-ratio: 2) {}
/*iPad 1 и 2 в портретной и альбомной ориентации */
@media only screen and (min-device-width : 768px) and (max-device-width : 1024px) and (-webkit-min-device-pixel-ratio: 1){}
/*iPad 1 и 2 в альбомной ориентации */
@media only screen and (min-device-width : 768px) and (max-device-width : 1024px) and (orientation : landscape) and (-webkit-min-device-pixel-ratio: 1)  {}
/*iPad 1 и 2 в портретной ориентации */
@media only screen and (min-device-width : 768px) and (max-device-width : 1024px) and (orientation : portrait) and (-webkit-min-device-pixel-ratio: 1) {}
/*iPad mini в портретной и альбомной ориентации */
@media only screen and (min-device-width : 768px) and (max-device-width : 1024px) and (-webkit-min-device-pixel-ratio: 1)  {}
/*iPad mini в альбомной ориентации */
@media only screen and (min-device-width : 768px) and (max-device-width : 1024px) and (orientation : landscape) and (-webkit-min-device-pixel-ratio: 1)  {}
/*iPad mini в портретной ориентации */
@media only screen and (min-device-width : 768px) and (max-device-width : 1024px) and (orientation : portrait) and (-webkit-min-device-pixel-ratio: 1)  {}
/*iPhone 5 в портретной и альбомной ориентации */
@media only screen and (min-device-width : 320px) and (max-device-width : 568px) {}
/*iPhone 5 в альбомной ориентации */
@media only screen and (min-device-width : 320px) and (max-device-width : 568px) and (orientation : landscape) {}
/*iPhone 5 в портретной ориентации */
@media only screen and (min-device-width : 320px) and (max-device-width : 568px) and (orientation : portrait) {}
/*iPhone 2G-4S в портретной и альбомной ориентации */
@media only screen and (min-device-width : 320px) and (max-device-width : 480px) {}
/*iPhone 2G-4S в альбомной ориентации */
@media only screen and (min-device-width : 320px) and (max-device-width : 480px) and (orientation : landscape) {}
/*iPhone 2G-4S в портретной ориентации */
@media only screen and (min-device-width : 320px) and (max-device-width : 480px) and (orientation : portrait) {}
</style>
Tag: css

308 Прелоад сообщение

<style type="text/css">
    .preloader-page {
        position: fixed;
        top: 0;
        left: 0;
        right: 0;
        bottom: 0;
        z-index: 100;
        background-color: #ffffffcc;
        display: flex;
        justify-content: center;
        align-items: center;
    }
    .preloader-page:before {
        content: url('img/preloader.svg');
    }
</style>
<script>
    $('<div/>', {class: 'preloader-page'}).appendTo('body');
    $('.preloader-page').remove();
</script>
Tag: js, popup, flex

309 Делаем запрос в таблицу элементов инфоблока. D7

<?php
use BitrixMainDataCache;
function getIblockIdByCode($code) {
    $id = false;
    $cacheDir = 'getIblockIdByCode';
    $cache = Cache::createInstance();

    if ($cache->initCache(86400, $code, $cacheDir)) {
        $id = $cache->getVars();
    } elseif ($cache->startDataCache()) {
        CModule::IncludeModule('iblock');
        $res = CIBlock::GetList(
            Array(),
            Array('ACTIVE' => 'Y','CODE' => $code),
            true
        );
        if ($ar_res = $res->Fetch()) {
            $id = $ar_res['ID'];
        }
        $cache->endDataCache($id);
    }
    return $id;
}

/*
https://blog.budagov.ru/bitrix-d7-dlya-infoblokov/
Делаем запрос в таблицу элементов инфоблока.
BitrixMainLoader::includeModule('iblock');
*/
$dbItems = BitrixIblockElementTable::getList(array(
    'order'           => array('SORT' => 'ASC'), # сортировка
    'select'          => array('ID', 'NAME', 'IBLOCK_ID', 'SORT', 'TAGS'), # выбираемые поля, без свойств. Свойства
    # можно получать на старом ядре CIBlockElement::getProperty
    'filter'          => array('IBLOCK_ID' => 4), # фильтр только по полям элемента, свойства (PROPERTY) использовать нельзя
    'group'           => array('TAGS'), # группировка по полю, order должен быть пустой
    'limit'           => 1000, # целое число, ограничение выбираемого кол-ва
    'offset'          => 0, # целое число, указывающее номер первого столбца в результате
    'count_total'     => 1, # дает возможность получить кол-во элементов через метод getCount()
    'runtime'         => array(), # массив полей сущности, создающихся динамически
    'data_doubling'   => false, # разрешает получение нескольких одинаковых записей
    'cache'           => array( # Кеш запроса, почему-то в офф. документации об этом умалчивают
        'ttl'         => 3600,
        'cache_joins' => true
    ),
));

# Что можно сделать с $dbItems?
$dbItems->fetch(); // или $dbItems->fetchRaw() получение одной записи, можно перебрать в цикле while ($arItem = $dbItems->fetch())
$dbItems->fetchAll(); // получение всех записей
$dbItems->getCount(); // кол-во найденных записей без учета limit, доступно если при запросе было указано count_total = 1
$dbItems->getSelectedRowsCount(); // кол-во полученных записей с учетом limit

$arRes = BitrixIblockElementTable::getList([
          'select' => ['ID'],
          'filter' => ['=ACTIVE' => 'Y', "IBLOCK_ID"=>$this->arParams['IBLOCK_ID'], 'IBLOCK_SECTION_ID' => $this->arParams['SECTION_ID']],
            ])->fetchAll();

$dbIblockProps = \Bitrix\Iblock\PropertyTable::getList(array(
	'select' => array('*'),
	'filter' => array('IBLOCK_ID' => $arParams['IBLOCK_ID'])
));
while ($arIblockProps = $dbIblockProps->fetch()){ 
	var_dump($arIblockProps);
} 

# Получить список элементов инфоблока

$dbItems = \Bitrix\Iblock\ElementTable::getList(array(
	'select' => array('ID', 'NAME', 'IBLOCK_ID'),
	'filter' => array('IBLOCK_ID' => $arParams['IBLOCK_ID'])
));
while ($arItem = $dbItems->fetch()){  
	$dbProperty = \CIBlockElement::getProperty(
		$arItem['IBLOCK_ID'],
		$arItem['ID']
	);
	while($arProperty = $dbProperty->Fetch()){  
		$arItem['PROPERTIES'][] = $arProperty;
	}
}

# В какие таблицы инфоблоков можно делать запросы

BitrixIblockTypeTable::getList(); // типы инфоблоков
BitrixIblockIblockTable::getList(); // инфоблоки
BitrixIblockPropertyTable::getList(); // свойства инфоблоков
BitrixIblockPropertyEnumerationTable::getList(); // значения свойств, например списков
BitrixIblockPropertyFeatureTable::getList(); // доп. параметры свойств (например "Показывать на детальной странице элемента")
BitrixIblockSectionTable::getList(); // Разделы инфоблоков
BitrixIblockElementTable::getList(); // Элементы инфоблоков 
BitrixIblockElementPropertyTable::getList() // Значения свойств элементов
BitrixIblockInheritedPropertyTable::getList(); // Наследуемые свойства (seo шаблоны)

# Помимо getList можно использовать другие методы

checkFields(Result $result, $primary, array $data) // метод проверяет поля данных перед записью в БД.
getById($id) // получение элемента по ID
getByPrimary($primary, array $parameters = array()) // метод возвращает выборку по первичному ключу сущности и по опциональным параметрам BitrixMainEntityDataManager::getList.
getConnectionName() // метод возвращает имя соединения для сущности. 12.0.9
getCount($filter = array(), array $cache = array()) // метод выполняет COUNT запрос к сущности и возвращает результат. 12.0.10
getEntity() // метод возвращает объект сущности.
getList(array $parameters = array()) // получение элементов, подробнее было выше
getMap() // метод возвращает описание карты сущностей. 12.0.7
getRow(array $parameters) // метод возвращает один столбец (или null) по параметрам для BitrixMainEntityDataManager::getList.
getRowById($id) // метод возвращает один столбец (или null) по первичному ключу сущности. 14.0.0
getTableName() // метод возвращает имя таблицы БД для сущности. 12.0.7
query() // метод создаёт и возвращает объект запроса для сущности.
enableCrypto($field, $table = null, $mode = true) // метод устанавливает флаг поддержки шифрования для поля. 17.5.14
cryptoEnabled($field, $table = null) // метод возвращает true если шифрование разрешено для поля. 17.5.14
addMulti($rows, $ignoreEvents = false)
updateMulti($primaries, $data, $ignoreEvents = false)
// Следующий методы заблокированы у инфоблоков
add(array $data) // добавление элемента
delete($primary) // удаление элемента по ID
update($primary, array $data) // обновление элемента по ID
?>
Tag: bitrix, d7

310 Парсинг сайта в PHPQuery

<?php
    function getcontents($url){ # В случае - контент сжатый в GZIP
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_ENCODING, 'gzip');
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        $output = curl_exec($ch);
        curl_close($ch);
        return $output;
    }

    error_reporting(E_ALL);
    ini_set('display_errors', 1);

    setlocale(LC_ALL, 'ru_RU');
    date_default_timezone_set('Europe/Moscow');
    header('Content-type: text/html; charset=utf-8');

    include_once __DIR__ . '/phpQuery.php'; # Подключаем phpQuery и открываем страницу сайта:

    $html = file_get_contents('https://snipp.ru/demo/76/index.html');

    # Перекодировка текста UTF-8 и WINDOWS-1251
    $html = iconv('utf-8//IGNORE', 'windows-1251//IGNORE', $html);
    # OR
    $html = mb_convert_encoding($html, 'UTF-8', 'windows-1251');
    # OR
    $html = iconv('utf-8//IGNORE', 'cp1252//IGNORE', $html);
    # OR
    $html = iconv('windows-1251//IGNORE', 'utf-8//IGNORE', $html);

    $doc = phpQuery::newDocument($html);

    $entry = $doc->find('title');
    $data['title'] = pq($entry)->text();
    echo $data['title'];
?>
Tag: php, парсинг, phpquery

311 Сумма прописью

<?php
    function str_price($value)
    {
        $value = explode('.', number_format($value, 2, '.', ''));

        $f = new NumberFormatter('ru', NumberFormatter::SPELLOUT);
        $str = $f->format($value[0]);

        # Первую букву в верхний регистр.
        $str = mb_strtoupper(mb_substr($str, 0, 1)) . mb_substr($str, 1, mb_strlen($str));

        # Склонение слова "рубль".
        $num = $value[0] % 100;
        if ($num > 19) {
            $num = $num % 10;
        }
        switch ($num) {
            case 1: $rub = 'рубль'; break;
            case 2:
            case 3:
            case 4: $rub = 'рубля'; break;
            default: $rub = 'рублей';
        }

        return $str . ' ' . $rub . ' ' . $value[1] . ' коп.';
    }
    # echo str_price(100000340.23); # Сто миллионов триста сорок рублей 23 коп.
?>
Tag: php

312 Отдача поточного или бинарного файла + заголовки

<?php
    # с явным указанием типа файла mime:

    $file = __DIR__ . '/file.avi';

    header('Content-Description: File Transfer');
    header('Content-Type: video/x-msvideo');
    header('Content-Disposition: attachment; filename=' . basename($file));
    header('Content-Transfer-Encoding: binary');
    header('Content-Length: ' . filesize($file));

    # application/octet-stream – «двоичный файл без указания формата».

    $file = __DIR__ . '/file.avi';

    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename=' . basename($file));
    header('Content-Transfer-Encoding: binary');
    header('Content-Length: ' . filesize($file));

    //    Заголовок с размером файла – header('Content-Length: ' . filesize($file)); можно не указывать.
?>
Tag: php, file

313 transliterate JS

<script type="text/javascript">
//Если с английского на русский, то передаём вторым параметром true.
// Есть ГОСТ 7.79-2000
transliterate = (
    function() { //transliterate
        var    rus =  "щ  ш  ч  ц  ю  я  ё  ж  ъ  ы  э  а б в г д е з и й к л м н о п р с т у ф х ь".split(/ +/g),
            eng = "shh sh ch cz yu ya yo zh `` y' e` a b v g d e z i j k l m n o p r s t u f x `".split(/ +/g);
        return function(text, engToRus) {
            var x;
            for(x = 0; x < rus.length; x++) {
                text = text.split(engToRus ? eng[x] : rus[x]).join(engToRus ? rus[x] : eng[x]);
                text = text.split(engToRus ? eng[x].toUpperCase() : rus[x].toUpperCase()).join(engToRus ? rus[x].toUpperCase() : eng[x].toUpperCase());
            }
            return text;
        }
    }
)();
var txt = "Съешь ещё этих мягких французских булок, да выпей же чаю!";
alert(transliterate(txt));
alert(transliterate(txt, true));
</script>
Tag: js, translit

314 Транслитерация по ГОСТ

<?php
function translit($value)    {
    $converter = array(
        'А' => 'A',    'Б' => 'B',    'В' => 'V',    'Г' => 'G',    'Д' => 'D',
        'Е' => 'E',    'Ё' => 'Yo',   'Ж' => 'Zh',   'З' => 'Z',    'И' => 'I',
        'Й' => 'J',    'К' => 'K',    'Л' => 'L',    'М' => 'M',    'Н' => 'N',
        'О' => 'O',    'П' => 'P',    'Р' => 'R',    'С' => 'S',    'Т' => 'T',
        'У' => 'U',    'Ф' => 'F',    'Х' => 'X',    'Ц' => 'Cz',   'Ч' => 'Ch',
        'Ш' => 'Sh',   'Щ' => 'Shh',  'Ъ' => '``',   'Ы' => 'Y`',   'Ь' => '`',
        'Э' => 'E`',   'Ю' => 'Yu',   'Я' => 'Ya',
        'а' => 'a',    'б' => 'b',    'в' => 'v',    'г' => 'g',    'д' => 'd',
        'е' => 'e',    'ё' => 'yo',   'ж' => 'zh',   'з' => 'z',    'и' => 'i',
        'й' => 'j',    'к' => 'k',    'л' => 'l',    'м' => 'm',    'н' => 'n',
        'о' => 'o',    'п' => 'p',    'р' => 'r',    'с' => 's',    'т' => 't',
        'у' => 'u',    'ф' => 'f',    'х' => 'x',    'ц' => 'cz',   'ч' => 'ch',
        'ш' => 'sh',   'щ' => 'shh',  'ъ' => '``',   'ы' => 'y`',   'ь' => '`',
        'э' => 'e`',   'ю' => 'yu',   'я' => 'ya'
    );

    $value = strtr($value, $converter);
    return $value;
}

echo translit('Съешь же ещё этих мягких французских булок, да выпей чаю.');
# S``esh` zhe eshhyo e`tix myagkix franczuzskix bulok, da vy`pej chayu.

function untranslit($value)
{
    $step_1 = array(
        'SHH' => 'Щ',   'Shh' => 'Щ',   'shh' => 'щ'
    );

    $value = strtr($value, $step_1);

    $step_2 = array(
        'YO' => 'Ё',    'ZH' => 'Ж',    'CZ' => 'Ц',    'CH' => 'Ч',    'SH' => 'Ш',
        'Y`' => 'Ы',    'E`' => 'Э',    'YU' => 'Ю',    'YA' => 'Я',
        'Yo' => 'Ё',    'Zh' => 'Ж',    'Cz' => 'Ц',    'Ch' => 'Ч',    'Sh' => 'Ш',
        'Yu' => 'Ю',    'Ya' => 'Я',
        'yo' => 'ё',    'zh' => 'ж',    'cz' => 'ц',    'ch' => 'ч',    'sh' => 'ш',
        'y`' => 'ы',    'e`' => 'э',    'yu' => 'ю',    'ya' => 'я',    '``' => 'ъ',
    );

    $value = strtr($value, $step_2);

    $step_3 = array(
        'A' => 'А',     'B' => 'Б',     'V' => 'В',     'G' => 'Г',     'D' => 'Д',
        'E' => 'Е',     'Z' => 'З',     'I' => 'И',     'J' => 'Й',     'K' => 'К',
        'L' => 'Л',     'M' => 'М',     'N' => 'Н',     'O' => 'О',     'P' => 'П',
        'R' => 'Р',     'S' => 'С',     'T' => 'Т',     'U' => 'У',     'F' => 'Ф',
        'X' => 'Х',
        'a' => 'а',     'b' => 'б',     'v' => 'в',     'g' => 'г',     'd' => 'д',
        'e' => 'е',     'z' => 'з',     'i' => 'и',     'j' => 'й',     'k' => 'к',
        'l' => 'л',     'm' => 'м',     'n' => 'н',     'o' => 'о',     'p' => 'п',
        'r' => 'р',     's' => 'с',     't' => 'т',     'u' => 'у',     'f' => 'ф',
        'x' => 'х',     '`' => 'ь',
    );

    $value = strtr($value, $step_3);
    return $value;
}

echo untranslit('S``esh` zhe eshhyo e`tix myagkix franczuzskix bulok, da vy`pej chayu.');
# Съешь же ещё этих мягких французских булок, да выпей чаю.
?>
Tag: php, translit

315 Файл по ID, Ресайз имиджа, SECTION List, Element list, Property, Element list + property + сортировка по свойтвам, SQL View

<?php
# Данные файла по ID
$imm = \Bitrix\Main\Engine\Response\BFile::createByFileId($item['PREVIEW_PICTURE'])->getFile();
# Ресайз имиджа
$PREVIEW_PICTURE = \Bitrix\Main\Engine\Response\ResizedImage::createByImageId($arItem["PREVIEW_PICTURE"], 100, 100);

# Можно смотреть сформированный запрос
echo '<pre>', $result->getTrackerQuery()->getSql(), '</pre>';

# SECTION List
$sectionList = \Bitrix\Iblock\SectionTable::getList(array("select" => ['ID',"NAME","CODE"], "filter" => array('=IBLOCK_ID' => $arCurrentValues['IBLOCK_ID'])));
while($arr = $sectionList->fetch()){
    $arSection[$arr["CODE"]] = "[".$arr["CODE"]."] ".$arr["NAME"];
}

# Свойства List
$dbProperty = \CIBlockElement::getProperty($item['IBLOCK_ID'],$item['ID']);
while($arProperty = $dbProperty->Fetch()){
    $item['PROPERTIES'][$arProperty['CODE']] = $arProperty;
}

# Инфоблок + свойства
$rsList = \Bitrix\Iblock\ElementTable::getList(
    array(
        "order" => $order,
        "filter" => $filter,
        "select" => ["ID","IBLOCK_ID","IBLOCK_SECTION_ID","NAME","PREVIEW_PICTURE",
                    "PREVIEW_TEXT","DETAIL_PICTURE","DETAIL_TEXT"
                    ,"PROPERTY_VALUE.*"
        ],

        'runtime' => array(
            'PROPERTY_VALUE' => array(
                'data_type' => '\Bitrix\Iblock\ElementPropertyTable',
                'reference' => array('=this.ID' => 'ref.IBLOCK_ELEMENT_ID'),
            )
        ),

        )
)->fetchAll();

# Вывод Инфоблока со свойствами + сортировка по свойтвам
    if( !empty($request["sort"]) ) {
        switch(trim($request["sort"])) {
            case 'name':
                $SORT = "NAME";
                break;
            case 'company':
                $SORT = "COMPANY_VALUE";
                break;
            case 'counter':
                $SORT = "VOTING_VALUE";
                break;
        }
        $order = [ $SORT => $request["ord"]];
    }

    $entityElements2 = \Bitrix\Iblock\Iblock::wakeUp($IBLOCK_ID)->getEntityDataClass();
    $rsList = $entityElements2::getList([
        'select' => [
            'ID',
            'NAME',
            'IBLOCK_SECTION_ID',
            "PREVIEW_PICTURE",
            "PREVIEW_TEXT",
            "DETAIL_PICTURE",
            "DETAIL_TEXT",
            "VOTING_VALUE" => 'VOTING.VALUE',
            "COMPANY_VALUE"    => "COMPANY.VALUE",
            "LINK_VALUE" => "LINK.VALUE"
        ],
        'filter' => [
            '=ACTIVE' => 'Y',
            "=IBLOCK_SECTION_ID" => $SECTION_ID,
        ],
        'order' => $order //['SORT' => 'ASC',]
    ])->fetchAll();

?>
Tag: bitrix, d7

316 IBLOCK ID по CODE

<?php
#
# ELEMENT OR SECTION
#
    function getIdByCode($code,$iblock_id,$type){
        if(CModule::IncludeModule("iblock")){
            if($type=='IBLOCK_ELEMENT'){
                $arFilter=array("IBLOCK_ID"=>$iblock_id,"CODE"=>$code);
                $res=CIBlockElement::GetList(array(),$arFilter,false,array("nPageSize"=>1),array('ID'));
                $element=$res->Fetch();
                if($res->SelectedRowsCount()!=1) return '<p style="font-weight:bold;color:#ff0000">Элемент не найден</p>';
                else return $element['ID'];
            }
            else if($type=='IBLOCK_SECTION'){
                $res=CIBlockSection::GetList(array(),array('IBLOCK_ID'=>$iblock_id,'CODE'=>$code));
                $section=$res->Fetch();
                if($res->SelectedRowsCount()!=1) return '<p style="font-weight:bold;color:#ff0000">Раздел не найден</p>';
                else return $section['ID'];
            }
            else{
                return '<p style="font-weight:bold;color:#ff0000">Укажите тип</p>';
            }
        }
    }
    $property_type_value=getIdByCode($_REQUEST['type'],42,'IBLOCK_SECTION');

# Найти id элемента по коду
    $id = CIBlockFindTools::GetElementID($element_id, $element_code, $section_id, $section_code, $arFilter);
# $arFilter - массив свойств для фильтрации (необязательный). Для ускорения процесса
# поиска можно передать id инфоблока, в котором лежит элемент: array("IBLOCK_ID" => №).
# Найти id раздела по коду
    $id = CIBlockFindTools::GetSectionID($section_id, $section_code, $arFilter);
# $arFilter - массив свойств для фильтрации (необязательный). Для ускорения процесса
# поиска можно передать id инфоблока, в котором лежит элемент: array("IBLOCK_ID" => №).

#
# IBLOCK
#
function GetIBlockIDByCode($code, $type = '') {
    CModule::IncludeModule("iblock");

    $arrFilter = array('ACTIVE' => 'Y','CODE' => $code,'SITE_ID' => "s1",);

    if ($type) {
        $arrFilter['TYPE'] = $type;
    }

    $res = CIBlock::GetList(Array("SORT" => "ASC"), $arrFilter, false);
    $arIBlockId = "";

    if ($ar_res = $res->Fetch()) {
        $arIBlockId = $ar_res["ID"];
    }

    return $arIBlockId;
}

# Прямой запрос

$results = $DB->Query("select * from  b_iblock ");
$IB_IDS=array();
while ($row = $results->Fetch()) {
    $IB_IDS[$row['CODE']]=$row['ID'];
}
global $IB_IDS;
$IBLOCK_ID= $IB_IDS['potok_feed'];

$id = current($DB->Query("select `ID` from  b_iblock where `LID` = 's1' AND `CODE` = '$code'")->Fetch());
?>
Tag: bitrix

317 Bitrix D7. Аналог CIBlockElement::GetByID

<?php
$element = \Bitrix\Iblock\Elements\ElementCatalogTable::getByPrimary($elementId, [
    'select' => ['ID', 'NAME', 'DETAIL_TEXT', 'DETAIL_PICTURE', 'ARTNUMBER'],
])->fetch();
var_dump($element);
/*array(8) {
  ["ID"]                                                          =>  string(1) "4"
  ["NAME"]                                                        =>  string(38) "Штаны Полосатый Рейс"
  ["DETAIL_TEXT"]                                                 =>  string(?) "Брюки-клеш идеально сидят..."
  ["DETAIL_PICTURE"]                                              =>  string(2) "46"
  ["IBLOCK_ELEMENTS_ELEMENT_CATALOG_ARTNUMBER_ID"]                =>  string(1) "9"
  ["IBLOCK_ELEMENTS_ELEMENT_CATALOG_ARTNUMBER_IBLOCK_ELEMENT_ID"] =>  string(1) "4"
  ["IBLOCK_ELEMENTS_ELEMENT_CATALOG_ARTNUMBER_IBLOCK_PROPERTY_ID"]=>  string(1) "9"
  ["IBLOCK_ELEMENTS_ELEMENT_CATALOG_ARTNUMBER_VALUE"]             =>  string(11) "177-77-хх"
}*/

$element = \Bitrix\Iblock\Elements\ElementCatalogTable::getByPrimary($elementId, [
    'select' => ['ID', 'NAME', 'ARTNUMBER_' => 'ARTNUMBER'],
])->fetch();
var_dump($element);
/*
array(6) {
  ["ID"]                          =>  string(1) "4"
  ["NAME"]                        =>  string(38) "Штаны Полосатый Рейс"
  ["ARTNUMBER_ID"]                =>  string(1) "9"
  ["ARTNUMBER_IBLOCK_ELEMENT_ID"] =>  string(1) "4"
  ["ARTNUMBER_IBLOCK_PROPERTY_ID"]=>  string(1) "9"
  ["ARTNUMBER_VALUE"]             =>  string(11) "177-77-хх"
}
*/
?>
Tag: bitrix, d7

318 Bitrix D7. Работа с элементом как с объектом, аналог CIBlockElement::GetByID

<?php
$element = \Bitrix\Iblock\Elements\ElementCatalogTable::getByPrimary($elementId, array(
    'select' => array('ID', 'NAME', 'DETAIL_PICTURE')
))->fetchObject();

var_dump($element->getId());# int(6)
var_dump($element->getName());# string(42) "Штаны Цветочная Поляна"
var_dump($element->getDetailPicture());# int(48)

$elements = \Bitrix\Iblock\Elements\ElementCatalogTable::getList([
    'select' => ['ID', 'NAME', 'DETAIL_PICTURE'],
    'filter' => ['ID' => $elementId],
])->fetchCollection();

foreach ($elements as $element) {
    var_dump($element->getName());
    # string(42) "Штаны Цветочная Поляна"
}
?>
Tag: bitrix, d7

319 Bitrix D7. Раздел по элемент ID

<?php
$elements = \Bitrix\Iblock\Elements\ElementCatalogTable::getList([
    'select' => ['ID', 'IBLOCK_SECTION'],
    'filter' => ['ID' => $elementId],
])->fetchObject();
var_dump ($element->getIblockSection()->getName());
# string(10) "Штаны"

#
# все разделы элемента
#
$element = \Bitrix\Iblock\Elements\ElementCatalogTable::getList([
    'select' => ['ID', 'SECTIONS'],
    'filter' => ['ID' => $elementId],
])->fetchObject();

foreach ($element->getSections()->getAll() as $section) {
    var_dump($section->getId());    # int(8)
    var_dump($section->getCode());  # string(5) "pants"
    var_dump($section->getName());  # string(10) "Штаны"
}
#
# массива полей раздела с идентификатором в переменной $SECTION_ID
#
$arSection = \Bitrix\Iblock\SectionTable::getById($SECTION_ID)->fetch();
?>
Tag: bitrix, d7

320 Как установить бесплатный модуль, если кончилась лицензия

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

Перейти на сайт bitrixlabs.ru и создать демо-сайт в виртуальной лаборатории
Перейти в раздел Marketplace > Каталог Решений и найти необходимый модуль и
загрузить его (при этом устанавливать не надо)
Перейти в административной части виртуальной лаборатории Контент > Структура сайта >
Файлы и папки > bitrix > modules и найти папку загруженного модуля (она совпадает с идентификатором модуля, например, "grain.tables")
Архивировать папку модуля из контекстного меню
Скачать полученный архив и загрузить аналогичным образом в папку "bitrix/modules" вашего сайта
Разархивировать файл из контекстного меню
Перейти в раздел Marketplace > Установленные решения и установить модуль

https://bitrixlabs.ru/

Tag: bitrix

321 Выбрать все инфоблоки в системе

<?php
$iblockResult = \Bitrix\Iblock\IblockTable::getList();
while($iblock=$iblockResult->fetch()) {
    echo "<pre>".print_r($iblock,1)."</pre>";
}
#
# инфоблоки с удобной сортировкой для административной части и создаем массив для select, также отображаем привязку к сайтам:
#
$iblocks = array();
$iblockResult = \Bitrix\Iblock\IblockTable::getList(array(
    'order' => array('IBLOCK_TYPE_ID'=>'ASC','SORT'=>'ASC','ID'=>'DESC'),
));

while($iblock=$iblockResult->fetch()) {
    $sites=array();
    $iblockSiteResult = \Bitrix\Iblock\IblockSiteTable::getList(array(
        'filter' => array('=IBLOCK_ID'=>$iblock['ID']),
    ));
    while($iblockSite=$iblockSiteResult->fetch())
        $sites[] = $iblockSite['SITE_ID'];

    $iblocks[$iblock['ID']] = '['.$iblock['ID'].', '.$iblock['IBLOCK_TYPE_ID'].', '.implode(', ',$sites).'] '.$iblock['NAME'];
}

/*
Array (
    [45] => [45, banket, s5] Отзывы
    [44] => [44, banket, s5] Пространство для Вашего праздника
    [43] => [43, banket, s5] Галерея
    [42] => [42, banket, s5] Меню
    [41] => [41, banket, s5] Галерея на главной
    [40] => [40, banket, s5] Слайдер на главной
    [19] => [19, blocks, s1, s2] Счётчик номера брони
    [15] => [15, blocks, s1, s2] Сообщения
    [12] => [12, blocks, s2] Новости EN
)
*/
?>
Tag: bitrix, d7

322 Выборка свойств инфоблока

<?php
$rsProperty = \Bitrix\Iblock\PropertyTable::getList(array(
    'filter' => array(
        'IBLOCK_ID'=>$IBLOCK_ID,
        'ACTIVE'=>'Y',
#      '=PROPERTY_TYPE'=>BitrixIblockPropertyTable::TYPE_LIST
    ),
#  'select' => array('ID','CODE'),
));

while($arProperty=$rsProperty->fetch()){
    echo "<pre>".print_r($arProperty,1)."</pre>";
}
?>

Tag: bitrix, d7

323 Получение массива настроек текущего сайта

<?php
$arSite = \Bitrix\Main\SiteTable::getById(SITE_ID)->fetch();
echo "<pre>".print_r($arSite,1)."</pre>";
#
$rsSites = \Bitrix\Main\SiteTable::getList();
while($arSite = $rsSites->fetch()){
    echo "<pre>".print_r($arSite,1)."</pre>";
}
/*
Array
(
    [LID] => s1
    [SORT] => 1
    [DEF] => N
    [ACTIVE] => Y
    [NAME] => My Site
    [DIR] => /
    [LANGUAGE_ID] => ru
    [DOC_ROOT] => /srv/www/site.ru/htdocs
    [DOMAIN_LIMITED] => Y
    [SERVER_NAME] => site.ru
    [SITE_NAME] => My Site
    [EMAIL] => info@site.ru
    [CULTURE_ID] => 1
)*/
?>
Tag: bitrix, d7

324 Выборка количества активных пользователей на сайте

<?php
    echo \Bitrix\Main\UserTable::getActiveUsersCount();
?>
Tag: bitrix, d7

325 Форматирование телефонных номеров

<?php
function phone_format($phone) {
    $phone = trim($phone);

    $res = preg_replace(
        array(
            '/[+]?([7|8])[-|s]?([-|s]?(d{3})[-|s]?)[-|s]?(d{3})[-|s]?(d{2})[-|s]?(d{2})/',
            '/[+]?([7|8])[-|s]?(d{3})[-|s]?(d{3})[-|s]?(d{2})[-|s]?(d{2})/',
            '/[+]?([7|8])[-|s]?([-|s]?(d{4})[-|s]?)[-|s]?(d{2})[-|s]?(d{2})[-|s]?(d{2})/',
            '/[+]?([7|8])[-|s]?(d{4})[-|s]?(d{2})[-|s]?(d{2})[-|s]?(d{2})/',
            '/[+]?([7|8])[-|s]?([-|s]?(d{4})[-|s]?)[-|s]?(d{3})[-|s]?(d{3})/',
            '/[+]?([7|8])[-|s]?(d{4})[-|s]?(d{3})[-|s]?(d{3})/',
        ),
        array(
            '+7 ($2) $3-$4-$5',
            '+7 ($2) $3-$4-$5',
            '+7 ($2) $3-$4-$5',
            '+7 ($2) $3-$4-$5',
            '+7 ($2) $3-$4',
            '+7 ($2) $3-$4',
        ),
        $phone
    );

    return $res;
}
?>
Tag: php

326 TAB - вкладки

<?php CJSCore::Init(array("jquery")); ?>
<style type="text/css">
.tabs-nav {position:relative;padding:11px 0 0 0;margin:0 0 58px 0;}
.tabs-nav::before {content:' ';position:absolute;left:0;bottom:0;overflow:hidden;width:100%;height:2px;background:#CECECE;}
.tabs-nav ul {position:relative;display:flex;font-size:17px;line-height:24px;list-style:none;margin:0 !important;}
.tabs-nav li {padding:0;margin:0;}
.tabs-nav li::before {display:none;}
.tabs-nav a {display:inline-block;position:relative;overflow:hidden;min-width:64px;color:#717171;text-align:center;vertical-align:top;padding:0 32px 13px 32px;}
.tabs-nav a::after {display:none;content:' ';position:absolute;left:0;bottom:0;overflow:hidden;width:100%;height:4px;background:#303030;}
.tabs-nav .active {color:#434343;}
.tabs-nav .active::after {display:block;}
.tab-bl {display:none;padding:0 0 10px 0;}
.tab-bl h4 {margin-bottom:30px;}
.tab-bl.open {display:block; font-family:'verdana';padding-bottom: 16px; font-size: 11pt; text-align: justify; line-height: 22px;}
.tab-bl.open > p {display:block; font-family:'verdana';padding-bottom: 16px; font-size: 11pt; text-align: justify; line-height: 22px;color: #434343;}
.tab-bl .tbl-wrap {padding:0 0 99px 0;}
.tab-bl .tbl-wrap tr td:nth-child(1) {width:15%;}
</style>
<script>
$(document).ready(function(){
    $(".tab-link").on("click",function(){
        var newBl = $(this).attr("href");
        var oldBl = "#"+$(".tab-bl.open").eq(0).attr("id");

        var oldActive = "a[href='"+oldBl+"']";
        $(oldActive).removeClass("active");
        $(oldBl).removeClass("open");

        var newActive = "a[href='"+newBl+"']";
        $(newActive).toggleClass("active");
        $(newBl).toggleClass("open");

        return false;
    });
});
</script>
<?php
/*
$arResult = Array(
    [IBLOCK] => Array (
            [3] => Array (
                    [ID] => 3
                    [CODE] => busines
                    [NAME] => Бизнес
                    [TITLE] => Бизнес
                )
            [5] => Array (
                    [ID] => 5
                    [CODE] => sales
                    [NAME] => Объекты
                    [TITLE] => Объекты
                )
        )
    [ELEMENT] => Array (
            [3] => Array (
                    [0] => Array (
                            [ID] => 78
                            [TIMESTAMP_X] => 04.12.2021 12:43:33
                            [TIMESTAMP_X_UNIX] => 1638611013
                ...
                            [PROPERTYS] => Array (
                                    [PHONE] => Array ()
                ...
                )
            )
            [5] => Array (
                    [0] => Array (
                            [ID] => 781
                            [TIMESTAMP_X] => 04.12.2021 12:43:33
                            [TIMESTAMP_X_UNIX] => 1638611013
                ...
                            [PROPERTYS] => Array (
                                    [EMAIL] => Array ()
                ...
                )
            )
        )
    )
*/
$tabsArr = array();

foreach($arResult['IBLOCK'] as $id=>$ib) {
    $tabsArr[] = array(
        'link' => $ib['CODE'],
        'caption' => $ib['TITLE'],
        'data' => $arResult['ELEMENT'][$id]
    );
}
if (!empty($tabsArr)) { ?>
        <div class="pr-about-sub">
            <div class="tabs-nav">
                <ul>
                    <? foreach ($tabsArr as $key => $oneTab) { ?>
                        <li>
                            <a class="tab-link <?= (!$key) ? 'active' : ''; ?>" href="#<?= $oneTab['link'] ?>">
                                <?= $oneTab['caption'] ?>
                            </a>
                        </li>
                    <? } ?>
                </ul>
            </div>

            <?    foreach ($tabsArr as $key => $oneTab) { ?>
                <div class="tab-bl <?= (!$key) ? 'open' : ''; ?>" id="<?= $oneTab['link'] ?>">
                <?    switch($oneTab['link']){
                        case 'sales':
                            foreach($oneTab['data'] as $item){
                                include 'sales.php';
                            }
                        break;
                        case 'busines':
                            foreach($oneTab['data'] as $id=>$item) {
                                include 'busines.php';
                            }
                        break;
#                     default:
                    }
                }?>
                </div>
        </div>
<?}?>
Tag: php, bitrix, tab

327 Тернарный оператор ??

<?php
$var = $value ?? "Другое значение";
# эквивалентно
$var = isset($value) ? $value : "Другое значение";
?>
<?php
$var = $value ?: "Другое значение";
# эквивалентно
$var = $value ? $value : "Другое значение";
?>
Tag: php, ??

328 Определить активна ли вкладка в браузере, закрытие вкладки

<script>
function DDD(){
    if (!document.hidden){
       console.log("открыта");
    }
    else {
       console.log("закрыта");
    }
}
setInterval(DDD, 1000);
</script>

<script>
/*
let analyticsData = { # объект с собранными данными  };

window.addEventListener("unload", function() {
  navigator.sendBeacon("/analytics", JSON.stringify(analyticsData));
});
*/
</script>

<script> // Запрашиваем подтверждение на закрытие вкладки
    window.onbeforeunload = function() {
      return false;
    };
    $(window).on("beforeunload", function() {
        return "Вы уверены, что хотите покинуть страницу?";
    });

    $(document).on("submit", "form", function(event) {
        $(window).off("beforeunload");
    });
</script>
Tag: js

329 Получение get, post параметров на D7

<?
$request = Bitrix\Main\Application::getInstance()->getContext()->getRequest();
$request->getQueryList()->toArray(); // массив get параметров
$request->getPostList()->toArray(); // массив post параметров
$request->get("param"); // один параметр get или post

// файлы и куки
$request->getFileList();
$request->getCookieList();

$uriString = $request->getUserAgent();
?>
Tag: get, post, d7, bitrix

330 UUID, Сгенерировать UUID в PHP

<?
function guidv4($data = null) {
    // Generate 16 bytes (128 bits) of random data or use the data passed into the function.
    $data = $data ?? random_bytes(16);
    assert(strlen($data) == 16);

    // Set version to 0100
    $data[6] = chr(ord($data[6]) & 0x0f | 0x40);
    // Set bits 6-7 to 10
    $data[8] = chr(ord($data[8]) & 0x3f | 0x80);

    // Output the 36 character UUID.
    return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
}
echo guidv4();
?>
Tag: php, uuid

331 Поиск текста во всех подключенных файлах

<?
$str_for_serch = 'product'; // текст для поиска
foreach (get_included_files() as $key=>$file) {
    $text = file_get_contents($file);
    $pos = strpos($text, $str_for_serch);
    if ($pos !== false) {
        echo $key." ".$file."<br>";
    }
}
echo "<br>";
?>
Tag: php, include, bitrix

332 Способ формирование XML

<?
$count = 6;
$LIC[3] = "Izz138bod";

$arXML = <<<XML
<?xml version="1.0"?>
<CAT>
  <NAME>Izzy</NAME>
  <BREED>Siamese</BREED>
  <AGE>$count</AGE>
  <ALTERED>yes</ALTERED>
  <DECLAWED>no</DECLAWED>
  <LICENSE>{$LIC[3]}</LICENSE>
  <OWNER>Colin Wilcox</OWNER>
</CAT>
XML;

echo $arXML;
?>
Tag: php, xml

333 Изменить единицы измерения

<?
Cmodule::IncludeModule('catalog');
$PRODUCT_ID = 251570;

$arMeasure = \Bitrix\Catalog\ProductTable::getCurrentRatioWithMeasure($PRODUCT_ID);
echo "<pre>".print_r($arMeasure,1)."</pre>";

$arFields = array('MEASURE' => 10); // M2
CCatalogProduct::Update($PRODUCT_ID, $arFields);
?>
Tag: php, bitrix, d7

334 получаем ссылки для редактирования и удаления элемента

<?php
    $arButtons = CIBlock::GetPanelButtons($arItem["IBLOCK_ID"],$arItem["ID"],0,
                array("SECTION_BUTTONS"=>false, "SESSID"=>false) );
    $arItem["EDIT_LINK"] = $arButtons["edit"]["edit_element"]["ACTION_URL"];
    $arItem["DELETE_LINK"] = $arButtons["edit"]["delete_element"]["ACTION_URL"];

//добавляем действия (экшены) для управления элементом
    $this->AddEditAction($arItem['ID'], $arItem['EDIT_LINK'], CIBlock::GetArrayByID($arItem["IBLOCK_ID"], "ELEMENT_EDIT"));
    $this->AddDeleteAction($arItem['ID'], $arItem['DELETE_LINK'], CIBlock::GetArrayByID($arItem["IBLOCK_ID"], "ELEMENT_DELETE"), array("CONFIRM" => GetMessage('CT_BNL_ELEMENT_DELETE_CONFIRM')));
?>
<p id="<?=$this->GetEditAreaId($arItem['ID']);?>">
    <!--содержимое элемента-->
</p>
Tag: php, bitrix, d7

335 получаем все что знает UserTable

<?
$res = Bitrix\Main\UserTable::getList(Array(
  "select"=>["ID","NAME"],
  "filter"=> ["ID"=>1],
))->fetchAll();
echo "<pre>".print_r($res,1)."</pre>";
?>
Tag: php, bitrix, d7

336 Аналоги функций API на D7

<?
#
# аналог CIBlockElement::GetByID
#
$element = \Bitrix\Iblock\Elements\ElementCatalogTable::getByPrimary($elementId, [
    'select' => ['ID', 'NAME', 'ARTNUMBER_' => 'ARTNUMBER'],
])->fetch();
echo "<pre>".print_r($element,1)."</pre>";
# Для объектов
$element = \Bitrix\Iblock\Elements\ElementCatalogTable::getByPrimary($elementId, array(
    'select' => array('ID', 'NAME', 'DETAIL_PICTURE')
))->fetchObject();
var_dump($element->get('NAME'));
#
# Аналогом CIBlockElement::GetList будет getList из D7:
#
$elements = \Bitrix\Iblock\Elements\ElementCatalogTable::getList([
    'select' => ['ID', 'NAME', 'ARTNUMBER_' => 'ARTNUMBER'],
    'filter' => ['=ACTIVE' => 'Y'],
])->fetchAll();
foreach ($elements as $element) {
    // ...
}
# Для объектов
$elements = \Bitrix\Iblock\Elements\ElementCatalogTable::getList([
    'select' => ['ID', 'NAME', 'DETAIL_PICTURE'],
    'filter' => [
        'ID' => $elementId,
    ],
])->fetchCollection();
foreach ($elements as $element) {
    var_dump($element->getName()); // string(42) "Штаны Цветочная Поляна"
}
#
# Разделы элементов
#
$elements = \Bitrix\Iblock\Elements\ElementCatalogTable::getList([
    'select' => ['ID', 'IBLOCK_SECTION'],
    'filter' => [
        'ID' => $elementId,
    ],
])->fetchObject();

var_dump ($element->getIblockSection()->getName()); // string(10) "Штаны"
# Для получения всех разделов элемента
$element = \Bitrix\Iblock\Elements\ElementCatalogTable::getList([
    'select' => ['ID', 'SECTIONS'],
    'filter' => [
        'ID' => $elementId,
    ],
])->fetchObject();

foreach ($element->getSections()->getAll() as $section) {
    var_dump($section->getId());     // int(8)
    var_dump($section->getCode());   // string(5) "pants"
    var_dump($section->getName());   // string(10) "Штаны"
}
#
# Свойства элементов
#
$element = \Bitrix\Iblock\Elements\ElementCatalogTable::getByPrimary($elementId, array(
    'select' => array('ID', 'ARTNUMBER')
))->fetchObject();

var_dump($element->getArtnumber()->getValue()); // string(11) "177-79-00"
#Если для свойства включен вывод описания, то его можно получить методом getDescription.

# Если свойство множественное, то getSomePropertyCode() вернет коллекцию.
# Получить значения коллекции также можно с помощью метода getAll().
# Рассмотрим на примере множественного свойства типа Справочник:
$elements = \Bitrix\Iblock\Elements\ElementCatalogTable::getList([
    'select' => ['ID', 'NAME', 'DETAIL_PICTURE', 'BRAND_REF'],
    'filter' => [
        'ID' => $elementId,
    ],
])->fetchCollection();

foreach ($elements as $element) {
    foreach ($element->getBrandRef()->getAll() as $value) {
        var_dump($value->getValue());
    }
}
// string(8) "company2"
// string(8) "company3"
// string(6) "brand2"
// string(6) "brand1"
// string(6) "brand3"

# Переходим в свойствам типа Файл. К значениям таких свойств можно привязать
# информацию из таблицы товаров и получить не только ID файлов, но информацию
# о файле. Рассмотрим на примере свойства с 2 картинками. Обратите внимание
# на добавленное к коду свойства слово FILE:

$elements = \Bitrix\Iblock\Elements\ElementCatalogTable::getList([
    'select' => ['ID', 'MORE_PHOTO.FILE'],
    'filter' => [
        'ID' => $elementId,
    ],
])->fetchCollection();

foreach ($elements as $element) {
    foreach ($element->getMorePhoto()->getAll() as $value) {
        var_dump('/upload/' . $value->getFile()->getSubdir().'/'.$value->getFile()->getFileName());
    }
}

//string(55) "/upload/iblock/2d6/2d6d01a93d220c012e40415616a3d0e1.jpg"
//string(55) "/upload/iblock/dd3/dd3495f96990223e3076c97e99b062d9.jpg"

# Со свойства типа Список традиционно всё немного сложнее. Получить просто ID значения достаточно просто:

$element = \Bitrix\Iblock\Elements\ElementCatalogTable::getList([
    'select' => ['ID', 'NEWPRODUCT'],
    'filter' => [
        'ID' => $elementId,
    ],
])->fetchObject();
var_dump($element->getNewproduct()->getValue()); // int(1)

# Если требуется получить ID, XML_ID и значение, то используем ITEM после
# код свойства, тогда к запросу добавится таблица значений списочных свойств:

$element = \Bitrix\Iblock\Elements\ElementCatalogTable::getList([
    'select' => ['ID', 'NEWPRODUCT.ITEM'],
    'filter' => [
        'ID' => $elementId,
    ],
])->fetchObject();
var_dump($element->getNewproduct()->getItem()->getId());    // int(1)
var_dump($element->getNewproduct()->getItem()->getXmlId()); // string(1) "Y"
var_dump($element->getNewproduct()->getItem()->getValue()); // string(4) "да"

# У свойств типов Привязка к элементам и Привязка к разделам есть подобное
# дополнительное поле (ELEMENT/SECTION) для доступа к элементу/разделу:

$element = \Bitrix\Iblock\Elements\ElementCatalogTable::getList([
    'select' => ['ID', 'RECOMMEND.ELEMENT'],
    'filter' => [
        'ID' => $elementId,
    ],
])->fetchObject();

foreach ($element->getRecommend()->getAll() as $linkElement) {
    var_dump($linkElement->getElement()->getId());     // int(29)
    var_dump($linkElement->getElement()->getName());   // string(34) "Платье Красная Фея"
}

# Кеширование
#
#Не забываем про возможность кеширование результатов выборок ORM D7:

$element = \Bitrix\Iblock\Elements\ElementCatalogTable::getList([
    'select' => ['ID', 'NAME'],
    'filter' => [
        'ID' => $elementId,
    ],
    "cache" => ["ttl" => 3600],
])->fetchObject();
?>
Tag: php, bitrix, d7

337 Вычленить имя файла из __FILE__

<?
echo str_replace(__DIR__."/","",__FILE__);
echo  basename(__FILE__);
?>
Tag: php

338 Вывод свойства типа HTML5/текст

<? if ($arItem["DISPLAY_PROPERTIES"]['свойство']){
    echo htmlspecialcharsBack($arItem["PROPERTIES"]["свойство"]["VALUE"]["TEXT"]);
}
?>
Tag: bitrix

339 Получение цены товара (стоимость товара) по его ID:

<?
$price = CPrice::GetBasePrice($arItem['ITEM_ID'])['PRICE'];
?>
Tag: bitrix

340 Как получить ссылку на товар в Bitrix:

<?
$res= \CIBlockElement::GetByID( $id );
$aTMP = $res->GetNext();
echo $aTMP[ 'DETAIL_PAGE_URL' ];
?>
Tag: bitrix

341 Многоуровневый нумерованный список <ol>

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

counter-reset сбрасывает один или несколько счётчиков, задавая
        значение для сброса;
counter-increment задаёт значение приращения счётчика, т.е. с
        каким шагом будет нумероваться каждый последующий пункт;
content — генерируемое содержимое, в данном случае отвечает
        за вывод номера перед каждым пунктом списка.
<style>
   .multi-level-list ol {
   /* убираем стандартную нумерацию */
      list-style: none;
   /* Идентифицируем счетчик и даем ему имя li.
   Значение счетчика не указано - по умолчанию оно равно 0 */
      counter-reset: li;
      padding-left: 40px;
      margin-top: 1em;
      margin-bottom: 1em;
   }
   .multi-level-list li:before {
   /* Определяем элемент, который будет нумероваться — li.
   Псевдоэлемент before указывает, что содержимое, вставляемое
   при помощи свойства content, будет располагаться перед
   пунктами списка. Здесь же устанавливается значение
   приращения счетчика (по умолчанию равно 1). */
      counter-increment: li;
   /* С помощью свойства content выводится номер пункта
   списка. counters() означает, что генерируемый текст
   представляет собой значения всех счетчиков с таким
   именем. Точка в кавычках добавляет разделяющую точку
   между цифрами, а точка с пробелом добавляется перед
   содержимым каждого пункта списка */
      content: counters(li, ".") ". ";
   }
</style>
<figure>
<div class="multi-level-list">
<ol>
    <li>пункт</li>
    <li>пункт
        <ol>
            <li>пункт</li>
            <li>пункт</li>
            <li>пункт
                <ol>
                    <li>пункт</li>
                    <li>пункт</li>
                    <li>пункт</li>
                </ol>
            </li>
            <li>пункт</li>
        </ol>
    </li>
    <li>пункт</li>
    <li>пункт</li>
</ol>
</div>
</figure>
Tag: css, ol

342 Событие по окончанию импорта из 1С

<?
#
# init.php
#
/*
AddEventHandler("catalog", "OnBeforeCatalogImport1C",   Array("EventClass1C", "_OnBeforeCatalogImport1C"));
    событие, вызываемое перед началом процедуры обмена: перед загрузкой XML в базу данных после загрузки файла на сервер.
AddEventHandler("catalog", "OnSuccessCatalogImport1C",  Array("EventClass1C", "_OnSuccessCatalogImport1C"));
    событие, вызываемое после окончания обмена одним XML-файлом
*/
AddEventHandler("catalog", "OnCompleteCatalogImport1C", Array("EventClass1C", "_OnCompleteCatalogImport1C"));
#  событие успешного окончания обмена
class EventClass1C {
    function _OnCompleteCatalogImport1C($arPropertyValues, $ABS_FILE_NAME){

        CModule::IncludeModule('iblock');
        CModule::IncludeModule("catalog");
        $IBLOCK_ID2 = 2; // ID инфоблока
        $arSelect = ["ID", "IBLOCK_ID"];
        $arFilter = ["IBLOCK_ID"=>$IBLOCK_ID2, "ACTIVE"=>"Y"];
        $res = CIBlockElement::GetList(["SORT"=>'ASC'], $arFilter, false, false, $arSelect); // Весь активный товар
        while($ob = $res->Fetch()) {
            $productId = $ob['ID'];
            $arProduct = CCatalogProduct::GetByID($productId); // получить данные по товару
            $arStoreProduct = \Bitrix\Catalog\StoreProductTable::getList(array( // Опросить все склады
                'filter' => ['=PRODUCT_ID'=>$productId,'STORE.ACTIVE'=>'Y'],
            ))->fetchAll();
            $AMOUNT = 0;
            foreach($arStoreProduct as $Store){
                if(in_array($Store['STORE_ID'],[7,6,5,3])){ // Просуммировать количества по ВСЕМ складам если склад в списке
                    $AMOUNT += $Store['AMOUNT'];
                }
            }
            if($arProduct['QUANTITY'] != $AMOUNT) {
                CCatalogProduct::Update($productId, ['QUANTITY' => $AMOUNT]); // Обновить доступное количество
            }
        }
        return;
    }
}
?>
Tag: bitrix,

343 Работа с датами в Битрикс

<?php
use Bitrix\Main\Type\DateTime;
$objDateTime = DateTime::createFromPhp(new \DateTime('2000-01-01'));
$objDateTime = DateTime::createFromTimestamp(1346506620); // Текущее время:
// или
$objDateTime = new DateTime();
$objDateTime = new DateTime("25.12.2012 12:30:00"); // Из строки в формате текущего сайта
$objDateTime = new DateTime("2007-05-14 12:10:00", "Y-m-d H:i:s"); // Из строки с указанием формата:
echo $objDateTime->getTimestamp(); // Из объекта можно получить представление в виде timestamp:
echo $objDateTime->toString(); // в виде строки в формате текущего сайта:
echo $objDateTime->format("Y-m-d H:i:s"); // в произвольном формате (фактически обёртка над DateTime::format):

# Метод add реализует сложение и вычитание дат,
# можно указывать смещение словами years, months, days, weeks, hours, minutes, seconds и знаками +/-:
$objDateTime = new DateTime("01.01.2012 00:00:00"); // "2012-01-01 00:00:00"
$objDateTime->add("1 day"); // "2012-01-01 00:00:00" => "2012-01-02 00:00:00"
$objDateTime->add("-1 day"); // "2012-01-01 00:00:00" =>"2011-12-31 00:00:00"
$objDateTime->add("3 months - 5 days + 10 minutes"); // "2012-01-01 00:00:00" =>"2012-03-27 00:10:00"
// Метод add изменяет объект, здесь для наглядности приведены результаты вызова add с начального состояния $objDateTime.
// Также в add можно указывать смещение в формате DateInterval (но буква P в начале строки необязательна):

$objDateTime = new DateTime("01.01.2012 00:00:00"); // "2012-01-01 00:00:00"
$objDateTime->add("7M5DT2M"); // "2012-01-01 00:00:00" =>"2012-08-06 00:02:00"
$objDateTime->add("-2YT10M"); // "2012-01-01 00:00:00" =>"2009-12-31 23:50:00"
// Получение формата даты сайта
$siteDateShortFormat = \CSite::GetDateFormat("SHORT");
$siteDateFullFormat = \CSite::GetDateFormat("FULL");
// Преобразование формата сайта к формату PHP
$phpDateShortFormat = \Bitrix\Main\Type\Date::convertFormatToPhp($siteDateShortFormat);
// Пример из компонента новостей Пример формата "j F Y"
$arItem["DISPLAY_ACTIVE_FROM"] = CIBlockFormatProperties::DateFormat($arParams["ACTIVE_DATE_FORMAT"],
                                            MakeTimeStamp($arItem["ACTIVE_FROM"],
                                            CSite::GetDateFormat()));
?>
Tag: bitrix, datetime, date, time

344 Пагинатор

<style type="text/css">
    .bx-pagination {margin: 10px 0;}
    .bx-pagination .bx-pagination-container {text-align: center;position: relative;}
    .bx-pagination .bx-pagination-container ul {padding: 0;margin: 0;list-style: none;display: inline-block;}
    .bx-pagination .bx-pagination-container ul li {display: inline-block;margin: 0 2px 15px 2px;}
    .bx-pagination .bx-pagination-container ul li span{
        -webkit-transition: color .3s ease, background-color .3s ease, border-color .3s ease;
           -moz-transition: color .3s ease, background-color .3s ease, border-color .3s ease;
            -ms-transition: color .3s ease, background-color .3s ease, border-color .3s ease;
             -o-transition: color .3s ease, background-color .3s ease, border-color .3s ease;
                transition: color .3s ease, background-color .3s ease, border-color .3s ease;
        background: #eff0f1;padding: 0 8px;display: block;height: 32px;min-width: 32px;line-height: 32px;color: #444;font-size: 14px;border-radius: 16px;-webkit-box-sizing: border-box;-moz-box-sizing: border-box;box-sizing: border-box;
    }
    .bx-pagination .bx-pagination-container ul li a {text-decoration: none;display: block;border-radius: 16px;height: 32px;min-width: 32px;line-height: 32px;color: #444;}
    .bx-pagination .bx-pagination-container ul li a:hover span{background: #DADADA;}
    .bx-pagination .bx-pagination-container ul li.bx-active span{background: #0083d1;color: #fff;}
    .bx-pagination .bx-pagination-container ul li.bx-pag-all a span,
    .bx-pagination .bx-pagination-container ul li.bx-pag-prev a span,
    .bx-pagination .bx-pagination-container ul li.bx-pag-next a span {background: #fff;border: 2px solid #eff0f1;line-height: 28px;padding: 0 18px;color: #444;}
    .bx-pagination .bx-pagination-container ul li.bx-pag-all span,
    .bx-pagination .bx-pagination-container ul li.bx-pag-prev span,
    .bx-pagination .bx-pagination-container ul li.bx-pag-next span{color: #aab1b4;background: #fff;border: 2px solid #eff0f1;line-height: 28px;padding: 0 18px;}
    .bx-pagination .bx-pagination-container ul li.bx-pag-all a:hover span,
    .bx-pagination .bx-pagination-container ul li.bx-pag-prev a:hover span,
    .bx-pagination .bx-pagination-container ul li.bx-pag-next a:hover span {background: #fff;border-color: #DADADA;color: #000;}
</style>
<?
$parse_url = parse_url($_SERVER['REQUEST_URI']);
if(!empty($parse_url['query'])){
    $query = explode("&",$parse_url['query']);
    $query = array_filter( $query, function( $v ) { return ( strpos($v,"page") === false ); } );
    $query = implode("&",$query);
}
$nPageWindow = 7; // кол-во элементов на экране
$NavPageCount = $max_page; //  кол-во страниц
$NavPageNomer = $_GET['page']; // текущая страница
$sUrlPath = $parse_url['path'];

if ($NavPageNomer > floor($nPageWindow/2) + 1 && $NavPageCount > $nPageWindow) {
    $nStartPage = $NavPageNomer - floor($nPageWindow/2);
} else {
    $nStartPage = 1;
}
if ($NavPageNomer <= $NavPageCount - floor($nPageWindow/2) && $nStartPage + $nPageWindow-1 <= $NavPageCount) {
    $nEndPage = $nStartPage + $nPageWindow - 1;
} else {
    $nEndPage = $NavPageCount;
    if($nEndPage - $nPageWindow + 1 >= 1)
        $nStartPage = $nEndPage - $nPageWindow + 1;
}
?>
<div class="bx-pagination">
    <div class="bx-pagination-container">
        <ul>
    <?if ($NavPageNomer > 1) {
        if ($NavPageNomer > 2) {
            ?><li class="bx-pag-prev"><a href="<?=$sUrlPath?>?page=<?=($NavPageNomer-1)?><?=strlen($query)?'&'.$query:''?>"><span>Назад</span></a></li><?
        } else {
            ?><li class="bx-pag-prev"><a href="<?=$sUrlPath?><?=strlen($query)?'?'.$query:''?>"><span>Назад</span></a></li><?
        }
            ?><li class=""><a href="<?=$sUrlPath?><?=strlen($query)?'?'.$query:''?>"><span>1</span></a></li><?
    }else{
            ?><li class="bx-pag-prev"><span>Назад</span></li><?
            ?><li class="bx-active"><span>1</span></li><?
    }

    $nStartPage++;
    while($nStartPage <= $nEndPage-1) {
        if ($nStartPage == $NavPageNomer) {
            ?><li class="bx-active"><span><?=$nStartPage?></span></li><?
        } else {
            ?><li class=""><a href="<?=$sUrlPath?>?page=<?=$nStartPage?><?=strlen($query)?'&'.$query:''?>"><span><?=$nStartPage?></span></a></li><?
        }
        $nStartPage++;
    }
    if($NavPageNomer < $NavPageCount) {
        if($NavPageCount > 1) {
            ?><li class=""><a href="<?=$sUrlPath?>?page=<?=$NavPageCount?><?=strlen($query)?'&'.$query:''?>"><span><?=$NavPageCount?></span></a></li><?
        }
            ?><li class="bx-pag-next"><a href="<?=$sUrlPath?>?page=<?=($NavPageNomer+1)?><?=strlen($query)?'&'.$query:''?>"><span>Вперед</span></a></li><?
    } else {
        if($NavPageCount > 1) {
            ?><li class="bx-active"><span><?=$NavPageCount?></span></li><?
        }
            ?><li class="bx-pag-next"><span>Вперед</span></li><?
    }?>
        </ul>
        <div style="clear:both"></div>
    </div>
</div>

Tag: php, page, navigation, pagination, bitrix

345 Старт/Cтоп анимации ожидания процесса

<style>
   #loadImg{position:absolute; z-index:1000; display:none}
</style>

<img id="loadImg" src="img/load.gif" />

<script>
function startLoadingAnimation() {// - функция запуска анимации
  // найдем элемент с изображением загрузки и уберем невидимость:
  var imgObj = $("#loadImg");
  imgObj.show();

  // вычислим в какие координаты нужно поместить изображение загрузки,
  // чтобы оно оказалось в серидине страницы:
  var centerY = $(window).scrollTop() + ($(window).height() + imgObj.height())/2;
  var centerX = $(window).scrollLeft() + ($(window).width() + imgObj.width())/2;

  // поменяем координаты изображения на нужные:
  imgObj.offset(top:centerY, left:centerX);
}

function stopLoadingAnimation() {// - функция останавливающая анимацию
  $("#loadImg").hide();
}
</script>
Tag: js, animate

346 Заглушка на отсутствие image

<script>
    /* Заглушка на отсутствие имиджа 1*/
      $(document).ready(function() {
        $("body img").each(function(key, item) {
          $(item).on("error", function() {
            $(this).attr('src', '/images/noimg.jpg');
            $(this).off("error");
          }).attr('src', $(item).attr('src'));
        });
      });

    /* Заглушка на отсутствие имиджа 2*/
    $('img').error(function(){
        $(this).attr('src', '/images/noimg.jpg');
        $(this).off("error");
    });
</script>
Tag: js, jquery, img

347 Передача данных на сайт (POST)

<?php
$url = 'https://site.ru/cur.php';

$data = array(
    'field1' => 'value1',
    'field2' => 'value2',
    'field3' => date("d.m.Y H:i:s"),
);

# Прередаем POST
$query_string = http_build_query($data);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $query_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$result = curl_exec($ch);

curl_close($ch);

echo " <pre>".print_r($result,1)."</pre>";
#*************************
#cur.php
#
file_put_contents("___.txt",print_r($_POST,1),FILE_APPEND);
echo 200;
?>
Tag: php, post

348 Передача данных на сайт (json)

<?
$data = array(
    'field1' => 'value1',
    'field2' => 'value2',
    'field3' => date("d.m.Y H:i:s"),
);

# Прередаем JSON
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$result = curl_exec($ch);

curl_close($ch);

echo "<pre>".print_r($result,1)."</pre>";
#*************************
#cur.php
#
$post_data = file_get_contents('php://input');
file_put_contents("___.txt","json ".print_r(json_decode($post_data,1),1),FILE_APPEND);
echo 200;
?>
Tag: php, json,

349 Кириллица и регулярные выражения

<?
# Кириллица и регулярные выражения
# Заменяем все символы кроме букв (в том числе и кириллица)
# и цифр на пустоту, т.е. удаляем символы, которые не подходят:

$str = "Intel устанавливает в своих офисах кофе и кола автоматы на платформе Core i7 :)";
$str = preg_replace('/[^w_]+/u', '', $str);
# результат: IntelустанавливаетвсвоихофисахкофеиколаавтоматынаплатформеCorei7

# Разрешаем символ пробела (\s):
$str = "Intel устанавливает в своих офисах кофе и кола автоматы на платформе Core i7 :)";
$str = preg_replace('/[^w_\s]+/u', '', $str);
# результат: Intel устанавливает в своих офисах кофе и кола автоматы на платформе Core i7
?>
Tag: php, preg_replace

350 file_get_contents и https протокол

# Чтобы иметь возможность использовать функцию file_get_contents
# для url с https проколом, вам нужно в файле php.ini добавить такие строки:

// --- php.ini ----
extension=php_openssl.dll
allow_url_include = On

#Также, можно использовать cURL запрос:

<?
function getSslPage($url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_REFERER, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    $result = curl_exec($ch);
    curl_close($ch);
    return $result;
}
?>
Tag: php, file_get_contents, curl

351 Сохраняем изображение по ссылке

<?
# Если allow_url_fopen установлен в true:

$url = 'http://example.com/image.php';
// Также, можно указывать прямую ссылку на картинку, например: http://vk.com/image.jpg
$img = '/my/folder/flower.gif';
file_put_contents($img, file_get_contents($url));

#cURL запрос:

$ch = curl_init('http://example.com/image.php');
$fp = fopen('/my/folder/flower.gif', 'wb');
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);
fclose($fp);
?>
Tag: php, file_get_contents, img, curl

352 Определить кооридинаты по адресу через API Яндекс.Карты

<?
$adress = urlencode("Москва, Тверская+улица, дом 7");
$url = "http://geocode-maps.yandex.ru/1.x/?geocode={$adress}";
$content = file_get_contents($url);
preg_match("/<pos>(.*?)</pos>/", $content, $point);
$coords = str_replace(' ', ', ', trim(strip_tags($point[1])));
echo $coords;
// результат: 38.241803, 56.300984
?>
Tag: php, coords

353 Определяем основной цвет изображения

<?
# Под "основным", имеется ввиду цвет, который наиболее часто встречается на картинке.
$im=ImageCreateFromJPEG('test.jpg');

$total_R=0;
$total_G=0;
$total_B=0;

// Размеры изображения
$width=ImageSX($im);
$height=ImageSY($im);

// Подсчитать суммарные значения по RGB
for ($x=0; $x<$width; $x++) {
    for ($y=0; $y<$height; $y++) {
        $rgb=ImageColorAt($im,$x,$y);
        $total_R+=($rgb>>16) & 0xFF;
        $total_G+=($rgb>>8) & 0xFF;
        $total_B+=$rgb & 0xFF;
    }
}

// Прибраться за собой
ImageDestroy($im);

// Определение значений RGB основного цвета
$avg_R=round($total_R/$width/$height);
$avg_G=round($total_G/$width/$height);
$avg_B=round($total_B/$width/$height);

?>
Tag: php, color

354 Вырезать контент внутри тега

<?
# Пример 1. Вырезать всё, что между тегом <a>:

// до первого совпавшего
preg_match('#(<a[^>]*>).+?()#is', $html_code, $mathces);
echo $mathces[0];
// все совпадения
preg_match_all('#(<a[^>]*>).+?()#is', $html_code, $mathces);

# Пример 2. Вырезать всё, что между тега <div clas="content">.
# Вырезать весь контент между тегом <div> с классом "content":

$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML($html_code);
$xpath = new DOMXPath($dom);
$div = $xpath->query('//div[@class="content"]');
$div = $div->item(0);
$data = $dom->saveHtml($div);
echo $data
?>
Tag: php, preg_match

355 Работа с валютами в Bitrix

<?
# Получение массива валют, включая языковые параметры для текущего языка:
$currencyList = \Bitrix\Currency\CurrencyManager::getCurrencyList();

# список валют и их курсов
$rsCurrency = \Bitrix\Currency\CurrencyTable::getList();
while($currency=$rsCurrency->fetch()){
    echo " <pre>".print_r($currency,1)."</pre>";
}

# Метод ORM для получения таблицы курсов валют
$rsCurrencyRate = \Bitrix\Currency\CurrencyRateTable::getList();
while($currencyRate=$rsCurrencyRate->fetch()) {
    echo "<pre>".print_r($currencyRate,1)."</pre>";
}

# Получение идентификатора базовой валюты:
$baseCurrency = \Bitrix\Currency\CurrencyManager::getBaseCurrency(); // string(3) "RUB"

# Получение валюты заказа из объекта заказа:
$currency = $order->getCurrency();

# Получение валюты позиции корзины из объекта позиции корзины:
$currency = $basketItem->getCurrency();

# Очистка кеша валют:
\Bitrix\Currency\CurrencyManager::clearCurrencyCache('ru');

#
function CalcPrice($ID, $currency) {
    $arPrices = \CCatalogProduct::GetByIDEx($ID)['PRICES'];

    $price = [];
    foreach($arPrices as $prs){
        if($prs['CURRENCY'] == $currency) {
            $price['RATIO_BASE_PRICE'] =
            $price['RATIO_PRICE'] =
            $price['PRICE'] =
            $price['BASE_PRICE'] = $prs['PRICE'];
            $price["CURRENCY"] = $prs['CURRENCY'];
            $price['PRINT_RATIO_PRICE'] = SaleFormatCurrency($prs['PRICE'], $prs["CURRENCY"]);
            break;
        }
    }
    return $price;
} // end func

?>
Tag: php, bitrix, d7, price, rub

356 Объекты application и context в битрикс D7 (https://mrcappuccino.ru/blog/post/d7-application-and-context-objects)

<?
# BitrixMainApplication
$context = Application::getInstance()->getContext();

# BitrixMainContext

$server = $context->getServer();   // объект Server
$siteId = $context->getSite();     // ID текущего сайта ("s1")
$langId = $context->getLanguage(); // ID текущего языка ("ru")

# BitrixMainRequest

$request = $context->getRequest(); // объект Request
$request = Context::getCurrent()->getRequest();

$value  = $request->get("param");       // получение параметра GET или POST
$value  = $request["param"];            // получение параметра GET или POST
$value  = $request->getQuery("param");  // получение GET-параметра
$values = $request->getQueryList();     // получение списка GET-параметров
$value  = $request->getPost("param");   // получение POST-параметра
$values = $request->getPostList();      // получение списка POST-параметров
$value  = $request->getFile("param");   // получение загруженного файла
$values = $request->getFileList();      // получение списка загруженных файлов
$value  = $request->getCookie("param"); // получение значения кука
$values = $request->getCookieList();    // получение списка кукисов

$method = $request->getRequestMethod();   // получение метода запроса
$flag   = $request->isGet();              // true - GET-запрос, иначе false
$flag   = $request->isPost();             // true - POST-запрос, иначе false
$flag   = $request->isAjaxRequest();      // true - AJAX-запрос, иначе false
$flag   = $request->isHttps();            // true - HTTPS-запрос, иначе false

$flag        = $request->isAdminSection();           // true - находимся в админке, иначе false
$requestUri  = $request->getRequestUri();            // Запрошенный адрес (напр. "/catalog/category/?param=value")
$requestPage = $request->getRequestedPage();         // Запрошенная страница (напр. "/catalog/category/index.php")
$rDir        = $request->getRequestedPageDirectory();// Директория запрошенной страницы (напр. "/catalog/category")

# BitrixMainServer

$server = $context->getServer();
// Или более краткая форма:
$server = Context::getCurrent()->getServer();

$server->getDocumentRoot(); // DOCUMENT_ROOT
$server->getPersonalRoot(); // BX_PERSONAL_ROOT ("/bitrix")
$server->getHttpHost();     // HTTP_HOST
$server->getServerName();   // SERVER_NAME
$server->getServerAddr();   // SERVER_ADDR
$server->getServerPort();   // SERVER_PORT
$server->getRequestUri();   // REQUEST_URI
$server->getRequestMethod();// REQUEST_METHOD
$server->getPhpSelf();      // PHP_SELF
$server->getScriptName();   // SCRIPT_NAME
$server->get('HTTP_ACCEPT');// Любое значение из $_SERVER
?>
Tag: php, bitrix, d7

357 HTTP-клиент в битрикс D7 (https://mrcappuccino.ru/blog/post/work-with-http-bitrix-d7)

<?
use \Bitrix\Main\Application,
    \Bitrix\Main\Web\Uri,
    \Bitrix\Main\Web\HttpClient;

# Класс Uri содержит методы для работы с адресом страницы.
# Фактически это надстройка над функциями PHP parse_url и http_build_query.
# Конструктор принимает адрес, возьмем для примера адрес страницы с некоторыми дополнениями:

$uri = new Uri("http://username:password@mrcappuccino.ru/blog/post/work-with-http-bitrix-d7/?param1=value#comments");

# примеры работы с этим адресом:

$uri->getLocator(); // "http://mrcappuccino.ru/blog/post/work-with-http-bitrix-d7/?param1=value"
$uri->getUri(); // "http://mrcappuccino.ru/blog/post/work-with-http-bitrix-d7/?param1=value#comments"
$uri->getHost(); // "mrcappuccino.ru"
$uri->getUser(); // "username"
$uri->getPass(); // "password"
$uri->getPath(); // "/blog/post/work-with-http-bitrix-d7/"
$uri->getPathQuery(); // "/blog/post/work-with-http-bitrix-d7/?param1=value"
$uri->getPort(); // 80
$uri->getQuery(); // "param1=value"
$uri->getScheme(); // "http"
$uri->deleteParams(array("param1"));
$uri->getUri(); // "http://mrcappuccino.ru/blog/post/work-with-http-bitrix-d7/#comments"
$uri->addParams(array("param2" => "value"));
$uri->getUri(); // "http://mrcappuccino.ru/blog/post/work-with-http-bitrix-d7/?param2=value#comments"

# Сменив протокол на https, получим:

$uri = new Uri("https://mrcappuccino.ru/blog/post/work-with-http-bitrix-d7/");
$uri->getScheme(); // "https"
$uri->getPort(); // 443

# Таким образом, получаем аналог CMain::GetCurPageParam из старого ядра и генератор URI для запросов:

$uri = new Uri("http://api.ru/");
$uri->addParams(array("token" => "89ud98gdfj78w", "data" => "ЙЦУКЕН ГШЩЗХЪ"));
var_dump($uri->getUri()); // string(113) "http://api.ru/?token=89ud98gdfj78w&data=%D0%99%D0%A6%"

# BitrixMainWebHttpClient
# Класс HttpClient является реализацией HTTP-клиента в
# Битрикс D7, конструктор класса принимает необязательный массив опций:

// опции по умолчанию:
$options = array(
    "redirect" => true, // true, если нужно выполнять редиректы
    "redirectMax" => 5, // Максимальное количество редиректов
    "waitResponse" => true, // true - ждать ответа, false - отключаться после запроса
    "socketTimeout" => 30, // Таймаут соединения, сек
    "streamTimeout" => 60, // Таймаут чтения ответа, сек, 0 - без таймаута
    "version" => HttpClient::HTTP_1_0, // версия HTTP (HttpClient::HTTP_1_0 или HttpClient::HTTP_1_1)
    "proxyHost" => "", // адрес
    "proxyPort" => "", // порт
    "proxyUser" => "", // имя
    "proxyPassword" => "", // пароль
    "compress" => false, // true - принимать gzip (Accept-Encoding: gzip)
    "charset" => "", // Кодировка тела для POST и PUT
    "disableSslVerification" => false, // true - отключить проверку ssl (с 15.5.9)
);
$httpClient = new HttpClient($options);

# Также опции можно установить сеттерами:

/*  @param bool $followRedirects,  @param int $redirectMax(default null) */
$httpClient->setRedirect($followRedirects, $redirectMax = null);
/*  @param bool $waitResponse */
$httpClient->waitResponse($waitResponse);
/*  @param int $socketTimeout */
$httpClient->setTimeout($socketTimeout);
/*  @param int $streamTimeout */
$httpClient->setStreamTimeout($streamTimeout);
/*  @param string $version */
$httpClient->setVersion($version);
/*  @param string $proxyHost, @param int $proxyPort(default null),
    @param string $proxyUser(default null), @param string $proxyPassword(default null)
*/
$httpClient->setProxy($proxyHost, $proxyPort = null, $proxyUser = null, $proxyPassword = null);
/** @param bool $compress */
$httpClient->setCompress($compress);
/** @param string $charset */
$httpClient->setCharset($charset);
$httpClient->disableSslVerification();

# С версии 16.0.14 опции по умолчанию также можно менять в файле настроек в http_client_options.

/*
...
'http_client_options' =>
    array (
        'value' =>
            array (
                'redirect' => true,
                'redirectMax' => 3,
                //...
            ),
        'readonly' => false,
    ),
 ...
*/

# Установить заголовки можно методом setHeader, третий
# аргумент $replace определяет нужно ли заменить
# заголовок (true, по умолчанию) или добавить еще с этим именем (false):

$name = "User-Agent";
$value = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/7046A194A";
$httpClient->setHeader($name, $value, true);

# Установить cookies для запроса можно методом setCookies, метод принимает массив имя => значение:

$cookies = array(
    "name" => "value",
);
$httpClient->setCookies($cookies);

# Для установки имени и пароля для basic authorization нужно вызвать метод setAuthorization:

$httpClient->setAuthorization($user, $pass);

# Для выполнения запроса используется метод query:

$httpClient->query($method, $url, $entityBody = null);

# Аргумент $method - метод запроса: GET, POST и т.д.,
# можно использовать константы класса: HttpClient::HTTP_GET,
# HttpClient::HTTP_POST, HttpClient::HTTP_PUT,
# HttpClient::HTTP_HEAD и HttpClient::HTTP_PATCH.
# В $entityBody передаём тело запроса.

# Метод возвращает результат запроса - true или false.
# Чтобы получить информацию об ответе, можно использовать методы:

$httpClient->getResult(); // текст ответа
$httpClient->getStatus(); // код статуса ответа
$httpClient->getContentType(); // Content-Type ответа
$httpClient->getEffectiveUrl(); // реальный url ответа, т.е. после редиректов
$httpClient->getCookies(); // объект BitrixMainWebHttpCookies
$httpClient->getHeaders(); // объект BitrixMainWebHttpHeaders
$httpClient->getError(); // массив ошибок

# У объектов BitrixMainWebHttpCookies и BitrixMainWebHttpHeaders
# есть метод toArray() для получения массива cookies и заголовков соответственно.

# Вместо query можно использовать короткие вызовы в соответствии с методом запроса:

$httpClient->get($url); // Возвращает тело ответа
$httpClient->post($url, $postData); // Возвращает тело ответа
$httpClient->head($url); // Возвращает объект BitrixMainWebHttpHeaders

# Также класс HttpClient позволяет скачивать файлы методом GET:

$httpClient->download('http://example.ru/file.pdf', Application::getDocumentRoot() . '/upload/example/document.pdf');
?>
Tag: php, bitrix, d7

358 загрузить файлы на сервер с помощью HttpClient D7 [Guzzle, curl не нужен]

<?
use BitrixMainWebHttpClient;
$client = new HttpClient();
$srcFiles = [
                $_SERVER['DOCUMENT_ROOT'] . '/upload/test1.jpg',
                $_SERVER['DOCUMENT_ROOT'] . '/upload/test2.jpg',
                $_SERVER['DOCUMENT_ROOT'] . '/upload/test3.jpg',
            ];
$uploadData = [];
foreach ($srcFiles as $fname)
{
    $uploadData[] = [
        'resource' => fopen($fname, 'r'),
// дополнительные параметры
// 'content' => содержимое файла
// 'filename' => название файла
// 'contentType' => тип
    ];
}
$uploadUrl = 'https://www.bitrix24.ru/features/sites.php';
$resUpload = $client->post($uploadUrl, $uploadData, true);
?>
Tag: php, bitrix, d7, httpclient

359 Наиболее покупаемый товар за год, Самые продаваемые товары

<?
    \CModule::IncludeModule("catalog");
    $dateNow = new DateTime();
    $dateNow->add("-12 months");

    $arFilter = Array(">=DATE_INSERT" => $dateNow->format("Y-m-d H:i:s"));
    $db_sales = \CSaleOrder::GetList(["DATE_INSERT" => "DESC"],$arFilter,false,false,["ID"]);
    $arOrders = array();
    while ($ar_sales = $db_sales->Fetch(1,0)) { // Заказы за год
        $arOrders[] = $ar_sales['ID'];
    }
    $arOrderProduct = array();
    foreach ($arOrders as $key => $order_id) {
        $dbBasketItems = \CSaleBasket::GetList(array(), array("ORDER_ID" => $order_id), false, false, array());
        $product = array();
        while ($arItems = $dbBasketItems->Fetch(1,0)) {
            $arOrderProduct[$arItems['PRODUCT_ID']]++; // Товар куплен N раз
        }
        unset($dbBasketItems);
    }
    arsort($arOrderProduct);
    $arOrderProduct = array_keys($arOrderProduct);
    $result = array_slice($arOrderProduct,0,15);
?>
Tag: php, bitrix, d7

360 Товар с наличием на складе недавно поступивший

<?
    \CModule::IncludeModule('iblock');
    \CModule::IncludeModule('catalog');

    $IBLOCK_ID = 4;

    $dateNow = new DateTime();
    $dateNow->add("-12 months");
    $date12 = $dateNow->format("Y-m-d H:i:s");

    $arInfo = CCatalogSKU::GetInfoByProductIBlock($IBLOCK_ID); // Торговые предложения

    $dbItems = \CIBlockElement::GetList(
        ['DATE_CREATE' => 'DESC'],
        ['IBLOCK_ID' => $IBLOCK_ID, 'ACTIVE' => 'Y','>=DATE_CREATE'=>$date12],
        false,
        ["nPageSize"=>200],
        ['ID','CATALOG_QUANTITY']
    );
    $result = [];
    while ($ar_fields = $dbItems->Fetch(1,0)) {
        $CATALOG_QUANTITY = $ar_fields['CATALOG_QUANTITY'];
        if(empty($CATALOG_QUANTITY) || $CATALOG_QUANTITY == 0 ) { // Возможно есть торговые предложения
            $rsOffers = \CIBlockElement::GetList(array(),array('IBLOCK_ID' => $arInfo['IBLOCK_ID'], 'PROPERTY_'.$arInfo['SKU_PROPERTY_ID'] => $ar_fields['ID']),false,false,Array('ID','CATALOG_QUANTITY',));
            while ($arOffer = $rsOffers->Fetch(1,0)) {
                $CATALOG_QUANTITY += $arOffer['CATALOG_QUANTITY'];
            }
            unset($rsOffers,$arOffers);
        }
        if($CATALOG_QUANTITY > 0){
            $result[] = $ar_fields['ID']; // Есть наличие товара
        }
    }
    unset($dbItems,$ar_fields);
    $result = array_slice($result,0,32);

    $GLOBALS['arrFilter']['=ID'] = $result;
?>
Tag: php, bitrix, d7

361 Запись в CForm

<?
    $arValues = [
      'form_text_48' => htmlspecialcharsbx($_POST['product_id']),
      'form_text_49' => htmlspecialcharsbx($_POST['product_color']),
      'form_text_50' => htmlspecialcharsbx($_POST['product_size']),
      'form_text_51' => htmlspecialcharsbx($_POST['product_article']),
    ];

    if($RESULT_ID = CFormResult::Add(7, $arValues)) // Добавить данные в Forms ID=7
    {
      CFormResult::Mail($RESULT_ID); //
      $result['status'] = true;
    } else {
      $result['status'] = false;
    }
?>
Tag: php, bitrix, cform

362 Очистка буфера вывода

<?
# Если уровней вложенности буферов много, то может не сработать
$APPLICATION->restartBuffer();
#Гарантированная очистка всех уровней вложенности буферов вывода
while (ob_get_level()) {
    ob_end_clean();
}
?>
Tag: bitrix

363 Рекурсивная функция смены регистра всех ключей в массиве

<?
function array_change_key_case_recursive($arr, $case = CASE_LOWER)
{
    return array_map(function($item) use($case) {
        if(is_array($item))
            $item = array_change_key_case_recursive($item, $case);
        return $item;
    },array_change_key_case($arr, $case));
}
?>
Tag: php, case, array

364 Выборка всех активных служб доставки

<?
$deliveries = \Bitrix\Sale\Delivery\Services\Table::getList([
    'filter' => array('ACTIVE'=>'Y'),
])->fetchAll();
$AviableDeliveries = [];
foreach ($deliveries as $delivery) {
    if (\Bitrix\Sale\Delivery\Restrictions\ByLocation::check($CITY_CODE, [], $delivery['ID'])) {
        $AviableDeliveries[] = $delivery;
    }
}
print_r($AviableDeliveries);
?>
Tag: bitrix, d7, delivery

365 Выборка доставки по id

<?
$arDelivery = \Bitrix\Sale\Delivery\Services\Table::getById(1)->fetch();
?>
Tag: bitrix, d7, delivery

366 Выборка информации о платежной системе с ID=12 одной строкой

<?
$arPaySystem = \Bitrix\Sale\Internals\PaySystemActionTable::getById(12)->fetch());
echo "<pre>"; print_r($arPaySystem); echo "</pre>";
?>
Tag: bitrix, d7, paysystem

367 Выборка информации о платежных системах

<?
$rsPaySystem = \Bitrix\Sale\Internals\PaySystemActionTable::getList([
    'filter' => array('ACTIVE'=>'Y'),
]);
while($arPaySystem = $rsPaySystem->fetch())
{
    echo "<pre>"; print_r($arPaySystem); echo "</pre>";
}
?>
Tag: bitrix, d7, paysystem

368 Отправить SMS, используя стандартные функции битрикс.

<?
/*
    Для начала необходимо выбрать и настроить провайдера SMS
    в настройках модуля "Служба сообщений". Затем установить
    отправителя по умолчанию в настройках главного модуля.
    Также следующий код подразумевает, что создан тип
    SMS-события "MY_SMS_EVENT" и шаблон для него.
*/
$fields = array(
    'PHONE' => '+79990000000',
    'MACROS1' => 'Текст макроса 1',
    'MACROS2' => 'Текст макроса 2',
);

$sms = new \Bitrix\Main\Sms\Event('MY_SMS_EVENT', $fields);
$sms->setSite('s1');
$sms->setLanguage('ru');
$sms->send();
/*
    Проверить, что было отправлено можно, если вывести данные
    из таблицы "b_messageservice_message"
    (аналогична "b_event" для почты):
*/
//    SELECT * FROM b_messageservice_message ORDER BY ID DESC
?>
Tag: bitrix, d7, sms

369 Загрузка файла на сервер без использования формы

<?php
#
# CURL, multipart/form-data
#
$file = 'image.jpg';
$postdata = array( 'name' => 'Евгений',
                   'message' => 'Какое-то сообщение от пользователя',
                   'upload' => '@'.$file );

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://server.com/get.php');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_exec($ch);
curl_close($ch);
# Файл get.php на сервере http://server.com:
print_r($_POST);
print_r($_FILES);
move_uploaded_file($_FILES['upload']['tmp_name'], 'image.jpg');
# Результат работы:
/*
Array (
    [name] => Евгений
    [message] => Какое-то сообщение от пользователя
)
Array (
    [upload] => Array (
            [name] => image.jpg
            [type] => application/octet-stream
            [tmp_name] => C:WindowsTempphp504D.tmp
            [error] => 0
            [size] => 416919
        )
)

Важный момент: на форуме PHPCLUB.RU встретил упоминание, что может потребоваться указание полного пути файла — иначе CURL выдает ошибку.

$file = 'C:/work/localhost/www/image.jpg';
*/
#
# CURL, application/x-www-form-urlencoded
#
$file = 'image.jpg';
// данные POST-запроса
$postdata = array( 'name' => 'Евгений',
                   'message' => 'Какое-то сообщение от пользователя',
                   'upload' => file_get_contents($file) );

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://server.com/get.php');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_exec($ch);
curl_close($ch);
# Файл get.php на сервере http://server.com:
print_r($_POST);
file_put_contents('image.jpg', $_POST['upload']);
# Результат работы:
/* Array (
    [name] => Евгений
    [message] => Какое-то сообщение от пользователя
    [upload] => ...содержимое файла image.jpg...
)*/
#
# Сокеты, multipart/form-data
#
// устанавливаем соединение с сервером
$fp = fsockopen('server.com', 80, $errno, $errstr, 30);
if (!$fp) die($errstr.' ('.$errno.')');

$name = 'Евгений';
$message = 'Какое-то сообщение от пользователя';
$file = 'image.jpg';
// содержимое файла
$content = file_get_contents($file);

// разделитель
$boundary = md5(uniqid(time()));

$body = '--'.$boundary."
";
$body = $body.'Content-Disposition: form-data; name="name"'."

";
$body = $body.$name."
";

$body = $body.'--'.$boundary."
";
$body = $body.'Content-Disposition: form-data; name="message"'."

";
$body = $body.$message."
";

$body = $body.'--'.$boundary."
";
$body = $body.'Content-Disposition: form-data; name="upload"; filename="image.jpg"'."
";
$body = $body.'Content-Type: image/jpeg'."
";
$body = $body.'Content-Transfer-Encoding: binary'."

";
$body = $body.$content."
";

$body = $body.'--'.$boundary.'--';

// пишем в сокет метод, URI и протокол
fwrite($fp, 'POST /get.php HTTP/1.1'."
");
// а также имя хоста
fwrite($fp, 'Host: server.com'."
");
// отправляем заголовки
fwrite($fp, 'Content-Type: multipart/form-data; boundary='.$boundary."
");
fwrite($fp, 'Content-Length: '.strlen($body)."

");
// теперь передаем данные
fwrite($fp, $body);

// получаем ответ
$result = '';
while ( !feof($fp) ) $result .= fgets($fp, 1024);
// закрываем соединение
fclose($fp);
// выводим ответ в браузер
echo $result;

# Файл get.php на сервере http://server.com:
print_r( $_POST );
print_r( $_FILES );
move_uploaded_file($_FILES['upload']['tmp_name'], 'image.jpg')

#
# Сокеты, application/x-www-form-urlencoded
#
// устанавливаем соединение с сервером
$fp = fsockopen('server.com', 80, $errno, $errstr, 30);
if (!$fp) die($errstr.' ('.$errno.')');

$file = 'image.jpg';
// содержимое файла
$content = file_get_contents($file);
// данные POST-запроса
$data = 'name=' . urlencode('Евгений') . '&message=' . urlencode('Какое-то сообщение от пользователя') . '&upload='.urlencode($content);
// заголовоки запроса
$headers = 'POST /get.php HTTP/1.1'."
";
$headers .= 'Host: server.com'."
";
$headers .= 'Content-type: application/x-www-form-urlencoded'."
";
$headers .= 'Content-Length: '.strlen($data)."

";
// отправляем запрос серверу
fwrite($fp, $headers.$data);
// получаем ответ
$result = '';
while ( !feof($fp) ) $result .= fgets($fp, 1024);
// закрываем соединение
fclose($fp);
// выводим ответ в браузер
echo $result;

# Файл get.php на сервере http://server.com:
print_r($_POST);
file_put_contents('image.jpg', $_POST['upload']);

# Результат работы:
/*
HTTP/1.1 200 OK
Server: Apache/2.0 (Win32) PHP/5.1
X-Powered-By: PHP/5.1
Transfer-Encoding: chunked

Array (
    [name] => Евгений
    [message] => Какое-то сообщение от пользователя
    [upload] => ...содержимое файла image.jpg...
)
*/
#
# Метод PUT
#
// Описанные выше способы работают для относительно небольших файлов (примерно до 2-х мегабайт,
// для получения более точного значения необходимо смотреть // в настройках PHP максимальный
// объем принимаемых данных методом POST). Чтобы обойти это ограничение, будем передавать
// файл методом PUT:

$url = 'http://server.com/get.php';
$file = 'image.jpg';
// Открываем передаваемый файл на чтение для дальнейшей его передачи
$fp = fopen($file, 'r');
// Инициализируем сеанс CURL
$ch = curl_init();
// Указываем URL скрипта, который примет наш запрос. К имени скрипта
// добавляем еще две переменные, передаваемые методом GET
curl_setopt($ch, CURLOPT_URL, $url . '?name=' . urlencode('Евгений') . '&message=' . urlencode('Какое-то сообщение от пользователя'));
// Дескриптор файла, который собираемся передать
curl_setopt($ch, CURLOPT_INFILE, $fp);
// Указываем размер отправляемого файла
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($file));
// Указываем, что файл передается методом PUT
curl_setopt($ch, CURLOPT_PUT, 1);
// Указываем, что будет производиться закачка на удаленный сервер
curl_setopt($ch, CURLOPT_UPLOAD, 1);
// Выполняем запрос CURL
curl_exec($ch);
// Завершаем сеанс CURL
curl_close($ch);

#Файл get.php на сервере http://server.com:

print_r($_GET);
file_put_contents ('image.jpg', file_get_contents('php://input'));

#Результат работы:
/*
Array(
    [name] => Евгений
    [message] => Какое-то сообщение от пользователя
)
*/
?>
Tag: php, file, upload, curl

370 Как найти свой php.ini

<?php
    echo php_ini_loaded_file();
?>
Tag: php, общее

371 Отправка файла вместе с данными формы через ajax post

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

<form enctype="multipart/form-data" method="post" id="myForm1">
    <p><textarea id="TextArea1" rows="2" cols="20" name="TextArea1"></textarea></p>
    <p><input id="File1" type="file" multiple="multiple" /></p>
    <input id="btnUpload" type="button" value="Submit" />
</form>
<script>
$(document).ready(function () //Setting up on Document to Ready Function
{
    $("#btnUpload").click(function (event) {
        //getting form into Jquery Wrapper Instance to enable JQuery Functions on form
        var form = $("#myForm1");
        //Serializing all For Input Values (not files!) in an Array Collection so that we can iterate this collection later.
        var params = form.serializeArray();
        //Getting Files Collection
        var files = $("#File1")[0].files;
        //Declaring new Form Data Instance
        var formData = new FormData();
        //Looping through uploaded files collection in case there is a Multi File Upload. This also works for single i.e simply remove MULTIPLE attribute from file control in HTML.
        for (var i = 0; i < files.length; i++) {
            formData.append(files[i].name, files[i]);
        }
        //Now Looping the parameters for all form input fields and assigning them as Name Value pairs.
        $(params).each(function (index, element) {
            formData.append(element.name, element.value);
        });
        //disabling Submit Button so that user cannot press Submit Multiple times
        var btn = $(this);
        btn.val("Uploading...");
        btn.prop("disabled", true);
        $.ajax({
            url: "Handler.ashx", //You can replace this with MVC/WebAPI/PHP/Java etc
            method: "post",
            data: formData,
            contentType: false,
            processData: false,
            success: function () {
                //Firing event if File Upload is completed!
                alert("Upload Completed");
                btn.prop("disabled", false);
                btn.val("Submit");
                $("#File1").val("");
            },
            error: function (error) { alert("Error"); }
        });
    });
});
</script>
<?php
    #
    #+++++++++++++++++++++++++ Вариант 2 ++++++++++++++++++++++++++++++
    #
?>
<form enctype="multipart/form-data" method="post" id="myForm1">
    <p><textarea id="TextArea1" rows="2" cols="20" name="TextArea1"></textarea></p>
    <p><input id="File1" type="file" multiple="multiple" /></p>
    <input id="btnUpload" type="button" value="Submit" />
</form>

<script>
    $("#btnUpload").click(function (event) {
        event.preventDefault();
        var form = $('#myForm1')[0];
        var formData = new FormData(form);
        formData.append("action", "save");
        $.ajax({
            url: "ajax.php",
            method: "post",
            enctype: 'multipart/form-data',
            data: formData,
            contentType: false,
            processData: false,
            success: function (msg) {
                var ret = $.parseJSON(msg);
            },
            error: function (error) {
                alert("Error");
            }
        })
    }
</script>
<?php // ajax.php
    file_put_contents("test.arr",print_r($_REQUEST,1).print_r($_FILES,1));
?>
Tag: php, js, form, file, ajax

372 connect to DB PostgreSQL

<?php
function ConnectPDOPgSQL() {// connect to DB PostgreSQL
    static $dbconn;
    if (is_null($dbconn)) {
        try {
            $host     = 'localhost';
            $port     = 5432;
            $dbname   = 'postgres';
            $username = 'postgres';
            $passwd   = '';
            $dbconn = new PDO("pgsql:host=$host;port=$port;dbname=$dbname", $username, $passwd);
        } catch (PDOException $e) {
            print "Error!: " . $e->getMessage() . "<br />";
        }
    }
    return $dbconn;
}

$dbconn = ConnectPDOPgSQL(); // Подключение
// Проверка на подключение
if (!$dbconn) {
    // Если проверку не прошло, то выводится надпись ошибки и заканчивается работа скрипта
    echo "Не удается подключиться к серверу базы данных!";
    exit;
}
?>
Tag: php, sql, pdo

373 SELECT DB PostgreSQL

<?php
    $year = 2021;
    $res = $dbconn->query("Select * FROM people where rip >= '$year.01.01' AND rip < '".(++$year).".01.01' AND active='1' ORDER BY rip ASC");
    $select = [];
    while ($row = $res->fetch(PDO::FETCH_ASSOC)) {
        $select[] = $row;
    }
?>
Tag: php, sql, pdo

374 INSERT to DB PostgreSQL

<?php
    function pdoSetInsert($arValues) {
        $par = $set = [];
        foreach ($arValues as $key=>$field) {
            $par[] = $key;
            $set[] = ":".$key;
        }
        return "(".implode(", ",$par).") VALUES ( ".implode(", ",$set).")";
    }

    $sql = "INSERT INTO people ".pdoSetInsert($_REQUEST);
    $stm = $dbconn->prepare($sql);
    $stm->execute($_REQUEST);
    #
    # Вариант 2
    #
    $login = $_REQUEST['login'];
    $pass = password_hash($_REQUEST['pass'], PASSWORD_DEFAULT);

    $sql = "INSERT INTO admin (password, login) VALUES ('$pass', '$login')";
    $result = $dbconn->exec($sql);
?>
Tag: php, sql, pdo

375 UPDATE to DB PostgreSQL

<?php
    function pdoSetUpdate($arValues) {
        $par = $set = [];
        foreach ($arValues as $key=>$field) {
            $par[] = $key;
            $set[] = ":".$key;
        }
        return "(".implode(", ",$par).") = ( ".implode(", ",$set).")";
    }

    $sql = "UPDATE people SET ".pdoSetUpdate($_REQUEST)." WHERE id = $id;";
    $stm = $dbconn->prepare($sql);
    $stm->execute($_REQUEST);
?>
Tag: php, sql, pdo

376 DELETE to DB PostgreSQL

<?php
    $sql = "DELETE FROM people WHERE id = '".$_REQUEST['id']."';";
    $dbconn->query($sql);
?>
Tag: php, sql, pdo

377 Поиск Bitrix

<?php
    <form method="post" action="">
        <input type="text" name="q" id="search">
    </form>
    <div class="

"></div>
?>
<script>
$(document).ready(function(){
    $("#search").on("keyup", function(eventObject){
        var txt = $(this).val();
        if(eventObject.keyCode == 27) { // ESC
            ...
        }
        if(txt.length > 1){
            $.ajax( {
                type: "POST",
                url: "ajax.php",
                data: "q="+txt,
                success: function(msg){
                    $(".resultSearch").html(msg);
                }
            });
        }
    });
});
</script>
<?php
// ajax.php
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");

CModule::IncludeModule("search");

$q = $_REQUEST['q'];
$module_id = "iblock";
$param1 = 'catalogs';
$param2 = 2;

$obSearch = new CSearch;

$obSearch->SetOptions(array(//мы добавили еще этот параметр, чтобы не ругался на форматирование запроса
   'ERROR_ON_EMPTY_STEM' => false,
));

$obSearch->Search(array(
    'QUERY' => $q,
    'SITE_ID' => SITE_ID,
    'MODULE_ID' => $module_id,
    'PARAM1' => $param1, // тип инфоблока.
    'PARAM2' => $param2  // ID инфоблока.
));

if (!$obSearch->selectedRowsCount()) {//и делаем резапрос, если не найдено с морфологией...
   $obSearch->Search(array(
        'QUERY' => $q,
        'SITE_ID' => SITE_ID,
        'MODULE_ID' => $module_id,
        'PARAM1' => $param1,
        'PARAM2' => $param2
   ), array(), array('STEMMING' => false));//... уже с отключенной морфологией
}
$arResult = [];
$N = 1;
while ($row = $obSearch->fetch()) {
    $arResult[] = '<div class="line"><a href="'.$row['URL'].'">' ."$N	". $row['TITLE_FORMATED'].'</a>'.(strlen($row['BODY_FORMATED'])>0 ? "	<div class='subline'>".$row['BODY_FORMATED']:"").'</div></div>';
    $N++;
}
echo implode("",$arResult);
?>
Tag: php, bitrix, search, ajax

378 Как добавить кнопки «Изменить элемент», «Добавить элемент», «Удалить элемент» в 1С-Битрикс

<?php
$comp = new CBitrixComponent;
// Получаем ссылки для редактирования и удаления элемента
  $arButtons = CIBlock::GetPanelButtons(
      $s["IBLOCK_ID"],
      $s["ID"], // Для елемента
      0,        // Для раздела
      array("SECTION_BUTTONS"=>false/*true - для раздела*/, "SESSID"=>false)
  );

  $arItem["ADD_LINK"] = $arButtons["edit"]["edit_element"]["ACTION_URL"];
  $arItem["EDIT_LINK"] = $arButtons["edit"]["edit_element"]["ACTION_URL"];
  $arItem["DELETE_LINK"] = $arButtons["edit"]["delete_element"]["ACTION_URL"];
  // Вызываем действия для элемента методами AddEditAction, AddDeleteAction
  $comp = new CBitrixComponent;
  $comp->AddEditAction($s[ID], $s['ADD_LINK'], CIBlock::GetArrayByID($IBLOCK_ID, "ELEMENT_ADD"));
  $comp->AddEditAction($s[ID], $s['EDIT_LINK'], CIBlock::GetArrayByID($IBLOCK_ID, "ELEMENT_EDIT"));
  $comp->AddDeleteAction($s[ID], $s['DELETE_LINK'], CIBlock::GetArrayByID($IBLOCK_ID, "ELEMENT_DELETE"),
      array("CONFIRM" => GetMessage('CT_BNL_ELEMENT_DELETE_CONFIRM')));

    или для Раздела

  $arItem["ADD_LINK"] = $arButtons["edit"]["edit_section"]["ACTION_URL"];
  $arItem["EDIT_LINK"] = $arButtons["edit"]["edit_section"]["ACTION_URL"];
  $arItem["DELETE_LINK"] = $arButtons["edit"]["delete_section"]["ACTION_URL"];
// Вызываем действия для элемента методами AddEditAction, AddDeleteAction
  $comp = new CBitrixComponent;
  $comp->AddEditAction($s[ID], $s['ADD_LINK'], CIBlock::GetArrayByID($IBLOCK_ID, "SECTION_ADD"));
  $comp->AddEditAction($s[ID], $s['EDIT_LINK'], CIBlock::GetArrayByID($IBLOCK_ID, "SECTION_EDIT"));
  $comp->AddDeleteAction($s[ID], $s['DELETE_LINK'], CIBlock::GetArrayByID($IBLOCK_ID, "SECTION_DELETE"),
      array("CONFIRM" => GetMessage('CT_BNL_ELEMENT_DELETE_CONFIRM')));

  //   Чтобы это заработало, блоку нужно передать id:
?>
  <div id="<?=$comp->GetEditAreaId($s[ID])?>">Элемент, который выделится эрмитажем</div>
Tag: bitrix

379 Стилизация загрузки файла

<input type="file" name="file" class="wrap_input-file" id="file_id" accept="application/msword,text/plain,application/pdf">
<label for="file_id" class="btn btn-second js-labelFile">
    <span class="js-fileName">Загрузить файл</span>
</label>

<style type="text/css">
.wrap label { height: 47px;}
.wrap_input-file{width:.1px;height:.1px;opacity:0;overflow:hidden;position:absolute;z-index:-1}
.wrap_input-file + .js-labelFile{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:0 10px;cursor:pointer}
</style>
<script>
    $('.wrap_input-file').on('change', function(element) {
        var $input = $(this),
            $label = $input.next('.js-labelFile'),
            labelVal = $label.html(),
            fileName = '',
            file_data = $(this).prop('files')[0],
            form_data = new FormData();

            form_data.append('file', file_data);

        if (element.target.value)
            fileName = element.target.value.split('\').pop();

        if(fileName) {
            $label.find('.js-fileName').html(fileName)
            $.ajax( {
                cache: false,
                contentType: false,
                processData: false,
                type: "POST",
                url: $('body').data('template') + "/ajax.php",
                data: form_data,
                success: function(msg){
                    alert(msg);
                }
            });
        } else {
            $label.html(labelVal);
        }
    });
</script>
<?/*ajax.php*/
    file_put_contents($_SERVER["DOCUMENT_ROOT"]."/___aa.txt","
".print_r($_REQUEST,1).print_r($_FILES,1));

    move_uploaded_file($_FILES['file']['tmp_name'], $_SERVER["DOCUMENT_ROOT"].'/upload/tmp/' . $_FILES['file']['name']);
    if (file_exists($_SERVER["DOCUMENT_ROOT"].'/upload/tmp/' . $_FILES['file']['name'])) {
        $arFile = CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"].'/upload/tmp/' . $_FILES['file']['name']);

   // unlink($_SERVER["DOCUMENT_ROOT"].'/upload/tmp/' . $_FILES['file']['name']);
   echo "ok";
   return;
?>
Tag: php, js, ajax, post, form, bitrix

380 Список функций и методов CIBlockFindTools

<?php
# itrixmodulesiblockclassesgeneralcomp_findtools.php

# Список методов CIBlockFindTools

CIBlockFindTools::GetElementID($element_id, $element_code, $section_id, $section_code, $arFilter)
CIBlockFindTools::GetSectionID($section_id, $section_code, $arFilter)
CIBlockFindTools::GetSectionIDByCodePath($iblock_id, $section_code_path)
CIBlockFindTools::checkElement($iblock_id, &$arVariables, $strict_check = false)
CIBlockFindTools::checkSection($iblock_id, &$arVariables)
CIBlockFindTools::resolveComponentEngine(CComponentEngine $engine, $pageCandidates, &$arVariables)
?>
Tag: bitrix

381 Кнопка CLOSE

<div class="modal_price-list__wrap">
    <div class="modal_price-list__close">
      <hr class="modal_price-list__close-line">
      <hr class="modal_price-list__close-line">
    </div>
</div>
<style>
.modal_price-list__wrap {
    position: relative;
    width: 960px;
    height: 620px;
    margin: auto;
    background-color: #0877AE;
}
.modal_price-list__close {
    position: absolute;
    right: 0;
    top: -5%;
    user-select: none;
    cursor: pointer;
}
.modal_price-list__close-line:first-child {
    transform: rotate(45deg) translateY(1px) translateX(1px);
}
.modal_price-list__close-line:last-child {
    transform: rotate(-45deg);
}
.modal_price-list__close-line {
    height: 2px;
    width: 24px;
    background-color: #fff;
    border: none;
}
</style>

Tag: close, css

382 Ajax POST на javascript

<script>

function ajax(number, count){
    const request = new XMLHttpRequest();
    const url = "ajax/ajax.php";

    request.open("POST", url, false); // false - синхронный, true - асинхронный
    request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    request.addEventListener("readystatechange", () => {
        if(request.readyState === 4 && request.status === 200) {
            return request.responseText;
        } else {
            return 0;
        }
    });
    const params = "number=" + number + "&count=" + count;
    request.send(params);
}
</script>
Tag: js, ajax

383 Файл "Политика конфиденциальности"

    <!-- Качайте архив с файлом -->
    <a download href="https://shng.ru/programmer/images/privacy.zip">privacy.zip</a>

Tag: bitrix, privacy

384 Восстановление забытого пароля резервной копии Bitrix

<?php
//  нужно иметь доступ к базе данных и файлам сайта
//  в административном разделе в Командную строку PHP прописываем следующее:
require_once $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/classes/general/backup.php';
var_dump(CPasswordStorage::Get('dump_temporary_cache'));
//
// Результатом работы данной команды будет ваш пароль, который использовался для создания резервной копии
?>
<?php
// Если же вам нужен пароль тогда, когда ваш сайт уже не открывается —
// используем следующий метод, предварительно создав в корне сайта файл
define('NO_KEEP_STATISTIC', true);
define('NOT_CHECK_PERMISSIONS',true);
define('BX_NO_ACCELERATOR_RESET', true);

require_once $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php';
require_once $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/classes/general/backup.php';

var_dump(CPasswordStorage::Get('dump_temporary_cache'));
?>
Tag: bitrix, backup

385 Как посчитать стоимость товара или предложения со всеми скидками

<?
/***Как посчитать стоимость товара или предложения со всеми скидками***/
function getFinalPriceInCurrency($item_id, $sale_currency = 'RUB') {
CModule::IncludeModule("iblock");
CModule::IncludeModule("catalog");
CModule::IncludeModule("sale");
    global $USER;

    $currency_code = 'RUB';

    // Проверяем, имеет ли товар торговые предложения?
    if(CCatalogSku::IsExistOffers($item_id)) {

        // Пытаемся найти цену среди торговых предложений
        $res = CIBlockElement::GetByID($item_id);

        if($ar_res = $res->GetNext()) {

            if(isset($ar_res['IBLOCK_ID']) && $ar_res['IBLOCK_ID']) {

                // Ищем все тогровые предложения
                $offers = CIBlockPriceTools::GetOffersArray(array(
                    'IBLOCK_ID' => $ar_res['IBLOCK_ID'],
                    'HIDE_NOT_AVAILABLE' => 'Y',
                    'CHECK_PERMISSIONS' => 'Y'
                ), array($item_id), null, null, null, null, null, null, array('CURRENCY_ID' => $sale_currency), $USER->getId(), null);

                foreach($offers as $offer) {

                    $price = CCatalogProduct::GetOptimalPrice($offer['ID'], 1, $USER->GetUserGroupArray(), 'N');
                    if(isset($price['PRICE'])) {

                        $final_price = $price['PRICE']['PRICE'];
                        $currency_code = $price['PRICE']['CURRENCY'];

                        // Ищем скидки и высчитываем стоимость с учетом найденных
                        $arDiscounts = CCatalogDiscount::GetDiscountByProduct($item_id, $USER->GetUserGroupArray(), "N");
                        if(is_array($arDiscounts) && sizeof($arDiscounts) > 0) {
                            $final_price = CCatalogProduct::CountPriceWithDiscount($final_price, $currency_code, $arDiscounts);
                        }

                        // Конец цикла, используем найденные значения
                        break;
                    }
                }
            }
        }
    } else {
        // Простой товар, без торговых предложений (для количества равному 1)
        $price = CCatalogProduct::GetOptimalPrice($item_id, 1, $USER->GetUserGroupArray(), 'N');

        // Получили цену?
        if(!$price || !isset($price['PRICE'])) {
            return false;
        }

        // Меняем код валюты, если нашли
        if(isset($price['CURRENCY'])) {
            $currency_code = $price['CURRENCY'];
        }
        if(isset($price['PRICE']['CURRENCY'])) {
            $currency_code = $price['PRICE']['CURRENCY'];
        }

        // Получаем итоговую цену
        $final_price = $price['PRICE']['PRICE'];

        // Ищем скидки и пересчитываем цену товара с их учетом
        $arDiscounts = CCatalogDiscount::GetDiscountByProduct($item_id, $USER->GetUserGroupArray(), "N", 2);
        if(is_array($arDiscounts) && sizeof($arDiscounts) > 0) {
            $final_price = CCatalogProduct::CountPriceWithDiscount($final_price, $currency_code, $arDiscounts);
        }
    }
    // Если необходимо, конвертируем в нужную валюту
    if($currency_code != $sale_currency) {
        $final_price = CCurrencyRates::ConvertCurrency($final_price, $currency_code, $sale_currency);
    }
    return $final_price;
}
?>
Tag: bitrix

386 Как добавить кнопки: Изменить, Удалить, Добавить

<?php
    foreach($arResult['ITEM'] as $arItem) {
        $arButtons = CIBlock::GetPanelButtons($arItem["IBLOCK_ID"],$arItem["ID"],0,
                                array("SECTION_BUTTONS"=>false, "SESSID"=>false));

        $arItem["ADD_LINK"] = $arButtons["edit"]["add_element"]["ACTION_URL"];
        $arItem["EDIT_LINK"] = $arButtons["edit"]["edit_element"]["ACTION_URL"];
        $arItem["DELETE_LINK"] = $arButtons["edit"]["delete_element"]["ACTION_URL"];

        $arItem["ADD_LINK_TEXT"] = $arButtons["edit"]["add_element"]["TEXT"];
        $arItem["EDIT_LINK_TEXT"] = $arButtons["edit"]["edit_element"]["TEXT"];
        $arItem["DELETE_LINK_TEXT"] = $arButtons["edit"]["delete_element"]["TEXT"];

        $this->AddEditAction($arItem['ID'], $arItem['ADD_LINK'], $arItem["ADD_LINK_TEXT"]);
        $this->AddEditAction($arItem['ID'], $arItem['EDIT_LINK'], $arItem["EDIT_LINK_TEXT"]);
        $this->AddDeleteAction($arItem['ID'], $arItem['DELETE_LINK'], $arItem["DELETE_LINK_TEXT"],
                                array("CONFIRM" => GetMessage('CT_BNL_ELEMENT_DELETE_CONFIRM')));
?>&nbsp;
    <div class="card" id="<?=$this->GetEditAreaID($arItem['ID'])?>">
    ...
Tag: bitrix, keyboard, edit, delete

387 Вертикальное центрирование

<style type="text/css">
    .container {
        min-height: 10em;
        display: table-cell;
        vertical-align: middle;
    }
</style>
Tag: css, html

388 Автовысота textarea

<textarea id="textarea" placeholder="Введите текст..."></textarea>

<script>
    $('#textarea').on('input', function(){
        this.style.height = '1px';
        this.style.height = (this.scrollHeight + 6) + 'px';
    });
</script>
<style type="text/css">
#textarea {
	display: block;
	width: 500px;
	box-sizing: border-box;
	margin: 0 0 5px 0;
	padding: 10px;
	border: solid 3px #e06969;
	background-color: #fff;
	min-height: 54px;
	font-size: 14px;
	line-height: 1.2;
}
</style>
Tag: css, html, js

389 Пагинация в API

<?
$CNT = 32;
$PAGE = $_GET['page'];

$rsElement = CIBlockElement::GetList(array('SORT' => 'asc'),$arFilter, false,
                    ['nPageSize'=>$CNT, 'iNumPage'=>$PAGE, 'bShowAll' => true ]);

$arResult['NAV'] = $rsElement->GetPageNavString(
    'Элементы', // поясняющий текст
    'modern',   // имя шаблона
    false       // показывать всегда?
);
echo $arResult['NAV'];
?>
Tag: php, page, navigation, pagination, bitrix

390 Прямой запрос к разделам IBlock

<?
global $DB;
$IBlock_ID = 244;
$results = $DB->Query("SELECT distinct * FROM `b_iblock_section` WHERE `IBLOCK_ID`='$IBlock_ID'");
while ($row = $results->Fetch()) {
    echo "<pre>".print_r($row,1)."</pre>";
}
?>
Tag: section, bitrix, sql

391 Basket D7

<?php
use BitrixSale;

Bitrix\Main\Loader::includeModule("catalog");

// Корзину можно получить для текущего юзера
$basket = Sale\Basket::loadItemsForFUser(Sale\Fuser::getId(), Bitrix\Main\Context::getCurrent()->getSite());

// корзину заказа:
/** int $orderId номер заказа */
$basket = Sale\Order::load($orderId)->getBasket();
// или:
/** SaleBasket $order объект заказа */
$basket = Sale\Basket::loadItemsForOrder($order);

// Информация о корзине:

$price = $basket->getPrice(); // Цена с учетом скидок
$fullPrice = $basket->getBasePrice(); // Цена без учета скидок
$weight = $basket->getWeight(); // Общий вес корзины

// добавления в корзину:

$fields = [
    'PRODUCT_ID' => 98, // ID товара, обязательно
    'QUANTITY' => 2, // количество, обязательно
    'PROPS' => [
        ['NAME' => 'Test prop', 'CODE' => 'TEST_PROP', 'VALUE' => 'test value'],
    ],

];
$r = Bitrix\Catalog\ProductBasket::addProduct($fields);
if (!$r->isSuccess()) {
    var_dump($r->getErrorMessages());
}

// Получение записи по ID и удаление записи из корзины (аналог CSaleBasket::Delete):

/** int $id ID записи */
$basket->getItemById($id)->delete();
$basket->save();

// Получение товаров в корзине, доступных для покупки (CAN_BUY=Y):

$orderBasket = $basket->getOrderableItems();

// Информация о корзине

var_dump($basket->getListOfFormatText()); // возвращает корзину в читаемом виде:
// array(2) { [11]=> string(101) "Тарелка [Цвет: Кофе с молоком] - 2 : 2 199 руб." [12]=> string(65) "Кружка - 1 : 1 899 руб." }
var_dump($basket->getQuantityList()); // возвращает массив "количеств" товаров в корзине:
// array(3) { [11]=> float(2) [12]=> float(1) }

var_dump(array_sum($basket->getQuantityList())); // float(3) - количество товаров в корзине
var_dump(count($basket->getQuantityList())); // int(2) - количество позиций в корзине

// Товар в корзине (SaleBasketItem)

$basketItems = $basket->getBasketItems(); // массив объектов SaleBasketItem

// перебираем записи с помощью foreach:

foreach ($basket as $basketItem) {
    echo $basketItem->getField('NAME') . ' - ' . $basketItem->getQuantity() . '<br />';
}

# Информация о товарах в корзине:

$item = $basketItems[0];
$item->getId();         // ID записи в корзине
$item->getProductId();  // ID товара
$item->getPrice();      // Цена за единицу
$item->getQuantity();   // Количество
$item->getFinalPrice(); // Сумма
$item->getWeight();     // Вес
$item->getField('NAME');// Любое поле товара в корзине
$item->canBuy();        // true, если доступно для покупки
$item->isDelay();       // true, если отложено

// Также из записи можно получить другие сущности:

$item->getPropertyCollection(); // Свойства товара в корзине, коллекция объектов SaleBasketPropertyItem, см. ниже
$item->getCollection();         // Корзина, в которой лежит товар 

// Действия над записями:

$item->setField('QUANTITY', $quantity); // Изменение поля
$item->setFields(array(
    'QUANTITY' => $quantity,
    'CUSTOM_PRICE' => $customPrice,
)); // Изменение полей

$item->delete(); // Удаление
$item->save();   // Сохранение изменения, можно использовать и $basket->save();

// А таким образом можем получить количество и сумму товаров в корзине текущего юзера:

$result = Sale\Internals\BasketTable::getList(array(
    'filter' => array(
        'FUSER_ID' => SaleFuser::getId(), 
        'ORDER_ID' => null,
        'LID' => SITE_ID,
        'CAN_BUY' => 'Y',
    ),
    'select' => array('BASKET_COUNT', 'BASKET_SUM'),
    'runtime' => array(
        new \Bitrix\MainEntity\ExpressionField('BASKET_COUNT', 'COUNT(*)'),
        new \Bitrix\MainEntity\ExpressionField('BASKET_SUM', 'SUM(PRICE*QUANTITY)'),
    )
))->fetch();

// Получить свойства товаров в корзине поможет класс BitrixSaleInternalsBasketPropertyTable:

$basketPropRes = Sale\Internals\BasketPropertyTable::getList(array(
   'filter' => array(
      "BASKET_ID" => $basketItemId,
   ),
));

while ($property = $basketPropRes->fetch()) {
   var_dump($property);
}
Tag: basket, bitrix, order

392 Копирование текста в буфер обмена по клику

<script>
/*
Копирование происходит через функцию copytext(element), например:

<button onclick="copytext('#text1')">Добавить в буфер</button>

Если в копируемом тексте не нужны переносы строк, то вместо:

var $tmp = $("<textarea>");

нужно написать:

var $tmp = $("<input>");
*/
function copytext(el) {
    var $tmp = $("<textarea>");
    $("body").append($tmp);
    $tmp.val($(el).text()).select();
    document.execCommand("copy");
    $tmp.remove();
}    
</script>
Tag: js, copy

393 Zip работа со строкой

$compressed = gzcompress(json_encode($_SERVER), 9);
$enc = base64_encode($compressed);
echo "<pre>"; var_dump($enc); echo "</pre>";

$dc = base64_decode($enc);
$uc = gzuncompress($dc);
echo "<pre>"; var_dump(json_decode($uc,1)); echo "</pre>";
Tag: zip, qz, base64, json

394 Параметры компонента

<?
# https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=43&LESSON_ID=2132&LESSON_PATH=3913.4565.2132

GROUPS:

"код группы" => array(
    "NAME" => "название группы на текущем языке",
    "SORT" => "сортировка",
    )

--------------------------------------------------------------------------
КОД             СОРТИРОВКА      НАЗВАНИЕ                 ОПИСАНИЕ

BASE                   100      Основные параметры              Базовые параметры для 
                                                                работы компонента
DATA_SOURCE            200      Источник данных                 Параметры, указывающие, 
                                                                откуда выбирать данные для 
                                                                компонента (к примеру, для 
                                                                компонент модуля Инфоблоки это 
                                                                тип и ID инфоблока).
VISUAL                 300      Настройки внешнего вида         Сюда предполагается размещать 
                                                                параметры, отвечающие за внешний вид.
USER_CONSENT           350      Согласие пользователя           Настройка параметров на получение 
                                                                согласия пользователя, согласно 
                                                                законодательству РФ,.
URL_TEMPLATES          400      Шаблоны ссылок                  Служебная
SEF_MODE               500      Управление адресами страниц     Группа для всех параметров, 
                                                                связанных с использованием ЧПУ.
AJAX_SETTINGS          550      Управление режимом AJAX         Все, что касается ajax.
CACHE_SETTINGS         600      Настройки кеширования           Появляется при указании 
                                                                параметра CACHE_TIME.
ADDITIONAL_SETTINGS    700      Дополнительные настройки        Эта группа появляется, например, при 
                                                                указании параметра SET_TITLE.
--------------------------------------------------------------------------

PARAMETERS

"код параметра" => array(
    "PARENT"    => "код группы",  // если нет - ставится ADDITIONAL_SETTINGS
    "NAME"    => "название параметра на текущем языке",
    "TYPE"    => "тип элемента управления, в котором будет устанавливаться параметр",
    "REFRESH"    => "перегружать настройки или нет после выбора (N/Y)",
    "MULTIPLE"    => "одиночное/множественное значение (N/Y)",
    "VALUES"    => "массив значений для списка (TYPE = LIST)",
    "ADDITIONAL_VALUES" => "показывать поле для значений, вводимых вручную (Y/N)",
    "SIZE"    => "число строк для списка (если нужен не выпадающий список)",
    "DEFAULT"    => "значение по умолчанию",
    "COLS"    => "ширина поля в символах",
),

Для типа элемента управления TYPE есть значения:

LIST - выбор из списка значений. Для типа LIST ключ VALUES содержит массив значений следующего вида:
VALUES => array( "ID или код, сохраняемый в настройках компонента" => "языкозависимое описание", ),

Если в списке значений используются строковые ключи (RUB, 'TRIPLEX' и так далее), то массив выводится 
в том порядке, как сформирован . Если же ключи могут быть приведены к числовым - массив значений 
выводится отсортированный по ключам.

STRING - текстовое поле ввода.
CHECKBOX - да/нет.
CUSTOM - позволяет создавать кастомные элементы управления.
FILE - выбор файла.

    Пример:
        Пример реализации в компоненте bitrix:player:
        $ext = 'wmv,wma,flv,vp6,mp3,mp4,aac,jpg,jpeg,gif,png';
        Array(
           "PARENT" => "BASE_SETTINGS",
           "NAME" => 'Выберите файл:',
           "TYPE" => "FILE",
           "FD_TARGET" => "F",
           "FD_EXT" => $ext,
           "FD_UPLOAD" => true,
           "FD_USE_MEDIALIB" => true,
           "FD_MEDIALIB_TYPES" => Array('video', 'sound')
        );

    В данном случае можно будет выбрать файл из медиабиблиотеки или из файловой 
    структуры. Результатом будет строка - путь к файлу от корня сайта.

COLORPICKER - указание цвета:

    $arComponentParameters["PARAMETERS"]["COLOR"]  = Array(
        "PARENT" => "BASE",
        "NAME" => 'Выбор цвета',
        "TYPE" => "COLORPICKER",
        "DEFAULT" => 'FFFF00'
    );

Внешний вид списка меняется в зависимости от наличия/отсутствия ключей 
MULTIPLE и ADDITIONAL_VALUES:

Если MULTIPLE и ADDITIONAL_VALUES отсутствуют или равны "N", то выводится 
     просто список, никаких значений в список не добавляется.
Если ADDITIONAL_VALUES = "Y", MULTIPLE = "N", то в список добавляется значение 
     "другое" и рядом доп.поле для ввода значения вручную.
Если ADDITIONAL_VALUES = "N", MULTIPLE = "Y", то в список ничего не добавляется,
     просто появляется возможность выбрать несколько элементов.
Если ADDITIONAL_VALUES = "Y", MULTIPLE = "Y", то в список добавляется значение 
     не выбрано и рядом множественное дополнительное поле для ввода значения вручную.?>
Tag: parameters, bitrix

395 Создание своей отложенной функции

<?php
// выводим разметку в зависимости от параметра страницы "show_side_menu"
$APPLICATION->AddBufferContent(array('MyClass', 'showCondSide'));
?>
<?php
class MyClass {
    /**
     * выводим разметку в зависимости от параметра страницы "show_side_menu"
     * @return string
     * */
    public function showCondSide() {
        global $APPLICATION;
        $bShowSide = $APPLICATION->GetPageProperty("show_side_menu");

        $props = $APPLICATION->GetPagePropertyList();

        ob_start();
    
            if($bShowSide):?>
                <div class="col-md-3">

                    <?$APPLICATION->IncludeComponent(
                        "bitrix:menu",
                        "sub_menu",
                        Array(
                            "ALLOW_MULTI_SELECT" => "N",
                            "CHILD_MENU_TYPE" => "left",
                            "DELAY" => "N",
                            "MAX_LEVEL" => "1",
                            "MENU_CACHE_GET_VARS" => array(0=>"",),
                            "MENU_CACHE_TIME" => "3600",
                            "MENU_CACHE_TYPE" => "N",
                            "MENU_CACHE_USE_GROUPS" => "Y",
                            "ROOT_MENU_TYPE" => "main_popup_sub",
                            "USE_EXT" => "N"
                        )
                    );?>

                </div>

                <div class="col-md-9 page-content">                        

            <?else : ?>
            
                <div class="col-md-12 page-content">
            
            <?endif;?>
            <?
            $buferResult = ob_get_contents();
        ob_end_clean();

        return $buferResult;
    }
}
Tag: bitrix, ob_, add, отложенные

396 Передача данных формы Стандартная проверка соответствия сессии

<form action="" name="form-order" method="post">
    <?=bitrix_sessid_post();?>
    <!-- ... разметка ... -->
</form>

<?php
if(!check_bitrix_sessid()) {
    $valid = false;
}
Tag: bitrix, form, sessid

397 Объекты Context, Request в Битрикс D7

<?php
// Подключение
use BitrixMainApplication, 
    BitrixMainContext, 
    BitrixMainRequest, 
    BitrixMainServer;
 
$application = Application::getInstance(); // Объект приложения
$docRoot = Application::getDocumentRoot(); // root
$connection = Application::getConnection(); // соединение с БД
 
$context = Context::getCurrent(); // контекст текущего хита
$request = $context->getRequest(); // объект Request
$server = $context->getServer();   // объект Server
$siteId = $context->getSite();     // ID текущего сайта ("s1")
$langId = $context->getLanguage(); // ID текущего языка ("ru")
 
$request = Context::getCurrent()->getRequest(); // Объект запроса
$request = $context->getRequest(); // альтернатива
 
$value = $request->get("param"); // получение параметра
$value = $request["param"]; // получение параметра
$values = $request->getQueryList(); // список параметров
$value = $request->getQuery("param"); // получение GET-параметра
$value = $request->getPost("param"); // получение POST-параметра
$values = $request->getPostList(); // получение списка POST-параметров
$value = $request->getFile("param"); // получение загруженного файла
$values = $request->getFileList(); // получение списка загруженных файлов
$value = $request->getCookie("param"); // получение значения куки
$values = $request->getCookieList(); // получение списка
$method = $request->getRequestMethod(); // получение метода запроса
$flag = $request->isGet(); // true - GET-запрос, иначе false
$flag = $request->isPost(); // true - POST-запрос, иначе false
$flag = $request->isAjaxRequest(); // true - AJAX-запрос, иначе false
$flag = $request->isHttps(); // true - HTTPS-запрос, иначе false
$flag = $request->isAdminSection(); // true - находимся в админке, иначе false
$requestUri = $request->getRequestUri(); // Запрошенный адрес (напр. "/catalog/category/?param=value")
$requestPage = $request->getRequestedPage(); // Запрошенная страница (напр. "/catalog/category/index.php")
$rDir  = $request->getRequestedPageDirectory(); // Директория запрошенной страницы (напр. "/catalog/category")
 
$server = Context::getCurrent()->getServer(); // сервер
$server->getDocumentRoot(); // DOCUMENT_ROOT
$server->getHttpHost(); // HTTP_HOST 
$server->getServerName(); // SERVER_NAME 
$server->getServerAddr(); // SERVER_ADDR 
$server->getServerPort(); // SERVER_PORT 
$server->getRequestUri(); // REQUEST_URI 
$server->getRequestMethod(); // REQUEST_METHOD 
$server->getPhpSelf(); // PHP_SELF 
$server->getScriptName(); // SCRIPT_NAME
$server->get('HTTP_ACCEPT'); // Любое значение из $_SERVER
?>
Tag: bitrix, d7

398 Видео для Битрикс

<?php ?>
<?$APPLICATION->IncludeComponent("bitrix:player","",Array(
	"PLAYER_TYPE" => "auto",
	"USE_PLAYLIST" => "Y",
	"PATH" => "playlist.xml",
	"PLAYLIST_DIALOG" => "",
	"PROVIDER" => "video",
	"STREAMER" => "",
	"WIDTH" => "400",
	"HEIGHT" => "400",
	"PREVIEW" => "",
	"FILE_TITLE" => "Вступление",
	"FILE_DURATION" => "305",
	"FILE_AUTHOR" => "Иван Иванов",
	"FILE_DATE" => "01.08.2010",
	"FILE_DESCRIPTION" => "Презентация продукта",
	"SKIN_PATH" => "/bitrix/components/bitrix/player/mediaplayer/skins",
	"SKIN" => "bitrix.swf",
	"CONTROLBAR" => "bottom",
	"WMODE" => "transparent",
	"PLAYLIST" => "right",
	"PLAYLIST_SIZE" => "180",
	"LOGO" => "/logo.png",
	"LOGO_LINK" => "http://ваш_сайт.com/",
	"LOGO_POSITION" => "bottom-left",
	"PLUGINS" => array("tweetit-1", "fbit-1"),
	"PLUGINS_TWEETIT-1" => "tweetit.link=",
	"PLUGINS_FBIT-1" => "fbit.link=",
	"ADDITIONAL_FLASHVARS" => "",
	"WMODE_WMV" => "window",
	"SHOW_CONTROLS" => "Y",
	"PLAYLIST_TYPE" => "xspf",
	"PLAYLIST_PREVIEW_WIDTH" => "64",
	"PLAYLIST_PREVIEW_HEIGHT" => "48",
	"SHOW_DIGITS" => "Y",
	"CONTROLS_BGCOLOR" => "FFFFFF",
	"CONTROLS_COLOR" => "000000",
	"CONTROLS_OVER_COLOR" => "000000",
	"SCREEN_COLOR" => "000000",
	"AUTOSTART" => "Y",
	"REPEAT" => "list",
	"VOLUME" => "90",
	"MUTE" => "N",
	"HIGH_QUALITY" => "Y",
	"SHUFFLE" => "N",
	"START_ITEM" => "1",
	"ADVANCED_MODE_SETTINGS" => "Y",
	"PLAYER_ID" => "",
	"BUFFER_LENGTH" => "10",
	"DOWNLOAD_LINK" => "http://ваш_сайт.com/video.flv",
	"DOWNLOAD_LINK_TARGET" => "_self",
	"ADDITIONAL_WMVVARS" => "",
	"ALLOW_SWF" => "Y",
  	)
);?>
Tag: bitrix, video

399 Манипуляции с номером телефона (разбор, форматирование)

<?/*
# Определение, разбор и форматирование номеров телефонов с помощью классов 
# "\Bitrix\Main\PhoneNumber\Parser" и "\Bitrix\Main\PhoneNumber\Formatter".

# Разбор номера телефона в объект:

$phone = '+7 (999) 999-99-99';

$parsedPhone = \Bitrix\Main\PhoneNumber\Parser::getInstance()->parse($phone);

# Форматирование номера в формате E164 (+79999999999):

$parsedPhone->format(\Bitrix\Main\PhoneNumber\Format::E164)

# Форматирование номера в интернациональном формате (+7 999 999-99-99):

$parsedPhone->format(\Bitrix\Main\PhoneNumber\Format::INTERNATIONAL)

# Форматирование номера в национальном формате (8 (999) 999-99-99):

$parsedPhone->format(\Bitrix\Main\PhoneNumber\Format::NATIONAL)

# Двухбуквенный код страны номера телефона (например "RU"):

$parsedPhone->getCountry()

# Цифровой код страны номера телефона (например "7"):

$parsedPhone->getCountryCode()

# Получение страны по умолчанию из настроек (в главном модуле - опция "phone_number_default_country"):

\Bitrix\Main\PhoneNumber\Parser::getDefaultCountry()

# Нормализация номера телефона одной строкой:

$phone = '+7 (999) 999-99-99';

$parsedPhone = \Bitrix\Main\PhoneNumber\Parser::getInstance()->normalizePhoneNumber($phone);
?>
Tag: bitrix, phone, parser, format

400 Добавление скидки

<?
# Добавление скидки с помощью классов 
# "\Bitrix\Sale\Internals\DiscountTable", "\Bitrix\Sale\Internals\DiscountGroupTable".
# Добавление пятипроцентной скидки на товары инфоблока с идентификатором 15, при 
# наличии определенных значений в свойстве с символьным кодом "tags":

\Bitrix\Main\Loader('iblock');
\Bitrix\Main\Loader('sale');

$IBLOCK_CATALOG_ID = 15;
$name = 'Test discount';
$siteId = 's1';
$userGroupIds = array();
$groupIterator = \Bitrix\Main\GroupTable::getList(array(
    'select' => array('ID'),
));

while($group = $groupIterator->fetch()) {
    $userGroupIds[] = $group['ID'];
}

$propertyTagConditions = array();
$rsProperty = \Bitrix\Iblock\PropertyTable::getList(array(
    'filter' => array('IBLOCK_ID'=>$IBLOCK_CATALOG_ID,'=CODE'=>'tags'),
    'select' => array('ID','CODE'),
));
while($property=$rsProperty->fetch()) {
    $rsEnum = \Bitrix\Iblock\PropertyEnumerationTable::getList(array(
        'filter' => array('PROPERTY_ID'=>$property['ID']),
    ));
    while($enum=$rsEnum->fetch()) {
        if(!in_array($enum["XML_ID"],array('sale','rasprodazha','aktsiya','skidka')))
            continue;
        $propertyTagConditions[] = array (
            'CLASS_ID' => 'CondIBProp:'.$IBLOCK_CATALOG_ID.':'.$property['ID'],
            'DATA' => 
            array (
            'logic' => 'Equal',
            'value' => $enum["ID"],
            ),
        )
    }
}

$discountFields = array(
    'LID' => $siteId,
    'NAME' => $name,
    'ACTIVE_FROM' => '',
    'ACTIVE_TO' => '',
    'ACTIVE' => 'Y',
    'SORT' => '100',
    'PRIORITY' => '1',
    'LAST_DISCOUNT' => 'Y',
    'XML_ID' => '',
    'ACTIONS_LIST' => array (
        'CLASS_ID' => 'CondGroup',
        'DATA' => array (
            'All' => 'AND',
        ),
        'CHILDREN' => array(
            array(
                'CLASS_ID' => 'ActSaleBsktGrp',
                'DATA' => array (
                    'Type' => 'Discount',
                    'Value' => 5.0,
                    'Unit' => 'Perc',
                    'Max' => 0,
                    'All' => 'OR',
                    'True' => 'True',
                ),
                'CHILDREN' => $propertyTagConditions,
            ),
        ),
    ),
);

$resultDiscountAdd = \Bitrix\Sale\Internals\DiscountTable::add($discountFields);

if($resultDiscountAdd->isSuccess())
{
    foreach($userGroupIds as $groupId)
    {
        \Bitrix\Sale\Internals\DiscountGroupTable::add(array(
            'ACTIVE' => 'Y',
            'GROUP_ID' => $groupId,
            'DISCOUNT_ID' => $resultDiscountAdd->getId(),
        ));
    }
}
?>
Tag: bitrix, discount, d7

401 Получение привязок каталога товаров к инфоблоку предложений

<?
# Работа с привязками каталогов товаров к каталогам предложений с помощью класса
# "\Bitrix\Catalog\CatalogIblockTable".
# Получение ID инфоблока предложений для основного инфоблока каталога товаров с ID=3:

$catalogInfo = \Bitrix\Catalog\CatalogIblockTable::getList(array(
    'filter' => array('PRODUCT_IBLOCK_ID'=>$item['IBLOCK_ID']),
))->fetch();
print_r($catalogInfo);

/*
Array
(
    [IBLOCK_ID] => 3 - ID инфоблока предложений
    [YANDEX_EXPORT] => N
    [SUBSCRIPTION] => N
    [VAT_ID] => 0
    [PRODUCT_IBLOCK_ID] => 12 - ID инфоблока основного каталога товаров
    [SKU_PROPERTY_ID] => 230 - ID свойства привязки к основному товару в инфоблоке предложений
)
*/
?>
Tag: bitrix, d7, property

402 Отправка SMS средствами системы Bitrix D7

<?
# Отправить SMS, используя стандартные функции битрикс.
# Для начала необходимо выбрать и настроить провайдера SMS 
# в настройках модуля "Служба сообщений". Затем установить 
# отправителя по умолчанию в настройках главного модуля. 
# Также следующий код подразумевает, что создан тип SMS-события 
# "MY_SMS_EVENT" и шаблон для него.

$fields = array(
    'PHONE' => '+79990000000',
    'MACROS1' => 'Текст макроса 1',
    'MACROS2' => 'Текст макроса 2',
);

$sms = new \Bitrix\Main\Sms\Event('MY_SMS_EVENT', $fields);
$sms->setSite('s1');
$sms->setLanguage('ru');
$sms->send();
# Проверить, что было отправлено можно, если вывести данные из таблицы 
# "b_messageservice_message" (аналогична "b_event" для почты):
# 
# SELECT * FROM b_messageservice_message ORDER BY ID DESC
# 
?>
Tag: bitrix, sms, d7

403 Элементы инфоблоков, ORM D7

<?
# Работа с элементами инфоблоков средствами ORM.
# Для работы с элементами инфоблоков через ORM 
# необходимо сначала задать поле "Символьный код 
# API" в настройках инфоблока, после чего, если, 
#  например, символьный код инфоблока равен "MyIblock"
# мы сможем работать с инфоблоком через класс 
# "\Bitrix\Iblock\Elements\ElementMyIblockTable". 
# Также возможен вариант получения класса для работы 
# с инфоблоком по его ID с последующей подстановкой 
# переменной вместо класса:

$iblock = \Bitrix\Iblock\Iblock::wakeUp(2);
$iblock::getEntityDataClass()::...

# Получение объекта элемента инфоблока с идентификатором в переменной $elementId (с получением значений свойств с кодами "MY_PROP", "MY_LINK_PROP"):

$element=\Bitrix\Iblock\Elements\ElementMyIblockTable::getByPrimary($elementId,array(
    'select'=>array('ID', 'NAME', 'IBLOCK_ID', 'MY_PROP', 'MY_LINK_PROP.ELEMENT' )
))->fetchObject();

# Получение массива (или т.н. "коллекции") элементов инфоблока по фильтру:

$elements = \Bitrix\Iblock\Elements\ElementMyIblockTable::getList([
    'select' => ['ID', 'IBLOCK_ID', 'MY_PROP', 'MY_LINK_PROP.ELEMENT'],
    'filter' => [
       ...
    ],
])->fetchCollection();

foreach($elements as $element){
    ...
}

# Получение полей из объекта элемента инфоблока (необходимо указывать в "select" при выборке):

$element->getId() // ID
$element->getIblockId() // IBLOCK_ID
$element->getName() // NAME
$element->getPreviewPicture() // PREVIEW_PICTURE
$element->getDetailPicture() // DETAIL_PICTURE

# Получение символьного кода связанного раздела и вышележащего раздела:

$element->getIblockSection()->getCode() // IBLOCK_SECTION.CODE
$element->getIblockSection()->getParentSection()->getCode() // IBLOCK_SECTION.PARENT_SECTION.CODE

# Получение пути из символьных кодов раздела:

$curSection=$element->getIblockSection(); // 'IBLOCK_SECTION.CODE','IBLOCK_SECTION.PARENT_SECTION.CODE','IBLOCK_SECTION.PARENT_SECTION.PARENT_SECTION.CODE' и т.д.
$sectionPath = $curSection->getCode();

    while($curSection=$curSection->getParentSection())
        $sectionPath = $curSection->getCode().'/'.$sectionPath;

# Получение значения свойства с кодом "MY_PROP" типа "Строка", немножественное:

$element->getMyProp->getValue() // MY_PROP

# Получение значений свойства с кодом "MY_PROP" типа "Строка", множественное, и сборка их в массив:

$values = []; // MY_PROP

foreach($element->getMyProp()->getAll() as $value)
    $values[] = $value->getValue();

# Получение значения поля связанного через свойство типа "Привязка к элементам" элемента с кодом "MY_LINK_PROP", немножественного:

$element->getMyLinkProp()->getElement()->getName() // MY_LINK_PROP.ELEMENT.NAME

# Получение значений полей связанных через свойство типа "Привязка к элементам" элементов, множественного:

foreach($element->getMyLinkProp()->getAll() as $value) // MY_LINK_PROP.ELEMENT.NAME {
#     $value->getElement()->getName() 
      ...
}

# Только получение количества элементов по фильтру (а данном примере со значением свойства "AUTHOR" равным 12):

$сnt = \Bitrix\Iblock\Elements\ElementMyIblockTable::getList([
    'runtime' => array(new \Bitrix\Main\Entity\ExpressionField('CNT', 'COUNT(*)')),
    'select' => ['CNT'],
    'filter' => ['AUTHOR.VALUE'=>12],
])->fetch()['CNT'];
?>
Tag: bitrix, d7, orm

404 Запуск BACKUP bitrix из командной строки

# резервная копия ядра и базы данных
su bitrix
php –f /хххх/bitrix/www/ bitrix/modules/main/tools/backup.php

# Проверяем свободное место:
df –h
# перейдите в папку, где хотите сохранить архив (чаще всего в корень сайта) и запускаем:
tar -czvf upload.tar.gz ./upload
№ Разархивация, загрузить все архивы в корень сайта запустить restore.php и
tar -xvf upload.tar.gz
Tag: buckup, bitrix, restore

405 Забираем заголовок из .section.php Битрикс

function GetCurrentTitle(){ // Забираем заголовок из .section.php
    global $APPLICATION;
    include $_SERVER['DOCUMENT_ROOT'].$APPLICATION->GetCurDir()."/.section.php";
    return $sSectionName;
}
Tag: bitrix, .section

406 Price со скидкой

            global $USER;
            $filter = ['IBLOCK_ID' => $this->arParams['IBLOCK_ID'], 'ID' => $arFavorites, '=AVAILABLE' => 'Y'];
            $rows = CIBlockElement::GetList(['SORT' => 'ASC'], $filter, false, false, ['ID','IBLOCK_ID','ACTIVE','NAME','CODE','IBLOCK_SECTION_ID','PREVIEW_PICTURE','DETAIL_PICTURE','DETAIL_PAGE_URL']);

            while ($row = $rows->GetNext(1,0)) {
                $arResult['ELEMENTS'][$row['ID']] = $row;
                $PRODUCT_ID = $row['ID'];
                $ProductPrices = \Bitrix\Catalog\PriceTable::getList(["select" => ["*"],"filter" => ["=PRODUCT_ID" => $PRODUCT_ID,],])->fetch();

                $arResult['ELEMENTS'][$row['ID']]['PRICE'] = $ProductPrices;
                // это список доступных скидок
                $arDiscounts = \CCatalogDiscount::GetDiscountByProduct($ProductPrices['PRODUCT_ID'],$USER->GetUserGroupArray(),"N",$ProductPrices['CATALOG_GROUP_ID'],SITE_ID);
                if($arDiscounts !== false) {
                  $arResult['ELEMENTS'][$row['ID']]['PRICE']['PRICE_DISCOUNT']  = \CCatalogProduct::CountPriceWithDiscount($ProductPrices["PRICE"],$ProductPrices["CURRENCY"],$arDiscounts);
                }
            }
Tag: bitrix, price, d7

407 Формирование ссылки для логина

<?php
// пример формирование ссылок "Logout" и "Регистрация"
if ($USER->IsAuthorized()) {?>
 <a href="<?echo $APPLICATION->GetCurPageParam("logout=yes", [
     "login",
     "logout",
     "register",
     "forgot_password",
     "change_password")];?>">Закончить сеанс (logout)</a>
<?} else {?>
 
 <a href="<?=$APPLICATION->GetCurPageParam("register=yes", [
     "login",
     "logout",
     "forgot_password",
     "change_password")];?>">Регистрация</a>
<? }?>
Tag: bitrix, logout, register, login

408 Перекодировка Unicode UTF-8

<?php

$_code = array(
"&#97;" => "a", "&#98;" => "b", "&#99;" => "c", "&#100;" => "d", "&#101;" => "e",
"&#102;" => "f", "&#103;" => "g", "&#104;" => "h", "&#105;" => "i", "&#106;" => "j",
"&#107;" => "k", "&#108;" => "l", "&#109;" => "m", "&#110;" => "n", "&#111;" => "o",
"&#112;" => "p", "&#113;" => "q", "&#114;" => "r", "&#115;" => "s", "&#116;" => "t",
"&#117;" => "u", "&#118;" => "v", "&#119;" => "w", "&#120;" => "x", "&#121;" => "y","&#122;" => "z",

"&#65;" => "A", "&#66;" => "B", "&#67;" => "C", "&#68;" => "D", "&#69;" => "E",
"&#70;" => "F", "&#71;" => "G", "&#72;" => "H", "&#73;" => "I", "&#74;" => "J",
"&#75;" => "K", "&#76;" => "L", "&#77;" => "M", "&#78;" => "N", "&#79;" => "O",
"&#80;" => "P", "&#81;" => "Q", "&#82;" => "R", "&#83;" => "S", "&#84;" => "T",
"&#85;" => "U", "&#86;" => "V", "&#87;" => "W", "&#88;" => "X", "&#89;" => "Y","&#90;" => "Z",

"&#91;" => "[", "&#92;" => "/", "&#93;" => "]", "&#94;" => "^", "&#95;" => "_", "&#96;" => "`",

"&#10;" =>" ", "&#32;" =>" ", "&#33;" =>"!", "&#34;" =>'"', "&#35;" =>"#", "&#36;" =>"$", "&#37;" =>"%",
"&#38;" =>"&", "&#39;" =>"'", "&#40;" =>"(", "&#41;" =>")", "&#42;" =>"*", "&#43;" =>"+", "&#44;" =>",",
"&#45;" =>"-", "&#46;" =>".", "&#47;" =>"/", "&#48;" =>"0", "&#49;" =>"1", "&#50;" =>"2", "&#51;" =>"3",
"&#52;" =>"4", "&#53;" =>"5", "&#54;" =>"6", "&#55;" =>"7", "&#56;" =>"8", "&#57;" =>"9", "&#58;" =>":",
"&#59;" =>";", "&#60;" =>"<", "&#61;" =>"=", "&#62;" =>">", "&#63;" =>"?", "&#64;" =>"@",

"&#1040;" =>"А", "&#1041;" =>"Б", "&#1042;" =>"В", "&#1043;" =>"Г", "&#1044;" =>"Д",
"&#1045;" =>"Е", "&#1025;" =>"Ё", "&#1046;" =>"Ж", "&#1047;" =>"З", "&#1048;" =>"И",
"&#1049;" =>"Й", "&#1050;" =>"К", "&#1051;" =>"Л", "&#1052;" =>"М", "&#1053;" =>"Н",
"&#1054;" =>"О", "&#1055;" =>"П", "&#1056;" =>"Р", "&#1057;" =>"С", "&#1058;" =>"Т",
"&#1059;" =>"У", "&#1060;" =>"Ф", "&#1061;" =>"Х", "&#1062;" =>"Ц", "&#1063;" =>"Ч",
"&#1064;" =>"Ш", "&#1065;" =>"Щ", "&#1066;" =>"Ъ", "&#1067;" =>"Ы", "&#1068;" =>"Ь", "&#1069;" =>"Э",
"&#1070;" =>"Ю", "&#1071;" => "Я",

"&#1072;" =>"а", "&#1073;" =>"б", "&#1074;" =>"в", "&#1075;" =>"г", "&#1076;" =>"д",
"&#1077;" =>"е", "&#1105;" =>"ё", "&#1078;" =>"ж", "&#1079;" =>"з", "&#1080;" =>"и",
"&#1081;" =>"й", "&#1082;" =>"к", "&#1083;" =>"л", "&#1084;" =>"м", "&#1085;" =>"н",
"&#1086;" =>"о", "&#1087;" =>"п", "&#1088;" =>"р", "&#1089;" =>"с", "&#1090;" =>"т",
"&#1091;" =>"у", "&#1092;" =>"ф", "&#1093;" =>"х", "&#1094;" =>"ц", "&#1095;" =>"ч",
"&#1096;" =>"ш", "&#1097;" =>"щ", "&#1098;" =>"ъ", "&#1099;" =>"ы", "&#1100;" =>"ь", "&#1101;" =>"э",
"&#1102;" =>"ю", "&#1103;" =>"я");

    $A = file("a0.html"); // Читаем файл в массив
    file_put_contents("a2.html","");
    foreach($A as $a){
        $line = preg_replace_callback('/&#d+;/',
        function ($matches) {
	#вариант 1
            global $_code;
            return $_code[$matches[0]] ?? $matches[0];
	#вариант 2
            return html_entity_decode($matches[0]);
        }, $a );
        file_put_contents("a2.html",$line, 8);
    }
?>
Tag: utf-8, unicode, decode

409 Bootstrap Доступные контрольные точки

Контрольная точка  | Описание        | Инфикс класса | Размеры
X-Small            | Очень маленький | None          | <576px
Small              | Маленький       | sm            | ≥576px
Medium             | Средний         | md            | ≥768px
Large              | Большой         | lg            | ≥992px
Extra large        | Очень большой   | xl            | ≥1200px
Extra extra large  | Огромный        | xxl           | ≥1400px



Минимальная ширина

// Устройства X-Small (портретные телефоны, менее 576 пикселей)
// Нет медиа-запроса для `xs`, так как это значение по умолчанию в Bootstrap

// Устройства Small (телефоны с горизонтальной ориентацией, 576 пикселей и выше)
@media (min-width: 576px) { ... }

// Устройства Medium (планшеты, 768 пикселей и выше)
@media (min-width: 768px) { ... }

// Устройства Large (настольные компьютеры, 992 пикселей и выше)
@media (min-width: 992px) { ... }

// Устройства X-Large (большие настольные компьютеры, 1200 пикселей и выше)
@media (min-width: 1200px) { ... }

// Устройства XX-Large (большие настольные компьютеры, 1400 пикселей и выше)
@media (min-width: 1400px) { ... }


Максимальная ширина

Эти миксины берут объявленные контрольной точки, вычитают из них .02px и используют их как значения max-width. Например:

// Устройства X-Small (портретные телефоны, менее 576 пикселей)
@media (max-width: 575.98px) { ... }

// Устройства Small (телефоны с горизонтальной ориентацией, менее 768 пикселей)
@media (max-width: 767.98px) { ... }

// Устройства Medium (планшеты, менее 992 пикселей)
@media (max-width: 991.98px) { ... }

// Устройства Large (настольные компьютеры, менее 1200 пикселей)
@media (max-width: 1199.98px) { ... }

// Устройства X-Large (большие настольные компьютеры, менее 1400 пикселей)
@media (max-width: 1399.98px) { ... }

// Устройства XX-Large (большие настольные компьютеры)
// Нет медиа-запроса, так как контрольная точка xxl не имеет верхней границы ширины


Bootstrap поставляется с тремя разными контейнерами:

.container, который устанавливает max-width для каждой контрольной точки
.container-fluid, который равен width: 100% во всех контрольных точках
.container-{breakpoint}, который равен width: 100% до указанной контрольной точки
В приведенной ниже таблице показано, как max-width каждого контейнера сравнивается
с исходными .container и .container-fluid для каждой контрольной точки.

Посмотрите их в действии и сравните их в примере сетки.

                 Extra small  Small  Medium  Large   X-Large  XX-Large   
                 <576px       ≥576px ≥768px  ≥992px  ≥1200px  ≥1400px    

.container       100%         540px  720px   960px   1140px   1320px
.container-sm    100%         540px  720px   960px   1140px   1320px
.container-md    100%         100%   720px   960px   1140px   1320px
.container-lg    100%         100%   100%    960px   1140px   1320px
.container-xl    100%         100%   100%    100%    1140px   1320px
.container-xxl   100%         100%   100%    100%    100%     1320px
.container-fluid 100%         100%   100%    100%    100%     100%

Подвижные контейнеры

Используйте .container-fluid для контейнера полной ширины, охватывающего всю ширину области просмотра.

Копировать
<div class="container-fluid">
  ...
</div>
Tag: bootstrap