Блог

Пишу о PHP, Laravel и Yii2, фрилансе и работе веб–разработчика.

Как сбросить кеш VK, FB и Telegram для Opengraph-изображений

Бывает так, что вы расшарили ссылку на свой сайт в соцсетях, после чего изменили на сайте картинку-превью или заголовок, а соцсети не подтягивают новые данные. Это происходит потому, что сервисы один раз получают информацию о ссылке и сохраняют её у себя в кеше, и в следующий раз уже берут информацию из своего кеша. Как заставить соцсети обновить информацию о своей ссылке?

Сбросить кеш в Фейсбуке

https://developers.facebook.com/tools/debug/

Переходим по ссылке — это дебаг-панель Фейсбука. В форме сверху указываем ссылку на свой сайт и загружаем результат. Для обновления данных нужно нажать кнопку «Повторить скрапинг».

Как сбросить кеш Фейсбук для ссылки
Дебаг-панель для сброса кеша Фейсбука

Сбросить кеш Вконтакте

https://vk.com/dev/pages.clearCache

Открываем страницу, прокручиваем вниз к форме для указания ссылки, заполняем её и жмём «Выполнить». В случае успеха вы увидите надпись response: 1. После этого можете расшаривать Вконтакте вашу ссылку с новой превью.

Пример сброса кеша Вконтакте. Результат выполнения — успешно (response: 1)

Сбросить кеш для Телеграма

Пишем боту @WebpageBot, далее просто следуем инструкциям: отправьте ссылку боту, дальше он сам всё сделает. В ответном сообщении пришлёт обновлённые данные и кнопки для повторного обновления данных на случай, если вы в режиме реального времени вносите изменения и занимаетесь отладкой.

Пример работы бота

Готовый код для Pagination в Bulma для Laravel 5

Сначала вам нужно скопировать к себе в resources/views шаблон пагинации. Делаем:

php artisan vendor:publish --tag=laravel-pagination

Эта команда разместит шаблоны в папке resources/views/vendor/pagination.

По-умолчанию Laravel использует шаблон bootstrap-4.blade.php. Меняем его код:

@if ($paginator->hasPages())
    <nav class="pagination is-centered" role="navigation" aria-label="pagination">
        {{-- Previous Page Link --}}
        @if ($paginator->onFirstPage())
            <a class="pagination-previous" disabled>Previous</a>
        @else
            <a class="pagination-previous" href="{{ $paginator->previousPageUrl() }}">Previous</a>
        @endif

        {{-- Next Page Link --}}
        @if ($paginator->hasMorePages())
            <a class="pagination-next" href="{{ $paginator->nextPageUrl() }}">Next Page</a>
        @else
            <a class="pagination-next" disabled>Next Page</a>
        @endif
        

        {{-- Pagination Elements --}}
        <ul class="pagination-list">
            @foreach ($elements as $element)
                {{-- "Three Dots" Separator --}}
                @if (is_string($element))
                    <li><span class="pagination-ellipsis">…</span></li>
                @endif

                {{-- Array Of Links --}}
                @if (is_array($element))
                        @foreach ($element as $page => $url)
                            @if ($page == $paginator->currentPage())
                                <li><a class="pagination-link is-current" aria-label="Goto page {{ $page }}">{{ $page }}</a></li>
                            @else
                                <li><a href="{{ $url }}" class="pagination-link" aria-label="Goto page {{ $page }}">{{ $page }}</a></li>
                            @endif
                        @endforeach
                @endif
            @endforeach
        </ul>

    </nav>
@endif

Как посмотреть размер всех подключаемых через Laravel-mix Javascript библиотек

Бывает полезно посмотреть размер файлов всех подключаемых библиотек и фреймворков, из которых собирается приложение. Это можно легко сделать с помощью плагина bundle-analyzer для Webpack. Ставим плагин:

npm i laravel-mix-bundle-analyzer

Добавляем плагин в webpack.mix.js:

const mix = require('laravel-mix');
require('laravel-mix-bundle-analyzer');

if (!mix.inProduction()) {
    mix.bundleAnalyzer();
}

Теперь вы можете запустить npm run dev, и после сборки откроется браузер с анализом:

Результат работы Bundle-analyzer

Полная документация к плагину доступна на сайте laravel-mix.

Плюрализация строк в Laravel для русского языка

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

{{ trans_choice('Публикация|Публикации|Публикаций', $user->articles->count()) }}

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

Почему Тинькофф-эквайринг АПИ не удаётся проверить токен

Когда ваш сайт получает нотификацию от Тинькофф-банка, он конкатенирует все параметры запроса и высчитывает sha256-хеш. Алгоритм простой, но есть несколько нюансов:

  1. Нужно удалить из входящих параметров поле Token;
  2. Нужно добавить параметр Password, который содержит пароль от терминала (указан в личном кабинете);
  3. Самое важное! Поле Success нужно привести из boolean в строку «true» или «false», иначе при конкатенации PHP будет подставлять в строку 1 или 0, из-за чего сгенерированный вами токен не будет совпадать с пришедшим от банка.

Вот так выглядит функция генерации токена:

/**
 * @return string
 */
public function generateToken($data) : string
{
    $data = array_except($data, 'Token');
    $data = array_merge($data, ['Password' => config('tinkoff.secretKey')]);

    // Success field to string
    $data['Success'] = $data['Success'] ? 'true' : 'false';

    ksort($data);
    $data = implode(array_values($data));

    return hash('sha256', $data);
}

Как сконвертировать PDF в изображение (JPG, PNG) с помощью PHP

Это можно сделать с помощью Imagick, но это не очень удобно:

$imagick = new Imagick('file.pdf[0]');
$imagick->setImageFormat('jpg');
file_put_contents($pathToImage, $imagick);

Вместо этого можно подключить пакет spatie/pdf-to-image ( composer require spatie/pdf-to-image ) и использовать его:

$pdf = new Spatie\PdfToImage\Pdf('file.pdf');
$pdf->saveImage($pathToImage);

Вы можете явно указать расширение файла в $pathToImage. Если не укажите, то изображение по-умолчанию сохранится в JPG.

Ошибка отправки почты через Яндекс (SMTP)

На одном проекте почта отправляется через сервис Яндекса «Почта для домена». Всё работало отлично, пока кто-то из менеджеров не решил обновить настройки почтовой программы. Настройки обновил, и в это же время перестала уходить почта с сайта:

Failed to authenticate on SMTP server with username ...
Читать далее

Как получить Email пользователя при авторизации Вконтакте через Laravel Socialite

Стандартный способ получения эл. почты в Laravel Socialite не работает для Вконтакте:

$userSocial = Socialite::driver('vkontakte')->user();
$user = new User;
$user->name = $userSocial->name;
$user->email = $userSocial->email;
$user->save();

Это происходит потому, что Вконтакте возвращает ответ в нестандартном формате JSON. Вот так можно получить почту пользователя:

public static function getUserEmail($user, $provider)
{
    if($provider == 'vkontakte') {
        return $user->accessTokenResponseBody['email'] ?? null;
    }
    return $user->email;
}

Yii2 и label у hidden-поля в ActiveForm

Для меня было полной неожиданностью, что yii2 по-умолчанию отображает label у скрытого поля. Но спрятать его достаточно просто:

echo $form->field($model, 'user_id')->hiddenInput()->label(false);

Скругленные края у таблицы в Bootstrap

Обычный border-radius для бутстраповской таблицы не даст нужного эффекта. Края у таблицы всё равно останутся без скругления.

Документация рекомендует использовать такой способ для скругления краев у таблицы:

<div class="panel panel-default">
    <table class="table table-striped"> ... </table>
</div>