Пишем сообщество phpland на Laravel - Часть 3

В этой статье мы продолжим разработку нашего сообщества "phpland" на Laravel

Планы

  • Подключим HtmlPurifier чтобы автоматически удалять вредоностный код
  • Подключим Github Markdown
  • Сделаем под-кат, чтобы прятать туда текст :)

Подключаем HtmlPurifier

HtmlPurifier - позволяет удалять весь вредоностный код из Input поля. Почему-то в Laravel его нету по умолчанию, поэтому я решил использовать компонент, который используется в Yii2.

Выполним команду composer:

composer require ezyang/htmlpurifier

Чтобы добавить в наш проект HtmlPurifier.

Теперь создадим папку "app/Helpers", где будет храниться наши Helpers и в ней файл HtmlPurifier.php:

<?php

namespace App\Helpers;

/**
 * HtmlPurifier provides an ability to clean up HTML from any harmful code.
 *
 * @author Alexander Makarov <sam@rmcreative.ru>
 * @link http://www.yiiframework.com/
 * @copyright Copyright (c) 2008 Yii Software LLC
 * @license http://www.yiiframework.com/license/
 */
class HtmlPurifier
{

    public static function process($content, $config = null)
    {

        $configInstance = \HTMLPurifier_Config::create($config instanceof \Closure ? null : $config);

        $configInstance->autoFinalize = false;

        $purifier = \HTMLPurifier::instance($configInstance);
        $purifier->config->set('Cache.SerializerPath', config('cache.stores.file.path'));
        $purifier->config->set('Cache.SerializerPermissions', 0775);

        static::configure($configInstance);

        if ($config instanceof \Closure) {
            call_user_func($config, $configInstance);
        }

        return $purifier->purify($content);
    }

    protected static function configure($config)
    {
    }
}

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

config('cache.stores.file.path')

Теперь нужно обновить autoload композера:

composer dumpautoload -o

Далее откроем файл "app/Observers/PageObserver.php" и добавим в "creating" и "updating":

$page->content = \App\Helpers\HtmlPurifier::process($page->content);

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

Подключаем Github Markdown

Откроем файл "composer.json" и добавим в секцию "require":

"cebe/markdown": "~1.0.0 | ~1.1.0 | ~1.2.0",

Теперь сделаем:

composer install

Теперь создадим файл "app/Helpers/Markdown.php":

<?php

namespace App\Helpers;

use \cebe\markdown\GithubMarkdown;

class Markdown
{
    public static function process($markdown)
    {
        $parser = new GithubMarkdown();
        $parser->enableNewlines = true;
        $parser->keepListStartNumber = true;
        $parser->html5 = true;

        return $parser->parse($markdown);
    }
}

Теперь нужно обновить autoload композера:

composer dumpautoload -o

Далее откроем модель "Page" (app/Page.php) и добавим три новых функции:

    public function getIntroContent() {
        return App\Helpers\Text::cut($this->getHtmlContent());
    }

    public function getFullContent(): string
    {
        return App\Helpers\Text::hideCut($this->getHtmlContent());
    }

    private function getHtmlContent(): string
    {
        return App\Helpers\Markdown::process($this->content);
    }

Делаем под-кат

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

Создадим новых Helper app/Helpers/Text.php:

<?php

namespace App\Helpers;

class Text
{
    public static function cut(string $text, ?string $moreLink = null)
    {
        $text = explode('', $text, 2);

        return empty($text[1]) ? $text[0] : $moreLink === null ? $text[0] : $text[0] . "\n$moreLink";
    }

    public static function hideCut(string $text): string
    {
        return str_replace('', '', $text);
    }
}

Теперь осталось отредактировать "resources/views/pages/index.blade.php" и добавить туда:

<span v-pre>
    {!! $page->getIntroContent() !!}
</span>

В resources/views/pages/show.blade.php добавим:

    <span v-pre>
        {!! $page->getFullContent() !!}
    </span>

И наконец добавим в "resources/views/pages/form.blade.php":

<div class="form-group">
    <label for="content">Текст</label>
    <span v-pre>
        <textarea name="content" class="form-control @error('content') is-invalid @enderror" id="content">
            {{ old('content', $page->content ?? null) }}
        </textarea>
    </span>
    @error('content')
        <div class="text-danger">{{ $message }}</div>
    @enderror
</div>

Важно чтобы этот span v-pre был, иначе Vue.js будет ломать отображение страницы.

Посмотреть всё в виде коммита на Github можно здесь: https://github.com/dignityinside/phpland_laravel/commit/7dd7e2b1e9ce267a7422e14836bcabeb9433084c


Оставьте комментарий!

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий:


Написать новый комментарий

Видео

Самые полезные видео на темы "веб-разработка", "Linux" и "IT". Смотри и обучайся!

Подробнее »

Сделки

Самые горячие и выгодные сделки, акции и скидки на видео-курсы, софт, услуги, книги и железо из всего рунета.

Подробнее »

Планета

Наша планета собирает интересные статьи из различных источников и объединяет их в одну ленту. Которую можно читать на нашем сайте.

Подробнее »

Сообщество

Наше сообщество славится своим дружелюбием и стремлением делиться приобретённым опытом с новыми веб-разработчиками и пользователями ОС Linux.

Любой желающий может совершенно свободно зарегистрироваться на нашем сайте и принять активное участия в жизни сообщества!

Подробнее »