[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Оцените Контроллер
TMake
Всем привет.
Знаю что очень наляписто сделал из-за того что сразу было не учтено в тз.
но лучше что бы сразу ткнули меня где я сделал каку.

Свернутый текст


<?php

class
RequestController extends Controller
{
/**
*
@var string the default layout for the views. Defaults to '//layouts/column2', meaning
* using two-column layout. See 'protected/views/layouts/column2.php'.
*/

public $layout='//layouts/column2';

/**
*
@return array action filters
*/

public function filters()
{
return array(
'accessControl', // perform access control for CRUD operations
);
}

/**
* Specifies the access control rules.
* This method is used by the 'accessControl' filter.
*
@return array access control rules
*/

public function accessRules()
{
return array(
array('allow',
'actions'=>array('guestCreate'),
'users'=>array('*'),
),

array('allow',
'actions'=>array('index', 'view', 'archive'),
'users'=>array('@')
),

array('allow',
'actions'=>array('worker', 'view', 'manageadmin', 'admin'),
'expression'=>'Yii::app()->user->roles>='.User::ROLES_WORKER,
'users'=>array('@'),
),

array('allow', // allow all users to perform 'index' and 'view' actions
'actions'=>array('index','view', 'create','update', 'admin','delete'),
'expression'=>'Yii::app()->user->roles>='.User::ROLES_OPERATION,
'users'=>array('@'),
),

array('allow',
'actions'=>array('ajax'),
'expression'=>'Yii::app()->user->roles>='.User::ROLES_ADMIN,
'users'=>array('@'),
),

array('deny', // deny all users
'users'=>array('*'),
),
);

}

/**
* Displays a particular model.
*
@param integer $id the ID of the model to be displayed
*/

public function actionView($id)
{
$model = $this->loadModel($id, 'fixings');

if(Yii::app()->user->roles != User::ROLES_SUPER_ADMIN){ // Супер админа это не касается
if(Yii::app()->user->roles==User::ROLES_WORKER){ // Для работников проверяем - доступ к этой заявки
$fix = Fixing::model()->find('worker_id=:wid AND request_id=:rid',
array(
':wid'=>Yii::app()->user->id,
':rid'=>$id
));
$access = ($fix == NULL)? false: true;
}
else{
if(Yii::app()->user->roles == User::ROLES_CLIENT){ // проверяем доступность для клиента
$request = Request::model()->find('id=:id AND createuser_id=:cid',
array(
':id'=>$id,
':cid'=>Yii::app()->user->id));
if($request == NULL)
throw new CHttpException(403, Yii::app()->params['pageAccess']);
}
$access = true; // Админ и оператор имеет доступ к этой заявки
}

// Для клиента
if(Yii::app()->user->roles == User::ROLES_CLIENT){
if(!empty($_GET['flag'])) // определяем существование флага
if($_GET['flag'] == 'break'){ // пытаемся отозвать заявку если еще не закреплена
if($model->status == 0)
Request::model()->updateAll(
array(
'status'=>1
),
'id=:id',
array(
':id'=>$id
));
}
elseif($_GET['flag'] == 'send'){
if($model->status == 1)
Request::model()->updateAll(
array(
'status'=>0
),
'id=:id',
array(
':id'=>$id
));
}
elseif($_GET['flag'] == 'range'){
if($model->range == 0)
Request::model()->updateAll(
array(
'range'=>$_POST['range']
),

'id=:id',
array(
':id'=>$id
));
}
}
}


// Кроме Супер админа, выдаем ошибку для заявок из другого города
if(Yii::app()->user->roles != User::ROLES_SUPER_ADMIN)
if($model->city_id != Yii::app()->user->city)
throw new CHttpException(403, Yii::app()->params['pageAccess']);

$model = $this->loadModel($id, 'fixings');

$this->render('view',array(
'model'=>$model,
'access'=>$access
));
}

/**
* Creates a new model.
* If creation is successful, the browser will be redirected to the 'view' page.
*/

public function actionCreate()
{
$model=new Request;
//echo '<pre>'; var_dump($model->relations()); exit;
// Uncomment the following line if AJAX validation is needed
// $this->performAjaxValidation($model);


if(isset($_POST['Request']))
{

if(Yii::app()->user->roles != User::ROLES_SUPER_ADMIN)
$_POST['Request']['city_id'] = Yii::app()->user->city;

$model->attributes=$_POST['Request'];
if($model->save()){
$cmd = Yii::app()->db->createCommand();

$cmd->insert('fixing', array(
'worker_id'=>$_POST['Fixing']['worker_id'],
'request_id'=>$model->id,
'date'=>date('Y-m-d H:i:s'),
));


$this->redirect(array('view','id'=>$model->id));
}
}


$model->date = date('Y-m-d H:i:s');
$this->render('create',array(
'model'=>$model
));
}

/**
* Updates a particular model.
* If update is successful, the browser will be redirected to the 'view' page.
*
@param integer $id the ID of the model to be updated
*/

public function actionUpdate($id)
{
$model=$this->loadModel($id, 'fixings');


if(Yii::app()->user->roles != User::ROLES_SUPER_ADMIN)
if($model->city_id != Yii::app()->user->city)
throw new CHttpException(403, Yii::app()->params['pageAccess']);

// Uncomment the following line if AJAX validation is needed
// $this->performAjaxValidation($model);


if(isset($_POST['Request']))
{
if($_POST['Request']['checked'] == 1)
$_POST['Request']['date_checked'] = date('Y-m-d H:i:s');

$cmd = Yii::app()->db->createCommand();
$cmd->update('fixing',
array('worker_id'=>$_POST['Fixing']['worker_id'],
'date'=>date('Y-m-d H:i:s')),
'request_id=:rid',
array(':rid'=>$id));

if(Yii::app()->user->roles != User::ROLES_SUPER_ADMIN)
$_POST['Request']['city_id'] = Yii::app()->user->city;

$model->attributes=$_POST['Request'];
if($model->save())
$this->redirect(array('view','id'=>$model->id));
}

$this->render('update',array(
'model'=>$model
));
}

public function actionWorker($id){
if(isset($_GET['flag']))
if($_GET['flag'] == 'up'){
$if_req = Request::model()->findByPk($id);
if($if_req->status == 2)
$this->redirect(array('request/manageadmin/fail'));
else{
Fixing::model()->updateAll(
array(
'worker_id'=>Yii::app()->user->id
),
'request_id=:rid',
array(':rid'=>$id));
Request::model()->updateAll(
array(
'status'=>2
),
'id=:id',
array(':id'=>$id));
}
}


if(!empty($_POST['money']))
if(trim($_POST['money']) != '')
Request::model()->updateAll(
array(
'status'=>3,
'money'=>$_POST['money']
),

'id=:id',
array(':id'=>$id));

if(Yii::app()->user->roles==User::ROLES_WORKER){
$fix = Fixing::model()->find('worker_id=:wid AND request_id=:rid',
array(
':wid'=>Yii::app()->user->id,
':rid'=>$id
));
$access = ($fix == NULL)? false: true;
if($access){
$req = Request::model()->findByPk($fix->request_id);
$if_stat = ($req->status == 0||$req->status == 2)? true: false;
}
}

else{
$access = true;
$if_stat = true;
}

$model = $this->loadModel($id);

if(Yii::app()->user->roles != User::ROLES_SUPER_ADMIN)
if($model->city_id != Yii::app()->user->city)
throw new CHttpException(403, Yii::app()->params['pageAccess']);

$this->render('updateWorker', array(
'model'=>$model,
'access'=>$access,
'if_stat'=>$if_stat,
));

}

/**
* Deletes a particular model.
* If deletion is successful, the browser will be redirected to the 'admin' page.
*
@param integer $id the ID of the model to be deleted
*/

public function actionDelete($id)
{
if(Yii::app()->request->isPostRequest)
{
$model = $this->loadModel($id);

if(Yii::app()->user->roles != User::ROLES_SUPER_ADMIN)
if($model->city_id != Yii::app()->user->city)
throw new CHttpException(403, Yii::app()->params['pageAccess']);

// we only allow deletion via POST request
if(Yii::app()->user->roles == User::ROLES_SUPER_ADMIN)
$model->delete();
else
Request::model()->updateByPk($id, array('status'=>5));

// if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser
if(!isset($_GET['ajax']))
$this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));
}
else
throw new CHttpException(400,'Invalid request. Please do not repeat this request again.');
}

/**
* Lists all models.
*/

public function actionIndex()
{
if(Yii::app()->user->roles == User::ROLES_SUPER_ADMIN)
$dataProvider=new CActiveDataProvider('Request');
else
$dataProvider=new CActiveDataProvider('Request', array(
'criteria'=>array(
'condition'=>'city_id=:cid AND createuser_id=:crid AND status NOT IN (5,3)',
'params'=>array(
':cid'=>Yii::app()->user->city,
':crid'=>Yii::app()->user->id,
)
)
));


$this->render('index',array(
'dataProvider'=>$dataProvider,
));

}

public function actionArchive(){
$dataProvider=new CActiveDataProvider('Request', array(
'criteria'=>array(
'condition'=>'city_id=:cid AND createuser_id=:crid
AND status=3'
,
'params'=>array(
':cid'=>Yii::app()->user->city,
':crid'=>Yii::app()->user->id,
)
)
));


$this->render('index',array(
'dataProvider'=>$dataProvider,
));

}

/**
* Manages all models.
*/

public function actionAdmin()
{
if(Yii::app()->user->roles==User::ROLES_SUPER_ADMIN)
$CButton = array('class'=>'CButtonColumn');
else
$CButton = array(
'class'=>'CButtonColumn',
'template'=>'');

$model=new Request('search');
$model->unsetAttributes(); // clear any default values
if(isset($_GET['Request'])){
$model->attributes=$_GET['Request'];
}

$this->render('admin',array(
'model'=>$model, 'CButton'=>$CButton,
));

}

public function actionManageadmin(){
if(Yii::app()->user->roles==User::ROLES_WORKER)
$CButton = array(
'class'=>'CButtonColumn',
'template'=>'{view}',
'buttons'=>array(
'view'=>array(
'url'=>'Yii::app()->createUrl("request/worker/".$data->id)',
),
));

else
$CButton = array('class'=>'CButtonColumn');

$alert = !empty($_GET['flag'])? Yii::app()->params['failRequestEnter'] : '';

$model=new Request('archive');
$model->unsetAttributes(); // clear any default values
if(isset($_GET['Request'])){
$model->attributes=$_GET['Request'];
}

$this->render('archiveAdmin',
array('model'=>$model, 'CButton'=>$CButton,
'alert'=>$alert));
}

/**
* Returns the data model based on the primary key given in the GET variable.
* If the data model is not found, an HTTP exception will be raised.
*
@param integer the ID of the model to be loaded
*/

public function loadModel($id, $with = false)
{
if($with)
$model=Request::model()->with($with)->findByPk($id);
else
$model=Request::model()->findByPk($id);
if($model===null)
throw new CHttpException(404,'The requested page does not exist.');
return $model;
}

/**
* Performs the AJAX validation.
*
@param CModel the model to be validated
*/

protected function performAjaxValidation($model)
{
if(isset($_POST['ajax']) && $_POST['ajax']==='request-form')
{
echo CActiveForm::validate($model);
Yii::app()->end();
}
}


public function actionGuestCreate(){
if(!empty($_POST['create'])){
if(!Yii::app()->user->isGuest){
$createUser = Yii::app()->user->id;
$phone = Yii::app()->user->phone;
$username = Yii::app()->user->username;
$city = Yii::app()->user->city;
$status =0;
}
else{
$if_bl = BlackList::model()->find('phone=:phone',
array(':phone'=>$_POST['phone']));
if($if_bl == NULL){
$username = $_POST['username'];
$createUser = 0;
$phone = $_POST['phone'];
$city = $_POST['city'];
$status = 4;
}
}


if($if_bl == NULL){
$request = new Request;
$request->category_id = $_POST['category'];
$request->text = $_POST['text'];
$request->phone = $phone;
$request->city_id = $city;
$request->street = $_POST['street'];
$request->hous_num = $_POST['num_hous'];
$request->office = $_POST['num_office'];
$request->date = date('Y-m-d H:i:s');
$request->username = $username;
$request->createuser_id = $createUser;
$request->status = $status;

if($request->save()){
$fix = new Fixing;
$fix->worker_id = 0;
$fix->request_id = $request->id;
$fix->date = date('Y-m-d H:i:s');
$fix->status = 0;
$fix->save();

$alert = Yii::app()->params['requestOK'];
}
else
$alert = Yii::app()->params['validateOff'];
}
else
$alert = Yii::app()->params['banedPhone'];
}
elseif(!empty($_POST['save']) && !empty($_GET['id']) && !Yii::app()->user->isGuest){
$request = Request::model()->find('id=:id AND createuser_id=:cid',
array(
':id'=>$_GET['id'],
':cid'=>Yii::app()->user->id
));
if($request != NULL){
Request::model()->updateAll(
array(
'category_id'=>$_POST['category'],
'text'=>$_POST['text'],
'street'=>$_POST['street'],
'hous_num'=>$_POST['num_hous'],
'office'=>$_POST['num_office'],
),

'id=:id',
array(':id'=>$request->id));
$alert = Yii::app()->params['UpdateSuccess'];
}
}

else
$alert = '';

if(!empty($_GET['id']) && !Yii::app()->user->isGuest)
$model = Request::model()->find('id=:id AND createuser_id=:cid',
array(
':id'=>$_GET['id'],
':cid'=>Yii::app()->user->id
));
else
$model = NULL;

$this->render('guestCreate',
array(
'alert'=>$alert,
'model'=>$model
));
}
public function actionAjax(){
if(!empty($_GET))
if($_GET['fl']=='delete' && count($_GET['checked'])>0 && Yii::app()->user->roles == User::ROLES_SUPER_ADMIN){
$criteria = new CDbCriteria();
$criteria->addInCondition('id', $_GET['checked']);

Request::model()->deleteAll($criteria);
}
elseif($_GET['fl']=='export' && count($_GET['checked'])>0){
$criteria = new CDbCriteria();
$criteria->addInCondition('id', $_GET['checked']);

$req = Request::model()->findAll($criteria);

$data = array();
$data[] = array(
'ID',
'Город',
'Категория',
'Описание',
'Работник',
'Статус',
'Заказчик',
'Телефон',
'Ф И О',
'Улица/Район',
'Дом/Объект',
'Квартира',
'Дата подачи',
'Дата закрепления',
'Дата завершения',
'Сумма',
'Проверка',
);

foreach($req as $unit)
$data[] = array(
$unit->id,
City::model()->getCity($unit->city_id),
Category::model()->getCategory($unit->category_id),
$unit->text,
Fixing::model()->getWorker($unit->id),
Request::model()->getStat($unit->status),
User::model()->getUser($unit->createuser_id),
$unit->phone,
$unit->username,
$unit->street,
$unit->hous_num,
$unit->office,
$unit->date,
Fixing::model()->getDate($unit->id),
$unit->date_end,
$unit->money,
Request::model()->getCheckedStatus($unit->checked),
);

Yii::import('application.extensions.phpexcel.JPhpExcel');
$xls = new JPhpExcel('UTF-8', false, 'Export-excel');
$xls->addArray($data);
$xls->generateXML();
exit;
}

if(Yii::app()->user->roles==User::ROLES_SUPER_ADMIN)
$CButton = array('class'=>'CButtonColumn');
else
$CButton = array(
'class'=>'CButtonColumn',
'template'=>'');

$model=new Request('search');

$this->render('admin',array(
'model'=>$model, 'CButton'=>$CButton, 'xls'=>$xls,
));

}
}







Спустя 14 минут, 56 секунд (15.03.2012 - 09:45) sharki написал(а):
stepan
Знаешь такой принцип "Разделяй и властвуй" ?

Было бы красивее, и практичнее на мой взгляд, вынести ключевые моменты твоего контроллера в отдельные классы, используя так же принцип композиции)

Спустя 32 минуты, 54 секунды (15.03.2012 - 10:18) TMake написал(а):
Цитата (sharki @ 15.03.2012 - 10:45)
Знаешь такой принцип "Разделяй и властвуй" ?
да изучал

Цитата (sharki @ 15.03.2012 - 10:45)
Было бы красивее, и практичнее на мой взгляд,

и где это ты увидел можно применить?

Спустя 10 минут, 10 секунд (15.03.2012 - 10:28) sharki написал(а):
Ну смотри, раз у тебя RequestController это контроллер, то я бы все реализации методов вынес в отдельные классы, конечно увеличивается кол-во классов, но зато появляется ясность, так же можно будет делать еще какие нибудь модификации, и вообще не касаться контроллера, и при расширении этих маленьких классов (создавать подклассы) нужно будет всего лишь в контроллере вызывать другой подкласс, даже этот способ можно было бы автоматизировать (пока можно без заморочек).

И я не говорю еще про неймспейсы, при их использовании можно вообще версионность замутить, просто поменять неймспейс, и вот уже совсем другая реализация тех самых вынесенных классов.

Спустя 1 час, 6 минут, 27 секунд (15.03.2012 - 11:35) TMake написал(а):
Цитата (sharki @ 15.03.2012 - 11:28)
то я бы все реализации методов вынес в отдельные классы

вот про это я думал уже - стоит ли???

Спустя 40 минут, 6 секунд (15.03.2012 - 12:15) sharki написал(а):
stepan
Если сайт так себе, да и не будешь им заниматься в будущем, расширять и т.п, то не надо smile.gif

А если делаешь для будущей серьезной модернизации, то стоит. Тебе же удобнее

Спустя 19 минут, 57 секунд (15.03.2012 - 12:35) glock18 написал(а):
Цитата (sharki @ 15.03.2012 - 09:15)
stepan
Если сайт так себе, да и не будешь им заниматься в будущем, расширять и т.п, то не надо smile.gif

А если делаешь для будущей серьезной модернизации, то стоит. Тебе же удобнее

я бы сказал - "если сайт тебе не нужен, то занимайся, конечно, такими заморочками". Выделить по классу еще для каждого экшена - ахтунг капут, какая ж там прозрачность. Эта ваша версионность, которая в реальной жизни почти никогда не нужна, делается простым наследованием контроллера в целом.

То что я лично считаю существенным, я уже Степану сказал.

Спустя 12 минут, 6 секунд (15.03.2012 - 12:47) TMake написал(а):
Цитата (sharki @ 15.03.2012 - 13:15)
Если сайт так себе, да и не будешь им заниматься в будущем

это заказ был - хотел узнать свои грехи

Цитата (glock18 @ 15.03.2012 - 13:35)
То что я лично считаю существенным, я уже Степану сказал.

огромное тебе спасибо - буду ковырять

Спустя 55 минут, 36 секунд (15.03.2012 - 13:43) sharki написал(а):
glock18
stepan
А можно тут написать что glock18 посоветовал) Интересно мнение эксперта smile.gif

Спустя 12 минут, 31 секунда (15.03.2012 - 13:55) TMake написал(а):
Цитата (sharki @ 15.03.2012 - 14:43)
А можно тут написать что glock18 посоветовал)

легко

пересмотреть определение уровня доступа
'expression'=>'Yii::app()->user->roles>='.User::ROLES_WORKER,

так как глянули в исходник yii оно обрабатывается через eval что плохо влияет на интерпретатор
'expression' => array('someclass', 'staticmethod')
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.