Полезные утилиты на каждый день

#
Полезные утилиты на каждый день
Всем привет!

За годы разработки под HostCMS я собрал некоторую коллекцию всяких функций, которые облегчают мне рутинные задачи. И вот решил собрать все это добро в один набор, и поделиться с общественностью.

В наборе две части.
1.
Небольшая библиотека для отладки https://bitbucket.org/JamesKotov/hostcms-6-utils/src/tip/modules/debug/debug.php
Подключается в bootstrap.php и содержит две функции echo_r() и echo_v()
Когда вам нужно посмотреть содержимое любой переменной, например, в коде ТДС, то обычный вывод его с помощью print_r или var_dump выглядит неудобочитаемым, потому что в html лишние пробелы игнорируются, и удобный вывод print_r сливается в одну строчку. Нам поможет тег <pre>...</pre>, но каждый раз писать его руками неудобно )
Поэтому я написал две функции-обертки, которые оборачивают тегом pre вывод функций print_r или var_dump. Это реально очень удобно!

2.
Библиотека с разными полезными утилитами https://bitbucket.org/JamesKotov/hostcms-6-utils/src/tip/modules/core/utils.php

Core_Utils::log()
Быстрая запись в лог

@param string $sMessage сообщение
@param integer $iStatus уровень критичности сообщения от 0 (просто запись) до 4 (критическая ошибка), см /modules/core/log.php

Примеры:
Core_Utils::log('Лытдыбр', 0);
Core_Utils::log('Все в порядке', 1);
Core_Utils::log('Упс :)', 2);
Core_Utils::log('Чо-та я на измену присел', 3);
Core_Utils::log('Ааа! Капец, все пропало!!!', 4);



Core_Utils::getCanonicalUrl()
Вычисляет канонический адрес страницы для link rel="canonical" Тот же метод, что и в теме http://www.hostcms.ru/forums/3/8724/

@param boolean [$useParentShopItem = false] В интернет-магазине, для страниц товаров-модификаций считать каноническим урл родительского товара. По умолчанию выключено.
@param string [$sFirstPageSuffix = 'page-1/'] Суффикс пейджинга на первую страницу, удаляется из урла, чтобы каноническим урлом первой страницы был урл без пейджинга.
@return string

Примеры:
<link rel="canonical" href="<?=Core_Utils::getCanonicalUrl(TRUE); ?>"/>

<link rel="canonical" href="<?=Core_Utils::getCanonicalUrl(TRUE, 'pg_1/'); ?>"/>

<link rel="canonical" href="<?=Core_Utils::getCanonicalUrl(FALSE, 'pg_1'); ?>"/>



Core_Utils::getIndexationValue()
Вычисляет значение для meta robots на основании активности лампочки индексации в свойствах структуры

@param mixed $structure_id
@return string

Примеры:
<meta name="robots" content="<?=Core_Utils::getIndexationValue()?>" />



Core_Utils::is503error()
Детектор отключенного сайта

@param mixed $site_id
@return boolean

Примеры
if (!Core_Utils::is503error())
{
      // выводим форму входа в личный кабинет
}
else
{
      // НЕ выводим форму входа в личный кабинет, пишем "Извините, сейчас залогниться нельзя"
}


Core_Utils::ShowDoc()
Быстрый вывод документа по его id

@param mixed $doc_id
@return void

Пример
Core_Utils::ShowDoc(123); // <p>Это мой документ</p>



Core_Utils::getPathByStructureId()
Относительный урл к разделу структуры по его id

@param mixed $iStrucutreId
@return

Пример
Core_Utils::getPathByStructureId(456); //  /path/to/my/structure/



Core_Utils::getPropertyByTagName()
Возвращает id доп.свойства по названию его xml-тега.
Полезно, например, если у вас на одной ТДС несколько одинаковых магазинов, с одинаковым набором доп.свойств
(у одних и тех же свойств в разным магазинах разные id но одинаковые xml-теги)
Позволяет реализовать для таких случаев универсальную ТДС, не завязываясь на id свойств.

@param integer $iObjectId Идентификатор сущности, к которой относится доп.свойство (инфосистема, магазин, структура, пользователь)
@param string $sPropertyTagName xml-имя доп.свойства
@param string $sObjectType тип сущности, к которой относится доп.свойство. Одно из фиксированного набора значений: 'Informationsystem_Item', 'Informationsystem_Group', 'Shop_Item', 'Shop_Group', 'Structure', 'Siteuser'
@return integer


Пример
//В магазине 1 есть доп.свойство группы, с xml-тегом my_group_property, нужно узнать id этого доп.свойства и получить объект свойства

$oShop = Core_Entity::factory('Shop', 1);
$propertyTagName = 'my_group_property';
$propertyType = 'Shop_Group';

$oProperty = Core_Utils::getPropertyByTagName($oShop->id, $propertyTagName, $propertyType); // важно, в первом параметре идентификатор именно магазина, а не его группы или товара!


Core_Utils::getPropertyFirstValue()
Быстрое получение первого значения доп.свойства

@param mixed $oProperty
@param integer $iEntityId
@return

Пример
// Получение первого значения свойства товара магазина с id=123 для товара с id=456

$oProperty = Core_Entity::factory('Property', 123);
$firstValue = Core_Utils::getPropertyFirstValue($oProperty, 456);



Core_Utils::prepareRetpath()
Построение урла возврата на текущую страницу.
Используется, когда вам нужно уйти со страницы в какой-то другой процесс (например, авторизация или регистрация) а потом вернуться сюда же.
Урл страницы для возврата передается в параметре retpath

@param string $sRetpath
@return


Core_Utils::goToRetpath()
Редирект на урл возврата
На самом деле, просто быстрый редирект на переданый урл.

@param string $sRetpath
@param integer $iHttpCode
@return void


Core_Utils::ajaxResponse()
Быстрая отправка аякс-ответа

@param string $sResponseBody
@param integer $iHttpCode
@param string $contentType
@return void


Core_Utils::ProcessTypographic()
Быстрое типографирование текста

@param mixed $sText
@param bool $bEnableOptic
@return string


Core_Utils::prepareUserText()
Быстрая подготовка текста (удаление всех тегов, кроме разрешенных, и типографирование)

@param string $sText
@param bool $bProcessTypographic
@param mixed $sAdditionalAllowedTags
@return string


Core_Utils::prepareUserDescription()
Подготовка описания инфоэлемента из текста, введенного пользователем
Удаление из него списков и таблиц, интеллектуальная обрезка на заданную длинну с сохранением целых предложений (см ниже), и типографирование

@param string $sText
@param integer $iTextLength
@param bool $bProcessTypographic
@param mixed $bAllowTags
@return string


Core_Utils::textSmartCut()
Функция обрезки текста $sText по концам предложений, с сохранением целостности тегов html и удалением лишних тегов и атрибутов. Текст, с учетом окончания предложений, будет гарантированно не длиннее, чем указано в параметре $iLength
За длинну принмается только длинна самого текста, общая суммарна длинна html-тегов и из атрибутов в рассчет не входит.
При этом удаляются запрещенные html-теги, у разрешенных удаляются запрещенные атрибуты.
Список разделителей, определяющих конец предложения настраивается.
Заголовки в тексте по умолчанию не разрешены, и заменяются на абзацы с выделением жирным.

@param string $sText Текст
@param integer $iLength максимальная длинна самого текста (без учета длинны тегов)
@param mixed $aAllowedTags массив тегов, разрешенных в текста
@param mixed $aDisabledAttributes массив запрещенных атрибутов у разрешенных тегов
@param string $sDelim разделители предложений (\s;,.!?:#)
@author James V. Kotov. Based on code from Ilya Lebedev.
@return string


Примеры
// длинна текста 544 символа
$text = 'За годы разработки под HostCMS я собрал некоторую коллекцию всяких функций, которые облегчают мне рутинные задачи. И вот решил собрать все это добро в один набор, и поделиться им с общественностью. Одна из функций возвращает id доп.свойства по названию его xml-тега. Полезно, например, если у вас на одной ТДС несколько одинаковых магазинов, с одинаковым набором доп.свойств (у одних и тех же свойств в разным магазинах разные id но одинаковые xml-теги). Позволяет реализовать для таких случаев универсальную ТДС, не завязываясь на id свойств.';
echo Core_Utils::textSmartCut($text, 250);
// вернет текст в 192 символа
// За годы разработки под HostCMS я собрал некоторую коллекцию всяких функций, которые облегчают мне рутинные задачи. И вот решил собрать все это добро в один набор, и поделиться им с общественностью

echo Core_Utils::textSmartCut($text, 350);
// вернет текст в 260 символов
// За годы разработки под HostCMS я собрал некоторую коллекцию всяких функций, которые облегчают мне рутинные задачи. И вот решил собрать все это добро в один набор, и поделиться им с общественностью. Одна из функций возвращает id доп.свойства по названию его xml-тега

// суммарная длинна с тегами - 592 символа
$text2 = '<h1>За годы разработки под HostCMS</h1> я собрал <b>некоторую коллекцию всяких функций</b>, <span class="myclass">которые облегчают мне рутинные задачи</span>. И вот решил собрать все это добро в один набор, и поделиться им с общественностью. Одна из функций возвращает id доп.свойства по названию его xml-тега.<br/>Полезно, например, если у вас на одной ТДС несколько одинаковых магазинов, с одинаковым набором доп.свойств (у одних и тех же свойств в разным магазинах разные id но одинаковые xml-теги). Позволяет реализовать для таких случаев универсальную ТДС, не завязываясь на id свойств.';
echo Core_Utils::textSmartCut($text2, 250);
// Вернет текст в 192 символа плюс исправленная html-разметка
// <p><b>За годы разработки под HostCMS</b></p> я собрал <b>некоторую коллекцию всяких функций</b>, которые облегчают мне рутинные задачи. И вот решил собрать все это добро в один набор, и поделиться им с общественностью



Выложено это все, как обычно, в репозиторий на битбакет, самую свежую версию всегда можно скачать по ссылке https://bitbucket.org/JamesKotov/hostcms-6-utils/get/tip.zip
Заказов не беру. Консультирую редко.
#
Re: Полезные утилиты на каждый день
Kotoff,
rulez
HostDev.pw - модули для HostCMS, Telegram: @hostdev
#
Re: Полезные утилиты на каждый день
EugenyP, пользуйтесь на здоровье )
Заказов не беру. Консультирую редко.
#
Re: Полезные утилиты на каждый день
Kotoff,
также есть предложение сделать так, чтобы не отображалось простым смертным:

// вывод содержимого через print_r
function echo_r($value)
{
   if (Core_Auth::logged()) {
      echo '<pre>' . print_r($value, true) . '</pre>';
   }
}

// вывод содержимого через var_dump
function echo_v($value)
{
   if (Core_Auth::logged()) {
      echo '<pre>' . var_dump($value) . '</pre>';
   }
}
HostDev.pw - модули для HostCMS, Telegram: @hostdev
#
Re: Полезные утилиты на каждый день
EugenyP, гениально! Уже лет пять использую эти отладчики, а такая идея мне в голову не пришла! )
(Возможно, потому, что написаны они были еще во времена hostcms v.5)
Утащил к себе, и выложил правку на битбакет
Заказов не беру. Консультирую редко.
#
Re: Полезные утилиты на каждый день
Kotoff,
такая конструкция очень спасает при правке уже работающих сайтов, на которых понаустанавливано всяких живосайтов и т.д. ибо мешаются
HostDev.pw - модули для HostCMS, Telegram: @hostdev
#
Re: Полезные утилиты на каждый день
Может проще смотреть по IP вместо Core_Auth::logged()
#
Re: Полезные утилиты на каждый день
Alegrans,
а если несколько админов и соответственно несколько IP ?
HostDev.pw - модули для HostCMS, Telegram: @hostdev
#
Re: Полезные утилиты на каждый день
Alegrans, не проще, потому что бывают большие группы пользователей, сидящих под одним IP (например за NAT или через Proxy), а бывают пользователи с динамическими IP адресами, и много чего еще бывает...
Core_Auth::logged() базируется на механизме сессий, а потому надежнее.
Заказов не беру. Консультирую редко.
#
Re: Полезные утилиты на каждый день
Здравствуйте!
при вызове
Core_Utils::textSmartCut($str)

дает ошибку  
Undefined error: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead в файле /var/www/name.com/modules/core/utils.php (строка 639)
Авторизация