• Как генерировать красивый PDF с помощью PHP?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    TL;DR: Если нужно точное совпадение с хтмл шаблоном - только хеадлесс хром, остальное достаточно сильно отличается от оригинала, в силу ряда проблем.

    Сталкивался ровно с такой же задачей пару раз, нормальных вариантов на самом деле всего 2:
    генерить на фронте через хтмл2пдф, или подобные библиотеки, работающие через канвас,
    или на бэке через хеадлесс хром.

    Естественно оба со своими нюансами. В первом случае минус в том что пдф по сути будет набором картинок скринов, со всеми вытекающими, типа разных размеров экрана и невозможности выделить например текст в готовом пдф.
    Во втором - надо ставить хедлес хром на сервер и соответственно из бэка отдавать ему сгенеренный хтмл, что несет свои трудности и приколы, зато на 99,9% совпадает с тем что вы отправляете на печать из хрома, и отладка и подгонка хтмл под формат в разы проще и удобнее. Кроме того, использование стилей и медиа запросов для печати открывает невероятную гибкость в плане работы с готовыми шаблонами (автонумерация, поля, колонтитулы етц). А, и забыл киллер фичу - оно выполняет жс, то есть если есть графики или какие-то элементы, выводимые через жс - то только хром, других вариантов просто нет.

    Что касается других библиотек (mpdf, FPDF, wkhtmltopdf) - все они сильно "плавают" в отличие от хрома, многие вещи в них просто невозможны, кроме того у некоторых есть хронические проблемы со шрифтами и кодировками... Возможно за последние 3 года с тех пор как я их пробовал что-то изменилось, но думаю часть проблем все равно осталась.
    Ответ написан
    4 комментария
  • Как правильно работать с исключениями?

    Stalker_RED
    @Stalker_RED
    На самом верхнем уровне вашего приложения должен быть какой-то Глобальный И Великий Обработчик Исключений Общего Назначения. Задачи у него очень простые - записать в лог что и где сломалось, показать пользователю табличку "ой, все пропало", и опционально пнуть мониторинг, отправить смс админу или письмо деду морозу.

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

    Рассмотрим пару примеров:
    1. Представим, что модуль "генератор превьюшек для фоточек", который верой и правдой трудился многие месяцы, однажды наталкивается на непреодолимую для него преграду и бросает исключение - "капец, место на диске кончилось, я так больше не работаю!"

    Если ваш код не может ничего с этим поделать - вы пропускаете это исключение выше, пускай Глобальный И Великий Обработчик показывает юзеру красивую табличку "извините, у нас перерыв обед", и шлет письма админу в три часа ночи. А если у вас облачный хостинг, например, и вы можете на лету подключить больше дискового пространства, или может снести какой-то ненужный кэш освободив место, то можно перехватить это исключение, показать юзеру "извините, за задержку, ваши фоточки будут обработаны через пару минут", а админу прислать не красный алерт, а желтый.

    2. Виджет, который показывает самых рейтинговых котиков с ютуба не смог подгрузить очередную порцию котиков, т.к. ютуб забанен роскомнадзором. Если ваш код ничего не может с этим поделать - Глобальный И Великий Обработчик Исключений покажет пользователю "ой все". Или вы перехватите это событие на более низком уровне и покажете табличку "свежих котиков нет, но вот есть рейтинг за прошлую пятницу". Или, если котики должны быть обязательно свежие, то можете предусмотреть экстренное подключение через vpn или tor, или может возьмете котиков с vimeo вместо ютуба, например.

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

    Важно в этом не переусердствовать, и не основывать бизнес-логику на исключениях. Этот механизм для редких, исключительных ситуаций, которые не получается обработать другим способом. Если модуль ресайза фоточек написан индусами, и его, внезапно, нечем заменить. Но если есть возможность (и необходимость) перевести эту проблему из разряда исключительной в обычную рабочую ситуацию - лучше так и сделать. Если у вас место кончается два раза в неделю - лучше настроить какой-то мониторинг, который будет следить за этим показателем и заранее разруливать такие ситуации. В случае с недоступностью сервера можно на уровне бизнес логики проверять доступность и подключать резервные каналы или источники данных, вместо того, чтобы падать с ошибкой "ой 500!".
    Ответ написан
    3 комментария
  • Коллеги, расскажите о своих методах защиты от "Клиент всегда прав" в процессе разработки?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Я объясняю клиенту почему не стоит делать так, как он хочет. Но если он настаивает, то делаю. В конце концов, это же его проект и его деньги. Если он не хочет получить экспертное мнение и зарабатывающий продукт, а хочет только реализацию его идей - это его право. Несколько таких клиентов приносят мне весьма неплохой доход: они придумывают безумную идею, я её реализацию, беру оплату, через месяц-два они просят это безумие убрать, я и за это тоже беру оплату. И так уже несколько лет.
    Ответ написан
    7 комментариев