Criteria mentioned in model class not executing from search form - php

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

Related

Multiple forms for entity instances - symfony3

I'm trying to create a form that would allow a manager to approve a list of time off requests (also planning to have a todo list and want to be able to mark them as done).
I have read [Generate same form type on same page multiple times Symfony2 (as well as several others) and I am close to understanding but I'm fairly to new to Symfony and not clear on what parts of the code should go in what files. I am using a form type and a controller in Symfony3 with Doctrine.
I have list of the entity instances that were returned from a query ($em->createQuery) in the controller and I am looking to produce a form for each entity instance or even two forms per entity (one for approve and one for reject).
The referenced question says you need a loop to display and save them. My intention is to only work on (submit) one at a time. I assume this part of the code would go in the controller?
I am using an indexAction for the controller but using it more like an Edit action since I will be processing forms, so I pass in a Request object and the objects as parameters.
>
class HRMgrController extends Controller
{
/**
* Lists all manager role requests and provide a means to approve/deny.
*
* #Route("/", name="hrmgr_index")
* #Method({"GET", "POST"})
* #Security("has_role('ROLE_APP_MANAGER')")
*/
public function indexAction(Request $request, TimeOffRequest $timeOffRequest)
{
if (!empty($timeOffRequest)) {
$form = $this->createForm('CockpitBundle\Form\TORApprovalType', $timeOffRequest);
print "TOR Id = " . $timeOffRequest->getId() . "<BR>";
$em = $this->getDoctrine()->getManager();
$form->handleRequest($request);
print "Form name = " . $form->getName() . "<BR>";
if ($form->isSubmitted() && $form->isValid()) {
if ($form->get('approve')->isClicked()) {
print "This puppy was approved";
$timeOffRequest['status'] = 4;
}
if ($form->get('reject')->isClicked()) {
print "This puppy was rejected";
$timeOffRequest['status'] = 1;
}
$this->getDoctrine()->getManager()->flush();
print "At least its there<BR>";
// return $this->redirectToRoute('hrmgr_index');
} else {
print "did not detect form submission<BR>";
}
}
$emp = new \CockpitBundle\Entity\Employee();
$date = new \DateTime();
$year = $date->format('Y');
$username = $this->getUser()->getUserName();
$user = $em->getRepository('CockpitBundle:Employee')->findByUsername($username);
$employees = $em->getRepository('CockpitBundle:Employee')->htmlContact($user);
$tors = $em->getRepository('CockpitBundle:TimeOffRequest')->findMgrUnapprovedTORs($user->getId());
$timeoff = "<h3>Unapproved Time Off Requests</h3>";
$actions = true;
$torforms = [];
foreach ($tors as $tor) {
$target = $this->generateUrl('hrmgr_index',array("tor_id" => $tor->getId()));
$torforms[] = $this->actionForm($tor,$target)->createView();
}
return $this->render('hrmgr/index.html.twig', array(
'torforms' => $torforms,
));
I have the forms working nowbut when I submit them the isSubmitted() doesn't seem to be working. It outputs the "did not detect form submission" currently.
So when I have multiple forms and I submit one, does the handleRequest get the right one? I think I might be confusing two concepts here as well. I recently changed the code to submit the ID of the timeOffRequest as a parameter to the route. It is properly picking that up which allows me to potentially update the form but that part of the code doesn't seem to be working.
I noticed that if I look at the debugger, I get something like:
> approval_form_2
[▼
"reject" => ""
"_token" => "IE1rGa5c0vaJYk74_ncxgFsoDU7wWlkAAWWjLe3Jr1w"
]
if I click the reject button. I get a similar form with "approve" if I click the approve button so it seems like I am close. Also, the proper ID shows up from the route given in the action.
Here is the form generator:
<?php
namespace CockpitBundle\Form;
use CockpitBundle\Entity\Employee;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\ButtonType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
class TORApprovalType extends AbstractType
{
private $nameSuffix = null;
private $name = 'time_req_approval';
public function __constructor(string $suffix = null) {
//parent::__construct();
$this->nameSuffix = $this->generateNameSuffix();
}
private function generateNameSuffix() {
if ($this->nameSuffix == null || $this->nameSuffix == '') {
$generator = new SecureRandom();
//change data to alphanumeric string
return bin2hex($generator->nextBytes(10));
}
return $this->nameSuffix;
}
public function setNameSuffix($suffix){
$this->nameSuffix = $suffix;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
// Build your form...
$builder->add('approve', SubmitType::class, array(
'label' => "Approve",
'attr' => array("class"=>"action-approve"),
));
$builder->add('reject', SubmitType::class, array(
'label' => "Reject",
'attr' => array("class"=>"action-reject"),
));
//$builder->add('employee');
}
public function getName() {
if ($this->nameSuffix == null || $this->nameSuffix == "" ) {
$this->nameSuffix = $this->generateNameSuffix();
}
return $this->name .'_'. $this->nameSuffix;
}
/**
* {#inheritdoc}
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'CockpitBundle\Entity\TimeOffRequest'
));
}
/**
* {#inheritdoc}
*/
public function getBlockPrefix()
{
return 'cockpitbundle_timeoffrequest';
}
}
Any clues? (sorry I am on vacation so not particular quick with updates.
You can do multiple submit button: check your formtype
->add('approve', 'submit')
->add('reject', 'submit')
then in your controller
if ($form->isValid()) {
// ... do something
// the save_and_add button was clicked
if ($form->get('approve')->isClicked()) {
// probably redirect to the add page again
}
if ($form->get('reject')->isClicked()) {
// probably redirect to the add page again
}
// redirect to the show page for the just submitted item
}
I was able to get it working with the following builder.
$builder->add('approve', SubmitType::class, array(
'label' => "Approve",
'attr' => array("class"=>"action-approve"),
));
$builder->add('reject', SubmitType::class, array(
'label' => "Reject",
'attr' => array("class"=>"action-reject"),
));
Then in the controller form I generate and process the forms as such. Not sure if it is the optimal way but it works find. Of course, this approach redraws the whole list each time, but that is fine for what I'm doing.
class HRMgrController extends Controller
{
/**
* Lists all manager role requests and provide a means to approve/deny.
*
* #Route("/", name="manager_home")
* #Method({"GET"})
* #Security("has_role('ROLE_APP_MANAGER')")
*/
public function indexAction()
{
$em = $this->getDoctrine()->getManager();
$emp = new \CockpitBundle\Entity\Employee();
$employeeSummary = [];
$date = new \DateTime();
$year = $date->format('Y');
$username = $this->getUser()->getUserName();
$user = $em->getRepository('CockpitBundle:Employee')->findByUsername($username);
$myemployees = $em->getRepository('CockpitBundle:Employee')->findManagersEmployees($user);
$torRep = $em->getRepository('CockpitBundle:TimeOffRequest');
$toas = [];
$torforms = [];
foreach ($myemployees as $employee) {
$tors = $torRep->findAllMine($employee,$year);
$toas[$employee->getDisplayName()] = $em->getRepository('CockpitBundle:TimeOffAllocation')->getEmpAllocation($employee->getId(),$year);
$employeeSummary[$employee->getDisplayName()] = $torRep->mySummary($tors,$toas[$employee->getDisplayName()]);
if (array_key_exists('items',$employeeSummary[$employee->getDisplayName()]['Vacation']['Requested'])) {
foreach ($employeeSummary[$employee->getDisplayName()]['Vacation']['Requested']['items'] as $tor) {
$target = $this->generateUrl('hrmgr_tor_approval',array("tor_id" => $tor->getId()));
$torforms[] = $this->actionForm($tor,$target)->createView();
}
}
if (array_key_exists('items',$employeeSummary[$employee->getDisplayName()]['Sick Time']['Requested'])) {
foreach ($employeeSummary[$employee->getDisplayName()]['Sick Time']['Requested']['items'] as $tor) {
$target = $this->generateUrl('hrmgr_tor_approval',array("tor_id" => $tor->getId()));
$torforms[] = $this->actionForm($tor,$target)->createView();
}
}
if (array_key_exists('Time Off',$employeeSummary[$employee->getDisplayName()]) &&
array_key_exists('items',$employeeSummary[$employee->getDisplayName()]['Time Off']['Requested'])) {
foreach ($employeeSummary[$employee->getDisplayName()]['Time Off']['Requested']['items'] as $tor) {
$target = $this->generateUrl('hrmgr_tor_approval',array("tor_id" => $tor->getId()));
$torforms[] = $this->actionForm($tor,$target)->createView();
}
}
}
return $this->render('hrmgr/index.html.twig', array(
'employeeSummary' => $employeeSummary,
'torforms' => $torforms,
'year' => $year,
));
}
/**
* Lists all manager role requests and provide a means to approve/deny.
*
* #Route("/{tor_id}", name="hrmgr_tor_approval")
* #Method({ "POST" })
* #ParamConverter("timeOffRequest", class="CockpitBundle:TimeOffRequest", options={"id"="tor_id"})
* #Security("has_role('ROLE_APP_MANAGER')")
*/
public function approvalAction(Request $request, TimeOffRequest $timeOffRequest)
{
if (!empty($timeOffRequest)) {
$form = $this->createForm('CockpitBundle\Form\TORApprovalType', $timeOffRequest);
$id = $timeOffRequest->getId();
$em = $this->getDoctrine()->getManager();
$form->handleRequest($request);
$postparams = $request->request->all();
if (array_key_exists("approval_form_$id",$postparams)) {
// Form was submitted
if (array_key_exists("approve",$postparams["approval_form_$id"])) {
$status = $em->getReference('CockpitBundle\Entity\TimeOffStatus', 4);
$timeOffRequest->setStatus($status);
$timeOffRequest->setApprovedDate(new \DateTime);
$em->persist($timeOffRequest);
$em->flush($timeOffRequest);
}
if (array_key_exists("reject",$postparams["approval_form_$id"])) {
$status = $em->getReference('CockpitBundle\Entity\TimeOffStatus', 1);
$timeOffRequest->setStatus($status);
$timeOffRequest->setApprovedDate(new \DateTime);
$em->persist($timeOffRequest);
$em->flush($timeOffRequest);
}
} else {
print "Form did not exist<BR>";
}
return $this->redirectToRoute('manager_home');
}
}
public function actionForm($tor,$target) {
return $this->get('form.factory')->createNamedBuilder('approval_form_'.$tor->getId(), \CockpitBundle\Form\TORApprovalType::class, $tor,
array("action"=> $target))->getForm();
}
}

Filter not working in Yii CGridView

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?

Custom validation Not Working in yii

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");
}

yii cjuiautocomplete from dervied column

I want to do an auto complete using name on a text box. however the name is split into to columns, first_name, last_name. i have the following code.
view
$this->widget('zii.widgets.jui.CJuiAutoComplete',array(
'attribute'=>'CONSULTANT',
'model'=>$invoices,
'sourceUrl'=>array('SugarContacts/InvoicesNameList'),
// additional javascript options for the autocomplete plugin
'options'=>array(
'minLength'=>'2',
'select'=>"js:function(event, ui) { $('#Invoices_CONSULTANT').val(ui.item.id); getAddress(ui.item.id,'billing');} "
),
'htmlOptions'=>array(
'style'=>'height:20px;',
'id'=>"Invoices_CONSULTANT_search",
"size"=>"50",
'name'=>"Invoices[CONSULTANT]",
),
));
ccontroller
public function actions()
{
return array(
'ProjectsNameList'=>array(
'class'=>'application.extensions.EAutoCompleteAction',
'model'=>'Projects', //My model's class name
'attribute'=>'PROJECT', //The attribute of the model i will search
),
'ProjectsAreaList'=>array(
'class'=>'application.extensions.EAutoCompleteAction',
'model'=>'Projects', //My model's class name
'attribute'=>'AREA', //The attribute of the model i will search
),
'BidsContactList'=>array(
'class'=>'application.extensions.EAutoCompleteAction',
'model'=>'SugarContacts', //My model's class name
'attribute'=>'first_name', //The attribute of the model i will search
),
'BidNoList'=>array(
'class'=>'application.extensions.EAutoCompleteAction',
'model'=>'Bids', //My model's class name
'attribute'=>'BIDNO', //The attribute of the model i will search
),
'BidsClientRefList'=>array(
'class'=>'application.extensions.EAutoCompleteAction',
'model'=>'Bids', //My model's class name
'attribute'=>'CLIENTREF', //The attribute of the model i will search
),
'BidsAreaList'=>array(
'class'=>'application.extensions.EAutoCompleteAction',
'model'=>'Bids', //My model's class name
'attribute'=>'AREA', //The attribute of the model i will search
),
'OrdersconsultantsNameList'=>array(
'class'=>'application.extensions.EAutoCompleteAction',
'model'=>'SugarContacts', //My model's class name
'attribute'=>'first_name', //The attribute of the model i will search
),
'InvoicesNameList'=>array(
'class'=>'application.extensions.EAutoCompleteAction',
'model'=>'SugarContacts', //My model's class name
'attribute'=>'name', //The attribute of the model i will search
),
);
}
model
public function getName(){
return $this->first_name . " " . $this->last_name;
}
I had to modify eautocomplete action class
public function run()
{
if(isset($this->model) && isset($this->attribute)) {
$criteria = new CDbCriteria();
$criteria->compare($this->attribute, $_GET['term'], true);
if ($this->model == "SugarContacts") {
if($this->attribute == "name"){ //used on invoices
$criteria->select = "*, CONCAT(t.first_name, ' ', t.last_name) AS name";
$criteria->condition = "(CONCAT(t.first_name, ' ' , t.last_name) LIKE :ycp0 || accounts.name LIKE :ycp0) and length(t.id)<8"; //use id length to grab nav contacts
$criteria->join = " join sugarcrm6.accounts_contacts on t.id = sugarcrm6.accounts_contacts.contact_id" .
" join sugarcrm6.accounts on sugarcrm6.accounts_contacts.account_id = sugarcrm6.accounts.id"; // join tables to include company name in search
}
else
$criteria->addSearchCondition('last_name', $_GET['term'], true,"OR");
}
$model = new $this->model;
// print_r($model);
// print_r($criteria);
//exit();
foreach($model->findAll($criteria) as $m)
{
if ($this->model == "SugarContacts") {
if($this->attribute == "name"){ //used on invoices
$this->results[] = array(
//'label'=>trim($m->{$this->attribute}),
'value'=>trim($m->{$this->attribute}) . " " . " : " . trim($m->sugarAccountsContacts1->sugarAccounts->billing_address_street),
'id'=>$m->primaryKey
);
}else{
$this->results[] = array(
//'label'=>trim($m->{$this->attribute}),
'value'=>trim($m->{$this->attribute}) . " " . trim($m->last_name) . " : " . trim($m->primary_address_street),
'id'=>$m->primaryKey
);
}
}else{
$this->results[] = array(
'value'=>trim($m->{$this->attribute}),
'id'=>$m->primaryKey
);
}
}
}
if ($this->model != "SugarContacts" && !is_a($model,"Bids")) {
$this->results = array_unique($this->results);
}
echo CJSON::encode($this->results);
}

Yii, User Name Acting As Admin Even If Not Logged

i have a problem. i was trying to make a checkAccess rule in the layout on my custom theme. but after deciding to keep it in the way it was before, i undo everything but now its staying logged as admin, even when i click logout and still rendering the stuff i dont want to show if not logged.. this is my main layout custom:
<?php
if(Yii::app()->user->name = 'admin')
{
$this->widget('bootstrap.widgets.TbNavBar',array(
'brandLabel'=>TbHtml::b(Yii::app()->name),
'color'=>TbHtml::NAVBAR_COLOR_INVERSE,
'items'=>array(
array(
'class'=>'bootstrap.widgets.TbNav',
'items'=>array(
array('label'=>'Home', 'url'=>array('/site/index')),
array('label'=>'About', 'url'=>array('/site/page', 'view'=>'about')),
array('label'=>'Contact', 'url'=>array('/site/contact')),
array('label'=>'Users', 'url'=>array('/user/index')),
),
),
array(
'class'=>'bootstrap.widgets.TbNav',
'htmlOptions'=>array('class'=>'pull-right'),
'items'=>array(
array('label'=>'Login', 'url'=>array('/site/login'), 'visible'=>Yii::app()->user->isGuest),
array('label'=>'Logout ('.Yii::app()->user->name.')', 'url'=>array('/site/logout'), 'visible'=>!Yii::app()->user->isGuest)
),
),
),
));
}
else
{
$this->widget('bootstrap.widgets.TbNavBar',array(
'brandLabel'=>TbHtml::b(Yii::app()->name),
'color'=>TbHtml::NAVBAR_COLOR_INVERSE,
'items'=>array(
array(
'class'=>'bootstrap.widgets.TbNav',
'items'=>array(
array('label'=>'Home', 'url'=>array('/site/index')),
array('label'=>'About', 'url'=>array('/site/page', 'view'=>'about')),
array('label'=>'Contact', 'url'=>array('/site/contact')),
),
),
array(
'class'=>'bootstrap.widgets.TbNav',
'htmlOptions'=>array('class'=>'pull-right'),
'items'=>array(
array('label'=>'Login', 'url'=>array('/site/login'), 'visible'=>Yii::app()->user->isGuest),
array('label'=>'Logout ('.Yii::app()->user->name.')', 'url'=>array('/site/logout'), 'visible'=>!Yii::app()->user->isGuest)
),
),
),
));
}
?>
i do an echo on the menu to show the name of the current logged user, but still returning as admin.. i dont know what is it doing.. this is my controller.
<?php
class UserController 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('create', 'new'),
'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('index', 'view', '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),
));
}
public function actionNew($id)
{
$this->render('new',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()
{
$user = new User;
$gunwcuser =new Gunwcuser;
$game = new Game;
$cash = new Cash;
// Uncomment the following line if AJAX validation is needed
// $this->performAjaxValidation($model);
$auth = '1';
$time = '0000-00-00 00:00:00';
$gp = '1000';
$gold = '200000';
$cash1 = '10000';
$rank = '19';
if(isset($_POST['User']))
{
// Set data column in DB before saving
$user->Status = '1';
$user->MuteTime = $time;
$user->RestrictTime = $time;
$user->Authority = $auth;
$user->User_Level = '1';
$user->Authority2 = $auth;
$user->attributes=$_POST['User'];
$gunwcuser->Status = '1';
$gunwcuser->MuteTime = $time;
$gunwcuser->RestrictTime = $time;
$gunwcuser->Authority = $auth;
$gunwcuser->User_Level = '1';
$gunwcuser->Authority2 = $auth;
$gunwcuser->AuthorityBackup = $auth;
$gunwcuser->attributes=$_POST['User'];
$game->attributes=$_POST['User'];
$game->Nickname = $user->NickName;
$game->Money = $gold;
$game->EventScore1 = '0';
$game->EventScore2 = '0';
$game->EventScore3 = '0';
$game->AvatarWear = '0';
$game->Prop1 = '0';
$game->Prop2 = '0';
$game->AdminGift = $gp;
$game->TotalScore = $gp;
$game->SeasonScore = $rank;
$game->TotalGrade = $rank;
$game->SeasonGrade = '0';
$game->TotalRank = '0';
$game->SeasonRank = '0';
$game->AccumShot = '0';
$game->AccumDamage = '0';
$game->StageRecords = '0';
$game->LastUpdateTime = $time;
$game->NoRankUpdate = '0';
$game->ClientData = '0';
$game->CountryGrade = '20';
$game->CountryRank = '0';
$game->GiftProhibitTime = $time;
$cash->Cash = $cash1;
if($user->save() && $gunwcuser->save() && $game->save() && $cash->save())
/*$this->redirect(array('view','id'=>$user->Id, 'message'=>$message));*/
$this->redirect(array('new', 'id'=>$user->Id));
}
$this->render('create',array(
'user'=>$user, 'gunwcuser'=>$gunwcuser, 'game'=>$game, 'cash'=>$cash,
));
}
/**
* 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['User']))
{
$model->attributes=$_POST['User'];
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)
{
$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('User');
$this->render('index',array(
'dataProvider'=>$dataProvider,
));
}
/**
* Manages all models.
*/
public function actionAdmin()
{
$model=new User('search');
$model->unsetAttributes(); // clear any default values
if(isset($_GET['User']))
$model->attributes=$_GET['User'];
$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 User the loaded model
* #throws CHttpException
*/
public function loadModel($id)
{
$model=User::model()->findByPk($id);
if($model===null)
throw new CHttpException(404,'The requested page does not exist.');
return $model;
}
/**
* Performs the AJAX validation.
* #param User $model the model to be validated
*/
protected function performAjaxValidation($model)
{
if(isset($_POST['ajax']) && $_POST['ajax']==='user-form')
{
echo CActiveForm::validate($model);
Yii::app()->end();
}
}
}
if(Yii::app()->user->name = 'admin')
should be
if(Yii::app()->user->name == 'admin')
See == is comparing, = is setting :)
Also this thing
array('allow', // allow all users to perform 'index' and 'view' actions
'actions'=>array('create', 'new'),
'users'=>array('*'),
),
Maybe the comments are just wrong, but it's now allowing create and new actions :)

Categories