HTML в PDF средствами Dompdf

Давненько я тут не писал.

Сразу к делу: недавно столкнулся с задачей реализовать простенькую печатную форму.

На голом HTML её делать бесполезняк — можно легко столкнуться с «особенностями» браузера из которого производится печать. Собственно решил перегнать html в PDF и уже этот формат использовать в качестве печатного.

В качестве библиотеки выбрал Dompdf — она понимает стили вроде max-width и max-height и умеет работать с картинками.

Порядок действий:

  1. Собственно качаем dompdf: тык
  2. Заливаем содержимое на свой сервак.
  3. Формируем сниппет кода. Принцип прост: html-ку запихиваем в буфер вывода, а уже потом её используем в качестве содержимого PDF-ки:

Читать далее

VK API и access token

Не совсем понятно почему, но VK ввели ограничение на получение данных с публичных методов вроде wall.get и т.п.

В случае, если, к примеру, делаем запрос на получение контента стены какой-нибудь группы вк (corporationofhumor)

$url = 'https://api.vk.com/api.php?oauth=1&method=wall.get&domain=corporationofhumor&count=100';
$wall = json_decode(file_get_contents($url));
print_r( $wall );

получаем

stdClass Object
(
    [error] => stdClass Object
        (
            [error_code] => 8
            [error_msg] => Invalid request: method is unavailable without access token
            [request_params] => Array
                (
                    [0] => stdClass Object
                        (
                            [key] => oauth
                            [value] => 1
                        )

                    [1] => stdClass Object
                        (
                            [key] => method
                            [value] => wall.get
                        )

                    [2] => stdClass Object
                        (
                            [key] => domain
                            [value] => sarsar
                        )

                    [3] => stdClass Object
                        (
                            [key] => count
                            [value] => 100
                        )

                )

        )

)

Я лично решил проблему так: зарегал приложение в VK и скопировал сервисный ключ:

Читать далее

Как сделать Update пользователя в обработчике OnAfterUserUpdate без зацикливания.

В обычной ситуации при вызове функции Update класса CUser в обработчике OnAfterUserUpdate приведёт к повторному вызову OnAfterUserUpdate и так по кругу. Таким образом получается замкнутый цикл и скрипт начинает вызывать сам себя бесконечное число раз.

Как же выйти из этой ситуации?

Вариант 1:

А вот как:

В init.php вызываем обработчик:

AddEventHandler("main", "OnAfterUserUpdate", array("CUserHandler", "OnAfterUserUpdateHandler"));

А вот в самом классе CUserHandler делаем такую хитрость:

class CUserHandler
{
	public static $disableHandler = false;
	public static $element_id = '';
	
	function OnAfterUserUpdateHandler(&$arFields){
		if ((self::$disableHandler)&&($arFields['ID']==self::$element_id)){
			return;
		}
		
		self::$disableHandler = true;
		self::$element_id = $arFields['ID'];
		
		//ниже вызываем Update юзера
		//...
	}
}

Смысл в том, что при первом вызове OnAfterUserUpdateHandler всё, что ниже условия проверки значений $disableHandler и $element_id выполняется, а при последующих вызовах — нет.

Вариант 2:

Обновлять св-во по ссылке (т.к. на вход функции подаётся &$arFields )

Отладка PHP кода в консоли браузера

Сегодня я задумался, как вывести print_r в консоль браузера? Ведь, сколько раз мы писали злосчастные var_dump и print_r и после этого долго мотали страницу в поиске отладочной информации, а если отладку нужно производить на боевом сайте — то клиенты могли увидеть вашу «работу» по устранению неисправностей.

Итак, поехали: реализации функции вывода отладочной информации PHP в консоль браузера

<?
function cl_print_r ($var, $label = '')
{
	$str = json_encode(print_r ($var, true));
	echo "<script>console.group('".$label."');console.log('".$str."');console.groupEnd();</script>";
}
function cl_var_dump ($var, $label = '')
{
	ob_start();
	var_dump($var);
	$result = json_encode(ob_get_clean());
	echo "<script>console.group('".$label."');console.log('".$result."');console.groupEnd();</script>";
}
//пример использования:
$mas = array ("1", "2", "3", array("key"=>"value"));
cl_print_r($mas, '$mas log cl_print_r');
cl_var_dump($mas, '$mas log cl_var_dump');
?>

В итоге всё будет выглядеть примерно так:

Читать далее

Полезные функции при выводе информации на русском языке (окончания, номера месяцев, дней)

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

Функция подбора окончания слова:

function num2word($num, $words) {
    $num = $num % 100;
    if ($num > 19) {
        $num = $num % 10;
    }
    switch ($num) {
        case 1: {
                return($words[0]);
            }
        case 2: case 3: case 4: {
                return($words[1]);
            }
        default: {
                return($words[2]);
            }
    }
}

Пример использования:

Читать далее