воскресенье, 24 августа 2014 г.

Как упростить импорт файлов?

Однажды при написании программы обнаружил вот такой участок кода, импортирующий файлы в исполняемый php-скрипт index.php:

<?php include(dirname(__FILE__).'/atm_table_row.jst'); ?>
<?php include(dirname(__FILE__).'/atm_table.jst'); ?>
<?php include(dirname(__FILE__).'/atm_yandex_map.php'); ?>

Вопрос: Как упростить этот участок кода, если все указанные файлы лежат в одной директории?

четверг, 7 августа 2014 г.

Настройка Code Sniffer в PHP Storm 6.0

В среде разработки PHP Storm есть возможность активировать инструмент проверки качества кода Code Sniffer. Данный инструмент позволяет выставлять стандарт кодирования, к примеру Zend, PSR1, PSR2. Вот как выглядят подсказки, которые дает программисту Code Sniffer, если код написан с нарушением установленного стандарта кодирования:


@php_bin@ не является внутренней или внешней командой, исполняемой программой или пакетным файлом

При настройке инструмента проверки кода Code Sniffer в IDE PHP Storm возникла ошибка:
@php_bin@ не является внутренней или внешней командой, исполняемой программой или пакетным файлом.

Данная ошибка возникает, если попытаться вызвать из консоли Windows bat-файл phpcs.bat:


Если заглянуть в файл phpcs.bat, то там можно увидеть следующее:
"@php_bin@" -d auto_append_file="" -d auto_prepend_file="" -d include_path="'@php_dir@'" -f "@bin_dir@\phpcs" -- %*

Причина ошибки в том, что система не может найти путь к интерпретатору php у вас на компьютере. Для устранения данной ошибки можно решить задачу "в лоб" - просто указать прямые пути к интерпретатору php и самому файлу phpcs.
Напишем в файле phpcs.bat:
"C:\wamp\bin\php\php5.5.12\php.exe" -d auto_append_file="" -d auto_prepend_file="" -d include_path="'C:\wamp\bin\php\php5.5.12\php.exe'" -f "C:\tools\PHP_CodeSniffer-master\scripts\phpcs" -- %*

Как видно, здесь мы указали:
- путь к интерпретатору php: C:\wamp\bin\php\php5.5.12\php.exe
- путь к файлу Code Sniffer - phpcs: C:\tools\PHP_CodeSniffer-master\scripts\phpcs

После этого запуск bat-файла из консоли не будет вызывать ошибок. Это позволит нам настроить Code Sniffer в PHP Storm.

вторник, 29 июля 2014 г.

Bitrix. Добавить пользователя в группу социальной сети

При использовании битрикса и системы "Портал Битрикс24" может потребоваться добавить пользователя в группу социальной сети. Сделать это можно при помощи CSocNetUserToGroup::Add():
function addUserToGroup ($userId, $groupId)
{
    global $APPLICATION;

    //1 - это id пользователя, от имени которого будет добавлен пользователь
    //в нашей системе, 1 - это id пользователя "Администратор"
    $initiatedByUserId = CUser::GetID() ? CUser::GetID() : 1;

    $arFields = array(
        "USER_ID" => $userId,
        "GROUP_ID" => $groupId,
        "ROLE" => SONET_ROLES_USER,
        "=DATE_CREATE" => $GLOBALS["DB"]->CurrentTimeFunction(),
        "=DATE_UPDATE" => $GLOBALS["DB"]->CurrentTimeFunction(),
        "INITIATED_BY_TYPE" => SONET_INITIATED_BY_USER,
        "INITIATED_BY_USER_ID" => $initiatedByUserId,
        "MESSAGE" => false,
    );
    
    $rs = CSocNetUserToGroup::Add($arFields);
    if ($rs === false) {
        echo 'Пользователь #' . $userId . ' не добавлен в группу #' . $groupId;
        if ($e = $APPLICATION->GetException()) {
            echo 'Error code: ' . $e->id . '; error message: ' . $e->msg;
        }
    } else {
        echo 'Пользователь #' . $userId . ' добавлен в группу #' . $groupId;
    }
}

Bitrix. Удалить пользователя из группы социальной сети

В битриксе может потребоваться удалить пользователя из группы социальной сети. Сделать это можно при помощи CSocNetUserToGroup::DeleteRelation($userId, $groupId):
$deleteUserId = 2149; // ID пользователя
$deleteGroupId = 114;  // ID группы

if (CSocNetUserToGroup::DeleteRelation($deleteUserId, $deleteGroupId)) {
    echo 'Пользователь #' . $deleteUserId . ' удален из группы';
} else {
    echo 'Не удалось удалить пользователя #' . $deleteUserId . ' из группы';

    //Также желательно выводить сообщения об ошибке, 
    //чтобы понять, что помешало удалить пользователя
    if ($e = $APPLICATION->GetException()) {
        echo 'Error code: ' . $e->id . '; error message: ' . $e->msg;
    }
}

В битриксе сообщения об ошибке можно получить при помощи $e = $APPLICATION->GetException(). Это выражение запишет в $e объект, который содержит поля id и msg. Эта информация может оказаться полезной, чтобы понять, что пошло не так.
Вот, к примеру, при удалении пользователей из группы возникла ошибка:
Error code: ERROR_NO_MEMBER_REQUEST; error message: Record was not found

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

Bitrix. Получить список пользователей группы социальной сети

Для получения списка пользователей группы в социальной сети битрикса можно использовать CSocNetUserToGroup::GetList():
$rsUsers = CSocNetUserToGroup::GetList(
    array("ID" => "ASC"),
    array("GROUP_ID" => 100) //Указать ID группы в социальной сети
);

while($arGroupUser = $rsUsers->Fetch()) {
    var_dump($arGroupUser);
}

Обязательно обратите внимание на структуру данных, помещаемых в переменную $arGroupUser:
array(9) {
  ["ID"]=>
  string(3) "133"
  ["USER_ID"]=>
  string(4) "1770"
  ["GROUP_ID"]=>
  string(3) "114"
  ["ROLE"]=>
  string(1) "A"
  ["DATE_CREATE"]=>
  string(19) "15.04.2014 17:55:23"
  ["DATE_UPDATE"]=>
  string(19) "15.04.2014 17:55:23"
  ["INITIATED_BY_TYPE"]=>
  string(1) "U"
  ["INITIATED_BY_USER_ID"]=>
  string(4) "1770"
  ["MESSAGE"]=>
  NULL
}

Для получения идентификатора пользователя нам здесь нужно использовать не $arGroupUser["ID"], а такое выражение: $arGroupUser["USER_ID"].

четверг, 24 июля 2014 г.

Fatal error: Maximum execution time of 30 seconds exceeded

Ошибка Fatal error: Maximum execution time of 30 seconds exceeded возникает из-за того, что ваш php-скрипт выполняется по времени больше установленного ограничения.
Вот пример такого скрипта:
//Данный скрипт будет потреблять много памяти, 
//поэтому уберем ограничение на объем потребляемой памяти 
ini_set('memory_limit', -1);

$str = '';
for ($i = 0; $i < 10000000; $i++) {
    $str .= 'Hello my wonderful world!';
}

Данный скрипт вызовет ошибку Fatal error: Maximum execution time of 30 seconds exceeded. Устранить эту ошибку можно несколькими путями:
1. Увеличить скорость работы скрипта, изменив его логику работы.
2. Увеличить ограничение на время работы скрипта:
//Устанавливаем ограничение времени выполнения скрипта в 300 секунд
ini_set('max_execution_time', 300); 
$str = '';
for ($i = 0; $i < 10000000; $i++) {
    $str .= 'Hello my wonderful world!';
}
3. Убрать ограничение на время работы скрипта (не рекомендуется):
//Позволяем скрипту выполняться бесконечно долго
set_time_limit(0);