Код, готовые решения, HTML JS PHP SQL Битрикс.
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-мнемонику: © -------------------------------------------------
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%
3 Каталог local для Битрикс
Какие папки обрабатываются в /local? activities - действия БП; components - компоненты; gadgets - гаджеты рабочего стола; modules - модули; php_interface - init.php, папка user_lang; templates - шаблоны сайтов, шаблоны компонентов, шаблоны страниц.
4 Загасить системное сообшение Битрикс
# Загасить системное сообшение Битрикс # <?php # файл /bitrix/panel/main/admin-public.css #bx-admin-prefix .adm-info-message {display:none} ?>
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 */?>
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'; # Изменяем привязку к сайту } } ?>
7 Вспомогательные ДЛЯ ОТЛАДКИ
<!-- *** <?= "Debug\n".$templateFolder."\n"; ?> --> <?php echo "<!-- DEBUG line: / ".__FILE__." -->"; echo "<details><summary>Debug</summary><pre>".print_r( $tst ,1)."</pre></details>"; ?>
8 Снять ограничение по времени исполнения
<?php if (!set_time_limit(0)) ini_set("max_execution_time", 3600); ?>
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); ?>
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"); ?>
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"); ?>
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"); ?>
13 IncludeModule для BITRIX
<?php CModule::IncludeModule('iblock'); CModule::IncludeModule("catalog"); CModule::IncludeModule("sale"); CModule::IncludeModule("form"); CModule::IncludeModule("highloadblock"); ?>
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; } ?>
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 ?>
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 } ?>
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'); } ?>
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" # имя шаблона для нового файла )); ?>
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("Форум "Отзывы"", "/ru/forum/list.php?FID=3"); ?>
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>" ?>
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)); ?>
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 ){ } ?>
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"); ?>
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>
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; } ?>
26 Обфурцируем и деобфурцируем строку
<?php $S = "string"; $String = base64_encode(gzdeflate($S)); $S = gzinflate(base64_decode($String)); eval($S); ?>
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>
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>
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'); ?>
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)); ?>
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)); ?>
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(); }?>
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'; } } ?>
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); ?>
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; } ?>
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); ?>
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; } } ?>
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'); ?>
39 Енкодим только параметры в URL строке
<?php function encode_basename($url) { # Енкодим только параметры в URL строке $url = explode('/', $url); $base = array_pop($url); return implode('/', $url).'/'.urlencode($base); } ?>
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); } } ?>
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") ?>
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 ?>
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>
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)); } ?>
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; } } ?>
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;} } ?>
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; } ?>
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; } ?>
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>
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); } ?>
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; } ?>
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; } ?>
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); } ?>
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>"; } ?>
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*")); ?>
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'); ?>
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; } ?>
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>"; ?>
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"); ?>
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 ?>
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); # Текущий счетчик положения ?>
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>
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); } ?>
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); } ?>
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>"; } ?>
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); } ?>
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; } } } ?>
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; } ?>
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); } ?>
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); } ?>
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); ?>
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); */ ?>
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; } ?>
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); ?>
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; } ?>
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); ?>
77 mime_base64
<?php function mime_base64($string, $charset='windows-1251') { return '=?'.$charset.'?B?'.base64_encode(iconv("UTF-8", "CP1251",trim($string))).'?='; //, } ?>
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); } ?>
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; } ?>
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; } ?>
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]; } ?>
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']; } } } ?>
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>"; } ?>
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(); } ?>
85 Снимаем ограничение на самоудаление
<?php # Снимаем ограничение на самоудаление # header('Location: '.$_SERVER['HTTP_HOST'].'/?complete'); unlink($_SERVER['DOCUMENT_ROOT'].'/plugins/iepng/plugin.php'); ?>
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")); ?>
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 />'; } ?>
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(); ?>
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); ?>
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>
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)); ?>
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>
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>
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>
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>
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>
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>
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>
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>
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>
101 Работа с cookie Битрих
<?php global $APPLICATION; $VISITOR_ID = $APPLICATION->get_cookie("VISITOR_ID"); ?>
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=""/>
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>
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>
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>
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>
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>
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>
109 Отключение языковых настроек у БИТРИКСА
Отключение языковых настроек у БИТРИКСА dbconn.php / define("BX_UTF", true); нужно закоментить
110 VBScript javascript "Hello world!"
<%@ Language=VBScript %><% Response.write "Hello world!" %> <%@ Language=javascript %> <% Response.Write ("Hello world!"); %>
111 Как разархивировать zip-файл на сервере
<?php $unzip = shell_exec("tar xvf cluster_encode_php5.tar.gz"); ?>
112 Очистка b_captcha Битрикс
Битрикс : Выполните такой запрос к БД: truncate table b_captcha
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>
114 Вывод одной строки текста в многоточие CSS
<style type="text/css"> /* CSS */ /* Вывод одной строки текста в многоточие */ .text-overflow { white-space: nowrap; /* Перво-наперво, запретим перенос строк */ overflow: hidden; /* Скрываем текст, который не помещается в блок */ text-overflow: ellipsis; /* Уводим текст в многоточие */ display: block; /* Элемент обязательно должен быть блочным */ } </style>
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;
116 Обновление с заменой MySQL
UPDATE `a_navigator_obj` SET `b_text` = REPLACE(`b_text`,'Московская областьСКВА','МОСКВА') WHERE `b_text` LIKE '%Московская областьСКВА%'
117 Заказная сортировка MySQL
SELECT * FROM page ORDER BY FIELD(season, "весна","лето","осень","зима")
118 поиск и замена слов во всей таблице одним запросом
mysql_query("UPDATE table_articles SET article = REPLACE(article, 'свадьба', 'похороны')");
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 ;
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))
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);
122 Генерим Дамп БД
exec('mysqldump --user=... --password=... --host=... DB_NAME > /path/to/output/file.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>
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']; } ?>
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');?>
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>
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>
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>
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)); } ?>
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>
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>
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>
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)); } ?>
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(); } ?>
135 Перекодировка из charset=iso-8859-1
<?php $iso = array( 'ϩ'=>'ϩ', 'Ϫ'=>'Ϫ', 'ϫ'=>'ϫ', 'Ϭ'=>'Ϭ', 'ϭ'=>'ϭ', 'Ϯ'=>'Ϯ', 'ϯ'=>'ϯ', 'ϰ'=>'ϰ', 'ϱ'=>'ϱ', 'ϲ'=>'ϲ', 'ϳ'=>'ϳ', 'ϴ'=>'ϴ', 'ϵ'=>'ϵ', '϶'=>'϶', 'Ϸ'=>'Ϸ', 'ϸ'=>'ϸ', 'Ϲ'=>'Ϲ', 'Ϻ'=>'Ϻ', 'ϻ'=>'ϻ', 'ϼ'=>'ϼ', 'Ͻ'=>'Ͻ', 'Ͼ'=>'Ͼ', 'Ͽ'=>'Ͽ', 'Ѐ'=>'Ѐ', 'Ё'=>'Ё', 'Ђ'=>'Ђ', 'Ѓ'=>'Ѓ', 'Є'=>'Є', 'Ѕ'=>'Ѕ', 'І'=>'І', 'Ї'=>'Ї', 'Ј'=>'Ј', 'Љ'=>'Љ', 'Њ'=>'Њ', 'Ћ'=>'Ћ', 'Ќ'=>'Ќ', 'Ѝ'=>'Ѝ', 'Ў'=>'Ў', 'Џ'=>'Џ', 'А'=>'А', 'Б'=>'Б', 'В'=>'В', 'Г'=>'Г', 'Д'=>'Д', 'Е'=>'Е', 'Ж'=>'Ж', 'З'=>'З', 'И'=>'И', 'Й'=>'Й', 'К'=>'К', 'Л'=>'Л', 'М'=>'М', 'Н'=>'Н', 'О'=>'О', 'П'=>'П', 'Р'=>'Р', 'С'=>'С', 'Т'=>'Т', 'У'=>'У', 'Ф'=>'Ф', 'Х'=>'Х', 'Ц'=>'Ц', 'Ч'=>'Ч', 'Ш'=>'Ш', 'Щ'=> '', 'Ъ'=>'Ъ', 'Ы'=>'Ы', 'Ь'=>'Ь', 'Э'=>'Э', 'Ю'=>'Ю', 'Я'=>'Я', 'а'=>'а', 'б'=>'б', 'в'=>'в', 'г'=>'г', 'д'=>'д', 'е'=>'е', 'ж'=>'ж', 'з'=>'з', 'и'=>'и', 'й'=>'й', 'к'=>'к', 'л'=>'л', 'м'=>'м', 'н'=>'н', 'о'=>'о', 'п'=>'п', 'р'=>'р', 'с'=>'с', 'т'=>'т', 'у'=>'у', 'ф'=>'ф', 'х'=>'х', 'ц'=>'ц', 'ч'=>'ч', 'ш'=>'ш', 'щ'=>'щ', 'ъ'=>'ъ', 'ы'=>'ы', 'ь'=>'ь', 'э'=>'э', 'ю'=>'ю', 'я'=>'я', 'ѐ'=>'ѐ', 'ё'=>'ё', 'ђ'=>'ђ', 'ѓ'=>'ѓ', 'є'=>'є', 'ѕ'=>'ѕ', 'і'=>'і', 'ї'=>'ї', 'ј'=>'ј', 'љ'=>'љ', 'њ'=>'њ', 'ћ'=>'ћ', 'ќ'=>'ќ', 'ѝ'=>'ѝ', 'ў'=>'ў', 'џ'=>'џ', 'Ѡ'=>'Ѡ', 'ѡ'=>'ѡ', 'Ѣ'=>'Ѣ', 'ѣ'=>'ѣ', 'Ѥ'=>'Ѥ', 'ѥ'=>'ѥ', 'Ѧ'=>'Ѧ', 'ѧ'=>'ѧ', 'Ѩ'=>'Ѩ', 'ѩ'=>'ѩ', 'Ѫ'=>'Ѫ', 'ѫ'=>'ѫ', 'Ѭ'=>'Ѭ', 'ѭ'=>'ѭ', 'Ѯ'=>'Ѯ', 'ѯ'=>'ѯ', 'Ѱ'=>'Ѱ', 'ѱ'=>'ѱ', 'Ѳ'=>'Ѳ', 'ѳ'=>'ѳ', 'Ѵ'=>'Ѵ', 'ѵ'=>'ѵ', 'Ѷ'=>'Ѷ', 'ѷ'=>'ѷ', 'Ѹ'=>'Ѹ', 'ѹ'=>'ѹ', 'Ѻ'=>'Ѻ', 'ѻ'=>'ѻ', 'Ѽ'=>'Ѽ', 'ѽ'=>'ѽ', 'Ѿ'=>'Ѿ', 'ѿ'=>'ѿ', 'Ҁ'=>'Ҁ', 'ҁ'=>'ҁ', '҂'=>'҂', '҃'=>"'", '҄'=>"'", '҅'=> '҅', '҆'=> '҆', '҇'=> '҇', '҈'=>'҈', '҉'=>'҉', 'Ҋ'=>'Ҋ', 'ҋ'=>'ҋ', 'Ҍ'=>'Ҍ', 'ҍ'=>'ҍ', 'Ҏ'=>'Ҏ', 'ҏ'=>'ҏ', 'Ґ'=>'Ґ', 'ґ'=>'ґ', 'Ғ'=>'Ғ', 'ғ'=>'ғ', 'Ҕ'=>'Ҕ', 'ҕ'=>'ҕ', 'Җ'=>'Җ', 'җ'=>'җ', 'Ҙ'=>'Ҙ', 'ҙ'=>'ҙ', 'Қ'=>'Қ', 'қ'=>'қ', 'Ҝ'=>'Ҝ', 'ҝ'=>'ҝ', 'Ҟ'=>'Ҟ', 'ҟ'=>'ҟ', 'Ҡ'=>'Ҡ', 'ҡ'=>'ҡ', 'Ң'=>'Ң', 'ң'=>'ң', 'Ҥ'=>'Ҥ', 'ҥ'=>'ҥ', 'Ҧ'=>'Ҧ', 'ҧ'=>'ҧ', 'Ҩ'=>'Ҩ', 'ҩ'=>'ҩ', 'Ҫ'=>'Ҫ', 'ҫ'=>'ҫ', 'Ҭ'=>'Ҭ', 'ҭ'=>'ҭ', 'Ү'=>'Ү', 'ү'=>'ү', 'Ұ'=>'Ұ', 'ұ'=>'ұ', 'Ҳ'=>'Ҳ', 'ҳ'=>'ҳ', 'Ҵ'=>'Ҵ', 'ҵ'=>'ҵ', 'Ҷ'=>'Ҷ', 'ҷ'=>'ҷ', 'Ҹ'=>'Ҹ', 'ҹ'=>'ҹ', 'Һ'=>'Һ', 'һ'=>'һ', 'Ҽ'=>'Ҽ', 'ҽ'=>'ҽ', 'Ҿ'=>'Ҿ', 'ҿ'=>'ҿ', 'Ӏ'=>'Ӏ', 'Ӂ'=>'Ӂ', 'ӂ'=>'ӂ', 'Ӄ'=>'Ӄ', 'ӄ'=>'ӄ', 'Ӆ'=>'Ӆ', 'ӆ'=>'ӆ', 'Ӈ'=>'Ӈ', 'ӈ'=>'ӈ', 'Ӊ'=>'Ӊ', 'ӊ'=>'ӊ', 'Ӌ'=>'Ӌ', 'ӌ'=>'ӌ', 'Ӎ'=>'Ӎ', 'ӎ'=>'ӎ', 'ӏ'=>'ӏ', 'Ӑ'=>'Ӑ', 'ӑ'=>'ӑ', 'Ӓ'=>'Ӓ', 'ӓ'=>'ӓ', 'Ӕ'=>'Ӕ', 'ӕ'=>'ӕ', 'Ӗ'=>'Ӗ', 'ӗ'=>'ӗ', 'Ә'=>'Ә', 'ә'=>'ә', 'Ӛ'=>'Ӛ', 'ӛ'=>'ӛ', 'Ӝ'=>'Ӝ', 'ӝ'=>'ӝ', 'Ӟ'=>'Ӟ', 'ӟ'=>'ӟ', 'Ӡ'=>'Ӡ', 'ӡ'=>'ӡ', 'Ӣ'=>'Ӣ', 'ӣ'=>'ӣ', 'Ӥ'=>'Ӥ', 'ӥ'=>'ӥ', 'Ӧ'=>'Ӧ', 'ӧ'=>'ӧ', 'Ө'=>'Ө', 'ө'=>'ө', 'Ӫ'=>'Ӫ', 'ӫ'=>'ӫ', 'Ӭ'=>'Ӭ', 'ӭ'=>'ӭ', 'Ӯ'=>'Ӯ', 'ӯ'=>'ӯ', 'Ӱ'=>'Ӱ', 'ӱ'=>'ӱ', 'Ӳ'=>'Ӳ', 'ӳ'=>'ӳ', 'Ӵ'=>'Ӵ', 'ӵ'=>'ӵ', 'Ӷ'=>'Ӷ', 'ӷ'=>'ӷ', 'Ӹ'=>'Ӹ', 'ӹ'=>'ӹ', 'Ӻ'=>'Ӻ', 'ӻ'=>'ӻ', 'Ӽ'=>'Ӽ', 'ӽ'=>'ӽ', 'Ӿ'=>'Ӿ', 'ӿ'=>'ӿ', 'Ԁ'=>'Ԁ', 'ԁ'=>'ԁ', 'Ԃ'=>'Ԃ', 'ԃ'=>'ԃ', 'Ԅ'=>'Ԅ', 'ԅ'=>'ԅ', 'Ԇ'=>'Ԇ', 'ԇ'=>'ԇ', 'Ԉ'=>'Ԉ', 'ԉ'=>'ԉ', 'Ԋ'=>'Ԋ', 'ԋ'=>'ԋ', 'Ԍ'=>'Ԍ', 'ԍ'=>'ԍ', 'Ԏ'=>'Ԏ', 'ԏ'=>'ԏ', 'Ԑ'=>'Ԑ', 'ԑ'=>'ԑ', 'Ԓ'=>'Ԓ', 'ԓ'=>'ԓ', 'Ԕ'=>'Ԕ', 'ԕ'=>'ԕ', 'Ԗ'=>'Ԗ', 'ԗ'=>'ԗ', 'Ԙ'=>'Ԙ', 'ԙ'=>'ԙ', 'Ԛ'=>'Ԛ', 'ԛ'=>'ԛ', 'Ԝ'=>'Ԝ', 'ԝ'=>'ԝ', 'Ԟ'=>'Ԟ', 'ԟ'=>'ԟ', 'Ԡ'=>'Ԡ', 'ԡ'=>'ԡ', 'Ԣ'=>'Ԣ', 'ԣ'=>'ԣ', 'Ԥ'=>'Ԥ', 'ԥ'=>'ԥ', 'Ԧ'=>'Ԧ', 'ԧ'=>'ԧ', 'Ԩ'=>'Ԩ', 'ԩ'=>'ԩ', 'Ԫ'=>'Ԫ', 'ԫ'=>'ԫ', 'Ԭ'=>'Ԭ', 'ԭ'=>'ԭ', 'Ԯ'=>'Ԯ', 'ԯ'=>'ԯ', '԰'=>'', 'Ա'=>'Ա', 'Բ'=>'Բ', 'Գ'=>'Գ', 'Դ'=>'Դ', 'Ե'=>'Ե', 'Զ'=>'Զ', 'Է'=>'Է', 'Ը'=>'Ը', 'Թ'=>'Թ', 'Ժ'=>'Ժ', 'Ի'=>'Ի', 'Լ'=>'Լ', 'Խ'=>'Խ', 'Ծ'=>'Ծ', 'Կ'=>'Կ', 'Հ'=>'Հ', 'Ձ'=>'Ձ', 'Ղ'=>'Ղ', 'Ճ'=>'Ճ', 'Մ'=>'Մ', 'Յ'=>'Յ', 'Ն'=>'Ն', 'Շ'=>'Շ', 'Ո'=>'Ո', 'Չ'=>'Չ', 'Պ'=>'Պ', 'Ջ'=>'Ջ', 'Ռ'=>'Ռ', 'Ս'=>'Ս', 'Վ'=>'Վ', 'Տ'=>'Տ', 'Ր'=>'Ր', 'Ց'=>'Ց', 'Ւ'=>'Ւ', 'Փ'=>'Փ', 'Ք'=>'Ք', 'Օ'=>'Օ', 'Ֆ'=>'Ֆ', '՗'=>'', '՘'=> '', 'ՙ'=>'ՙ', '՚'=>'՚', '՛'=>'՛', '՜'=>'՜', '՝'=>'՝', '՞'=>'՞', '՟'=>'՟', 'ՠ'=>'ՠ', 'ա'=>'ա', 'բ'=>'բ', 'գ'=>'գ', 'դ'=>'դ', 'ե'=>'ե', 'զ'=>'զ', 'է'=>'է', 'ը'=>'ը', 'թ'=>'թ', 'ժ'=>'ժ', 'ի'=>'ի', 'լ'=>'լ', 'խ'=>'խ', 'ծ'=>'ծ', 'կ'=>'կ', 'հ'=>'հ', 'ձ'=>'ձ', 'ղ'=>'ղ', 'ճ'=>'ճ', 'մ'=>'մ', 'յ'=>'յ', 'ն'=>'ն', 'շ'=>'շ', 'ո'=>'ո', 'չ'=>'չ', 'պ'=>'պ', 'ջ'=>'ջ', 'ռ'=>'ռ', 'ս'=>'ս', 'վ'=>'վ', 'տ'=>'տ', 'ր'=>'ր', 'ց'=>'ց', 'ւ'=>'ւ', 'փ'=>'փ', 'ք'=>'ք', 'օ'=>'օ', 'ֆ'=>'ֆ', 'և'=>'և', 'ֈ'=>'ֈ', '։'=>'։', '֊'=>'֊', '֋'=>'', '֌'=>'', '֍'=>'֍', '֎'=>'֎', '֏'=>'֏', '֐'=>'', '֑'=>'֑', '֒'=>'֒', '֓'=>'֓', '֔'=>'֔', '֕'=>'֕', '֖'=>'֖', '֗'=>'֗', '֘'=>'֘', '֙'=>'֙', '֚'=>'֚', '֛'=>'֛', '֜'=>'֜', '֝'=>'֝', '֞'=>'֞', '֟'=>'֟', '֠'=>'֠', '֡'=>'֡', '֢'=>'֢', '֣'=>'֣', '֤'=>'֤', '֥'=>'֥', '֦'=>'֦', '֧'=>'֧', '֨'=>'֨', '֩'=>'֩', '֪'=>'֪', '֫'=>'֫', '֬'=>'֬', '֭'=>'֭', '֮'=>'֮', '֯'=>'֯', 'ְ'=>'ְ', 'ֱ'=>'ֱ', 'ֲ'=>'ֲ', 'ֳ'=>'ֳ', 'ִ'=>'ִ', 'ֵ'=>'ֵ', 'ֶ'=>'ֶ', 'ַ'=>'ַ', 'ָ'=>'ָ', 'ֹ'=>'ֹ', 'ֺ'=>'ֺ', 'ֻ'=>'ֻ', 'ּ'=>'ּ', 'ֽ'=>'ֽ', '־'=>'־', 'ֿ'=>'ֿ', '׀'=>'׀', 'ׁ'=>'ׁ', 'ׂ'=>'ׂ', '׃'=>'׃', 'ׄ'=>'ׄ', 'ׅ'=>'ׅ', '׆'=>'׆', 'ׇ'=>'ׇ', '׈'=>'', '׉'=>'', '׊'=>'', '׋'=>'', '׌'=>'', '׍'=>'', '׎'=>'', '׏'=>'', 'א'=>'א', 'ב'=>'ב', 'ג'=>'ג', 'ד'=>'ד', 'ה'=>'ה', 'ו'=>'ו', 'ז'=>'ז', 'ח'=>'ח', 'ט'=>'ט', 'י'=>'י', 'ך'=>'ך', 'כ'=>'כ', 'ל'=>'ל', 'ם'=>'ם', 'מ'=>'מ', 'ן'=>'ן', 'נ'=>'נ', 'ס'=>'ס', 'ע'=>'ע', 'ף'=>'ף', 'פ'=>'פ', 'ץ'=>'ץ', 'צ'=>'צ', 'ק'=>'ק', 'ר'=>'ר', 'ש'=>'ש', 'ת'=>'ת', '׫'=>'', '׬'=>'', '׭'=>'', '׮'=>'', 'ׯ'=>'ׯ', 'װ'=>'װ', 'ױ'=>'ױ', 'ײ'=>'ײ', '׳'=>'׳', '״'=>'״', '׵'=>'', '׶'=>'', '׷'=>'', '׸'=>'', '׹'=>'', '׺'=>'', '׻'=>'', '׼'=>'', '׽'=>'', '׾'=>'', '׿'=>'', '؀'=>'', '؁'=>'', '؂'=>'', '؃'=>'', '؄'=>'', '؅'=>'', '؆'=>'؆', '؇'=>'؇', '؈'=>'؈', '؉'=>'؉', '؊'=>'؊', '؋'=>'؋', '،'=>'،', '؍'=>'؍', '؎'=>'؎', '؏'=>'؏', 'ؐ'=>'ؐ', 'ؑ'=>'ؑ', 'ؒ'=>'ؒ', 'ؓ'=>'ؓ', 'ؔ'=>'ؔ', 'ؕ'=>'ؕ', 'ؖ'=>'ؖ', 'ؗ'=>'ؗ', 'ؘ'=>'ؘ', 'ؙ'=>'ؙ', 'ؚ'=>'ؚ', '؛'=>'؛', '؜'=>'', '؝'=>'؝', '؞'=>'؞', '؟'=>'؟', 'ؠ'=>'ؠ', 'ء'=>'ء', 'آ'=>'آ', 'أ'=>'أ', 'ؤ'=>'ؤ', 'إ'=>'إ', 'ئ'=>'ئ', 'ا'=>'ا', 'ب'=>'ب', 'ة'=>'ة', 'ت'=>'ت', 'ث'=>'ث', 'ج'=>'ج', 'ح'=>'ح', 'خ'=>'خ', 'د'=>'د', 'ذ'=>'ذ', 'ر'=>'ر', 'ز'=>'ز', 'س'=>'س', 'ش'=>'ش', 'ص'=>'ص', 'ض'=>'ض', 'ط'=>'ط', 'ظ'=>'ظ', 'ع'=>'ع', 'غ'=>'غ', 'ػ'=>'ػ', 'ؼ'=>'ؼ', 'ؽ'=>'ؽ', 'ؾ'=>'ؾ', 'ؿ'=>'ؿ', 'ـ'=>'ـ', 'ف'=>'ف', 'ق'=>'ق', 'ك'=>'ك', 'ل'=>'ل', 'م'=>'م', 'ن'=>'ن', 'ه'=>'ه', 'و'=>'و', 'ى'=>'ى', 'ي'=>'ي', 'ً'=>'ً', 'ٌ'=>'ٌ', 'ٍ'=>'ٍ', 'َ'=>'َ', 'ُ'=>'ُ', 'ِ'=>'ِ', 'ّ'=>'ّ', 'ْ'=>'ْ', 'ٓ'=>'ٓ', 'ٔ'=>'ٔ', 'ٕ'=>'ٕ', 'ٖ'=>'ٖ', 'ٗ'=>'ٗ', '٘'=>'٘', 'ٙ'=>'ٙ', 'ٚ'=>'ٚ', 'ٛ'=>'ٛ', 'ٜ'=>'ٜ', 'ٝ'=>'ٝ', 'ٞ'=>'ٞ', 'ٟ'=>'ٟ', '٠'=>'٠', '١'=>'١', '٢'=>'٢', '٣'=>'٣', '٤'=>'٤', '٥'=>'٥', '٦'=>'٦', '٧'=>'٧', '٨'=>'٨', '٩'=>'٩', '٪'=>'٪', '٫'=>'٫', '٬'=>'٬', '٭'=>'٭', 'ٮ'=>'ٮ', 'ٯ'=>'ٯ', 'ٰ'=>'ٰ', 'ٱ'=>'ٱ', 'ٲ'=>'ٲ', 'ٳ'=>'ٳ', 'ٴ'=>'ٴ', 'ٵ'=>'ٵ', 'ٶ'=>'ٶ', 'ٷ'=>'ٷ', 'ٸ'=>'ٸ', 'ٹ'=>'ٹ', 'ٺ'=>'ٺ', 'ٻ'=>'ٻ', 'ټ'=>'ټ', 'ٽ'=>'ٽ', 'پ'=>'پ', 'ٿ'=>'ٿ', 'ڀ'=>'ڀ', 'ځ'=>'ځ', 'ڂ'=>'ڂ', 'ڃ'=>'ڃ', 'ڄ'=>'ڄ', 'څ'=>'څ', 'چ'=>'چ', 'ڇ'=>'ڇ', 'ڈ'=>'ڈ', 'ډ'=>'ډ', 'ڊ'=>'ڊ', 'ڋ'=>'ڋ', 'ڌ'=>'ڌ', 'ڍ'=>'ڍ', 'ڎ'=>'ڎ', 'ڏ'=>'ڏ', 'ڐ'=>'ڐ', 'ڑ'=>'ڑ', 'ڒ'=>'ڒ', 'ړ'=>'ړ', 'ڔ'=>'ڔ', 'ڕ'=>'ڕ', 'ږ'=>'ږ', 'ڗ'=>'ڗ', 'ژ'=>'ژ', 'ڙ'=>'ڙ', 'ښ'=>'ښ', 'ڛ'=>'ڛ', 'ڜ'=>'ڜ', 'ڝ'=>'ڝ', 'ڞ'=>'ڞ', 'ڟ'=>'ڟ', 'ڠ'=>'ڠ', 'ڡ'=>'ڡ', 'ڢ'=>'ڢ', 'ڣ'=>'ڣ', 'ڤ'=>'ڤ', 'ڥ'=>'ڥ', 'ڦ'=>'ڦ', 'ڧ'=>'ڧ', 'ڨ'=>'ڨ', 'ک'=>'ک', 'ڪ'=>'ڪ', 'ګ'=>'ګ', 'ڬ'=>'ڬ', 'ڭ'=>'ڭ', 'ڮ'=>'ڮ', 'گ'=>'گ', 'ڰ'=>'ڰ', 'ڱ'=>'ڱ', 'ڲ'=>'ڲ', 'ڳ'=>'ڳ', 'ڴ'=>'ڴ', 'ڵ'=>'ڵ', 'ڶ'=>'ڶ', 'ڷ'=>'ڷ', 'ڸ'=>'ڸ', 'ڹ'=>'ڹ', 'ں'=>'ں', 'ڻ'=>'ڻ', 'ڼ'=>'ڼ', 'ڽ'=>'ڽ', 'ھ'=>'ھ', 'ڿ'=>'ڿ', 'ۀ'=>'ۀ', 'ہ'=>'ہ', 'ۂ'=>'ۂ', 'ۃ'=>'ۃ', 'ۄ'=>'ۄ', 'ۅ'=>'ۅ', 'ۆ'=>'ۆ', 'ۇ'=>'ۇ', 'ۈ'=>'ۈ', 'ۉ'=>'ۉ', 'ۊ'=>'ۊ', 'ۋ'=>'ۋ', 'ی'=>'ی', 'ۍ'=>'ۍ', 'ێ'=>'ێ', 'ۏ'=>'ۏ', 'ې'=>'ې', 'ۑ'=>'ۑ', 'ے'=>'ے', 'ۓ'=>'ۓ', '۔'=>'۔', 'ە'=>'ە', 'ۖ'=>'ۖ', 'ۗ'=>'ۗ', 'ۘ'=>'ۘ', 'ۙ'=>'ۙ', 'ۚ'=>'ۚ', 'ۛ'=>'ۛ', 'ۜ'=>'ۜ', '۝'=>'', '۞'=>'۞', '۟'=>'۟', '۠'=>'۠', 'ۡ'=>'ۡ', 'ۢ'=>'ۢ', 'ۣ'=>'ۣ', 'ۤ'=>'ۤ', 'ۥ'=>'ۥ', 'ۦ'=>'ۦ', 'ۧ'=>'ۧ', 'ۨ'=>'ۨ', '۩'=>'۩', '۪'=>'۪', '۫'=>'۫', '۬'=>'۬', 'ۭ'=>'ۭ', 'ۮ'=>'ۮ', 'ۯ'=>'ۯ', '۰'=>'۰', '۱'=>'۱', '۲'=>'۲', '۳'=>'۳', '۴'=>'۴', '۵'=>'۵', '۶'=>'۶', '۷'=>'۷', '۸'=>'۸', '۹'=>'۹', 'ۺ'=>'ۺ', 'ۻ'=>'ۻ', 'ۼ'=>'ۼ', '۽'=>'۽', '۾'=>'۾', 'ۿ'=>'ۿ', '܀'=>'܀', '܁'=>'܁', '܂'=>'܂', '܃'=>'܃', '܄'=>'܄', '܅'=>'܅', '܆'=>'܆', '܇'=>'܇', '܈'=>'܈', '܉'=>'܉', '܊'=>'܊', '܋'=>'܋', '܌'=>'܌', '܍'=>'܍', '܎'=>'', '܏'=>'', 'ܐ'=>'ܐ', 'ܑ'=>'ܑ', 'ܒ'=>'ܒ', 'ܓ'=>'ܓ', 'ܔ'=>'ܔ', 'ܕ'=>'ܕ', 'ܖ'=>'ܖ', 'ܗ'=>'ܗ', 'ܘ'=>'ܘ', 'ܙ'=>'ܙ', 'ܚ'=>'ܚ', 'ܛ'=>'ܛ', 'ܜ'=>'ܜ', 'ܝ'=>'ܝ', 'ܞ'=>'ܞ', 'ܟ'=>'ܟ', 'ܠ'=>'ܠ', 'ܡ'=>'ܡ', 'ܢ'=>'ܢ', 'ܣ'=>'ܣ', 'ܤ'=>'ܤ', 'ܥ'=>'ܥ', 'ܦ'=>'ܦ', 'ܧ'=>'ܧ', 'ܨ'=>'ܨ', 'ܩ'=>'ܩ', 'ܪ'=>'ܪ', 'ܫ'=>'ܫ', 'ܬ'=>'ܬ', 'ܭ'=>'ܭ', 'ܮ'=>'ܮ', 'ܯ'=>'ܯ', 'ܰ'=>'ܰ', 'ܱ'=>'ܱ', 'ܲ'=>'ܲ', 'ܳ'=>'ܳ', 'ܴ'=>'ܴ', 'ܵ'=>'ܵ', 'ܶ'=>'ܶ', 'ܷ'=>'ܷ', 'ܸ'=>'ܸ', 'ܹ'=>'ܹ', 'ܺ'=>'ܺ', 'ܻ'=>'ܻ', 'ܼ'=>'ܼ', 'ܽ'=>'ܽ', 'ܾ'=>'ܾ', 'ܿ'=>'ܿ', '݀'=>'݀', '݁'=>'݁', '݂'=>'݂', '݃'=>'݃', '݄'=>'݄', '݅'=>'݅', '݆'=>'݆', '݇'=>'݇', '݈'=>'݈', '݉'=>'݉', '݊'=>'݊', '݋'=>'', '݌'=>'', 'ݍ'=>'ݍ', 'ݎ'=>'ݎ', 'ݏ'=>'ݏ', 'ݐ'=>'ݐ', 'ݑ'=>'ݑ', 'ݒ'=>'ݒ', 'ݓ'=>'ݓ', 'ݔ'=>'ݔ', 'ݕ'=>'ݕ', 'ݖ'=>'ݖ', 'ݗ'=>'ݗ', 'ݘ'=>'ݘ', 'ݙ'=>'ݙ', 'ݚ'=>'ݚ', 'ݛ'=>'ݛ', 'ݜ'=>'ݜ', 'ݝ'=>'ݝ', 'ݞ'=>'ݞ', 'ݟ'=>'ݟ', 'ݠ'=>'ݠ', 'ݡ'=>'ݡ', 'ݢ'=>'ݢ', 'ݣ'=>'ݣ', 'ݤ'=>'ݤ', 'ݥ'=>'ݥ', 'ݦ'=>'ݦ', 'ݧ'=>'ݧ', 'ݨ'=>'ݨ', 'ݩ'=>'ݩ', 'ݪ'=>'ݪ', 'ݫ'=>'ݫ', 'ݬ'=>'ݬ', 'ݭ'=>'ݭ', 'ݮ'=>'ݮ', 'ݯ'=>'ݯ', 'ݰ'=>'ݰ', 'ݱ'=>'ݱ', 'ݲ'=>'ݲ', 'ݳ'=>'ݳ', 'ݴ'=>'ݴ', 'ݵ'=>'ݵ', 'ݶ'=>'ݶ', 'ݷ'=>'ݷ', 'ݸ'=>'ݸ', 'ݹ'=>'ݹ', 'ݺ'=>'ݺ', 'ݻ'=>'ݻ', 'ݼ'=>'ݼ', 'ݽ'=>'ݽ', 'ݾ'=>'ݾ', 'ݿ'=>'ݿ', 'ހ'=>'ހ', 'ށ'=>'ށ', 'ނ'=>'ނ', 'ރ'=>'ރ', 'ބ'=>'ބ', 'ޅ'=>'ޅ', 'ކ'=>'ކ', 'އ'=>'އ', 'ވ'=>'ވ', 'މ'=>'މ', 'ފ'=>'ފ', 'ދ'=>'ދ', 'ތ'=>'ތ', 'ލ'=>'ލ', 'ގ'=>'ގ', 'ޏ'=>'ޏ', 'ސ'=>'ސ', 'ޑ'=>'ޑ', 'ޒ'=>'ޒ', 'ޓ'=>'ޓ', 'ޔ'=>'ޔ', 'ޕ'=>'ޕ', 'ޖ'=>'ޖ', 'ޗ'=>'ޗ', 'ޘ'=>'ޘ', 'ޙ'=>'ޙ', 'ޚ'=>'ޚ', 'ޛ'=>'ޛ', 'ޜ'=>'ޜ', 'ޝ'=>'ޝ', 'ޞ'=>'ޞ', 'ޟ'=>'ޟ', 'ޠ'=>'ޠ', 'ޡ'=>'ޡ', 'ޢ'=>'ޢ', 'ޣ'=>'ޣ', 'ޤ'=>'ޤ', 'ޥ'=>'ޥ', 'ަ'=>'ަ', 'ާ'=>'ާ', 'ި'=>'ި', 'ީ'=>'ީ', 'ު'=>'ު', 'ޫ'=>'ޫ', 'ެ'=>'ެ', 'ޭ'=>'ޭ', 'ޮ'=>'ޮ', 'ޯ'=>'ޯ', 'ް'=>'ް', 'ޱ'=>'ޱ', '޲'=>'', '޳'=>'', '޴'=>'', '޵'=>'', '޶'=>'', '޷'=>'', '޸'=>'', '޹'=>'', '޺'=>'', '޻'=>'', '޼'=>'', '޽'=>'', '޾'=>'', '޿'=>'', '߀'=>'߀', '߁'=>'߁', '߂'=>'߂', '߃'=>'߃', '߄'=>'߄', '߅'=>'߅', '߆'=>'߆', '߇'=>'߇', '߈'=>'߈', '߉'=>'߉', 'ߊ'=>'ߊ', 'ߋ'=>'ߋ', 'ߌ'=>'ߌ', 'ߍ'=>'ߍ', 'ߎ'=>'ߎ', 'ߏ'=>'ߏ'); $txt = strtr($txt1, $iso); ?>
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> <a href="javascript:void(0);" onclick="Zoom(0.1);">+</a> </p>
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 комментария ?>
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 копеек ?>
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("фонарь"); # фонарей ?>
140 укоротим текст без обрезки слов
<?php $txt = substr($text, 0, strpos($text, ' ', 100)); ?>
141 Отключаем_Правую_Мыш JS
<script type="text/javascript"> "use strict"; document.oncontextmenu = function (){return false}; </script>
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; } } ?>
143 Очищаем таблицу MYSQLI
<?php if(!function_exists("msql_open")) { function MYSQLI_truncate($name_tabl){ GLOBAL $db; $result = $db->query( "TRUNCATE TABLE `$name_tabl`;" ); # Очищаем таблицу } } ?>
144 Обнулить счетчик AUTO_INCREMENT MYSQLI
<?php GLOBAL $db; $result = $db->query( "ALTER TABLE name_table AUTO_INCREMENT=0;" ); # Обнулить счетчик AUTO_INCREMENT ?>
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"); } } } ?>
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; } } ?>
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_; } } ?>
148 escape MYSQLI
<?php function MYSQLI_escape($txt){ GLOBAL $db; return $db->real_escape_string($txt); } ?>
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); } } ?>
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 !!! "); } ?>
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; } ?>
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 }?>
153 Персональные данные. Пользовательское соглашение Битрикс
<?php //------------------------------------------------------------------ # Пользовательское соглашение # ?> <input id="policy" value="Y" type="checkbox" name="privacy_policy"> <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; } } ?>
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 ?>
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; } ?>
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>
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); # возвращает все параметры этого товара ?>
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']; } ?>
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*")); ?>
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']); ?>
161 Аналог exec PHP
<?php function Analog_Exec(){ # Аналог exec $output = `dir *.*`; # Обратные ковычки echo "<pre>$output</pre>"; } ?>
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; } ?>
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; } ?>
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); } ?>
165 Обращение к переменной по значению в строке
<?php function initvar($varname, $value=''){ global $$varname; if(!isset($$varname)) $$varname=$value; } ?>
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)); ?>
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"); ?>
168 Вся информация о продукте Битрикс по ID. CCatalogProduct::GetByIDEx
<?php $arOptPrices = CCatalogProduct::GetByIDEx($arElement['ID']); echo " <pre>"; print_r($arOptPrices); echo "</pre>"; $res = CCatalogProduct::GetOptimalPrice($el_id, 1); # 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); ?>
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>
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>
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>"; ?>
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; } ?>
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; } ?>
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); ?>
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; } ?>
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; ?>
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" ) );?>
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); } ?>
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; } ?>
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); ?>
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/>"; } } ?>
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); } ?>
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); } ?>
185 последний элемент URL GetLastLinkSection
<?php function GetLastLinkSection($link){ $arUrl = explode('/', $link); $arUrl = array_filter($arUrl); # Убрать пустоты $LastCode = array_pop($arUrl); # Извлекает последний элемент массива return $LastCode; } ?>
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))); } } ?>
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>
188 Блоки текста "<<<eol"
<?php $s = <<<EOL Кавычки бывают 'одинарными' и "двойными". $name и {$foo->bar[1]} 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"); ?>
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; } ?>
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); } ?>
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>
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); } ?>
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>
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; } ?>
196 прервать событие JS
<script type="text/javascript"> e = e || window.event; e.preventDefault(); e.stopPropagation(); </script>
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; } ?>
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(); } ?>
199 проверка включен ли режим правки Битрикс
<?php # ********************************************************************************* # 1C-Bitrix проверка включен ли режим правки # если кнопка "Показать включаемые области" нажата, то if ($APPLICATION->GetShowIncludeAreas()){} ?>
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); ?>
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">
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; ?>
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; } } ?>
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); ?>
205 замена множества значений в строке одной функцией
<?php $text = 'Я фан клуба {$club}. Тут какой-то {$text}. И тут ещё какой-то {$text2}.'; $vars = array( '{$club}' => 'Барселона', '{$text}' => 'текст', '{$text2}' => 'супер текст' ); echo strtr($text, $vars); ?>
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>"; # массив разборки имени файла ?>
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); ?>
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 */ ?>
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>
210 Javascript. Изменение URL без перезагрузки
<script type="text/javascript"> window.history.pushState('', '', 'new_url/'); </script>
211 JSON_ENCODE без заморочек с кодировкой Битрикс
<?php # encode $enc_value = \Bitrix\Main\Web\Json::encode($data, $options = null); # decode $dec_value = \Bitrix\Main\Web\Json::decode($data); ?>
212 Показывать спиннер пока картинка не загрузится.
<style type="text/css"> img { background: url('loading.gif') no-repeat center; } </style>
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") ?>
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; } ?>
215 Одновременное горизонтальное и вертикальное выравнивание элемента (span внутри div)
<style type="text/css"> .parent { position: relative; } .child { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } </style>
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>"; ?>
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>
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>
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>
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 # ?>
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'); ?>
222 Document.ready JS
<script> document.addEventListener("DOMContentLoaded", function(event) { //do work }); </script>
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', '')); ?>
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, ), );
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>
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 */ ?>
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 ?>
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>"; ?>
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] ); ?>
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']; } ?>
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'; } ?>
232 Подключение модулей
<?php # Статический метод подключает модуль по его имени. \Bitrix\Main\Loader::includeModule($moduleName); # Статический метод подключает партнёрский модуль по его имени. \Bitrix\Main\Loader::includeSharewareModule($partnerModuleName); ?>
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; } } ?>
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())); ?>
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"); ?>
236 Конверт массива
<?php function utf8(&$val, $key){ $val = iconv("CP1251", "UTF-8", $val); return $val; } array_walk_recursive($ret,'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>
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'; ?>
239 Очистить стиль
<style type="text/css"> li { all: initial; } </style>
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)); ?>
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(); ?>
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); ?>
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; } } ?>
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>'; ?>
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']; } } ?>
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>
247 GetPropertyValuesArray
<?php CModule::IncludeModule('iblock'); $ID = 31934; $IBLOCK_ID = 2; $elements[$ID] =[]; CIBlockElement::GetPropertyValuesArray($elements, $IBLOCK_ID, ["ACTIVE"=>'Y'],['CODE'=>['MORE_PHOTO']]); ?>
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; } ?>
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>"; ?>
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 минут, за это время истекла сессия и сообщение не отправилось). Для усложнения, этот инпут можно создавать яваскриптом. Большинство ботов его даже видеть не будут, а в принимающем скрипте будет проверяться приходящее из формы значение. */ ?>
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>
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(); -->
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; } ?>
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; } ?>
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(); } ?>
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]." показов"; } ?>
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']; } } ?>
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(); ?>
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 админки. Файлы стереть после внесения изменений. ?>
260 PHP. Получить все ссылки в тексте (возвращает массив url)
<?php function getArrUrl($text){ preg_match_all("#\s(?:href|src|url)=(?:[\"\'])?(.*?)(?:[\"\'])?(?:[\s\>])#i", $text, $matches); return $matches[1]; } ?>
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; } ?>
262 IsAdmin. Битрикс. D7.
<?php if (!\Bitrix\Main\Application::getInstance()->getContext()->getRequest()->isAdminSection()) { echo 'Это точно не админка'; } ?>
263 Битрикс. JSON и windows-1251. Обертка без заморочек:
<?php $eValue = \Bitrix\Main\Web\Json::encode($data, $options = null); $dValue = \Bitrix\Main\Web\Json::decode($data); ?>
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); } ?>
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>
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); } ?>
267 Битрикс. Читаем .setup.php
<?php $ret = include($_SERVER["DOCUMENT_ROOT"]."/bitrix/.settings.php"); echo "<pre>".print_r($ret[connections],1)."</pre>"; ?>
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>
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>
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); } } ?>
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>
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> #-----------------------------------------------#
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>"; ?>
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) : []; ?>
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>
276 Oтключить вывод информации.
<?php AddEventHandler("main", "OnBeforeProlog", "MyOnBeforePrologHandler"); function MyOnBeforePrologHandler(){ global $USER; if(!$USER->isAdmin()) define("PUBLIC_AJAX_MODE", true); } ?>
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]} name: {$arItem[ORIGINAL_NAME]}<br/>"; # аккуратно с ИБ, у которых отдельно хранятся значения<br> # CFile::Delete($arItem['ID']); } echo "<br/>Время: ".(microtime(true) - $t1)."<br/>"; ?>
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); ?>
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) ) ); ?>
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) ) ); ?>
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)); ?>
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>
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>
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]); } ?>
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, )); } ?>
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']; } ?>
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>
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); ?>
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); ?>
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); ?>
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>"; } } ?>
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>"; } ?>
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; } ?>
294 Обновляем корзину
<script type="text/javascript"> BX.onCustomEvent('OnBasketChange'); // Обновляем корзину </script>
295 Определить протокол сервера
<?php $protocol = "http".(isset($_SERVER['HTTPS']) ? "s" : ""); ?>
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>
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>
298 Чистим кеш
<?php BXClearCache(true); $GLOBALS["CACHE_MANAGER"]->CleanAll(); $GLOBALS["stackCacheManager"]->CleanAll(); $page = \Bitrix\Main\Composite\Page::getInstance(); $page->deleteAll(); ?>
299 Запись в лог ошибок PHP
<?php # Если логирование предполагает фиксацию только ошибок, то лучше писать их в # общий лог PHP, подробнее на php.net. error_reporting(E_ALL); ini_set('error_log', __DIR__ . '/php-errors.log'); error_log('Запись в лог', 0); ?>
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(); } ?>
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")); ?>
302 print_r в строку
<?php echo "<pre>".preg_replace("@\s+\[\d+\]\s\=\>(.*)\n@","$1, ",print_r(array(1,2,3),1))."</pre>"; ?>
303 проверка на наличие запроса GET или POST
<?php if ($_SERVER['HTTP_X_REQUESTED_WITH'] !== 'XMLHttpRequest') { return; } ?>
304 Перенос скриптов в нижнюю часть страницы
<?php /* Перенос скриптов в нижнюю часть страницы В админке битрикса есть настройка, отвечающая за перенос всего JS в нижнюю часть страницы, активируется она по пути: Настройки -> Настройки продукта -> Настройки модулей -> Главный модуль -> Переместить весь Javascript в конец страницы Если активировать эту настройку, то Битрикс сформирует страницу, вырежет ВСЕ вхождения тега script и вставит их в нижнюю часть страницы. Такой подход устраивает не всегда, яркий пример — подключение google tag manager и прочих скриптов, которые должны быть в верхней части страницы. Что бы настройка битрикса не меняла положение скрипта в коде нужно добавить атрибут data-skip-moving : */ ?> <script data-skip-moving="true"></script>
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(); ?>
306 Стандартная проверка в подключаемых файлах
<?php if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die(); ?>
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>
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>
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 ?>
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']; ?>
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 коп. ?>
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)); можно не указывать. ?>
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>
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.'); # Съешь же ещё этих мягких французских булок, да выпей чаю. ?>
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(); ?>
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()); ?>
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-хх" } */ ?>
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) "Штаны Цветочная Поляна" } ?>
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(); ?>
320 Как установить бесплатный модуль, если кончилась лицензия
Если вам нужно установить на сайт бесплатный модуль из Marketplace, но срок техподдержки и обновлений закончился, можно поступить следующим образом: Перейти на сайт bitrixlabs.ru и создать демо-сайт в виртуальной лаборатории Перейти в раздел Marketplace > Каталог Решений и найти необходимый модуль и загрузить его (при этом устанавливать не надо) Перейти в административной части виртуальной лаборатории Контент > Структура сайта > Файлы и папки > bitrix > modules и найти папку загруженного модуля (она совпадает с идентификатором модуля, например, "grain.tables") Архивировать папку модуля из контекстного меню Скачать полученный архив и загрузить аналогичным образом в папку "bitrix/modules" вашего сайта Разархивировать файл из контекстного меню Перейти в раздел Marketplace > Установленные решения и установить модуль https://bitrixlabs.ru/
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 ) */ ?>
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>"; } ?>
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 )*/ ?>
324 Выборка количества активных пользователей на сайте
<?php echo \Bitrix\Main\UserTable::getActiveUsersCount(); ?>
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; } ?>
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> <?}?>
327 Тернарный оператор ??
<?php $var = $value ?? "Другое значение"; # эквивалентно $var = isset($value) ? $value : "Другое значение"; ?> <?php $var = $value ?: "Другое значение"; # эквивалентно $var = $value ? $value : "Другое значение"; ?>
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>
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(); ?>
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(); ?>
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>"; ?>
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; ?>
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); ?>
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>
335 получаем все что знает UserTable
<? $res = Bitrix\Main\UserTable::getList(Array( "select"=>["ID","NAME"], "filter"=> ["ID"=>1], ))->fetchAll(); echo "<pre>".print_r($res,1)."</pre>"; ?>
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(); ?>
337 Вычленить имя файла из __FILE__
<? echo str_replace(__DIR__."/","",__FILE__); echo basename(__FILE__); ?>
338 Вывод свойства типа HTML5/текст
<? if ($arItem["DISPLAY_PROPERTIES"]['свойство']){ echo htmlspecialcharsBack($arItem["PROPERTIES"]["свойство"]["VALUE"]["TEXT"]); } ?>
339 Получение цены товара (стоимость товара) по его ID:
<? $price = CPrice::GetBasePrice($arItem['ITEM_ID'])['PRICE']; ?>
340 Как получить ссылку на товар в Bitrix:
<? $res= \CIBlockElement::GetByID( $id ); $aTMP = $res->GetNext(); echo $aTMP[ 'DETAIL_PAGE_URL' ]; ?>
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>
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; } } ?>
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())); ?>
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>
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>
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>
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; ?>
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; ?>
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 ?>
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; } ?>
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); ?>
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 ?>
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); ?>
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 ?>
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 ?>
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 ?>
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'); ?>
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); ?>
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); ?>
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; ?>
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; } ?>
362 Очистка буфера вывода
<? # Если уровней вложенности буферов много, то может не сработать $APPLICATION->restartBuffer(); #Гарантированная очистка всех уровней вложенности буферов вывода while (ob_get_level()) { ob_end_clean(); } ?>
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)); } ?>
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); ?>
365 Выборка доставки по id
<? $arDelivery = \Bitrix\Sale\Delivery\Services\Table::getById(1)->fetch(); ?>
366 Выборка информации о платежной системе с ID=12 одной строкой
<? $arPaySystem = \Bitrix\Sale\Internals\PaySystemActionTable::getById(12)->fetch()); echo "<pre>"; print_r($arPaySystem); echo "</pre>"; ?>
367 Выборка информации о платежных системах
<? $rsPaySystem = \Bitrix\Sale\Internals\PaySystemActionTable::getList([ 'filter' => array('ACTIVE'=>'Y'), ]); while($arPaySystem = $rsPaySystem->fetch()) { echo "<pre>"; print_r($arPaySystem); echo "</pre>"; } ?>
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 ?>
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] => Какое-то сообщение от пользователя ) */ ?>
370 Как найти свой php.ini
<?php echo php_ini_loaded_file(); ?>
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)); ?>
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; } ?>
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; } ?>
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); ?>
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); ?>
376 DELETE to DB PostgreSQL
<?php $sql = "DELETE FROM people WHERE id = '".$_REQUEST['id']."';"; $dbconn->query($sql); ?>
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); ?>
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>
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; ?>
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) ?>
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>
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>
383 Файл "Политика конфиденциальности"
<!-- Качайте архив с файлом --> <a download href="https://shng.ru/programmer/images/privacy.zip">privacy.zip</a>
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')); ?>
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; } ?>
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'))); ?> <div class="card" id="<?=$this->GetEditAreaID($arItem['ID'])?>"> ...
387 Вертикальное центрирование
<style type="text/css"> .container { min-height: 10em; display: table-cell; vertical-align: middle; } </style>
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>
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']; ?>
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>"; } ?>
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); }
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>
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>";
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", то в список добавляется значение не выбрано и рядом множественное дополнительное поле для ввода значения вручную.?>
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; } }
396 Передача данных формы Стандартная проверка соответствия сессии
<form action="" name="form-order" method="post"> <?=bitrix_sessid_post();?> <!-- ... разметка ... --> </form> <?php if(!check_bitrix_sessid()) { $valid = false; }
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 ?>
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", ) );?>
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); ?>
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(), )); } } ?>
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 свойства привязки к основному товару в инфоблоке предложений ) */ ?>
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 # ?>
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']; ?>
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
405 Забираем заголовок из .section.php Битрикс
function GetCurrentTitle(){ // Забираем заголовок из .section.php global $APPLICATION; include $_SERVER['DOCUMENT_ROOT'].$APPLICATION->GetCurDir()."/.section.php"; return $sSectionName; }
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); } }
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> <? }?>
408 Перекодировка Unicode UTF-8
<?php $_code = array( "a" => "a", "b" => "b", "c" => "c", "d" => "d", "e" => "e", "f" => "f", "g" => "g", "h" => "h", "i" => "i", "j" => "j", "k" => "k", "l" => "l", "m" => "m", "n" => "n", "o" => "o", "p" => "p", "q" => "q", "r" => "r", "s" => "s", "t" => "t", "u" => "u", "v" => "v", "w" => "w", "x" => "x", "y" => "y","z" => "z", "A" => "A", "B" => "B", "C" => "C", "D" => "D", "E" => "E", "F" => "F", "G" => "G", "H" => "H", "I" => "I", "J" => "J", "K" => "K", "L" => "L", "M" => "M", "N" => "N", "O" => "O", "P" => "P", "Q" => "Q", "R" => "R", "S" => "S", "T" => "T", "U" => "U", "V" => "V", "W" => "W", "X" => "X", "Y" => "Y","Z" => "Z", "[" => "[", "\" => "/", "]" => "]", "^" => "^", "_" => "_", "`" => "`", " " =>" ", " " =>" ", "!" =>"!", """ =>'"', "#" =>"#", "$" =>"$", "%" =>"%", "&" =>"&", "'" =>"'", "(" =>"(", ")" =>")", "*" =>"*", "+" =>"+", "," =>",", "-" =>"-", "." =>".", "/" =>"/", "0" =>"0", "1" =>"1", "2" =>"2", "3" =>"3", "4" =>"4", "5" =>"5", "6" =>"6", "7" =>"7", "8" =>"8", "9" =>"9", ":" =>":", ";" =>";", "<" =>"<", "=" =>"=", ">" =>">", "?" =>"?", "@" =>"@", "А" =>"А", "Б" =>"Б", "В" =>"В", "Г" =>"Г", "Д" =>"Д", "Е" =>"Е", "Ё" =>"Ё", "Ж" =>"Ж", "З" =>"З", "И" =>"И", "Й" =>"Й", "К" =>"К", "Л" =>"Л", "М" =>"М", "Н" =>"Н", "О" =>"О", "П" =>"П", "Р" =>"Р", "С" =>"С", "Т" =>"Т", "У" =>"У", "Ф" =>"Ф", "Х" =>"Х", "Ц" =>"Ц", "Ч" =>"Ч", "Ш" =>"Ш", "Щ" =>"Щ", "Ъ" =>"Ъ", "Ы" =>"Ы", "Ь" =>"Ь", "Э" =>"Э", "Ю" =>"Ю", "Я" => "Я", "а" =>"а", "б" =>"б", "в" =>"в", "г" =>"г", "д" =>"д", "е" =>"е", "ё" =>"ё", "ж" =>"ж", "з" =>"з", "и" =>"и", "й" =>"й", "к" =>"к", "л" =>"л", "м" =>"м", "н" =>"н", "о" =>"о", "п" =>"п", "р" =>"р", "с" =>"с", "т" =>"т", "у" =>"у", "ф" =>"ф", "х" =>"х", "ц" =>"ц", "ч" =>"ч", "ш" =>"ш", "щ" =>"щ", "ъ" =>"ъ", "ы" =>"ы", "ь" =>"ь", "э" =>"э", "ю" =>"ю", "я" =>"я"); $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); } ?>
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>