%PDF- %PDF-
| Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/modules/ui/view/components/ |
| Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/modules/ui/view/components/ViewMeta.php |
<?php
/**
* @link https://www.humhub.org/
* @copyright Copyright (c) 2022 HumHub GmbH & Co. KG
* @license https://www.humhub.com/licences
*/
namespace humhub\modules\ui\view\components;
use humhub\libs\LogoImage;
use humhub\libs\StringHelper;
use humhub\modules\content\components\ContentActiveRecord;
use humhub\modules\file\converter\PreviewImage;
use humhub\modules\file\models\File;
use Yii;
use yii\base\BaseObject;
use yii\helpers\Url;
use yii\web\Request;
/**
* Metadata Service for the View class.
*
* Supports:
* - standard meta tags
* - OpenGraph tags
* - Twitter Card tags
*
* Example usage in controller:
* ```
* $this->view->setPageTitle(Yii::t('PostModule.base', 'Post'), true);
* $this->view->meta->setContent($post);
* $this->view->meta->setDescription(RichTextToPlainTextConverter::process($post->message));
* $this->view->meta->setImages($post->fileManager->findAll());
* ```
*
* @since 1.13
*/
class ViewMeta extends BaseObject
{
/**
* @var View
*/
public $view;
/**
* @var ContentActiveRecord
*/
private $content;
/**
* The type metadata to preview the content with Open Graph protocol
* @var string
*/
private $contentType;
/**
* The URL metadata to preview the content with Open Graph protocol
* @var string
*/
private $url;
/**
* The Preview Image Urls
* @var string[]
*/
private $images = [];
/**
* @var string
*/
private $title;
/**
* @var string
*/
private $description;
/**
* Called by View to register Tags before rendering
*/
public function registerMetaTags()
{
$this->setDefaults();
$this->addMetaTags();
$this->registerOpenGraphMetaTags();
$this->registerTwitterMetaTags();
}
/**
* @param ContentActiveRecord $content
*/
public function setContent(ContentActiveRecord $content)
{
$this->content = $content;
}
/**
* @return string
*/
public function getDescription(): string
{
return $this->description;
}
/**
* @param string $description
*/
public function setDescription(string $description): void
{
$this->description = $description;
}
/**
* @return string[]
*/
public function getImages(): array
{
return $this->images;
}
/**
* Sets an array of File or Image URLs
*
* @param File[]|string $images
*/
public function setImages(array $images): void
{
$previewImage = new PreviewImage();
foreach ($images as $image) {
if ($previewImage->applyFile($image)) {
$this->images[] = $image->getUrl();
}
}
}
/**
* @return string
*/
public function getTitle(): string
{
return $this->title;
}
/**
* @param string $title
*/
public function setTitle(string $title): void
{
$this->title = $title;
}
/**
* Automatically sets default values
*/
private function setDefaults()
{
if (empty($this->title)) {
$this->title = $this->view->getPageTitle();
}
if (empty($this->contentType)) {
$this->contentType = 'website';
}
if (empty($this->url) && Yii::$app->getRequest() instanceof Request) {
$this->url = Yii::$app->getRequest()->getAbsoluteUrl();
}
if (empty($this->images)) {
// Use ContentContainer Image
$contentContainer = ($this->content !== null) ? $this->content->content->container : null;
if ($contentContainer === null && isset($this->view->context->contentContainer)) {
$contentContainer = $this->view->context->contentContainer;
}
if ($contentContainer !== null && $contentContainer->getProfileImage()->hasImage()) {
$this->images[] = Url::to($contentContainer->getProfileImage()->getUrl(), true);
}
// Fallback to Site Logo
if (LogoImage::hasImage()) {
$this->images[] = Url::to(LogoImage::getUrl(600, 600), true);
}
}
}
/**
* Add metadata to view to preview the content with Open Graph protocol
*/
private function addMetaTags()
{
$this->view->registerLinkTag(['rel' => 'canonical', 'href' => $this->url]);
if (!empty($this->description)) {
$this->view->registerMetaTag([
'name' => 'description',
'content' => str_replace("\n", '', StringHelper::truncate($this->description, 255))
]);
}
}
/**
* Register metadata to preview the content on Facebook and other compatible websites
*
* @return void
*/
private function registerOpenGraphMetaTags()
{
$this->view->registerMetaTag(['property' => 'og:url', 'content' => $this->url]);
$this->view->registerMetaTag(['property' => 'og:site_name', 'content' => Yii::$app->name]);
$this->view->registerMetaTag(['property' => 'og:type', 'content' => $this->contentType]);
if (!empty($this->title)) {
$this->view->registerMetaTag(['property' => 'og:title', 'content' => StringHelper::truncate($this->title, 70)]);
}
if (!empty($this->description)) {
$this->view->registerMetaTag(['property' => 'og:description', 'content' => StringHelper::truncate($this->description, 200)]);
}
if (count($this->images) > 0) {
$this->view->registerMetaTag(['name' => 'og:image', 'content' => $this->images[0]]);
}
}
/**
* Register metadata to preview the content on Twitter
*
* @return void
*/
private function registerTwitterMetaTags()
{
$this->view->registerMetaTag(['property' => 'twitter:url', 'content' => $this->url]);
$this->view->registerMetaTag(['property' => 'twitter:site', 'content' => Yii::$app->name]);
$this->view->registerMetaTag(['property' => 'twitter:type', 'content' => $this->contentType]);
if (!empty($this->title)) {
$this->view->registerMetaTag(['property' => 'twitter:title', 'content' => StringHelper::truncate($this->title, 70)]);
}
if (!empty($this->description)) {
$this->view->registerMetaTag([
'property' => 'twitter:description',
'content' => StringHelper::truncate($this->description, 200)]);
}
if (count($this->images) > 0) {
$this->view->registerMetaTag(['name' => 'twitter:image', 'content' => $this->images[0]]);
}
}
}