studioespresso/craft-seo-fields

View on GitHub
src/services/RenderService.php

Summary

Maintainability
A
55 mins
Test Coverage
<?php

namespace studioespresso\seofields\services;

use Craft;
use craft\base\Component;
use craft\elements\Category;
use craft\elements\Entry;
use craft\web\View;
use studioespresso\seofields\events\RegisterSeoElementEvent;
use studioespresso\seofields\models\SeoFieldModel;
use studioespresso\seofields\SeoFields;
use yii\base\Event;

/**
 *
 * @author    Studio Espresso
 * @package   SeoFields
 * @since     1.0.0
 */
class RenderService extends Component
{
    // Public Methods
    // =========================================================================
    public function renderMeta($context, $handle = 'seo')
    {
        Craft::beginProfile('renderMeta', __METHOD__);
        $data = $this->getSeoFromContent($context, $handle);

        $template = Craft::$app->getView()->renderTemplate(
            'seo-fields/_meta',
            ['meta' => $data['meta'], 'element' => $data['entry']],
            View::TEMPLATE_MODE_CP
        );

        Craft::endProfile('renderMeta', __METHOD__);
        return $template;
    }

    public function getSeoFromContent($context, $handle)
    {
        $meta = null;
        $element = null;

        Craft::beginProfile('renderMeta', __METHOD__);

        $registeredElements = $this->_registerElementsEvent();

        try {
            foreach ($registeredElements as $item) {
                $class = explode('\\', $item);
                $elementName = strtolower(end($class));
                if (isset($context[$elementName])) {
                    if (isset($context[$elementName][$handle])) {
                        $meta = $context[$elementName][$handle];
                    } else {
                        $meta = new SeoFieldModel();
                    }
                    $element = $context[$elementName];
                }
            }

            if (!$meta) {
                $meta = new SeoFieldModel();
            }

            return ['meta' => $meta, 'entry' => $element, 'element' => $element];
        } catch (\Exception $e) {
            return null;
        }
    }

    private function _registerElementsEvent()
    {
        $elements = [];
        $event = new RegisterSeoElementEvent([
            'elements' => $elements,
        ]);

        Event::trigger(SeoFields::class, SeoFields::EVENT_SEOFIELDS_REGISTER_ELEMENT, $event);
        $registeredElements = array_filter($event->elements);

        array_push($registeredElements, Entry::class);
        array_push($registeredElements, Category::class);

        return $registeredElements;
    }
}