Browse Source

add the social meta tags to both templates

Olivier Massot 4 years ago
parent
commit
ce0855f591

+ 44 - 0
ot_templating/Classes/ViewHelpers/Request/UriViewHelper.php

@@ -0,0 +1,44 @@
+<?php
+
+namespace Opentalent\OtTemplating\ViewHelpers\Request;
+
+use Closure;
+use Opentalent\OtCore\ViewHelpers\OtAbstractViewHelper;
+use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface;
+
+/**
+ *   Return the URI of the requested page
+ *
+ *     {namespace ot=Opentalent\OtTemplating\ViewHelpers}
+ *
+ *     {ot:request.uri()}
+ *
+ * @package Opentalent\OtTemplating\ViewHelpers
+ */
+class UriViewHelper extends OtAbstractViewHelper {
+
+    /**
+     * -- This method is expected by Fluid --
+     * Declares the viewhelper's parameters
+     */
+    public function initializeArguments()
+    {
+    }
+
+    /**
+     * -- This method is expected by Fluid --
+     * Renders the content as html
+     *
+     * @param array $arguments
+     * @param Closure $renderChildrenClosure
+     * @param RenderingContextInterface $renderingContext
+     * @return string|null
+     */
+    public static function renderStatic(
+        array $arguments,
+        Closure $renderChildrenClosure,
+        RenderingContextInterface $renderingContext
+    ) {
+        return (string)$GLOBALS['TYPO3_REQUEST']->getUri();
+    }
+}

+ 187 - 0
ot_templating/Classes/ViewHelpers/Social/MetadataViewHelper.php

@@ -0,0 +1,187 @@
+<?php
+
+namespace Opentalent\OtTemplating\ViewHelpers\Social;
+
+use FluidTYPO3\Vhs\Traits\TemplateVariableViewHelperTrait;
+use FluidTYPO3\Vhs\ViewHelpers\Resource\Record\FalViewHelper;
+use Opentalent\OtCore\Exception\ApiRequestException;
+use Opentalent\OtCore\ViewHelpers\OtAbstractViewHelper;
+use TYPO3\CMS\Core\Database\ConnectionPool;
+use TYPO3\CMS\Core\Utility\GeneralUtility;
+
+/**
+ *   This view helper give access to the data needed by the Opengraph and twitter meta tags
+ *   @see https://www.opengraph.xyz
+ *
+ *     {namespace ot=Opentalent\OtTemplating\ViewHelpers}
+ *
+ *     <ot:social.metadata as="meta"
+ *                            title="My Title"
+ *                            description="A description">
+ *          <f:debug>{meta}</f:debug>
+ *     </ot:social.metadata>
+ *
+ * @package Opentalent\OtTemplating\ViewHelpers
+ */
+class MetadataViewHelper extends OtAbstractViewHelper
+{
+    use TemplateVariableViewHelperTrait;
+
+    /**
+     * >> Required to prevent typo3 to escape the html output
+     * @var boolean
+     */
+    protected $escapeOutput = false;
+
+    /**
+     * @var \TYPO3\CMS\Extbase\Service\ImageService
+     */
+    protected $imageService;
+
+    /**
+     * @param \TYPO3\CMS\Extbase\Service\ImageService $imageService
+     */
+    public function injectImageService(\TYPO3\CMS\Extbase\Service\ImageService $imageService)
+    {
+        $this->imageService = $imageService;
+    }
+
+    /**
+     * -- This method is expected by Fluid --
+     * Declares the viewhelper's parameters
+     */
+    public function initializeArguments()
+    {
+        $this->registerArgument(
+            'as',
+            'string',
+            'Name of the returned array',
+            true
+        );
+        $this->registerArgument(
+            'title',
+            'string',
+            'Title of the page',
+            false
+        );
+        $this->registerArgument(
+            'description',
+            'string',
+            'Description of the page',
+            false
+        );
+    }
+
+    /**
+     * @param $table
+     * @param $field
+     * @param $uid
+     * @return string|null
+     */
+    private function getFalImagePath($table, $field, $uid): ?string
+    {
+        $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('sys_file_reference');
+        $queryBuilder->createNamedParameter($table, \PDO::PARAM_STR, ':tablenames');
+        $queryBuilder->createNamedParameter($field, \PDO::PARAM_STR, ':fieldname');
+        $queryBuilder->createNamedParameter($uid, \PDO::PARAM_INT, ':uid_foreign');
+        $ref = $queryBuilder
+            ->select('r.uid')
+            ->from('sys_file_reference', 'r')
+            ->where($queryBuilder->expr()->eq('r.table_local', $queryBuilder->expr()->literal('sys_file')))
+            ->andWhere($queryBuilder->expr()->eq('r.tablenames', ':tablenames'))
+            ->andWhere($queryBuilder->expr()->eq('r.uid_foreign', ':uid_foreign'))
+            ->andWhere($queryBuilder->expr()->eq('r.fieldname', ':fieldname'))
+            ->andWhere($queryBuilder->expr()->eq('r.deleted', 0))
+            ->andWhere($queryBuilder->expr()->eq('r.hidden', 0))
+            ->andWhere($queryBuilder->expr()->lte('r.t3ver_state', 0))
+            ->andWhere($queryBuilder->expr()->neq('r.pid', -1))
+            ->execute()
+            ->fetch();
+
+        if ($ref['uid'] == null) {
+            return null;
+        }
+
+        $image = $this->imageService->getImage($ref['uid'], null, 1);
+        return $this->imageService->getImageUri($image, 1);
+    }
+
+
+    /**
+     * -- This method is expected by Fluid --
+     * Renders the content as html
+     *
+     * @return string
+     * @throws ApiRequestException|\Exception
+     */
+    public function render()
+    {
+        // Get current settings
+        $as = $this->arguments['as'];
+        $forcedTitle = $this->arguments['title'];
+        $forcedDescription = $this->arguments['description'];
+
+        $uri = $GLOBALS['TYPO3_REQUEST']->getUri();
+        $page = $GLOBALS['TSFE']->page;
+
+        // Forced values registered with https://viewhelpers.fluidtypo3.org/fluidtypo3/vhs/5.0.1/Variable/Register/Set.html
+        $registered = $GLOBALS["TSFE"]->register;
+        $forcedTitle = $registered['forceSocialTitle'];
+        $forcedDescription = $registered['forceSocialDescription'];
+        $forcedImageUrl = $registered['forceSocialImageUrl'];
+
+        $data = [
+            'pageUrl' => (string)$uri,
+            'domain' => $uri->getHost(),
+        ];
+
+        // Determine OG title
+        if ($forcedTitle != null) {
+            $data['ogPageTitle'] = $forcedTitle;
+        } elseif ($page['og_title'] != null) {
+            $data['ogPageTitle'] = $page['og_title'];
+        } else {
+            $data['ogPageTitle'] = $page['title'];
+        }
+
+        // Determine OG description
+        if ($forcedDescription != null) {
+            $data['ogPageDescription'] = $forcedDescription;
+        } elseif ($page['og_description'] != null) {
+            $data['ogPageDescription'] = $page['og_description'];
+        }
+
+        // Determine OG image (we use the typo3 builtin meta tags generator for now)
+//        if ($forcedImageUrl != null) {
+//            $data['ogImageUrl'] = $forcedImageUrl;
+//        } elseif ($page['og_image'] == 1) {
+//            $data['ogImageUrl'] = $this->getFalImagePath('pages', 'og_image', $page['uid']);
+//        }
+
+        // Determine twitter title
+        if ($forcedTitle != null) {
+            $data['twitterPageTitle'] = $forcedTitle;
+        } elseif ($page['twitter_title'] != null) {
+            $data['twitterPageTitle'] = $page['twitter_title'];
+        } else {
+            $data['twitterPageTitle'] = $page['title'];
+        }
+
+        // Determine twitter description
+        if ($forcedDescription != null) {
+            $data['twitterPageDescription'] = $forcedDescription;
+        } elseif ($page['twitter_description'] != null) {
+            $data['twitterPageDescription'] = $page['twitter_description'];
+        }
+
+        // Determine twitter image (we use the typo3 builtin meta tags generator for now)
+//        if ($forcedImageUrl != null) {
+//            $data['twitterImageUrl'] = $forcedImageUrl;
+//        } elseif ($page['twitter_image'] == 1) {
+//            $data['twitterImageUrl'] = $this->getFalImagePath('pages', 'twitter_image', $page['uid']);
+//        }
+
+        $variables = [$as => $data];
+        return $this->renderChildrenWithVariables($variables);
+    }
+}

+ 2 - 0
ot_templating/Resources/Private/Partials/Classic/Footer.html

@@ -1,6 +1,8 @@
 {namespace v=FluidTYPO3\Vhs\ViewHelpers}
 {namespace v=FluidTYPO3\Vhs\ViewHelpers}
 {namespace ot=Opentalent\OtTemplating\ViewHelpers}
 {namespace ot=Opentalent\OtTemplating\ViewHelpers}
 
 
+<f:render partial="Classic/MetaSocial"/>
+
 <footer id="footer">
 <footer id="footer">
     <ul class="footer-navbar">
     <ul class="footer-navbar">
 
 

+ 36 - 0
ot_templating/Resources/Private/Partials/Classic/MetaSocial.html

@@ -0,0 +1,36 @@
+{namespace v=FluidTYPO3\Vhs\ViewHelpers}
+{namespace ot=Opentalent\OtTemplating\ViewHelpers}
+
+<ot:social.metadata as="meta">
+     <f:debug>{meta}</f:debug>
+
+     <f:comment><!-- Facebook Meta Tags --></f:comment>
+     <v:page.header.meta property="og:url" content="{meta.pageUrl}"/>
+     <v:page.header.meta property="og:type" content="website"/>
+     <v:page.header.meta property="og:title" content="{meta.ogPageTitle}"/>
+     <f:if condition="{meta.ogPageDescription}">
+          <v:page.header.meta property="og:description" content="{meta.ogPageDescription}"/>
+     </f:if>
+     <f:comment>
+          <!-- We use the typo3 builtin meta tags generator for now -->
+          <!--     <f:if condition="{meta.ogImageUrl}">-->
+          <!--          <v:page.header.meta property="og:image" content="{meta.ogImageUrl}"/>-->
+          <!--     </f:if>-->
+     </f:comment>
+
+     <f:comment><!-- Twitter Meta Tags --></f:comment>
+     <v:page.header.meta name="twitter:card" content="summary_large_image"/>
+     <v:page.header.meta property="twitter:domain" content="{meta.domain}"/>
+     <v:page.header.meta property="twitter:url" content="{meta.pageUrl}"/>
+     <v:page.header.meta name="twitter:title" content="{meta.twitterPageTitle}"/>
+     <f:if condition="{meta.twitterPageDescription}">
+          <v:page.header.meta name="twitter:description" content="{meta.twitterPageDescription}"/>
+     </f:if>
+     <f:comment>
+          <!-- We use the typo3 builtin meta tags generator for now -->
+          <!--     <f:if condition="{meta.twitterImageUrl}">-->
+          <!--          <v:page.header.meta name="twitter:image" content="{meta.twitterImageUrl}"/>-->
+          <!--     </f:if>-->
+     </f:comment>
+
+</ot:social.metadata>

+ 1 - 0
ot_templating/Resources/Private/Partials/Modern/Footer.html

@@ -3,6 +3,7 @@
 
 
 <f:render partial="Modern/BackToTop" />
 <f:render partial="Modern/BackToTop" />
 <f:render partial="Modern/Modals" arguments="{_all}" />
 <f:render partial="Modern/Modals" arguments="{_all}" />
+<f:render partial="Classic/MetaSocial"/>
 
 
 <f:comment><!-- Get the footer page' uid if the page is found --></f:comment>
 <f:comment><!-- Get the footer page' uid if the page is found --></f:comment>
 <v:variable.set value="{ot:getPageUid(slug: '/footer')}" name="footerPageUid"/>
 <v:variable.set value="{ot:getPageUid(slug: '/footer')}" name="footerPageUid"/>

+ 36 - 0
ot_templating/Resources/Private/Partials/Modern/MetaSocial.html

@@ -0,0 +1,36 @@
+{namespace v=FluidTYPO3\Vhs\ViewHelpers}
+{namespace ot=Opentalent\OtTemplating\ViewHelpers}
+
+<ot:social.metadata as="meta">
+     <f:debug>{meta}</f:debug>
+
+     <f:comment><!-- Facebook Meta Tags --></f:comment>
+     <v:page.header.meta property="og:url" content="{meta.pageUrl}"/>
+     <v:page.header.meta property="og:type" content="website"/>
+     <v:page.header.meta property="og:title" content="{meta.ogPageTitle}"/>
+     <f:if condition="{meta.ogPageDescription}">
+          <v:page.header.meta property="og:description" content="{meta.ogPageDescription}"/>
+     </f:if>
+     <f:comment>
+          <!-- We use the typo3 builtin meta tags generator for now -->
+          <!--     <f:if condition="{meta.ogImageUrl}">-->
+          <!--          <v:page.header.meta property="og:image" content="{meta.ogImageUrl}"/>-->
+          <!--     </f:if>-->
+     </f:comment>
+
+     <f:comment><!-- Twitter Meta Tags --></f:comment>
+     <v:page.header.meta name="twitter:card" content="summary_large_image"/>
+     <v:page.header.meta property="twitter:domain" content="{meta.domain}"/>
+     <v:page.header.meta property="twitter:url" content="{meta.pageUrl}"/>
+     <v:page.header.meta name="twitter:title" content="{meta.twitterPageTitle}"/>
+     <f:if condition="{meta.twitterPageDescription}">
+          <v:page.header.meta name="twitter:description" content="{meta.twitterPageDescription}"/>
+     </f:if>
+     <f:comment>
+          <!-- We use the typo3 builtin meta tags generator for now -->
+          <!--     <f:if condition="{meta.twitterImageUrl}">-->
+          <!--          <v:page.header.meta name="twitter:image" content="{meta.twitterImageUrl}"/>-->
+          <!--     </f:if>-->
+     </f:comment>
+
+</ot:social.metadata>