Related
I am yiibie. What i am tying to do to upload videos, for that i am using Uploadmiltifiles extension and following this link http://www.yiiframework.com/extension/uploadmultifiles. I have followed every thing but when i upload a video file(.3gp file) i says "testingvideo.3gp" failed and upon submit it says "Video file cannot be blank" This is the code of my videoController which has the actionupload() function.
<?php
class VideoController extends RController
{
/**
* #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/admin';
/**
* #return array action filters
*/
public function filters()
{
return array(
// 'accessControl', // perform access control for CRUD operations
// 'postOnly + delete', // we only allow deletion via POST request
'rights',
);
}
/**
* 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', // allow all users to perform 'index' and 'view' actions
'actions'=>array('index','view'),
'users'=>array('*'),
),
array('allow', // allow authenticated user to perform 'create' and 'update' actions
'actions'=>array('create','update'),
'users'=>array('#'),
),
array('allow', // allow admin user to perform 'admin' and 'delete' actions
'actions'=>array('admin','delete'),
'users'=>array('admin'),
),
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)
{
$this->render('view',array(
'model'=>$this->loadModel($id),
));
}
/**
* Creates a new model.
* If creation is successful, the browser will be redirected to the 'view' page.
*/
public function actionCreate()
{
$model=new Video;
// Uncomment the following line if AJAX validation is needed
// $this->performAjaxValidation($model);
if(isset($_POST['Video']))
{
$model->attributes=$_POST['Video'];
if($model->save())
$this->redirect(array('view','id'=>$model->id));
}
$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);
// Uncomment the following line if AJAX validation is needed
// $this->performAjaxValidation($model);
if(isset($_POST['Video']))
{
$model->attributes=$_POST['Video'];
if($model->save())
$this->redirect(array('view','id'=>$model->id));
}
$this->render('update',array(
'model'=>$model,
));
}
public function actionUpload()
{
Yii::import("ext.EAjaxUpload.qqFileUploader");
$folder=Yii::getPathOfAlias('webroot').'/upload/';// folder for uploaded files
$allowedExtensions = array("jpg","jpeg","gif","exe","mov","mp4",);//array("jpg","jpeg","gif","exe","mov" and etc...
$sizeLimit = 100 * 1024 * 1024;// maximum file size in bytes
$uploader = new qqFileUploader($allowedExtensions, $sizeLimit);
$result = $uploader->handleUpload($folder);
$return = htmlspecialchars(json_encode($result), ENT_NOQUOTES);
$fileSize=filesize($folder.$result['filename']);//GETTING FILE SIZE
$fileName=$result['filename'];//GETTING FILE NAME
//$img = CUploadedFile::getInstance($model,'image');
echo $return;// it's array
}
/**
* 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)
{
// we only allow deletion via POST request
$this->loadModel($id)->delete();
// 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()
{
$dataProvider=new CActiveDataProvider('Video');
$this->render('index',array(
'dataProvider'=>$dataProvider,
));
}
/**
* Manages all models.
*/
public function actionAdmin()
{
$model=new Video('search');
$model->unsetAttributes(); // clear any default values
if(isset($_GET['Video']))
$model->attributes=$_GET['Video'];
$this->render('admin',array(
'model'=>$model,
));
}
/**
* 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 $id the ID of the model to be loaded
* #return Video the loaded model
* #throws CHttpException
*/
public function loadModel($id)
{
$model=Video::model()->findByPk($id);
if($model===null)
throw new CHttpException(404,'The requested page does not exist.');
return $model;
}
/**
* Performs the AJAX validation.
* #param Video $model the model to be validated
*/
protected function performAjaxValidation($model)
{
if(isset($_POST['ajax']) && $_POST['ajax']==='video-form')
{
echo CActiveForm::validate($model);
Yii::app()->end();
}
}
}
This is the code of my Video view file(_form.php)
<?php
/* #var $this VideoController */
/* #var $model Video */
/* #var $form BSActiveForm */
?>
<?php $form=$this->beginWidget('bootstrap.widgets.BsActiveForm', array(
'id'=>'video-form',
// Please note: When you enable ajax validation, make sure the corresponding
// controller action is handling ajax validation correctly.
// There is a call to performAjaxValidation() commented in generated controller code.
// See class documentation of CActiveForm for details on this.
'enableAjaxValidation'=>false,
)); ?>
<p class="help-block">Fields with <span class="required">*</span> are required.</p>
<?php echo $form->errorSummary($model); ?>
<?php //echo $form->errorSummary($model); ?>
<?php echo $form->labelEx($model,'user_id'); ?>
<?php
$this->widget('ext.select2.ESelect2',array(
'name'=>'Video[user_id]',
'data'=>CHtml::listData(User::model()->findAll(), 'id', 'username'), //the whole available list
'htmlOptions'=>array(
'placeholder'=>' search User name?',
//'options'=>$options, //the selected values
//'multiple'=>'multiple',
'style'=>'width:530px',
),
));
?> <br><br>
<?php
$this->widget('ext.EAjaxUpload.EAjaxUpload',
array(
'id'=>'uploadFile',
'config'=>array(
'action'=>Yii::app()->createUrl('site/upload'),
'allowedExtensions'=>array("jpg","jpeg","gif","exe","mov","mp4","txt","doc","pdf","xls","3gp","php","ini","avi","rar","zip","png"),//array("jpg","jpeg","gif","exe","mov" and etc...
'sizeLimit'=>1000*1024*1024,// maximum file size in bytes
'minSizeLimit'=>1*1024,
'auto'=>true,
'multiple' => true,
'onComplete'=>"js:function(id, fileName, responseJSON){ alert(fileName); }",
'messages'=>array(
'typeError'=>"{file} has invalid extension. Only {extensions} are allowed.",
'sizeError'=>"{file} is too large, maximum file size is {sizeLimit}.",
'minSizeError'=>"{file} is too small, minimum file size is {minSizeLimit}.",
'emptyError'=>"{file} is empty, please select files again without it.",
'onLeave'=>"The files are being uploaded, if you leave now the upload will be cancelled."
),
'showMessage'=>"js:function(message){ alert(message); }"
)
));
?>
<?php echo $form->errorSummary($model); ?>
<?php //echo $form->textFieldControlGroup($model,'filename',array('maxlength'=>45)); ?>
<?php //echo $form->textFieldControlGroup($model,'user_id'); ?>
<?php echo BsHtml::submitButton('Submit', array('color' => BsHtml::BUTTON_COLOR_PRIMARY)); ?>
<?php $this->endWidget(); ?>
And this is the code of my config/main.php
<?php
// uncomment the following to define a path alias
// Yii::setPathOfAlias('local','path/to/local-folder');
// This is the main Web application configuration. Any writable
// CWebApplication properties can be configured here.
return array(
'theme' => 'bootstrap',
'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',
'name'=>'emergency response system',
// preloading 'log' component
'preload'=>array('log'),
'aliases' => array(
'bootstrap' => 'ext.bootstrap'),
// autoloading model and component classes
'import'=>array(
'application.models.*',
'application.components.*',
'bootstrap.behaviors.*',
'bootstrap.helpers.*',
'bootstrap.widgets.*',
'application.modules.user.models.*',
'application.modules.user.components.*',
'application.modules.rights.*',
'application.modules.rights.components.*',
'application.extensions.EAjaxUpload.*',//this is for uploading of video
),
'modules'=>array(
// uncomment the following to enable the Gii tool
'gii'=>array(
'class'=>'system.gii.GiiModule',
'password'=>'ers',
'generatorPaths' => array(
'bootstrap.gii', ),
// If removed, Gii defaults to localhost only. Edit carefully to taste.
'ipFilters'=>array('127.0.0.1','::1'),
),
'user' => array(
'tableUsers' => 'user',
'tableProfiles' => 'profiles',
'tableProfileFields' => 'profiles_fields',
// # encrypting method (php hash function)
// 'hash' => 'md5',
//
// # send activation email
// 'sendActivationMail' => true,
//
// # allow access for non-activated users
// 'loginNotActiv' => false,
//
// # activate user on registration (only sendActivationMail = false)
// 'activeAfterRegister' => false,
//
// # automatically login from registration
// 'autoLogin' => true,
//
// # registration path
// 'registrationUrl' => array('/user/registration'),
//
// # recovery password path
// 'recoveryUrl' => array('/user/recovery'),
//
// # login form path
// 'loginUrl' => array('/user/login'),
//
// # page after login
// 'returnUrl' => array('/user/profile'),
//
// # page after logout
// 'returnLogoutUrl' => array('/user/login'),
),
'rights'=>array(
'install'=>true,
// 'superuserName'=>'Admin', // Name of the role with super user privileges.
// 'authenticatedName'=>'Authenticated', // Name of the authenticated user role.
// 'userIdColumn'=>'id', // Name of the user id column in the database.
// 'userNameColumn'=>'username', // Name of the user name column in the database.
// 'enableBizRule'=>true, // Whether to enable authorization item business rules.
// 'enableBizRuleData'=>true, // Whether to enable data for business rules.
// 'displayDescription'=>true, // Whether to use item description instead of name.
// 'flashSuccessKey'=>'RightsSuccess', // Key to use for setting success flash messages.
// 'flashErrorKey'=>'RightsError', // Key to use for setting error flash messages.
// 'baseUrl'=>'/rights', // Base URL for Rights. Change if module is nested.
// 'layout'=>'rights.views.layouts.main', // Layout to use for displaying Rights.
// 'appLayout'=>'application.views.layouts.main', // Application layout.
// 'cssFile'=>'rights.css', // Style sheet file to use for Rights.
// 'install'=>false, // Whether to enable installer.
// 'debug'=>false,
),
),
// application components
'components'=>array(
'user'=>array(
'class'=>'RWebUser',
// enable cookie-based authentication
'allowAutoLogin'=>true,
'loginUrl'=>array('/user/login'),
),
'authManager'=>array(
'class'=>'RDbAuthManager',
'connectionID'=>'db',
'defaultRoles'=>array('Authenticated', 'Guest'),
// 'itemTable'=>'authitem',
// 'itemChildTable'=>'authitemchild',
// 'assignmentTable'=>'authassignment',
// 'rightsTable'=>'rights',
),
'bootstrap' => array(
'class' => 'bootstrap.components.BsApi',),
// uncomment the following to enable URLs in path-format
'urlManager'=>array(
'urlFormat'=>'path',
'showScriptName'=>false,
'rules'=>array(
//'<controller:\w+>'=>'<controller>/list',
'<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
'<controller:\w+>/<id:\d+>/<title>'=>'<controller>/view',
'<controller:\w+>/<id:\d+>'=>'<controller>/view',
),
),
// database settings are configured in database.php
// 'db'=>require(dirname(__FILE__).'/database.php'),
'db'=>array(
'connectionString' => 'mysql:host=localhost;dbname=response_system',
'emulatePrepare' => true,
'username' => 'root',
'password' => '',
'charset' => 'utf8',
),
'errorHandler'=>array(
// use 'site/error' action to display errors
'errorAction'=>'site/error',
),
'log'=>array(
'class'=>'CLogRouter',
'routes'=>array(
array(
'class'=>'CFileLogRoute',
'levels'=>'error, warning',
),
// uncomment the following to show log messages on web pages
array(
'class'=>'CWebLogRoute',
),
),
),
),
// application-level parameters that can be accessed
// using Yii::app()->params['paramName']
'params'=>array(
// this is used in contact page
'adminEmail'=>'webmaster#example.com',
),
);
And this the model of video
<?php
/**
* This is the model class for table "video".
*
* The followings are the available columns in table 'video':
* #property integer $id
* #property string $filename
* #property integer $user_id
*
* The followings are the available model relations:
* #property User $user
*/
class Video extends CActiveRecord
{
/**
* Returns the static model of the specified AR class.
* #param string $className active record class name.
* #return Video the static model class
*/
public static function model($className=__CLASS__)
{
return parent::model($className);
}
/**
* #return string the associated database table name
*/
public function tableName()
{
return 'video';
}
/**
* #return array validation rules for model attributes.
*/
public function rules()
{
// NOTE: you should only define rules for those attributes that
// will receive user inputs.
return array(
array('filename, user_id', 'required'),
array('user_id', 'numerical', 'integerOnly'=>true),
array('filename', 'length', 'max'=>45),
// The following rule is used by search().
// Please remove those attributes that should not be searched.
array('id, filename, user_id', 'safe', 'on'=>'search'),
);
}
/**
* #return array relational rules.
*/
public function relations()
{
// NOTE: you may need to adjust the relation name and the related
// class name for the relations automatically generated below.
return array(
'user' => array(self::BELONGS_TO, 'User', 'user_id'),
);
}
/**
* #return array customized attribute labels (name=>label)
*/
public function attributeLabels()
{
return array(
'id' => 'ID',
'filename' => 'Filename',
'user_id' => 'User',
);
}
/**
* Retrieves a list of models based on the current search/filter conditions.
* #return CActiveDataProvider the data provider that can return the models based on the search/filter conditions.
*/
public function search()
{
// Warning: Please modify the following code to remove attributes that
// should not be searched.
$criteria=new CDbCriteria;
$criteria->compare('id',$this->id);
$criteria->compare('filename',$this->filename,true);
$criteria->compare('user_id',$this->user_id);
return new CActiveDataProvider($this, array(
'criteria'=>$criteria,
));
}
}
Please help me with this, thank you.
It seems that your html form doesn't have the enctype attribute so $_FILES is empty. Try to add:
<?php $form=$this->beginWidget('bootstrap.widgets.BsActiveForm', array(
'id'=>'video-form',
'enableAjaxValidation'=>false,
'htmlOptions'=>array('enctype'=>'multipart/form-data'),
)); ?>
the view file needs to be like this.
<?php
/* #var $this VideoController */
/* #var $model Video */
/* #var $form BSActiveForm */
?>
<?php $form=$this->beginWidget('bootstrap.widgets.BsActiveForm', array(
'id'=>'video-form',
// Please note: When you enable ajax validation, make sure the corresponding
// controller action is handling ajax validation correctly.
// There is a call to performAjaxValidation() commented in generated controller code.
// See class documentation of CActiveForm for details on this.
'enableAjaxValidation'=>false,
)); ?>
<p class="help-block">Fields with <span class="required">*</span> are required.</p>
<?php echo $form->errorSummary($model); ?>
<?php //echo $form->errorSummary($model); ?>
<?php echo $form->labelEx($model,'user_id'); ?>
<?php
$this->widget('ext.select2.ESelect2',array(
'name'=>'Video[user_id]',
'data'=>CHtml::listData(User::model()->findAll(), 'id', 'username'), //the whole available list
'htmlOptions'=>array(
'placeholder'=>' search User name?',
//'options'=>$options, //the selected values
//'multiple'=>'multiple',
'style'=>'width:530px',
),
));
?> <br><br>
<?php
$this->widget('ext.EAjaxUpload.EAjaxUpload',
array(
'id'=>'uploadFile',
'config'=>array(
'action'=>Yii::app()->createUrl('video/upload'),//add your controller name here
'allowedExtensions'=>array("jpg","jpeg","gif","exe","mov","mp4","txt","doc","pdf","xls","3gp","php","ini","avi","rar","zip","png"),//array("jpg","jpeg","gif","exe","mov" and etc...
'sizeLimit'=>1000*1024*1024,// maximum file size in bytes
'minSizeLimit'=>1*1024,
'auto'=>true,
'multiple' => true,
'onComplete'=>"js:function(id, fileName, responseJSON){ alert(fileName); }",
'messages'=>array(
'typeError'=>"{file} has invalid extension. Only {extensions} are allowed.",
'sizeError'=>"{file} is too large, maximum file size is {sizeLimit}.",
'minSizeError'=>"{file} is too small, minimum file size is {minSizeLimit}.",
'emptyError'=>"{file} is empty, please select files again without it.",
'onLeave'=>"The files are being uploaded, if you leave now the upload will be cancelled."
),
'showMessage'=>"js:function(message){ alert(message); }"
)
));
?>
<?php echo $form->errorSummary($model); ?>
<?php //echo $form->textFieldControlGroup($model,'filename',array('maxlength'=>45)); ?>
<?php //echo $form->textFieldControlGroup($model,'user_id'); ?>
<?php echo BsHtml::submitButton('Submit', array('color' => BsHtml::BUTTON_COLOR_PRIMARY)); ?>
<?php $this->endWidget(); ?>
and controller needs to be like this,
<?php
class VideoController extends RController
{
/**
* #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/admin';
/**
* #return array action filters
*/
public function filters()
{
return array(
// 'accessControl', // perform access control for CRUD operations
// 'postOnly + delete', // we only allow deletion via POST request
'rights',
);
}
/**
* 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', // allow all users to perform 'index' and 'view' actions
'actions'=>array('index','view'),
'users'=>array('*'),
),
array('allow', // allow authenticated user to perform 'create' and 'update' actions
'actions'=>array('create','update'),
'users'=>array('#'),
),
array('allow', // allow admin user to perform 'admin' and 'delete' actions
'actions'=>array('admin','delete'),
'users'=>array('admin'),
),
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)
{
$this->render('view',array(
'model'=>$this->loadModel($id),
));
}
/**
* Creates a new model.
* If creation is successful, the browser will be redirected to the 'view' page.
*/
public function actionCreate()
{
$model=new Video;
// Uncomment the following line if AJAX validation is needed
// $this->performAjaxValidation($model);
if(isset($_POST['Video']))
{
$model->attributes=$_POST['Video'];
Yii::import("ext.EAjaxUpload.qqFileUploader");
$folder=Yii::getPathOfAlias('webroot').'/..video/';// folder for uploaded files
$allowedExtensions = array("jpg","jpeg","gif","exe","mov","mp4","txt","doc","pdf","xls","3gp","php","ini","avi","rar","zip","png");//array("jpg","jpeg","gif","exe","mov" and etc...
$sizeLimit = 100 * 1024 * 1024;// maximum file size in bytes
$uploader = new qqFileUploader($allowedExtensions, $sizeLimit);
$result = $uploader->handleUpload($folder);
$return = htmlspecialchars(json_encode($result), ENT_NOQUOTES);
$fileSize=filesize($folder.$result['filename']);//GETTING FILE SIZE
$fileName=$result['filename'];//GETTING FILE NAME
//$img = CUploadedFile::getInstance($model,'image');
echo $return;// it's array
if($model->save())
$this->redirect(array('view','id'=>$model->id));
}
$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);
// Uncomment the following line if AJAX validation is needed
// $this->performAjaxValidation($model);
if(isset($_POST['Video']))
{
$model->attributes=$_POST['Video'];
if($model->save())
$this->redirect(array('view','id'=>$model->id));
}
$this->render('update',array(
'model'=>$model,
));
}
/**
* 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)
{
// we only allow deletion via POST request
$this->loadModel($id)->delete();
// 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()
{
$dataProvider=new CActiveDataProvider('Video');
$this->render('index',array(
'dataProvider'=>$dataProvider,
));
}
/**
* Manages all models.
*/
public function actionAdmin()
{
$model=new Video('search');
$model->unsetAttributes(); // clear any default values
if(isset($_GET['Video']))
$model->attributes=$_GET['Video'];
$this->render('admin',array(
'model'=>$model,
));
}
public function actionUpload()
{
Yii::import("ext.EAjaxUpload.qqFileUploader");
$folder=Yii::getPathOfAlias('webroot').'/video/';// folder for uploaded files
$allowedExtensions = array();//array("jpg","jpeg","gif","exe","mov" and etc...
$sizeLimit = 100 * 1024 * 1024;// maximum file size in bytes
$uploader = new qqFileUploader($allowedExtensions, $sizeLimit);
$result = $uploader->handleUpload($folder);
$return = htmlspecialchars(json_encode($result), ENT_NOQUOTES);
$fileSize=filesize($folder.$result['filename']);//GETTING FILE SIZE
$fileName=$result['filename'];//GETTING FILE NAME
//$img = CUploadedFile::getInstance($model,'image');
echo $return;// it's array
}
/**
* 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 $id the ID of the model to be loaded
* #return Video the loaded model
* #throws CHttpException
*/
public function loadModel($id)
{
$model=Video::model()->findByPk($id);
if($model===null)
throw new CHttpException(404,'The requested page does not exist.');
return $model;
}
/**
* Performs the AJAX validation.
* #param Video $model the model to be validated
*/
protected function performAjaxValidation($model)
{
if(isset($_POST['ajax']) && $_POST['ajax']==='video-form')
{
echo CActiveForm::validate($model);
Yii::app()->end();
}
}
}
I am working on a job site,And want to show only the jobs posted by a particular user in cgridview.My actuall aim is to authenticate the user so that only jobs posted by him/her will be visible in cgridview.I have done the following stuff,but not working.
In controller:
public function actionViewJob() {
$user_id = Yii::app()->session['user_id'];
/* For User Authentication */
if (Yii::app()->user->getId() === null)
$this->redirect(array('site/login'));
/* For User Authentication */
/* Have tried the following codes to filter */
$model= ViewJob::model()->findAll(array(
'select'=>'*',"condition"=>"user_id='$user_id'",
));
// $model=ViewJob::model()->findByAttributes(array('user_id'=>Yii::app()->user->id));
// $model = ViewJob::model()->findAll("user_id=$user_id");
$model = new Viewjob('search');
$params = array('model' => $model,
);
$this->render('viewjob', $params);
}
In view
$this->widget('zii.widgets.grid.CGridView', array(
'dataProvider' =>$model->search()
// 'filter' => $model, /* not using this option ,so commented it */
))
In model
// Do I really Need This Function //
public function search() {
$criteria = new CDbCriteria;
$criteria->compare('user_id', $this->user_id, true);
return new CActiveDataProvider('viewjob', array(
'criteria'=>$criteria,
));
},,
What am I doing wrong here.It is still fetching all the available rows in table.
You define $model 3 times:
$model= ViewJob::model()->findAll(array(
'select'=>'*',"condition"=>"user_id='$user_id'",
));
Then
$model = new Viewjob('search');
And
'dataProvider' =>$model->search()
Choose one that you need, better last. And add to controller
$model->user_id = $user_id
It will works.
Create new CDbCriteria object and add condition using it and pass it to model.
In Controller:
public function actionViewJob() {
$criteria = new CDbCriteria ();
$criteria->condition = 'user_id=' . Yii::app()->user->id;
$model = ViewJob::model()->findAll($criteria);
$params = array('model' => $model);
$this->render('viewjob', $params);
}
And in View, simply:
$this->widget('zii.widgets.grid.CGridView', array(
'dataProvider' =>$model
Also for use Authentication, in your controller you don't need to check, if user has the user id, simply add access rules, which will automatically redirect user to the login page to view the job and once they are logged-in, will return them to the same page. So, add this at the top of our controller..
class YourController extends Controller {
public function filters() {
return array(
'accessControl', // perform access control
);
}
/**
* 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', // allow all users to perform 'index' and 'view' actions
'actions' => array('index', 'view'),
'users' => array('*'),
),
array('allow', // allow authenticate user actions
'actions' => array('viewjob'),
'users' => array('#'),
),
array('deny', // deny all users
'users' => array('*'),
),
);
}
I am new to Yii. I am displaying some data in my view. I have added filters in my View, But it seems not working. Please help me solving this.
My View:
<?php
/* #var $this NimsoftHostsDetailsController */
/* #var $model NimsoftHostsDetails */
$this->breadcrumbs=array(
'Nimsoft Hosts Details'=>array('index'),
$model->id,
);
$this->menu=array(
array('label'=>'List NimsoftHostsDetails', 'url'=>array('index')),
array('label'=>'Create NimsoftHostsDetails', 'url'=>array('create')),
array('label'=>'Update NimsoftHostsDetails', 'url'=>array('update', 'id'=>$model->id)),
array('label'=>'Delete NimsoftHostsDetails', 'url'=>'#', 'linkOptions'=>array('submit'=>array('delete','id'=>$model->id),'confirm'=>'Are you sure you want to delete this item?')),
array('label'=>'Manage NimsoftHostsDetails', 'url'=>array('admin')),
);
?>
<h1>View NimsoftHostsDetails - </h1><h3><?php echo "Host Name - ".$host_name;?></h3>
<?php
if(Yii::app()->user->hasFlash('error'))
{
echo Yii::app()->user->getFlash('error');
}
?>
<!--<a href="<?php //echo $this->createUrl('/NimsoftHostsDetails/create?id='.$host_id);?>" title="Add Date Entry" class="btn btn-primary circle_ok" style="text-decoration: none;" >Add Date Entry</a>-->
<a href="<?php echo $this->createUrl('/Nimsoft/search_host1?id='.$cust_id);?>" title="Back" class="btn btn-primary circle_ok" style="text-decoration: none;" >Back</a>
<?php /*$this->widget('zii.widgets.CListView', array(
'dataProvider'=>$dataProvider,
'itemView'=>'_view',
)); */?>
<div class="form">
<div class="row">
<div style="float:left;"> </div>
<?php
$host_id = $host_id;
$form=$this->beginWidget('CActiveForm', array(
'id'=>'nimsoft-hosts-details-form',
// Please note: When you enable ajax validation, make sure the corresponding
// controller action is handling ajax validation correctly.
// There is a call to performAjaxValidation() commented in generated controller code.
// See class documentation of CActiveForm for details on this.
'enableAjaxValidation'=>false,
)); ?>
<p class="note">Fields with <span class="required">*</span> are required.</p>
<div style="float:left;"> </div>
<div style="float:left;"><?php //echo $form->errorSummary($model); ?>
<?php echo $form->labelEx($model,'host_start_date'); ?>
<?php
Yii::import('application.extensions.CJuiDateTimePicker.CJuiDateTimePicker');
$this->widget('CJuiDateTimePicker', array(
'attribute' => 'host_start_date',
'language' => '',
'model' => $model,
'options' => array(
'mode' => 'focus',
'dateFormat' => 'yy-mm-dd',
'minDate'=>'0',
'showAnim' => 'slideDown',
),
'htmlOptions' => array(
'style'=>'height:20px;',
'value' => $host_start_date,
),
));
?>
<?php echo $form->error($model,'host_start_date'); ?></div>
<div style="float:left;"> </div>
<div style="float:left;"><?php echo $form->labelEx($model,'host_end_date'); ?>
<?php
Yii::import('application.extensions.CJuiDateTimePicker.CJuiDateTimePicker');
$this->widget('CJuiDateTimePicker', array(
'attribute' => 'host_end_date',
'language' => '',
'model' => $model,
'options' => array(
'mode' => 'focus',
'dateFormat' => 'yy-mm-dd',
'minDate'=>'0',
'showAnim' => 'slideDown',
),
'htmlOptions' => array(
'style'=>'height:20px;',
'value' => $host_end_date,
),
));
?>
<?php echo $form->error($model,'host_end_date'); ?>
</div>
</div>
<?php echo CHtml::submitButton($model->isNewRecord ? 'Create' : 'Save'); ?>
<?php $this->endWidget(); ?>
</div>
<?php
$obj=$this->widget('zii.widgets.grid.CGridView', array(
'dataProvider'=>$dataProvider,
////'afterAjaxUpdate'=>'\'changeTRColor()\'',
//'itemView'=>'_view',
'filter'=>$model,
'columns'=>array(
array( // display 'create_time' using an expression
'name'=>'host_start_date',
'value'=>'$data->host_start_date',
),
array(
'name'=>'host_end_date',
'value'=>'$data->host_end_date',
),
array(
'class'=>'CButtonColumn',
'template'=>'{update}{delete}',
)
),
));
?>
<?php //echo Yii::app()->user->getFlash('error'); ?>
My Controller:
<?php
class NimsoftHostsDetailsController 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/ticket_console';
/**
* #return array action filters
*/
public function filters()
{
return array(
'accessControl', // perform access control for CRUD operations
'postOnly + delete', // we only allow deletion via POST request
);
}
/**
* 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', // allow all users to perform 'index' and 'view' actions
'actions'=>array('index','view'),
'users'=>array('*'),
),
array('allow', // allow authenticated user to perform 'create' and 'update' actions
'actions'=>array('create','update'),
'users'=>array('#'),
),
array('allow', // allow admin user to perform 'admin' and 'delete' actions
'actions'=>array('admin','delete'),
'users'=>array('admin'),
),
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)
{
$host_id=$id;
$model1=new NimsoftHostsDetails;
$detail = NimsoftHostsDetails::model()->findAllByAttributes(array('host_id'=>$id));
if(isset($_POST['NimsoftHostsDetails']))
{
$model1->attributes = $_POST['NimsoftHostsDetails'];
$model1->host_id=$id;
/*$model=new NimsoftHostsDetails;
$model->attributes=$_POST['NimsoftHostsDetails'];
$model->host_id=$id;
$criteria = new CDbCriteria;
$date_details = NimsoftHostsDetails::model()->findAllByAttributes(array('host_start_date'=>$model->host_start_date,'host_end_date'=>$model->host_end_date,'host_id'=>$model->host_id));
if($date_details)
{echo "Hi";
//Yii::app()->user->setFlash('error', "DATA already present, Please Enter different Date");
//$this->render('view',array('message'=>"DATA already present, Please Enter different Date",'host_id'=>$model->host_id));
die();
}
$criteria = new CDbCriteria;
$date_details = NimsoftHostsDetails::model()->findAllByAttributes(array('host_start_date'=>$model->host_end_date,'host_id'=>$model->host_id));
if($date_details)
{
Yii::app()->user->setFlash('a', "The End date ".$model->host_end_date." is already mentioned as a start date");
//$this->render('exist',array('message'=>"The End date ".$model->host_end_date." is already mentioned as a start date",'host_id'=>$model->host_id));
die();
}
if($model->host_start_date == $model->host_end_date)
{
Yii::app()->user->setFlash('s', "Both dates same, Please Enter different Date");
//$this->render('exist',array('message'=>"Both dates same, Please Enter different Date",'host_id'=>$model->host_id));
die();
}*/
if($model1->save())
$this->redirect(array('view','id'=>$model1->host_id));
}
$criteria = new CDbCriteria();
$criteria->condition = "host_id = '$id'";
$details = NimsoftHostsDetails::model()->findAll($criteria);
$model=new NimsoftHost;
$detail2 = NimsoftHost::model()->findAllByAttributes(array('host_id'=>$id));
foreach($detail2 as $val)
{
$name=$val->host_name;
$id=$val->host_id;
$cust_id=$val->host_customer_id;
}
$dataProvider=new CActiveDataProvider('NimsoftHostsDetails',array(
'criteria' => $criteria,));
$this->render('view',array(
'dataProvider'=>$dataProvider,
'host_name'=>$name,
'host_id'=>$id,
'cust_id'=>$cust_id,'model'=>$model1
));
}
/**
* Creates a new model.
* If creation is successful, the browser will be redirected to the 'view' page.
*/
public function actionCreate($id)
{
$model=new NimsoftHostsDetails;
$host_id=$id;
// Uncomment the following line if AJAX validation is needed
// $this->performAjaxValidation($model);
if(isset($_POST['NimsoftHostsDetails']))
{
$model->attributes=$_POST['NimsoftHostsDetails'];
$model->host_id=$id;
$criteria = new CDbCriteria;
$date_details = NimsoftHostsDetails::model()->findAllByAttributes(array('host_start_date'=>$model->host_start_date,'host_end_date'=>$model->host_end_date,'host_id'=>$model->host_id));
if($date_details)
{
$this->render('exist',array('message'=>"DATA already present, Please Enter different Date",'host_id'=>$model->host_id));
die();
}
$criteria = new CDbCriteria;
$date_details = NimsoftHostsDetails::model()->findAllByAttributes(array('host_start_date'=>$model->host_end_date,'host_id'=>$model->host_id));
if($date_details)
{
$this->render('exist',array('message'=>"The End date ".$model->host_end_date." is already mentioned as a start date",'host_id'=>$model->host_id));
die();
}
if($model->host_start_date == $model->host_end_date)
{
$this->render('exist',array('message'=>"Both dates same, Please Enter different Date",'host_id'=>$model->host_id));
die();
}
if($model->save())
$this->redirect(array('view','id'=>$model->host_id));
}
$this->render('create',array(
'model'=>$model,
'host_id'=>$host_id,
));
}
/**
* 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);
// Uncomment the following line if AJAX validation is needed
// $this->performAjaxValidation($model);
if(isset($_POST['NimsoftHostsDetails']))
{
$model->attributes=$_POST['NimsoftHostsDetails'];
if($model->save())
$this->redirect(array('view','id'=>$model->host_id));
}
$this->render('update',array(
'model'=>$model,
));
}
/**
* 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)
{
$this->loadModel($id)->delete();
// 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'));
}
/**
* Lists all models.
*/
public function actionIndex()
{
$dataProvider=new CActiveDataProvider('NimsoftHostsDetails');
$this->render('index',array(
'dataProvider'=>$dataProvider,
));
}
/**
* Manages all models.
*/
public function actionAdmin()
{
$model=new NimsoftHostsDetails('search');
$model->unsetAttributes(); // clear any default values
if(isset($_GET['NimsoftHostsDetails']))
$model->attributes=$_GET['NimsoftHostsDetails'];
$this->render('admin',array(
'model'=>$model,
));
}
/**
* 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 $id the ID of the model to be loaded
* #return NimsoftHostsDetails the loaded model
* #throws CHttpException
*/
public function loadModel($id)
{
$model=NimsoftHostsDetails::model()->findByPk($id);
if($model===null)
throw new CHttpException(404,'The requested page does not exist.');
return $model;
}
/**
* Performs the AJAX validation.
* #param NimsoftHostsDetails $model the model to be validated
*/
protected function performAjaxValidation($model)
{
if(isset($_POST['ajax']) && $_POST['ajax']==='nimsoft-hosts-details-form')
{
echo CActiveForm::validate($model);
Yii::app()->end();
}
}
}
My Model:
<?php
/**
* This is the model class for table "mst_nimsoft_hosts_details".
*
* The followings are the available columns in table 'mst_nimsoft_hosts_details':
* #property integer $id
* #property integer $host_id
* #property string $host_start_date
* #property string $host_end_date
*/
class NimsoftHostsDetails extends CActiveRecord
{
/**
* #return string the associated database table name
*/
public function tableName()
{
return 'mst_nimsoft_hosts_details';
}
/**
* #return array validation rules for model attributes.
*/
public function rules()
{
// NOTE: you should only define rules for those attributes that
// will receive user inputs.
return array(
array('host_start_date, host_end_date', 'required'),
//array('host_start_date','date_validate'),
array('host_start_date, host_end_date', 'date','format'=>array('yyyy-MM-dd H:m','yyyy-MM-dd H:m')),
array('host_end_date','compare','compareAttribute'=>'host_start_date','operator'=>'>', 'allowEmpty'=>false,'message'=>'{attribute} must be greater than "{compareValue}".'),
//array('host_start_date,host_end_date', 'unique','message'=>'HOST Date already exists!'),
// The following rule is used by search().
// #todo Please remove those attributes that should not be searched.
array('host_start_date, host_end_date', 'safe', 'on'=>'search'),
);
}
/**
* #return array relational rules.
*/
public function relations()
{
// NOTE: you may need to adjust the relation name and the related
// class name for the relations automatically generated below.
return array(
);
}
/**
* #return array customized attribute labels (name=>label)
*/
public function attributeLabels()
{
return array(
'id' => 'ID',
'host_id' => 'Host',
'host_start_date' => 'Host Start Date',
'host_end_date' => 'Host End Date',
);
}
public function date_validate($attribute)
{
$this->host_start_date;
$this->host_end_date;
$model=new NimsoftHostsDetails;
$model->attributes=$_POST['NimsoftHostsDetails'];
$model->host_id=$id;
$criteria = new CDbCriteria;
$date_details = NimsoftHostsDetails::model()->findAllByAttributes(array('host_start_date'=>$this->host_start_date,'host_end_date'=>$this->host_end_date,'host_id'=>$model->host_id));
if($date_details)
{
$this->addError($attribute, 'DATA already present, Please Enter different Date');
}
$criteria = new CDbCriteria;
$date_details = NimsoftHostsDetails::model()->findAllByAttributes(array('host_start_date'=>$model->host_end_date,'host_id'=>$model->host_id));
if($date_details)
{
Yii::app()->user->setFlash('a', "The End date ".$model->host_end_date." is already mentioned as a start date");
//$this->render('exist',array('message'=>"The End date ".$model->host_end_date." is already mentioned as a start date",'host_id'=>$model->host_id));
die();
}
if($model->host_start_date == $model->host_end_date)
{
Yii::app()->user->setFlash('s', "Both dates same, Please Enter different Date");
//$this->render('exist',array('message'=>"Both dates same, Please Enter different Date",'host_id'=>$model->host_id));
die();
}
}
/**
* Retrieves a list of models based on the current search/filter conditions.
*
* Typical usecase:
* - Initialize the model fields with values from filter form.
* - Execute this method to get CActiveDataProvider instance which will filter
* models according to data in model fields.
* - Pass data provider to CGridView, CListView or any similar widget.
*
* #return CActiveDataProvider the data provider that can return the models
* based on the search/filter conditions.
*/
public function search()
{
// #todo Please modify the following code to remove attributes that should not be searched.
$criteria=new CDbCriteria;
$criteria->compare('id',$this->id);
$criteria->compare('host_id',$this->host_id);
$criteria->compare('host_start_date',$this->host_start_date,true);
$criteria->compare('host_end_date',$this->host_end_date,true);
return new CActiveDataProvider($this, array(
'criteria'=>$criteria,
));
}
/**
* Returns the static model of the specified AR class.
* Please note that you should have this exact method in all your CActiveRecord descendants!
* #param string $className active record class name.
* #return NimsoftHostsDetails the static model class
*/
public static function model($className=__CLASS__)
{
return parent::model($className);
}
}
My view displays data, but in filtering part, If I input any text, its does not return anything. Please help me. Thanks in advance.
make sure that the values you are using in your filter goes inside your model
public function search()
{
// #todo Please modify the following code to remove attributes that should not be searched.
$criteria=new CDbCriteria;
$criteria->compare('id',$this->id);
$criteria->compare('host_id',$this->host_id);
$criteria->compare('host_start_date',$this->host_start_date,true);
$criteria->compare('host_end_date',$this->host_end_date,true);
return new CActiveDataProvider($this, array(
'criteria'=>$criteria,
));
}
i'm having a hard time to read your code. So what field did you add to use as filter? is it by default included in your model?
I am new to Yii. I have a view which inputs host_start_date and host_end_date. While entering these dates, it must be validated. Validation Rules are as follows:
Both date_time must not be same
There can be two same start date but the time should be different
If start date_time is a and end_date_time is b, no other entries
must be permitted inside this limit
If an end_date_time is a
start_date_time of another entry, it must throw an error.
These are the validation Rules.
I am quiet new to custom validation. Please help me solving this.
My View:
<?php
/* #var $this NimsoftHostsDetailsController */
/* #var $model NimsoftHostsDetails */
$this->breadcrumbs=array(
'Nimsoft Hosts Details'=>array('index'),
$model->id,
);
$this->menu=array(
array('label'=>'List NimsoftHostsDetails', 'url'=>array('index')),
array('label'=>'Create NimsoftHostsDetails', 'url'=>array('create')),
array('label'=>'Update NimsoftHostsDetails', 'url'=>array('update', 'id'=>$model->id)),
array('label'=>'Delete NimsoftHostsDetails', 'url'=>'#', 'linkOptions'=>array('submit'=>array('delete','id'=>$model->id),'confirm'=>'Are you sure you want to delete this item?')),
array('label'=>'Manage NimsoftHostsDetails', 'url'=>array('admin')),
);
?>
<h1>View NimsoftHostsDetails - </h1><h3><?php echo "Host Name - ".$host_name;?></h3>
<?php
if(Yii::app()->user->hasFlash('error'))
{
echo Yii::app()->user->getFlash('error');
}
?>
<!--<a href="<?php //echo $this->createUrl('/NimsoftHostsDetails/create?id='.$host_id);?>" title="Add Date Entry" class="btn btn-primary circle_ok" style="text-decoration: none;" >Add Date Entry</a>-->
<a href="<?php echo $this->createUrl('/Nimsoft/search_host1?id='.$cust_id);?>" title="Back" class="btn btn-primary circle_ok" style="text-decoration: none;" >Back</a>
<?php /*$this->widget('zii.widgets.CListView', array(
'dataProvider'=>$dataProvider,
'itemView'=>'_view',
)); */?>
<div class="form">
<div class="row">
<div style="float:left;"> </div>
<?php
$host_id = $host_id;
$form=$this->beginWidget('CActiveForm', array(
'id'=>'nimsoft-hosts-details-form',
// Please note: When you enable ajax validation, make sure the corresponding
// controller action is handling ajax validation correctly.
// There is a call to performAjaxValidation() commented in generated controller code.
// See class documentation of CActiveForm for details on this.
'enableAjaxValidation'=>false,
)); ?>
<p class="note">Fields with <span class="required">*</span> are required.</p>
<div style="float:left;"> </div>
<div style="float:left;"><?php //echo $form->errorSummary($model); ?>
<?php echo $form->labelEx($model,'host_start_date'); ?>
<?php
Yii::import('application.extensions.CJuiDateTimePicker.CJuiDateTimePicker');
$this->widget('CJuiDateTimePicker', array(
'attribute' => 'host_start_date',
'language' => '',
'model' => $model,
'options' => array(
'mode' => 'focus',
'dateFormat' => 'yy-mm-dd',
'minDate'=>'0',
'showAnim' => 'slideDown',
),
'htmlOptions' => array(
'style'=>'height:20px;',
'value' => $host_start_date,
),
));
?>
<?php echo $form->error($model,'host_start_date'); ?></div>
<div style="float:left;"> </div>
<div style="float:left;"><?php echo $form->labelEx($model,'host_end_date'); ?>
<?php
Yii::import('application.extensions.CJuiDateTimePicker.CJuiDateTimePicker');
$this->widget('CJuiDateTimePicker', array(
'attribute' => 'host_end_date',
'language' => '',
'model' => $model,
'options' => array(
'mode' => 'focus',
'dateFormat' => 'yy-mm-dd',
'minDate'=>'0',
'showAnim' => 'slideDown',
),
'htmlOptions' => array(
'style'=>'height:20px;',
'value' => $host_end_date,
),
));
?>
<?php echo $form->error($model,'host_end_date'); ?>
</div>
</div>
<?php echo CHtml::submitButton($model->isNewRecord ? 'Create' : 'Save'); ?>
<?php $this->endWidget(); ?>
</div>
<?php
$obj=$this->widget('zii.widgets.grid.CGridView', array(
'dataProvider'=>$dataProvider,
////'afterAjaxUpdate'=>'\'changeTRColor()\'',
//'itemView'=>'_view',
'filter'=>$model,
'columns'=>array(
array( // display 'create_time' using an expression
'name'=>'host_start_date',
'value'=>'$data->host_start_date',
),
array(
'name'=>'host_end_date',
'value'=>'$data->host_end_date',
),
array(
'class'=>'CButtonColumn',
'template'=>'{update}{delete}',
)
),
));
?>
<?php //echo Yii::app()->user->getFlash('error'); ?>
My Model:
<?php
/**
* This is the model class for table "mst_nimsoft_hosts_details".
*
* The followings are the available columns in table 'mst_nimsoft_hosts_details':
* #property integer $id
* #property integer $host_id
* #property string $host_start_date
* #property string $host_end_date
*/
class NimsoftHostsDetails extends CActiveRecord
{
/**
* #return string the associated database table name
*/
public function tableName()
{
return 'mst_nimsoft_hosts_details';
}
/**
* #return array validation rules for model attributes.
*/
public function rules()
{
// NOTE: you should only define rules for those attributes that
// will receive user inputs.
return array(
array('host_start_date, host_end_date', 'required'),
//array('host_start_date','date_validate'),
array('host_start_date, host_end_date', 'date','format'=>array('yyyy-MM-dd H:m','yyyy-MM-dd H:m')),
array('host_end_date','compare','compareAttribute'=>'host_start_date','operator'=>'>', 'allowEmpty'=>false,'message'=>'{attribute} must be greater than "{compareValue}".'),
//array('host_start_date,host_end_date', 'unique','message'=>'HOST Date already exists!'),
// The following rule is used by search().
// #todo Please remove those attributes that should not be searched.
array('host_start_date, host_end_date', 'safe', 'on'=>'search'),
);
}
/**
* #return array relational rules.
*/
public function relations()
{
// NOTE: you may need to adjust the relation name and the related
// class name for the relations automatically generated below.
return array(
);
}
/**
* #return array customized attribute labels (name=>label)
*/
public function attributeLabels()
{
return array(
'id' => 'ID',
'host_id' => 'Host',
'host_start_date' => 'Host Start Date',
'host_end_date' => 'Host End Date',
);
}
public function date_validate($attribute)
{
$host_start_date=$this->host_start_date;
$host_end_date=$this->host_end_date;
$model=new NimsoftHostsDetails;
$model->attributes=$_POST['NimsoftHostsDetails'];
$model->host_id=$id;
$date_details = NimsoftHostsDetails::model()->findAllByAttributes(array('host_start_date'=>$this->host_start_date,'host_end_date'=>$this->host_end_date,'host_id'=>$model->host_id));
if($date_details)
{
$this->addError($attribute, 'DATA already present, Please Enter different Date');
}
$date_details1 = NimsoftHostsDetails::model()->findAllByAttributes(array('host_start_date'=>$this->host_end_date,'host_id'=>$model->host_id));
if($date_details1)
{
$this->addError($attribute, "The End date ".$this->host_end_date." is already mentioned as a start date");
//$this->render('exist',array('message'=>"The End date ".$model->host_end_date." is already mentioned as a start date",'host_id'=>$model->host_id));
}
if($model->host_start_date == $model->host_end_date)
{
$this->addError($attribute, 'Both dates same, Please Enter different Date');
//$this->render('exist',array('message'=>"Both dates same, Please Enter different Date",'host_id'=>$model->host_id));
}
}
/**
* Retrieves a list of models based on the current search/filter conditions.
*
* Typical usecase:
* - Initialize the model fields with values from filter form.
* - Execute this method to get CActiveDataProvider instance which will filter
* models according to data in model fields.
* - Pass data provider to CGridView, CListView or any similar widget.
*
* #return CActiveDataProvider the data provider that can return the models
* based on the search/filter conditions.
*/
public function search()
{
// #todo Please modify the following code to remove attributes that should not be searched.
$criteria=new CDbCriteria;
$criteria->compare('id',$this->id);
$criteria->compare('host_id',$this->host_id);
$criteria->compare('host_start_date',$this->host_start_date,true);
$criteria->compare('host_end_date',$this->host_end_date,true);
return new CActiveDataProvider($this, array(
'criteria'=>$criteria,
));
}
/**
* Returns the static model of the specified AR class.
* Please note that you should have this exact method in all your CActiveRecord descendants!
* #param string $className active record class name.
* #return NimsoftHostsDetails the static model class
*/
public static function model($className=__CLASS__)
{
return parent::model($className);
}
}
My controller:
<?php
class NimsoftHostsDetailsController 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/ticket_console';
/**
* #return array action filters
*/
public function filters()
{
return array(
'accessControl', // perform access control for CRUD operations
'postOnly + delete', // we only allow deletion via POST request
);
}
/**
* 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', // allow all users to perform 'index' and 'view' actions
'actions'=>array('index','view'),
'users'=>array('*'),
),
array('allow', // allow authenticated user to perform 'create' and 'update' actions
'actions'=>array('create','update'),
'users'=>array('#'),
),
array('allow', // allow admin user to perform 'admin' and 'delete' actions
'actions'=>array('admin','delete'),
'users'=>array('admin'),
),
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)
{
$host_id=$id;
$model1=new NimsoftHostsDetails;
$detail = NimsoftHostsDetails::model()->findAllByAttributes(array('host_id'=>$id));
if(isset($_POST['NimsoftHostsDetails']))
{
$model1->attributes = $_POST['NimsoftHostsDetails'];
$model1->host_id=$id;
/*$model=new NimsoftHostsDetails;
$model->attributes=$_POST['NimsoftHostsDetails'];
$model->host_id=$id;
$criteria = new CDbCriteria;
$date_details = NimsoftHostsDetails::model()->findAllByAttributes(array('host_start_date'=>$model->host_start_date,'host_end_date'=>$model->host_end_date,'host_id'=>$model->host_id));
if($date_details)
{echo "Hi";
//Yii::app()->user->setFlash('error', "DATA already present, Please Enter different Date");
//$this->render('view',array('message'=>"DATA already present, Please Enter different Date",'host_id'=>$model->host_id));
die();
}
$criteria = new CDbCriteria;
$date_details = NimsoftHostsDetails::model()->findAllByAttributes(array('host_start_date'=>$model->host_end_date,'host_id'=>$model->host_id));
if($date_details)
{
Yii::app()->user->setFlash('a', "The End date ".$model->host_end_date." is already mentioned as a start date");
//$this->render('exist',array('message'=>"The End date ".$model->host_end_date." is already mentioned as a start date",'host_id'=>$model->host_id));
die();
}
if($model->host_start_date == $model->host_end_date)
{
Yii::app()->user->setFlash('s', "Both dates same, Please Enter different Date");
//$this->render('exist',array('message'=>"Both dates same, Please Enter different Date",'host_id'=>$model->host_id));
die();
}*/
if($model1->save())
$this->redirect(array('view','id'=>$model1->host_id));
}
$criteria = new CDbCriteria();
$criteria->condition = "host_id = '$id'";
$details = NimsoftHostsDetails::model()->findAll($criteria);
$model=new NimsoftHost;
$detail2 = NimsoftHost::model()->findAllByAttributes(array('host_id'=>$id));
foreach($detail2 as $val)
{
$name=$val->host_name;
$id=$val->host_id;
$cust_id=$val->host_customer_id;
}
$dataProvider=new CActiveDataProvider('NimsoftHostsDetails',array(
'criteria' => $criteria,));
$this->render('view',array(
'dataProvider'=>$dataProvider,
'host_name'=>$name,
'host_id'=>$id,
'cust_id'=>$cust_id,'model'=>$model1
));
}
/**
* Creates a new model.
* If creation is successful, the browser will be redirected to the 'view' page.
*/
public function actionCreate($id)
{
$model=new NimsoftHostsDetails;
$host_id=$id;
// Uncomment the following line if AJAX validation is needed
// $this->performAjaxValidation($model);
if(isset($_POST['NimsoftHostsDetails']))
{
$model->attributes=$_POST['NimsoftHostsDetails'];
$model->host_id=$id;
$criteria = new CDbCriteria;
$date_details = NimsoftHostsDetails::model()->findAllByAttributes(array('host_start_date'=>$model->host_start_date,'host_end_date'=>$model->host_end_date,'host_id'=>$model->host_id));
if($date_details)
{
$this->render('exist',array('message'=>"DATA already present, Please Enter different Date",'host_id'=>$model->host_id));
die();
}
$criteria = new CDbCriteria;
$date_details = NimsoftHostsDetails::model()->findAllByAttributes(array('host_start_date'=>$model->host_end_date,'host_id'=>$model->host_id));
if($date_details)
{
$this->render('exist',array('message'=>"The End date ".$model->host_end_date." is already mentioned as a start date",'host_id'=>$model->host_id));
die();
}
if($model->host_start_date == $model->host_end_date)
{
$this->render('exist',array('message'=>"Both dates same, Please Enter different Date",'host_id'=>$model->host_id));
die();
}
if($model->save())
$this->redirect(array('view','id'=>$model->host_id));
}
$this->render('create',array(
'model'=>$model,
'host_id'=>$host_id,
));
}
/**
* 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);
// Uncomment the following line if AJAX validation is needed
// $this->performAjaxValidation($model);
if(isset($_POST['NimsoftHostsDetails']))
{
$model->attributes=$_POST['NimsoftHostsDetails'];
if($model->save())
$this->redirect(array('view','id'=>$model->host_id));
}
$this->render('update',array(
'model'=>$model,
));
}
/**
* 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)
{
$this->loadModel($id)->delete();
// 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'));
}
/**
* Lists all models.
*/
public function actionIndex()
{
$dataProvider=new CActiveDataProvider('NimsoftHostsDetails');
$this->render('index',array(
'dataProvider'=>$dataProvider,
));
}
/**
* Manages all models.
*/
public function actionAdmin()
{
$model=new NimsoftHostsDetails('search');
$model->unsetAttributes(); // clear any default values
if(isset($_GET['NimsoftHostsDetails']))
$model->attributes=$_GET['NimsoftHostsDetails'];
$this->render('admin',array(
'model'=>$model,
));
}
/**
* 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 $id the ID of the model to be loaded
* #return NimsoftHostsDetails the loaded model
* #throws CHttpException
*/
public function loadModel($id)
{
$model=NimsoftHostsDetails::model()->findByPk($id);
if($model===null)
throw new CHttpException(404,'The requested page does not exist.');
return $model;
}
/**
* Performs the AJAX validation.
* #param NimsoftHostsDetails $model the model to be validated
*/
protected function performAjaxValidation($model)
{
if(isset($_POST['ajax']) && $_POST['ajax']==='nimsoft-hosts-details-form')
{
echo CActiveForm::validate($model);
Yii::app()->end();
}
}
}
in your model, you could add another set of rules using your own validations.
public function rules()
{
// NOTE: you should only define rules for those attributes that
// will receive user inputs.
return array(
array('host_start_date, host_end_date', 'required'),
array('host_start_date, host_end_date', 'date','format'=>array('yyyy-MM-dd H:m','yyyy-MM-dd H:m')),
array('host_end_date','compare','compareAttribute'=>'host_start_date','operator'=>'>', 'allowEmpty'=>false,'message'=>'{attribute} must be greater than "{compareValue}".'),
//array('host_start_date,host_end_date', 'unique','message'=>'HOST Date already exists!'),
// The following rule is used by search().
// #todo Please remove those attributes that should not be searched.
array('host_start_date, host_end_date', 'safe', 'on'=>'search'),
array('host_start_date', 'unique'),//this will check if your entry is unique
array('host_start_date', 'checkEntry'),//this will call your custom validation
);
}
this will be your custom validation
public function checkEntry($attribute,$params)
{
if(condition)
$this->addError($attribute,"your error message");
}
I have two fields in the advanced search form(approved, reviewdate) for which I created the radiobuttons.
<div class="row">
<?php echo $form->labelEx($model,''); ?>
<?php
echo $form->radioButtonList($model,'ReviewedDate',
array('1' => 'Reviewed', '' => 'Not Reviewed'),
array(
'template'=>'{input}{label}',
'separator'=>'',
'labelOptions'=>array(
'style'=> '
padding-left:13px;
width: 60px;
float: left;
'),
'onclick' => 'this.form.submit()',
'style'=>'float:left;',
)
);
?>
<div style="clear: both;"></div>
<?php echo $form->error($model,'ReviewedDate'); ?>
</div>
<div class="row">
<?php echo $form->labelEx($model,''); ?>
<?php
echo $form->radioButtonList($model,'Approved',
array('0' => 'Rejected', '1' => 'Approved'),
array(
'template'=>'{input}{label}',
'separator'=>'',
'labelOptions'=>array(
'style'=> '
padding-left:13px;
width: 60px;
float: left;
'),
'style'=>'float:left;',
'onclick' => 'this.form.submit()',
'uncheck' => NULL,
)
);
?>
<div style="clear: both;"></div>
<?php echo $form->error($model,'Approved'); ?>
</div>
Below is the criteria I created for both the fields in model.
public function search()
{
// Warning: Please modify the following code to remove attributes that
// should not be searched.
$criteria=new CDbCriteria;
$criteria->with=array('apartment');
$criteria->compare('t.Id',$this->Id);
$criteria->compare('ApartmentId',$this->ApartmentId);
$criteria->compare('Approved',$this->Approved);
$criteria->compare('CreatedDate',$this->CreatedDate,true);
$criteria->compare('EmailBody',$this->EmailBody,true);
$criteria->compare('MailSubject',$this->MailSubject,true);
$criteria->compare('MessageType',1);
$criteria->compare('Name',$this->Name,true);
// $criteria->compare('ReviewedDate',$this->ReviewedDate);
$criteria->compare('SmsText',$this->SmsText,true);
$criteria->compare('UpdatedDate',$this->UpdatedDate,true);
$criteria->compare('PostedByUserFlatId',$this->PostedByUserFlatId);
$criteria->compare('Comments',$this->Comments,true);
$criteria->compare('ModifiedBy',$this->ModifiedBy,true);
if(isset($this->ReviewedDate) )
{
$criteria->addCondition('ReviewedDate IS NOT NULL');
$criteria->addCondition('UpdatedDate > CreatedDate');
$criteria->compare('ReviewedDate','0000-00-00 00:00:00');
}
else
{
$criteria->addCondition('updateddate = createddate');
$criteria->addCondition('ReviewedDate IS NULL');
}
if ($this->Approved)
{
$criteria->addCondition("approved='" . $this->Approved . "'");
$criteria->condition = ' (updateddate > createddate) AND (revieweddate IS NOT NULL) and approved = 1 ';
}
else
{
$criteria->addCondition("approved='" . $this->Approved . "'");
$criteria->condition = ' (updateddate > createddate) AND (revieweddate IS NOT NULL) and approved = 0 ';
}
$criteria->compare('apartment.Name',$this->groupz_search, true);
$criteria->compare('apartment.SocietyCode',$this->groupz_code_search, true);
return new CActiveDataProvider($this, array(
'criteria'=>$criteria,
));
}
Now when I try click on the reviewed/not reviewed button, the query that should be executed when rejected is clicked gets executed.
SQL query to be executed - SELECT count(*) FROM `message_template` `t` LEFT OUTER JOIN `apartment` `apartment` ON (`t`.`ApartmentId`=`apartment`.`Id`) WHERE (((MessageType=1) AND (updateddate = createddate)) AND (ReviewedDate IS NULL);
SQL executed - SELECT * FROM `message_template` `t` LEFT OUTER JOIN `apartment` `apartment` ON (`t`.`ApartmentId`=`apartment`.`Id`) WHERE (((MessageType=1) AND (updateddate > createddate)) AND (ReviewedDate IS NULL) and (Approved=0));
Why is this happening and how can I debug.
Edit
*Controller*
<?php
class MessageTemplateController 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
'postOnly + delete', // we only allow deletion via POST request
);
}
/**
* 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', // allow all users to perform 'index' and 'view' actions
'actions'=>array('index','view'),
'users'=>array('*'),
),
array('allow', // allow authenticated user to perform 'create' and 'update' actions
'actions'=>array('create','update'),
'users'=>array('#'),
),
array('allow', // allow admin user to perform 'admin' and 'delete' actions
'actions'=>array('admin','delete'),
# 'users'=>array('admin'),
'users'=>array('#'),//vishnu
),
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 = MessageTemplate::model()->findByPk($id);
$model = $this->loadModel($id);
$this->render('view', array(
'model' => $model,
));
}
/**
* Creates a new model.
* If creation is successful, the browser will be redirected to the 'view' page.
*/
public function actionCreate()
{
$model=new MessageTemplate;
// Uncomment the following line if AJAX validation is needed
// $this->performAjaxValidation($model);
if(isset($_POST['MessageTemplate']))
{
$model->attributes=$_POST['MessageTemplate'];
if($model->save())
$this->redirect(array('view','id'=>$model->Id));
}
$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_mt=new Messagesintable;
$model_al=new AuditLogin;
$model=$this->loadModel($id);
// Uncomment the following line if AJAX validation is needed
// $this->performAjaxValidation($model);
if(isset($_POST['MessageTemplate']) && isset($_POST['AuditLogin']))
{
$model->attributes=$_POST['MessageTemplate'];
list($name,$mobile,$email)=retrieve_persondetails($id);
if($model->save())
{
$model_al->attributes=$_POST['AuditLogin'];
if($model->Approved==1)
{
if($name!=NULL)
{
$model_mt->Address= address_xml($name, $mobile, $email);
$message=$model->SmsText;
$approved="-approved";
$model_mt->Message= message_xml($message,$approved);
$model_mt->MsgType=1;
$model_mt->Date=date('Y-m-d');
$model_mt->Time=date('H:i:s');
$model_mt->CustomData='0,0';
$model_mt->save();
}
$model_al->activity="Message Template Approved";
$model_al->moduleId=1003;
$model_al->content=$model->SmsText;
}
else
{
if($name!=NULL)
{
$model_mt->Address= address_xml($name, $mobile, $email);
$message=$model->SmsText;
$approved="-rejected";
$model_mt->Message= message_xml($message,$approved);
$model_mt->MsgType=1;
$model_mt->Date=date('Y-m-d');
$model_mt->Time=date('H:i:s');
$model_mt->CustomData='0,0';
$model_mt->save();
}
$model_al->activity="Message Template Rejected";
$model_al->moduleId=1003;
$model_al->content=$model->SmsText;
}
if ($model_al->save())
$this->redirect(array('admin','id'=>$model->Id));
}
}
$this->render('update',array(
'model'=>$model,
));
}
/**
* 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)
{
$this->loadModel($id)->delete();
// 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'));
}
/**
* Lists all models.
*/
public function actionIndex()
{
$dataProvider=new CActiveDataProvider('MessageTemplate');
$this->render('index',array(
'dataProvider'=>$dataProvider,
));
}
// Oh yeah the filter. I just copied your code.
/*
*/
/**
* Manages all models.
*/
public function actionAdmin()
{
$model=new MessageTemplate('search');
$model->unsetAttributes(); // clear any default values
if(isset($_GET['MessageTemplate']))
$model->attributes=$_GET['MessageTemplate'];
$this->render('admin',array(
'model'=>$model,
));
}
/**
* 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 $id the ID of the model to be loaded
* #return MessageTemplate the loaded model
* #throws CHttpException
*/
public function loadModel($id)
{
$model=MessageTemplate::model()->findByPk($id);
if($model===null)
throw new CHttpException(404,'The requested page does not exist.');
return $model;
}
/**
* Performs the AJAX validation.
* #param MessageTemplate $model the model to be validated
*/
protected function performAjaxValidation($model)
{
if(isset($_POST['ajax']) && $_POST['ajax']==='message-template-form')
{
echo CActiveForm::validate($model);
Yii::app()->end();
}
}
}
function retrieve_persondetails($id)
{
$hostname="localhost";
$username=Yii::app()->db->username;
$password=Yii::app()->db->password;
$database="apartment";
$connection = mysql_connect($hostname,$username,$password);
mysql_select_db($database);
$sql = "SELECT p.Name,p.Mobile,p.Email from person p,flat f,userflatmapping u,message_template m, society_profile s where m.id=$id and u.id=m.postedbyuserflatid and f.id=u.flatid and p.id=f.registeredpersonid and u.dontsendsmstome=0 and s.apartmentId=f.apartmentid and s.sms_enabled=1;";
$result = mysql_query($sql);
while ($row = mysql_fetch_array($result))
{
$name=$row['Name'];
$mobile=$row['Mobile'];
$email=$row['Email'];
}
if(isset($name))
return array($name,$mobile,$email);
mysql_close($connection);
}
function address_xml($name,$mobile,$email)
{
$address_xml = '<tolist><to><name>' . $name . '</name><contactpersonname>' . $name . '</contactpersonname><number>' . $mobile . '</number><email>' . $email . '</email><prefix></prefix><contactpersonprefix></contactpersonprefix></to></tolist><from><name>' . $name . '</name><number>' . $mobile . '</number></from>';
return $address_xml;
}
function message_xml($message,$approved)
{
$message_xml ='<shorttext>' . $message.''.$approved. '</shorttext>';
return $message_xml;
}
edit rules
public function rules()
{
// NOTE: you should only define rules for those attributes that
// will receive user inputs.
return array(
array('ApartmentId, Approved, MessageType, PostedByUserFlatId', 'numerical', 'integerOnly'=>true),
array('Name, SmsText, Comments, ModifiedBy', 'length', 'max'=>255),
array('CreatedDate, EmailBody, MailSubject, ReviewedDate, UpdatedDate', 'safe'),
// The following rule is used by search().
// Please remove those attributes that should not be searched.
array('Id, ApartmentId, Approved, CreatedDate, EmailBody, MailSubject, MessageType, Name, ReviewedDate, SmsText, UpdatedDate, PostedByUserFlatId, Comments, ModifiedBy,apartment.Name,apartment.SocietyCode,groupz_search,groupz_code_search', 'safe', 'on'=>'search'),
//array('ReviewedDate','default',
//'value'=>new CDbExpression('NOW()'),
//'setOnEmpty'=>false,'on'=>'update'),
);
}
You're using $criteria->condition = ''; after calling $criteria->addCondition();
With $criteria->condition = ''; you set a whole new condition for the CDbCriteria object, which means all your previous $criteria->addCondition(); are lost.
So change this, for example:
$criteria->addCondition("approved='" . $this->Approved . "'");
$criteria->condition = ' (updateddate > createddate) AND (revieweddate IS NOT NULL) and approved = 0 ';
To this:
$criteria->addCondition("approved='" . $this->Approved . "'");
$criteria->addCondition("(updateddate > createddate) AND (revieweddate IS NOT NULL)");
This code is almost right:
if ($this->Approved)
{
$criteria->addCondition("approved='" . $this->Approved . "'");
$criteria->condition = ' (updateddate > createddate) AND (revieweddate IS NOT NULL) and approved = 1 ';
}
else
{
$criteria->addCondition("approved='" . $this->Approved . "'");
$criteria->condition = ' (updateddate > createddate) AND (revieweddate IS NOT NULL) and approved = 0 ';
}
As "davey" says you must "clean up" your search function, and for example you might change you code like this:
if ($this->Approved)
{
//this line is unnecessary $criteria->addCondition("approved='" . $this->Approved . "'");
$criteria->addCondition(' (updateddate > createddate) AND (revieweddate IS NOT NULL) and approved = 1 ');
}
else
{
//this line is unnecessary $criteria->addCondition("approved='" . $this->Approved . "'");
$criteria->addCondition(' (updateddate > createddate) AND (revieweddate IS NOT NULL) and approved = 0 ');
//if you dont want approved = 0 then you must change above line with:
$criteria->addCondition(' (updateddate > createddate) AND (revieweddate IS NOT NULL) ');
}
To debug:
first are you sure your send the form params by GET?
<form action="/controller/action" method="get">
second for testing your values I would do something like this:
if(isset($this->Approved)){
if($this->Approved==0){
...
}elseif($this->Approved==1){
...
}else{
throw new CHttpExeption(404,'unknown approval');
}
}
so if nothing is submitted -> no criteria will be added
Hope this helps
Best regards