SeoCategory.php 5.72 KB
<?php


namespace frontend\components;

use artbox\core\models\Alias;
use artbox\core\models\interfaces\AliasInterface;
use yii\base\Object;


class SeoCategory extends Object implements AliasInterface
{
    const SINGLE_CATEGORY = 'single';

    const ONE_OPTION = 'one_option';

    const TWO_OPTIONS = 'two_options';

    const MANY = 'many';

    const TITLE_TEMPLATE = ' купити в Україні: Київ, Харків, Одесса - ціна, фото, відгуки | інтернет-магазин ACDC';

    const DESC_TEMPLATE = 'Купити {inner text} в інтернет-магазині ACDC | Тільки оригінал > Доступні ціни > Покупка в кредит > Швидка доставка по Україні';

    /**
     * @var \common\models\catalog\Categor0y
     */
    public $category;

    /**
     * @var array
     */
    public $options;

    /**
     * @var integer
     */
    public $languageId;

    /**
     * @var string
     */
    protected $mode;

    /**
     * @var string
     */
    protected $title = '';

    /**
     * @var string
     */
    protected $description = '';

    /**
     * @var string
     */
    protected $h1 = '';

    /**
     * @var string
     */
    protected $robots = '';

    /**
     * @var string
     */
    protected $text = '';

    /**
     * @var Alias
     */
    public $categoryAlias;

    /**
     * @var array
     */
    protected $templates = [];

    protected function countOptions()
    {
        return count($this->options);
    }

    /**
     * @inheritdoc
     */
    public function init()
    {
        $this->selectMode();

        $this->generateData();

        $this->generateRobots();
    }

    protected function selectMode()
    {
        if (empty($this->options)) {
            $this->mode = self::SINGLE_CATEGORY;
        } elseif ($this->countOptions() === 1) {
            $this->mode = self::ONE_OPTION;
        } elseif ($this->countOptions() === 2) {
            $this->mode = self::TWO_OPTIONS;
        } else {
            $this->mode = self::MANY;
        }
    }

    private function selectH1()
    {
//        if (!empty($this->categoryAlias->h1)) {
//            $this->h1 = $this->categoryAlias->h1;
//        } else {
            $this->h1 = $this->category->lang->title;
//        }
    }

    protected function generateData()
    {
        $this->selectH1();
        $this->selectTitle();
        $this->selectDescription();
    }

    protected function selectTitle()
    {
        switch ($this->mode) {
            case self::SINGLE_CATEGORY:
                $this->title = $this->h1 . self::TITLE_TEMPLATE;
                break;
            case self::ONE_OPTION:
                $this->title = $this->h1 . ' ' . $this->options[0]->title . self::TITLE_TEMPLATE;
                break;
            case self::TWO_OPTIONS:
                $this->title = $this->h1 . ' ' . $this->options[0]->title
                    . ' ' . $this->options[1]->title
                    . self::TITLE_TEMPLATE;
                break;
            default:
                $this->title = $this->h1 . self::TITLE_TEMPLATE;
        }

    }

    protected function selectDescription()
    {
        switch ($this->mode) {
            case self::SINGLE_CATEGORY:
                $this->description = str_replace('{inner text}',$this->h1,self::DESC_TEMPLATE);
                break;
            case self::ONE_OPTION:
                $this->description =
                    str_replace(
                        '{inner text}',
                        $this->h1 . ' ' . $this->options[0]->title,
                        self::DESC_TEMPLATE
                    );
                break;
            case self::TWO_OPTIONS:
                $this->description =
                    str_replace(
                        '{inner text}',
                        $this->h1
                                . ' ' . $this->options[0]->title
                                . ' ' . $this->options[1]->title,
                        self::DESC_TEMPLATE
                    );
                break;
            default:
                $this->description = str_replace('{inner text}',$this->h1,self::DESC_TEMPLATE);
        }
    }

    protected function generateRobots()
    {
        switch ($this->mode) {
            case self::SINGLE_CATEGORY:
                $this->robots = 'index, follow';
            case self::ONE_OPTION :
                if (!empty($this->template) && !$this->template->isBasic) {
                    $this->robots = $this->template->robots;
                } else {
                    $this->robots = 'index, follow';
                }
                break;
            case self::TWO_OPTIONS:
                if (!empty($this->template) && !$this->template->isBasic) {
                    $this->robots = $this->template->robots;
                } else {
                    $this->robots = 'index, follow';
                }
                break;
            case self::MANY:
                $this->robots = 'noindex, nofollow';
                break;
        }
    }

    public function getFields(): string
    {
        return '';
    }

    public function getSeoText(): string
    {
        return $this->text ?? '';
    }

    public function getId()
    {
        return 0;
    }

    public function getTitle(): string
    {
        return $this->title ?? '';
    }

    public function getDesc(): string
    {
        return $this->description ?? '';
    }

    public function getH1(): string
    {
        return mb_strtoupper(mb_substr($this->h1, 0, 1)).mb_strtolower(mb_substr($this->h1, 1)) ?? '';
    }

    public function getText(): string
    {
        return $this->text ?? '';
    }

    public function getRobots(): string
    {
        return $this->robots ?? '';
    }
}