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);
}
}