View file upload/src/addons/MMO/Hide/BbCode/AbstractTag.php

File size: 4.6Kb
<?php

namespace MMO\Hide\BbCode;

use XF\BbCode\Renderer\EmailHtml;
use XF\PreEscaped;

abstract class AbstractTag
{
    /**
     * @var \XF\App
     */
    protected $app;

    /**
     * @var \XF\BbCode\Renderer\AbstractRenderer
     */
    protected $renderer;

    /**
     * @var \XF\Template\Templater
     */
    protected $templater;

    /**
     * @param \XF\App $app
     * @param \XF\BbCode\Renderer\AbstractRenderer $renderer
     */
    public function __construct(\XF\App $app, \XF\BbCode\Renderer\AbstractRenderer $renderer = null)
    {
        $this->app = $app;
        $this->renderer = $renderer;
        $this->templater = $app->templater();
    }

    /**
     * @param $content
     * @param array $tagChildren
     * @param $tagOption
     * @param array $tag
     * @param array $options
     * @return mixed
     */
    abstract public function render($content, array $tagChildren, $tagOption, array $tag, array $options);

    /**
     * @param $content
     * @param $title
     * @param array $hide
     *
     * @return string
     */
    public function renderTemplate($content, $title, array $hide)
    {
        $template = $this->renderer instanceof EmailHtml ? 'email:mh_bb_code_hide' : 'public:mh_bb_code_hide';
        return $this->templater->renderTemplate($template, [
            'visible' => $hide['canView']
                || $this->isCreator($hide['options'])
                || $this->visitor()->canBypassTags()
                || $this->visitor()->canBypassHideTag(ucfirst($hide['tag'])),
            'content' => new PreEscaped($content),
            'title' => $title ? new PreEscaped($title) : ''
        ]);
    }

    /**
     * @param $tagChildren
     * @param $tagOption
     * @param $tag
     * @param array $options
     * @param \XF\BbCode\Renderer\AbstractRenderer $renderer
     *
     * @return string
     */
    public static function renderHide($tagChildren, $tagOption, $tag, array $options, \XF\BbCode\Renderer\AbstractRenderer $renderer)
    {
        $tagRenderer = new static(\XF::app(), $renderer);
        /** @var \XF\BbCode\Renderer\AbstractRenderer $content */
        $content = $renderer instanceof EmailHtml ? false : $renderer->renderSubTree($tagChildren, $options);
        if ($content === '')
        {
            return '';
        }

        $tags = [
            'hide',
            'groups',
            'users'
        ];

        \XF::fire('mh_hide_auth_tag_codes', [&$tags]);

        if(!\XF::visitor()->user_id && !\in_array($tag['tag'], $tags))
        {
            return $renderer->getTemplater()->renderTemplate('public:mh_hide_auth_or_register');
        }

        return $tagRenderer->render($content, $tagChildren, $tagOption, $tag, $options);
    }

    /**
     * @param $options
     * @return bool
     */
    public function isCreator($options)
    {
        $visitor = \XF::visitor();
        if (isset($options['user_id']))
        {
            return $options['user_id'] === $visitor->user_id;
        }

        if (!empty($options['entity']['user_id']))
        {
            return $options['entity']['user_id'] === $visitor->user_id;
        }
        else
        {
            return false;
        }
    }

    /**
     * @return \XF\Entity\User
     */
    public function visitor()
    {
        return \XF::visitor();
    }

    /**
     * @return \ArrayObject
     */
    public function options()
    {
        return \XF::options();
    }

    /**
     * @return \XF\Mvc\Entity\Manager
     */
    public function em()
    {
        return $this->app->em();
    }

    /**
     * @param string $repository
     *
     * @return \XF\Mvc\Entity\Repository
     */
    public function repository($repository)
    {
        return $this->app->repository($repository);
    }

    /**
     * @param $finder
     *
     * @return \XF\Mvc\Entity\Finder
     */
    public function finder($finder)
    {
        return $this->app->finder($finder);
    }

    /**
     * @param $shortName
     * @param $id
     * @param null $with
     * @return \XF\Mvc\Entity\Entity|null
     */
    public function find($shortName, $id, $with = null)
    {
        return $this->app->em()->find($shortName, $id, $with);
    }

    /**
     * @param string $finder
     * @param array $where
     * @param string|array $with
     *
     * @return null|\XF\Mvc\Entity\Entity
     */
    public function findOne($finder, array $where, $with = null)
    {
        return $this->app->em()->findOne($finder, $where, $with);
    }
}