Знаю что очень наляписто сделал из-за того что сразу было не учтено в тз.
но лучше что бы сразу ткнули меня где я сделал каку.
Свернутый текст
<?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
Если сайт так себе, да и не будешь им заниматься в будущем, расширять и т.п, то не надо
А если делаешь для будущей серьезной модернизации, то стоит. Тебе же удобнее
Если сайт так себе, да и не будешь им заниматься в будущем, расширять и т.п, то не надо
А если делаешь для будущей серьезной модернизации, то стоит. Тебе же удобнее
Спустя 19 минут, 57 секунд (15.03.2012 - 12:35) glock18 написал(а):
Цитата (sharki @ 15.03.2012 - 09:15) |
stepan Если сайт так себе, да и не будешь им заниматься в будущем, расширять и т.п, то не надо А если делаешь для будущей серьезной модернизации, то стоит. Тебе же удобнее |
я бы сказал - "если сайт тебе не нужен, то занимайся, конечно, такими заморочками". Выделить по классу еще для каждого экшена - ахтунг капут, какая ж там прозрачность. Эта ваша версионность, которая в реальной жизни почти никогда не нужна, делается простым наследованием контроллера в целом.
То что я лично считаю существенным, я уже Степану сказал.
Спустя 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 посоветовал) Интересно мнение эксперта
stepan
А можно тут написать что glock18 посоветовал) Интересно мнение эксперта
Спустя 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')