Untitled

 avatar
unknown
php
a year ago
10 kB
9
Indexable
<?php

class QueuesSearch extends Queues {


    public function rules() {
        return [
            [['operatorNumber', 'queue_monitor_name'], 'safe'],
        ];
    }

    public function attributes() {
        return array_merge(parent::attributes(), ['queue_monitor_name']);
    }

    public function search($params) {
        $query = Queues::find()->joinWith('sipUsers')->all();

        foreach($query as $row){
            var_dump($row->sipUsers);
            die;
        }


        $sort = new Sort([
            'attributes' => [
                'operatorNumber' => [
                    'asc' => ['membername' => SORT_ASC],
                    'desc' => ['membername' => SORT_DESC],
                    'default' => SORT_DESC,
                ],
                'queue_monitor_name' => [
                    'asc' => ['sipfriends.queue_monitor_name' => SORT_ASC],
                    'desc' => ['sipfriends.queue_monitor_name' => SORT_DESC],
                    'default' => SORT_ASC,
                ],
            ],
            'defaultOrder' => [
                'operatorNumber' => SORT_DESC
            ],
        ]);
        $data_provider = new ActiveDataProvider([
            'query' => $query,
            'pagination' => [
                'pageSize' => 10
            ],
            'sort' => $sort,
        ]);
        if (!($this->load($params) && $this->validate())) {
            return $data_provider;
        }
        die;

        $query->andFilterWhere(['like', 'membername', $this->operatorNumber]);
        $query->andFilterWhere(['like', 'sipfriends.queue_monitor_name', $this->queue_monitor_name]);

        return $data_provider;
    }
}




class Queues extends ActiveRecord {

    const IFACE_PREFIX = 'SIP';
    const LOCAL = FALSE;
    const LOCAL_CONTEXT = '';
    const USE_N = TRUE;

    public static function tableName() {
        return 'queue_members';
    }

    public static function primaryKey() {
        return ['uniqueid'];
    }

    public function setOperatorNumber($value) {
        $this->membername = $value;
        $this->interface = (self::LOCAL) ? 'LOCAL/' . $value . '@' . self::LOCAL_CONTEXT . ((self::USE_N) ? '/n' : '') : self::IFACE_PREFIX . '/' . $value;
        $this->state_interface = self::IFACE_PREFIX . '/' . $value;
    }

    public function getOperatorNumber() {
        return $this->membername;
    }

    public function getSipUsers() {
        return $this->hasOne(SipUsers::class, ['name' => 'membername']);
    }

    public function rules() {
        $inner_number_pat = Yii::$app->params['NUM_PATTERNS']['inner'];
        $inner_number_pat = '/^' . Utility::parseNumber($inner_number_pat) . '$/';
        return [
            ['membername', 'match', 'pattern' => $inner_number_pat],
            ['queue_name', 'match', 'pattern' => '/^[A-Za-z\-\_\d]+$/'],
            ['interface', 'match', 'pattern' => '/^((PJSIP\/[A-Za-z\-\_\d]+)|(SIP\/[A-Za-z\-\_\d]+)|(LOCAL\/[A-Za-z\-\_\d]+\@[A-Za-z\-\_\d]+(\/n)?))$/i'],
            ['state_interface', 'match', 'pattern' => '/^((PJSIP\/[A-Za-z\-\_\d]+)|(SIP\/[A-Za-z\-\_\d]+))$/i'],
            ['penalty', 'integer', 'min' => 0],
            ['paused', 'integer', 'min' => 0, 'max' => 1],
            ['operatorNumber', 'match', 'pattern' => $inner_number_pat],
            [['penalty', 'paused'], 'default', 'value' => 0],
            ['operatorNumber', 'unique', 'targetAttribute' => 'membername'],
            [['operatorNumber', 'queue_name', 'interface', 'penalty', 'paused'], 'required']
        ];
    }

    public function attributeLabels() {
        return [
            'operatorNumber' => Yii::t('adm-queues', 'Номер'),
            'queue_monitor_name' => Yii::t('adm-queues', 'Имя для монитора очередей')
        ];
    }
    
}



class SipUsers extends ActiveRecord {

    public static function tableName() {
        return 'sipfriends';
    }

    public static function primaryKey() {
        return ['id'];
    }

    public function setCalleridForm($value) {
        $this->callerid = '"' . $value . '" <' . $this->name . '>';
    }

    public function getCalleridForm() {
        $first_quote = mb_strpos($this->callerid, '"');
        if($first_quote === FALSE) return NULL;
        $second_quote = mb_strpos($this->callerid, '"', $first_quote + 1);
        if($second_quote === FALSE) return NULL;
        return mb_substr($this->callerid, $first_quote + 1, $second_quote - $first_quote - 1);
    }

    public function getCallLimitForm() {
        return $this->getAttribute('call-limit');
    }

    public function setCallLimitForm($value) {
        $this->setAttribute('call-limit', $value);
    }

    public function setNameForm($value) {
        $this->name = $value;
        $this->defaultuser = $value;
    }

    public function getNameForm() {
        return $this->name;
    }

    public function rules() {
        $inner_number_pat = Yii::$app->params['NUM_PATTERNS']['inner'];
        $inner_number_pat = '/^' . Utility::parseNumber($inner_number_pat) . '$/';
        return [
            ['context', 'match', 'pattern' => '/^[A-Za-z\-\_\d]+$/'],
            ['secret', 'match', 'pattern' => '/^[A-Za-z\d#?!@$%^&*-_]{8,50}$/'],
            ['nameForm', 'match', 'pattern' => $inner_number_pat],
            [['deny', 'permit'], 'match', 'pattern' => '/^((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)\.?\b){4}\/((((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)\.?\b){4})|(\d{1,2}))(\; *((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)\.?\b){4}\/((((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)\.?\b){4})|(\d{1,2})))*$/'],
            ['nat', 'in', 'range' => ['yes', 'no', 'never', 'route', 'force_rport,comedia']],
            [['directmedia', 'callcounter'], 'in', 'range' => ['yes', 'no']],
            ['qualifyfreq', 'integer', 'min' => 0, 'max' => 999999],
            [['calleridForm', 'queue_monitor_name'], 'filter', 'filter' => 'app\models\SipUsers::filter_name'],
            ['callLimitForm', 'integer', 'min' => 0, 'max' => 30],
            ['context', 'default', 'value' => 'local'],
            [['deny', 'permit'], 'default', 'value' => '0.0.0.0/0'],
            [['callcounter'], 'default', 'value' => 'yes'],
            [['directmedia'], 'default', 'value' => 'no'],
            ['qualifyfreq', 'default', 'value' => 15],
            ['callLimitForm', 'default', 'value' => 2],
            ['nat', 'default', 'value' => 'force_rport,comedia'],
            ['nameForm', 'unique', 'targetAttribute' => 'name'],
            [['secret', 'nameForm', 'deny', 'permit', 'calleridForm'], 'required'],
        ];
    }

    public function attributeLabels()
    {
        return [
            'context' => Yii::t('sip-users', 'Контекст'),
            'secret' => Yii::t('sip-users', 'Пароль'),
            'nameForm' => Yii::t('sip-users', 'Номер'),
            'deny' => Yii::t('sip-users', 'Запретить IP'),
            'permit' => Yii::t('sip-users', 'Разрешить IP'),
            'qualifyfreq' => Yii::t('sip-users', 'Частота qualify'),
            'calleridForm' => Yii::t('sip-users', 'CallerID(name)'),
            'queue_monitor_name' => Yii::t('sip-users', 'Имя для монитора очередей'),
            'callLimitForm' => Yii::t('sip-users', 'Одновременных звонков'),
        ];
    }

    public static function filter_name($value) {
        return preg_filter('/\n*[^a-zа-яёіїєґ \d\.\,\/\\\(\)]*/ui', '', $value);
    }
}



class QueueAdminController extends Controller {
    public function actionIndex() {
        $search_model = new QueuesSearch();
        $data_provider = $search_model->search(Yii::$app->request->post());

        return $this->render('index', [
            'data_provider' => $data_provider,
            'search_model' => $search_model,
        ]);
    }
}



    //VIEW:
        
            <?php Pjax::begin(['id' => 'pjax-id', 'timeout' => FALSE, 'enablePushState' => FALSE, 'clientOptions' => ['method' => 'POST']]); ?>
            <?= GridView::widget([
                'dataProvider' => $data_provider,
                'filterModel' => $search_model,
                'formatter' => [
                    'class' => 'yii\i18n\Formatter',
                    'nullDisplay' => '',
                ],
                'columns' => [
                    ['class' => 'yii\grid\SerialColumn', 'contentOptions' => ['class' => 'text-center'], 'headerOptions' => ['style' => 'min-width: 35px; max-width: 35px']],
                    ['attribute' => 'operatorNumber', 'contentOptions' => ['style' => 'min-width: 69px; max-width: 69px', 'class' => 'text-center', 'headerOptions' => ['style' => 'min-width: 69px; max-width: 69px']],
                        'encodeLabel' => FALSE , 'label' => '<i class="fa-regular fa-address-book"></i>', 'headerOptions' => ['title' => Yii::t('adm-queues', 'Номер')]],
                    ['attribute' => 'queue_monitor_name', 'contentOptions' => ['style' => 'width: 100%', 'class' => 'text-truncate'],
                        'headerOptions' => ['style' => 'width: 100%']],
                    [
                        'class' => ActionColumn::className(),
                        'urlCreator' => function ($action, Queues $model, $key, $index, $column) {
                            return Url::toRoute([$action, 'id' => $model->uniqueid]);
                        },
                        'template' => '<div class="btn-group d-inline-block" role="group"> {delete} </div>',
                        'buttonOptions' => ['class' => 'btn btn-sm'],
                        'contentOptions' => ['class' => 'text-truncate text-center'],
                        'headerOptions' => ['style' => 'min-width: 55px; max-width: 55px'],
                    ],
                ],
                'options' => ['class' => 'grid-view grid-view-adm-queues'],
                'tableOptions' => ['class' => 'table table-striped table-hover rounded-3 table-grid', 'style' => 'overflow: hidden'],
                'pager' => ['class' => 'yii\bootstrap5\LinkPager'],
            ]); ?>
            <?php Pjax::end(); ?>
Editor is loading...
Leave a Comment