Пропустить контент
Featured Post

Функции, которыми я пользуюсь постоянно. «Must have» для битрикса и PHP

Опубликовано в 1С-Битрикс, и PHP

Зачастую, при разработке сайтов, для того, чтобы ускорить свое время и минимизировать код, я выношу его в отдельные функции. А потом просто копирую файл с ними на все разрабатываемые сайты. Здесь я хочу привести перечень тех, функций, которые для меня являются «MUST HAVE» при разработке сайтов на битриксе.

Читать далее Функции, которыми я пользуюсь постоянно. «Must have» для битрикса и PHP

Еще один способ загрузки файла на Ajax

Опубликовано в JS, JQuery

В одном из постов мы уже приводили пример как можно отправить форму с файлом на ajax, и вот хотим показать еще один способ:

function setimage() {
    var $input = $("#uploadimage");
    var fd = new FormData;

    fd.append('img', $input.prop('files')[0]);

    $.ajax({
        url: 'http://example.com/script.php',
        data: fd,
        processData: false,
        contentType: false,
        type: 'POST',
        success: function (data) {
            alert(data);
        }
    });
}

Битрикс, получение SEO-шаблонов инфоблока через api

Опубликовано в 1С-Битрикс

Продолжаем документировать для себя недокументированные функции Битрикса.

Сегодня на повестке дня вывод заданных в админке значений мета-тегов для конкретного инфоблока. Напомню, что производятся эти настройки на странице редактирования элемента или раздела инфоблока во вкладке «SEO», там можно задать шаблоны мета-тегов для разделов, элементов инфоблока, значения параметров превьюшек и детальных картинок для элементов и разделов.

Битрикс, получение SEO-шаблонов инфоблока через api

Вводная:

Рассмотрим кейс: есть страница каталога интернет-магазина, мы задаем для каждого раздела свои мета-теги, например: в разделе «одежда» есть разделы «брюки», «футболки», «юбки», в разделе «аксессуары» есть разделы «ремни», «шарфы»;  для подразделов в настройках SEO для этих разделов мы прописываем шаблон meta title «название_магазина — название_раздела по самым низким ценам». При использовании компонента catalog.section все данные значения у нас прекрасно подхватываются и выводятся в тело страницы. Но допустим у нас есть страницы /catalog/odegda/ и /catalog/accessories/, на которых выводится список подразделов и мы хотим, чтобы на странице с одеждой в мета title было к примеру «Название_магазина — Название_раздела для вас и вашей семьи», а на странице с аксессуарами «Название_магазина — Название_раздела для дополнения стиля». Заполняем шаблоны  в админке, идем в публичку — пусто. Смотрим код компонента, а он и не умеет устанавливать данные свойства.

Что делать?

Будем вытаскивать значения через api. Где это делать — вариантов несколько, для простоты можно сделать это в result_modifier.php, главное не забывать, что результат работы result_modifier`а кэшируется вместе с шаблоном страницы.

Делай раз:

// для начала вытащим ИД раздела по его коду. Если в вашем случае ИД уже известен пропускаем эту часть
$sectionIterator = CIBlockSection::GetList(
    Array("SORT"=>"ASC"),
    Array("IBLOCK_ID"=>$arParams["IBLOCK_ID"],"CODE"=>$arResult["VARIABLES"]["SECTION_CODE"]),
    false,
    Array("ID"),
    false
);
$arSection = $sectionIterator->Fetch();

// вытащим значения свойств для данного раздела
$ipropValues = new \Bitrix\Iblock\InheritedProperty\SectionValues($arParams["IBLOCK_ID"], $arSection["ID"]);
$arIProp = $ipropValues->getValues();
$arResult["IPROPERTIES] = $arIProp;

// сделаем доступным значение вне кэша:
$this->_component->setResultCacheKeys(Array("IPROPERTIES"));

Класс \Bitrix\Iblock\InheritedProperty\SectionValues как раз служит для работы с данными свойствами.

После этого мы уже можем установить желаемое свойство в файле component_epilog.php.

Делай два:

$APPLICATION->SetPageProperty("title", $arResult["IPROPERTIES"]["SECTION_META_TITLE"]);

Готово :)

Битрикс, вывод состава комплектов в публичной части

Опубликовано в 1С-Битрикс

Сегодня разбирался с комплектами товаров и их показом в публичной части. Разработчики решили, что клиентам не нужно знать состав комплекта и вообще не отдают никакой информации по нему. Но на их «нет» всегда есть их же API, которое в свою очередь как всегда не полностью описано..

В итоге все как всегда ищется руками прямо в коде модуля. Прошу — класс CCatalogProductSet

Начнем.

Стандартный компонент catalog (ну или результат запроса CCatalogProduct::GetList ) отдает нам в массиве ключ CATALOG_TYPE, который может принимать три значения: 1 — простой товар, 2 — комплект, 3 — имеет торговые предложения. В случае с компонентом catalog.section воспользуемся файлом result_modifier.php. Пишем свой код, либо находим похожие строки и добавляем туда.

foreach($arResult["ITEMS"] as $arItem)
{
    switch($arItem["CATALOG_TYPE"])
    {
        case CCatalogProduct::TYPE_SET: 
            /* лучше будем сравнивать с константами, заданными в модуле
               TYPE_PRODUCT - простой товар
               TYPE_SET - комплект
               TYPE_SKU - товарные предложения
            */
            $arSets = CCatalogProductSet::getAllSetsByProduct($arItem["ID"], CCatalogProductSet::TYPE_SET); // передаем ИД текущего товара и тип комплекта (может быть еще "набором")
            /*
            в ответе возвращается массив комплектов для данного товара вида Array("ID_комплекта"=>Array("ID","ITEM_ID","ITEMS",..))
            */
            $arSetItems = array();
            foreach($arSets as $arSet)
            {
                foreach($arSet["ITEMS"] as $arSetItem)
                {
                    $arSetItems[] = $arSetItem["ITEM_ID"];                   
                }
            }
            $spIterator = CCatalogProduct::GetList(Array(),Array("ID"=>$arSetItems),false,false,Array("ID","ELEMENT_NAME")); // выберем интересующую нас информацию по товару
            $arSetProducts = array();
            while($arSP = $spIterator->Fetch())
            {
                $arSetProducts[] = $arSP["ELEMENT_NAME"];
            }
            $arItem['SET'] = $arSetProducts;
            break;
    }
}

после этого в шаблоне компонента мы можем уже использовать полученные нами данные.

if($arItem["CATALOG_TYPE"] == CCatalogProduct::TYPE_SET)
{
    foreach($arItem["SET"] as $arSet)
    {
        print "<div>".$arSet."</div>";
    }
}

 

 

Управление правилами в битриксовом urlrewrite через API

Опубликовано в 1С-Битрикс

Нашел замечательный служебный класс для работы с правилами обработки адресов.

CUrlRewriter::Add(   array(
      "SITE_ID" => $site_id,
      "CONDITION" => $CONDITION,
      "ID" => $ID,
      "PATH" => $FILE_PATH,
      "RULE" => $RULE
   )
);
CUrlRewriter::Update(   array("SITE_ID" => $site_id, "CONDITION" => $CONDITION_OLD),
   array(
      "CONDITION" => $CONDITION,
      "ID" => $ID,
      "PATH" => $FILE_PATH,
      "RULE" => $RULE
   )
);

Ну и другие методы http://bxapi.ru/?search=curlrewriter

Функция для вычисления разницы между временем PHP

Опубликовано в PHP

Задача: вычислить, какой время прошло от даты создания элемента до сейчашнего момента.

$now = time();
$date = explode(" ", $ob["DATE_CREATE"]);
$time = explode(":", $date[1]);
$dater = explode(".", $date[0]);
$this_time = mktime($time[0], $time[1], $time[2], $dater[1], $dater[0], $dater[2]);

$minus = $now - $this_time;
echo sprintf('%02d:%02d:%02d', $minus / 3600, ($minus % 3600) / 60, $minus % 60);

Загрузка файла вместе с отправкой формы на ajax. JQuery, PHP

Опубликовано в JS, JQuery, и PHP

Следующий скрипт подойдет для загрузки файла на сервер вместе с отправкой формы, а также проверяет заполнены ли все обязательные поля в форме. В первый раз был использован мною очень давно и используется до сих пор.
Будем считать, что в верстке у тех полей, которые должны быть заполнены обязательны, стоит атрибут data-req = 1.

Вот пример верстки, которую мы берем за основу:

<form action="action.php" enctype="multipart/form-data">
    <input type="text" name="fio" value="" data-req="1" placeholder="Фамилия, имя, отчество"> <!-- обязательное поле -->
    <input type="text" name="city" value="" placeholder="Город"> <!-- не обязательное-->
    <input type="file" name="file" value=""> <!-- не обязательное-->
    <input type="submit" name="btn" value="Отправить форму"> 
</form>

Читать далее Загрузка файла вместе с отправкой формы на ajax. JQuery, PHP

Парсинг цен из строки в число

Опубликовано в JS, JQuery

Допустим приходит к нам строка «3 048.56 руб.»

Но нам не нравится такое отображение, мы хотим получить только число (а не которые ЦМС не хотят отдавать нам просто число, привет Битрикс), чтобы как-то с ним оперировать.

Если, хотим получить на выходе целое число:

var d = parseInt("3 048.56 руб.".replace(/\s+/g,"").match(/[\d]+(\.|\,)*[\d]+/g));
// на выходе число

Если хотим разбить по разрядам, скормим результат функциии отсюда

Альтернативный вариант, если сначала нужно выделить из строки число с дробной частью:

var s = parseFloat("3 048.56 руб.".replace(/\s+/g,"").match(/[\d]+(\.|\,)*[\d]+/g)).toFixed(0).split(/(?=(?:\d{3})+$)/).join(" ");
// на выходе строка

Функция сортировки массива PHP с использованием пользовательской функции

Опубликовано в PHP

Функция сортировки массива PHP с использованием пользовательской функции

// Функция сравнения
function cmp($a, $b) {
    if (strtotime($a['date_create']) == strtotime($b['date_create'])) {
        return 0;
    }
    return (strtotime($a['date_create']) < strtotime($b['date_create'])) ? 1 : -1;
}

// Сортируем и выводим получившийся массив
uasort($arResult['LAST_MESSAGE'], 'cmp');

uasortСортирует массив, используя пользовательскую функцию для сравнения элементов с сохранением ключей

Сортировка массивов

Опубликовано в PHP

Давным-давно родилась у меня вот такая штука. В результате оказалось все просто, но дошел я до нее в свое время очень не быстро..

Нам нужно отсортировать два массива, один из которых обычный, сортируется по значениям другого массива, который является многомерным ассоциативным, и его ключи верхнего уровня есть значения первого. Т.е. есть например массив

$array_id = array(0 => 1, 1 => 4, 2 => 39 ...);

и массив

$array_name = array
   (
      ["4"] => array(
                          ... 
                          ["point"] => 1900, 
                          ["pay"] => 1, 
                          ...), 
      ["39"] =>  array(
                          ... 
                          ["point"] = >800, 
                          ["pay"] => 0, 
                          ...), 
      ...
   )

Нужно сделать так, чтобы массив

array_id

был отсортирован сначала по ключу

pay

, а внутри сортировки по pay была сортировка по

point

 

Код:

function mysort_pay($a,$b = NULL)
{
 static $array_name;
 if ($b === NULL)
 {
 $array_name = $a;
 }
 else
 {
 $r1 = $array_name[$a]['pay'] < $array_name[$b]['pay'] ? 1 : ($array_name[$a]['pay'] > $array_name[$b]['pay'] ? -1 : 0);
 $r2 = $array_name[$a]['point'] < $array_name[$b]['point'] ? 1 : ($array_name[$a]['point'] > $array_name[$b]['point'] ? -1 : 0);
 return ($r1 == 0) ? $r2 : $r1;
 }
}

if($_POST['sort'] == 'default')
{
 mysort_pay($array_name); 
 uasort($array_id,'mysort_pay');
}

Логинка для битрикса.

Опубликовано в 1С-Битрикс

Что делать, если пароль от аккаунта администратора сайта на битриксе потерялся, но есть FTP доступ? Загрузи в корень сайта этот скрипт и он авторизует тебя под администратором сайта!

 

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
global $USER;
$USER->Authorize(1);
LocalRedirect("/");

 

Перекодировка строки PHP

Опубликовано в PHP

Функция для перекодировки строки. Применима в тех случаях, когда, например, заполняемая форма на сайте имеет поля с данными в кодировке UTF-8, а необходимо записать результаты в базу в кодировке Windows-1251.

 

function convertEncoding($data, $in, $out) {
  foreach( $data as $k => $val) {
    if (is_array($val)) {
      $data[$k] = convertEncoding($val, $in, $out);
    } else {
      $data[$k] = iconv($in, $out, $val);
    }
  }
  return $data;
}

if (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) &&
  (strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest')) {
    $_POST = convertEncoding($_POST, 'utf-8', 'cp1251');
    $_REQUEST = convertEncoding($_REQUEST, 'utf-8', 'cp1251');
}

 

Как удалить лишние пробелы, абзацы и стили в тексте. PHP

Опубликовано в PHP

Регулярное выражение для того чтобы удалить лишние пробелы и стили при копировании или написании текста.

У меня возникала такая ситуация: есть блок для вставки текста. Но он сделан не классическим textarea, а тегом div, в который с помощью jquery-плагина вставляется текст, где каждый новый абзац (enter) заключает в div предыдущий абзац.

При копировании текстов с других сайтов, блок подхватывал стили другого сайта и при сохранении отображал их. So sad. Поэтому перед добавлением записи нужно всего лишь пройтись регулярочкой, которая удаляет лишние пробелы и абзацы (если их больше 2-х подряд), а также чужие стили.

$detail_text = preg_replace("!<div><br></div>!si","",$detail_text); // удаляем все лишние пробелы и абзацы
$detail_text = preg_replace('~style="[^"]*"~i', '', $detail_text); // удаляем стили с других сайтов

 

JQuery — достать любой URL параметр и заменить его

Опубликовано в JS, JQuery

Функция, которая может достать любой URL параметр и заменить его.

 

function getVarValueFromURL(url, varName) {
  var query = url.substring(url.indexOf('?') + 1);
  var vars = query.split("&");
  for (var i=0;i<vars.length;i++) {
    var pair = vars[i].split("=");
    if (pair[0] == varName) {
      return pair[1];
    }
  }
  return null;
}

url = url.replace(sorting, sort);