Генератор цифрового кода произвольной длинны PHP

Пример использования
Создание кода подтверждения мобильного телефона.

Реализация
/**
 * Генератор цифрового кода произвольной длинны
 *
 * @param int $length - длинна создаваемого кода
 * @return string
 */
function generatePhoneCode($length = 5)
{
    /** @var string $code - будущий результат */
    $code = '';

    /** @var int $i - счётчик символов кода */
    for ($i = 0; $i < $length; $i++) {
        /** цифра 0 может быть только в середине строки */
        if ($i == 0 || $i == $length - 1) {
            $code .= mt_rand(1, 9);
        } else {
            $code .= mt_rand(0, 9);
        }
    }

    return $code;
}

Use this ;)

Определение имени часового пояса по смещению от UTC

Промучался сегодня, а потому пишу)

Задача:
Получить имя часового пояса, например Europe/Helsinki, по значению смещения от UTC браузера.

Решение:
1. Получаем значение смещения от UTC браузера и отправляем в PHP.
var time_offset = - new Date().getTimezoneOffset()

2. Получаем имя временной зоны (часового пояса). $request['time_offset'] — значение, пришедшее из JS
$offset = timezone_name_from_abbr('', $request['time_offset']*60, 1); 

Также, пример и подробное описание функции timezone_name_from_abbr() имеется в официальной документации php.net/manual/ru/function.timezone-name-from-abbr.php

Use this ;)

Двухуровневое дерево MySQL + PHP

Немного хотелось бы описать процесс хранения двухуровневого дерева в MySQL, а так же его выгрузку одним запросом и формирование PHP массива для отображения в шаблоне и т.д.

Начну с структуры таблицы MySQL, на примере таблицы для хранения тегов Категория -> Тег.

Структура таблицы
CREATE TABLE table_tag (
  tag_id int(11) NOT NULL AUTO_INCREMENT COMMENT 'ИД тега',
  tag_name varchar(50) NOT NULL COMMENT 'ИМЯ тега',
  tag_type enum ('part', 'tag') NOT NULL DEFAULT 'tag' COMMENT 'ТИП тега',
  tag_parent int(10) UNSIGNED DEFAULT NULL COMMENT 'ИД родителя',
  PRIMARY KEY (tag_id),
  INDEX IDX_tag_parent (tag_parent),
  INDEX IDX_tag_type (tag_type)
)
ENGINE = MYISAM
COMMENT = 'Таблицы тегов';

Заполнение данными
Естественно, что заполнение данными для каждого конкретного случая будет если не уникально, то как минимум, отличаться. В данном случае, я буду использовать часть данных тегов уже существующего проекта.

Читать дальше

Преобразование строки HEX в число INT с учётом знака

PHP
Как оказалось, преобразование строки HEX в число INT с учётом знака, не является тривиальной задачей. И для такой конвертации не предусмотрено стандартной функции)
Но, если смотреть на сайте php.net не только описание стандартных функций, но и комментарии к ним, то можно обнаружить интереснейшие решения, одно из которых я и предлагаю Вашему вниманию.
/**
     * Конвертация HEX в INT с знаком
     *
     * @param $hex
     *
     * @return number
     */
    function hex2decSigned($hex)
    {
        // очистка от символов, не входящих в HEX
        $hex = preg_replace('/[^0-9A-Fa-f]/', '', $hex);

        // конвертация в десятичное значение:
        $dec = hexdec($hex);

        // максимальное десятичное значение, основанное на длине hex + 1:
        // количество бит в шестнадцатеричное число-это 8 бит для каждого 2 hex -> max = 2^n
        // использование 'pow(2,n) -' с '1 << n' - только для целых чисел и, следовательно, ограничен integer.
        $max = pow(2, 4 * (strlen($hex) + (strlen($hex) % 2)));

        // complement = maximum - конвертированный hex:
        $_dec = $max - $dec;

        // если dec значение больше, чем complement, имеем отрицательное значение (первый бит)
        return $dec > $_dec ? -$_dec : $dec;
    }

П.С. также эта функция может использоваться как частичная реализация C функции atoi(HEX) в PHP.

Метод разбиения промежутка времени по дням с фиксацией времени начала и конца дня для указанного периода времени

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

Для примера представим, что клиент в абстрактной системе отчетов устанавливает период времени с 01:00 15.12.2014 по 23:00 21.12.2014 (1 неделя), за который он желает получить информацию. Фабрика отчетов на сервере умеет отдавать данные за период не более 24 часов. Вот тут и встает задача разбить промежуток времени на отрезки, с которыми потом можно работать в фабрике, т.е. на дни. Для получения можно воспользоватся функцией getDateTimeStartStopByDays (см. ниже), которая принимает в качестве параметров начало и конец периода в формате Timestamp. А на выходе мы получаем массив дат с указанием начала и конца каждого дня. Больше деталей смотрите в реализации метода.

Конечно можно работать только с датами в формате Unixtime, но в случае необходимости получения именно отформатированного массива дней, данный метод может Вам пригодится.

Коментарии по улучшению кода (стилистики, подхода, реализации и пр.) приветствуются!


Читать дальше

Экспорт данных из таблицы ExtJS Grid в таблицу Excel

Как сделать экспорт данных из таблицы ExtJS Grid в таблицу Excel?

Данное решение экспериментальное и имеет место для небольших, одностраничных, таблиц типа xtype:'grid' с хранилищем типа xtype:'store'.

Для реализации функционала, нам понадобится:
  • Библиотека ExtJS — JavaScript фреймворк. Если вы слышите это впервые, статья не будет полезна.
  • PHP сервер весрии 5+
  • PHPExcel — библиотека для создание Excel документа. Ссылка на сайт производителя.


Grid таблица
Для примера берём простейшую таблицу с тремя колонками ID, Имя, Дата. В данном примера поля имеют тип string (текст).


Так как статья получилась длинная, читайте продолжение под катом...

OpenCart, Simple и поле для даты

Во время рабочего процесса неожиданно возникла задача добавить покупателям поле «Дата рождения», ввод данных нужно было реализовать не текстовым полем, а выпадающими списками для дня, месяца и года рождения. Возможно, в более поздних версиях Simple уже есть готовое решение, но в моем случае пришлось немножко повозиться. Итак, путь решения следующий, создаем нужное нам поле для пользователя в админке, я все-таки выбрал текстовое, но в принципе тип поля особой роли не играет, после чего начинаем кодить.

Шаг 1.
Лезем в system/library/simple/simple.php, находим функцию, которая выводит поля покупателя и вставляем после:

$html = '';

код приведенный ниже:


Читать дальше

Создание и использование битовой маски в PHP

PHP

Пример создание и использование битовой маски в PHP

Пишу этот материал только потому, что сам долго вникал, что к чему)))
Наверное, чтоб проще понять как использовать битовую маску (bitmask), нужно на примере показать, для чего она используется.

Пример использования битовой маски:
Задача
На сайте есть система опроса пользователей, которая содержит 10 вариантов ответа. Каждый вариант имеет свой уникальный номер — ID. Ответы нужно сохранять в БД.

Решение
Можно конечно, не заморачиваться и сделать для каждого варианта ответа отдельное поле в таблице результатов, но это не наши методы. Мы попробуем хранить все ответы в одном поле типа INT.

Предположим, что модуль голосования прислал нам массив результатов:
array(1,2,3,12);
это значит, что пользователь указал в голосовании пункты 1,2,3,12. Давайте представим результат нашего голосования как строку из 0 и 1, в которой 1 соответствуют выбранные в голосовании пункты. В результате такого преобразования мы получим число 100000000111 в двоичной системе, что будет соответствовать числу 2055 в десятичной системе.


Читать дальше

Новая Почта API PHP

Представляю Вашему вниманию небольшой PHP Class для работы с API Новая Почта.
Почему небольшой? Потому, что класс умеет только получать список городов, в которых находятся отделения службы доставки новая Почта, а так же список отделений по городам. А точнее список отделений Новая Почта для конкретного города.

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

Класс так же умеет кешировать полученные результаты. Это сделано для того, чтоб сервер постоянно не дергал сайт Новой Почты, который иногда сильно тормозит и соответственно заставить Вашего покупателя ждать, а это точно не повлияет на рост продаж! Кеширование реализовано для Framework OpenCart, но Вы можете и не использовать его и/или использовать собственную систему кеширования данных. В примере я его закомментирую.

По примеру моего класса и прочитав описание API на странице Новой Почты, Вы легко сможете реализовать остальные функции API.

Читать дальше

СМС шлюз для сайта или СМС средствами PHP

Что же такое СМС для сайта и для чего это нужно?

Попробую очень прост ответить на этот вопрос. Например, у Вас интернет магазин, СМС с подтверждением заказа, изменением статусов прилично повышает рейтинг в глазах покупателей и доверие.

Так же СМС можно с успехом использовать для авторизации на сайте. Скажете — дорого? Но взгляните на это с другой стороны! Вы получаете базу клиентов с рабочими телефонными номерами, все операции, подтверждённые по СМС, имею более высокий уровень безопасности и т.д.

Итак, вернёмся к СМС :) Существует достаточно большое количество сервисов отправки СМС в интернете, большинство из них снабжены API для взаимодействия с Вашим сайтом. Но в сегодняшней статье я опишу сервис, с которым мне пришлось работать последним.

Его преимущество прежде всего выгодно для Вас, так как регистрация на нём использую нашу партнерскую страницу мгновенно обеспечит 10% скидку на все услуги.

Собственно, страница регистрации it103.sms.ru/

API у данного сервиса достаточно широкий, но в нашем примере воспользуемся только основными функциями: отправка, проверка баланса.


Читать дальше