<?php namespace app\controllers; use app\models\Host; use app\models\Filter; use app\components\Collection; use Yii; use yii\db\Query; use yii\filters\AccessControl; use yii\web\Controller; use yii\web\Response; use yii\filters\VerbFilter; class AjaxController extends Controller { /** * {@inheritdoc} */ public function behaviors() { return [ 'access' => [ 'class' => AccessControl::className(), 'rules' => [ [ 'actions' => ['calc-status'], 'allow' => true, 'roles' => ['@'], ], ], ], 'contentNegotiator' => [ 'class' => 'yii\filters\ContentNegotiator', 'formats' => [ 'application/json' => Response::FORMAT_JSON, ], ], 'verbs' => [ 'class' => VerbFilter::className(), 'actions' => [ 'get-plants' => ['GET'] ], ], ]; } /** * Displays homepage. * * @return string */ public function actionCalcStatus() { $count_update = [Host::STATUS_OFF => 0, Host::STATUS_ON => 0]; $filters = [Filter::TYPE_1=>Collection::get_filter(Filter::TYPE_1), Filter::TYPE_2=>Collection::get_filter(Filter::TYPE_2), Filter::TYPE_3=>Collection::get_filter(Filter::TYPE_3)]; $query = (new Query())->select('id, domain')->from('{{%host}}'); if ($query) { foreach ($query->batch(1000) as $hosts) { foreach ($filters as $filter_type=>$filter) { $update = [Host::STATUS_OFF=>[],Host::STATUS_ON=>[]]; foreach ($hosts as $host) $update[ ( Collection::apply_filter($host['domain'], $filter) === false ? Host::STATUS_OFF : Host::STATUS_ON ) ][] = $host['id']; unset($host); $filter_name = 'f'.($filter_type+1).'_status'; if (count($update[Host::STATUS_OFF])>0) { Yii::$app->db->createCommand() ->update('{{%host}}', [$filter_name => Host::STATUS_OFF], ['in', 'id', $update[Host::STATUS_OFF]]) ->execute(); $count_update[Host::STATUS_OFF]+=count($update[$filter_type][Host::STATUS_OFF]); $update[$filter_type][Host::STATUS_OFF] = []; } if (count($update[Host::STATUS_ON])>0) { Yii::$app->db->createCommand() ->update('{{%host}}', [$filter_name => Host::STATUS_ON], ['in', 'id', $update[Host::STATUS_ON]]) ->execute(); $count_update[Host::STATUS_ON]+=count($update[$filter_type][Host::STATUS_ON]); $update[$filter_type][Host::STATUS_ON] = []; } unset($filter_name); unset($update); } unset($filter_type, $filter); } unset($hosts); } unset($query); unset($filters); return [ 'controller' => 'ajax', 'is_guest' => Yii::$app->user->isGuest, 'user_id' => Yii::$app->user->getId(), 'domains' => $count_update ]; } }