protected/modules/feedback/FeedbackModule.php

Summary

Maintainability
C
1 day
Test Coverage
<?php

/**
 * FeedbackModule основной класс модуля feedback
 *
 * @author yupe team <support@yupe.ru>
 * @link https://yupe.ru
 * @copyright 2009-2013 amyLabs && Yupe! team
 * @package yupe.modules.feedback
 * @since 0.1
 *
 */

use yupe\components\WebModule;

/**
 * Class FeedbackModule
 */
class FeedbackModule extends WebModule
{
    /**
     *
     */
    const VERSION = '1.0';

    /**
     * @var array
     */
    public $backEnd = ['DbFeedbackSender', 'EmailFeedbackSender'];
    /**
     * @var
     */
    public $emails;
    /**
     * @var
     */
    public $types;
    /**
     * @var int
     */
    public $showCaptcha = 0;
    /**
     * @var
     */
    public $notifyEmailFrom;
    /**
     * @var int
     */
    public $sendConfirmation = 0;
    /**
     * @var
     */
    public $successPage;
    /**
     * @var int
     */
    public $cacheTime = 60;
    /**
     * @var int
     */
    public $minCaptchaLength = 3;
    /**
     * @var int
     */
    public $maxCaptchaLength = 6;

    /**
     *
     */
    const BACKEND_EMAIL = 'EmailFeedbackSender';
    /**
     *
     */
    const BACKEND_DB = 'DbFeedbackSender';


    /**
     * @return array
     */
    public function getDependencies()
    {
        return [
            'category',
            'user',
            'mail',
        ];
    }

    /**
     * @return array
     */
    public function getParamsLabels()
    {
        return [
            'showCaptcha' => Yii::t('FeedbackModule.feedback', 'Show captcha'),
            'emails' => Yii::t('FeedbackModule.feedback', 'Message receivers (email, separated by comma)'),
            'notifyEmailFrom' => Yii::t('FeedbackModule.feedback', 'Email message will be send from'),
            'sendConfirmation' => Yii::t('FeedbackModule.feedback', 'Send notification'),
            'successPage' => Yii::t('FeedbackModule.feedback', 'Page after form was sent'),
            'cacheTime' => Yii::t('FeedbackModule.feedback', 'Counter caching time (seconds)'),
            'mainCategory' => Yii::t('FeedbackModule.feedback', 'Main messages category'),
            'minCaptchaLength' => Yii::t('FeedbackModule.feedback', 'Minimum captcha length'),
            'maxCaptchaLength' => Yii::t('FeedbackModule.feedback', 'Maximum captcha length'),
        ];
    }

    /**
     * @return array
     */
    public function getEditableParams()
    {
        return [
            'showCaptcha' => $this->getChoice(),
            'sendConfirmation' => $this->getChoice(),
            'notifyEmailFrom',
            'emails',
            'successPage',
            'cacheTime',
            'mainCategory' => CHtml::listData($this->getCategoryList(), 'id', 'name'),
            'minCaptchaLength',
            'maxCaptchaLength',
        ];
    }

    /**
     * @return array
     */
    public function getEditableParamsGroups()
    {
        return [
            'main' => [
                'label' => Yii::t('FeedbackModule.feedback', 'General module settings'),
                'items' => [
                    'sendConfirmation',
                    'notifyEmailFrom',
                    'emails',
                    'successPage',
                    'cacheTime',
                    'mainCategory',
                ],
            ],
            'captcha' => [
                'label' => Yii::t('FeedbackModule.feedback', 'Captcha settings'),
                'items' => [
                    'showCaptcha',
                    'minCaptchaLength',
                    'maxCaptchaLength',
                ],
            ],
        ];
    }

    /**
     * @return array|bool
     */
    public function checkSelf()
    {
        $messages = [];

        if (in_array(FeedbackModule::BACKEND_EMAIL, $this->backEnd) && (!$this->emails || !count(
                    explode(',', $this->emails)
                ))
        ) {
            $messages[WebModule::CHECK_ERROR][] = [
                'type' => WebModule::CHECK_ERROR,
                'message' => Yii::t(
                    'FeedbackModule.feedback',
                    'Select feedback message email receivers (emails) {link}',
                    [
                        '{link}' => CHtml::link(
                            Yii::t('FeedbackModule.feedback', 'Change module settings'),
                            [
                                '/yupe/backend/modulesettings/',
                                'module' => $this->id,
                            ]
                        ),
                    ]
                ),
            ];
        }

        if (!$this->notifyEmailFrom) {
            $messages[WebModule::CHECK_ERROR][] = [
                'type' => WebModule::CHECK_ERROR,
                'message' => Yii::t(
                    'FeedbackModule.feedback',
                    'Select email which will be display in "From" field {link}',
                    [
                        '{link}' => CHtml::link(
                            Yii::t('FeedbackModule.feedback', 'Change module settings'),
                            [
                                '/yupe/backend/modulesettings/',
                                'module' => $this->id,
                            ]
                        ),
                    ]
                ),
            ];
        }

        $count = FeedBack::model()->new()->cache($this->cacheTime)->count();

        if ($count) {
            $messages[WebModule::CHECK_NOTICE][] = [
                'type' => WebModule::CHECK_NOTICE,
                'message' => Yii::t(
                        'FeedbackModule.feedback',
                        'You have {{count}} ',
                        [
                            '{{count}}' => $count,
                        ]
                    ).Yii::t(
                        'FeedbackModule.feedback',
                        'new message |new messages |new messages ',
                        $count
                    ).' '.CHtml::link(
                        Yii::t('FeedbackModule.feedback', 'Show and reply?'),
                        [
                            '/feedback/feedbackBackend/index/',
                            'order' => 'status.asc',
                            'FeedbBack_sort' => 'status',
                        ]
                    ),
            ];
        }

        return (isset($messages[WebModule::CHECK_ERROR]) || isset($messages[WebModule::CHECK_NOTICE])) ? $messages : true;
    }

    /**
     * @return string
     */
    public function getAdminPageLink()
    {
        return '/feedback/feedbackBackend/index';
    }

    /**
     * @return array
     */
    public function getNavigation()
    {
        return [
            [
                'icon' => 'fa fa-fw fa-list-alt',
                'label' => Yii::t('FeedbackModule.feedback', 'Messages list'),
                'url' => ['/feedback/feedbackBackend/index'],
            ],
            [
                'icon' => 'fa fa-fw fa-plus-square',
                'label' => Yii::t('FeedbackModule.feedback', 'Create message'),
                'url' => ['/feedback/feedbackBackend/create'],
            ],
            [
                'icon' => 'fa fa-fw fa-folder-open',
                'label' => Yii::t('FeedbackModule.feedback', 'Messages categories'),
                'url' => ['/category/categoryBackend/index', 'Category[parent_id]' => (int)$this->mainCategory],
            ],
        ];
    }

    /**
     * @return string
     */
    public function getName()
    {
        return Yii::t('FeedbackModule.feedback', 'Feedback');
    }

    /**
     * @return string
     */
    public function getCategory()
    {
        return Yii::t('FeedbackModule.feedback', 'Services');
    }

    /**
     * @return string
     */
    public function getDescription()
    {
        return Yii::t('FeedbackModule.feedback', 'Module for feedback management');
    }

    /**
     * @return string
     */
    public function getVersion()
    {
        return self::VERSION;
    }

    /**
     * @return string
     */
    public function getAuthor()
    {
        return Yii::t('FeedbackModule.feedback', 'yupe team');
    }

    /**
     * @return string
     */
    public function getAuthorEmail()
    {
        return Yii::t('FeedbackModule.feedback', 'support@yupe.ru');
    }

    /**
     * @return string
     */
    public function getUrl()
    {
        return Yii::t('FeedbackModule.feedback', 'https://yupe.ru');
    }

    /**
     * @return string
     */
    public function getIcon()
    {
        return 'fa fa-fw fa-retweet';
    }

    /**
     * Возвращаем статус, устанавливать ли галку для установки модуля в инсталяторе по умолчанию:
     *
     * @return bool
     **/
    public function getIsInstallDefault()
    {
        return true;
    }

    /**
     *
     */
    public function init()
    {
        parent::init();

        $this->setImport(
            [
                'feedback.models.*',
                'feedback.components.*',
                'feedback.events.*',
            ]
        );

        if (!$this->emails) {
            $this->emails = Yii::app()->getModule('yupe')->email;
        }
    }

    /**
     * @return array
     */
    public function getTypes()
    {
        return is_array($this->types) ? $this->types : [];
    }

    /**
     * @return array
     */
    public function getAuthItems()
    {
        return [
            [
                'name' => 'Feedback.FeedbackManager',
                'description' => Yii::t('FeedbackModule.feedback', 'Manage feedback'),
                'type' => AuthItem::TYPE_TASK,
                'items' => [
                    [
                        'type' => AuthItem::TYPE_OPERATION,
                        'name' => 'Feedback.FeedbackBackend.Create',
                        'description' => Yii::t('FeedbackModule.feedback', 'Creating feedback'),
                    ],
                    [
                        'type' => AuthItem::TYPE_OPERATION,
                        'name' => 'Feedback.FeedbackBackend.Delete',
                        'description' => Yii::t('FeedbackModule.feedback', 'Removing feedback'),
                    ],
                    [
                        'type' => AuthItem::TYPE_OPERATION,
                        'name' => 'Feedback.FeedbackBackend.Index',
                        'description' => Yii::t('FeedbackModule.feedback', 'List of feedback'),
                    ],
                    [
                        'type' => AuthItem::TYPE_OPERATION,
                        'name' => 'Feedback.FeedbackBackend.Update',
                        'description' => Yii::t('FeedbackModule.feedback', 'Editing feedback'),
                    ],
                    [
                        'type' => AuthItem::TYPE_OPERATION,
                        'name' => 'Feedback.FeedbackBackend.View',
                        'description' => Yii::t('FeedbackModule.feedback', 'Viewing feedback'),
                    ],
                    [
                        'type' => AuthItem::TYPE_OPERATION,
                        'name' => 'Feedback.FeedbackBackend.Answer',
                        'description' => Yii::t('FeedbackModule.feedback', 'Answer feedback'),
                    ],
                ],
            ],
        ];
    }
}