yii-dropdown values are not setting into db - yii

my 2 dependent dropdowns exam_type and status are working fine,they displaying values ..but those values are not setting into database..plz help me...this is my code
form view:
<tr>
<td><?php echo $form->labelEx($model,'exam type :'); ?></td>
<td>
<?php echo CHtml::dropDownList('exam_type','',CHtml::listData(class1::model()->findAll(),'class','class'),array('empty'=>'Choose one',
'ajax' => array(
'type'=>'POST', //request type
'url'=>CController::createUrl('dynamicstates'), //url to call.
//Style: CController::createUrl('currentController/methodToCall')
'update'=>'#status', //selector to update
)));
//empty since it will be filled by the other dropdown
?>
</td>
<td> <?php echo $form->error($model,'exam_type'); ?></td>
</tr>
<tr>
<td><?php echo $form->labelEx($model,'status :'); ?></td>
<td><?php echo CHtml::dropDownList('status','', array());?></td>
<td> <?php echo $form->error($model,'status'); ?></td>
</tr>
controller view:
public function actiondynamicstates()
{
echo $aasd=$_POST['exam_type'];
echo $data=admission::model()->findAll('class=:class',
array(':class'=>$aasd));
$data=CHtml::listData($data,'studentid','studentfname');
foreach($data as $value=>$name)
echo CHtml::tag('option', array('value'=>$value), CHtml::encode($name), true);
}

It most likely that problem in dropdowns names. You should replace
CHtml::dropDownList('exam_type'
with
CHtml::dropDownList(CHtml::activeName($model, 'exam_type'
And
CHtml::dropDownList('status'
with
CHtml::dropDownList(CHtml::activeName($model, 'status'

some days before i too got stuck in this problem.i did some trick to work.
<tr>
<td><?php echo $form->labelEx($model,'exam type :'); ?></td>
<td>
<?php echo CHtml::dropDownList('exam_type','',CHtml::listData(class1::model()->findAll(),'class','class'),array('empty'=>'Choose one',
'ajax' => array(
'type'=>'POST', //request type
'url'=>CController::createUrl('dynamicstates'), //url to call.
//Style: CController::createUrl('currentController/methodToCall')
// 'update'=>'#status', //selector to update
'update'=>'#modelname_status', //here is the trick replace modelname to orginal model class name
)));
//empty since it will be filled by the other dropdown
?>
</td>
<td> <?php echo $form->error($model,'exam_type'); ?></td>
</tr>
<tr>
<td><?php echo $form->labelEx($model,'status :'); ?></td>
<?php //echo CHtml::dropDownList('status','', array());?>
<td><?php echo CHtml::dropDownList('modelname[status]','', array());?></td>//same here
<td> <?php echo $form->error($model,'status'); ?></td>
</tr>
in above code i changed:
'update'=>'#modelname_status', //here is the trick replace modelname to orginal model class name
<td><?php echo CHtml::dropDownList('modelname[status]','', array());?></td>//same here
even after it doesnt work give comment.(i didnt test,maybe your controller seems have problem.)

I hope your problem got solved already. If someone is still wondering why those drop-downs do not update the database, they don't because they are not listed as safe attributes.
Here is an example to make the drop-down-lists work (only important parts are given) :
Suppose you want to add the field called "showOnHome". First, create a field called "showOnHome" in your database table ( I prefer int(1) as the field type).
Then, in your model Model :
public function rules() {
....
....
array('showOnHome','safe'),
}
....
....
public function attributeLabels() {
return array(
.....
.....
.....
'showOnHome' => 'Show On Homepage' ,
)
}
In your View :
<div class="row">
<?php echo $form->labelEx($model,'showOnHome'); ?>
<?php echo $form->dropDownList($model, 'showOnHome', array('0'=>'No','1'=>'Yes') , array('empty'=>'--Select--')); ?>
<?php echo $form->error($model,'showOnHome'); ?>
</div>
The code snippsets above should do your job if you did not alter the default controller code generated by Yii, e.g.
/**
* Creates a new model.
* If creation is successful, the browser will be redirected to the 'view' page.
*/
public function actionCreate()
{
$model=new Livefuture;
// Uncomment the following line if AJAX validation is needed
// $this->performAjaxValidation($model);
if(isset($_POST['Livefuture']))
{
$model->attributes=$_POST['Livefuture'];
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['Livefuture']))
{
$model->attributes=$_POST['Livefuture'];
if($model->save())
$this->redirect(array('view','id'=>$model->id));
}
$this->render('update',array(
'model'=>$model,
));
}

Related

ajaxValidation is not working when i use custom id in htmlOption Array

i need custom id eg, 'id'=>table_name in below code. When i remove id from htmloptions array, ajax validation works fine, but it does no when i use id.
<div class="form">
<?php
$form=$this->beginWidget('bootstrap.widgets.TbActiveForm', array(
'id'=>'data-fixer-form',
'enableAjaxValidation'=>true,
'htmlOptions'=>array(
'onsubmit'=>"return false;",/* Disable normal form submit */
'onkeypress'=>" if(event.keyCode == 13){ ajaxReplaceValue(event); } " /* Do ajax call when user presses enter key */
),
));
?>
<?php echo $form->dropDownListControlGroup($model,'table_name',$tableNames,array('id'=>'table_name','onchange'=>'getColumn(event)','class'=>'span4')); ?>
<?php echo $form->dropDownListControlGroup($model,'column_name',$columnNames,array('id'=>'column_name','class'=>'span4')); ?>
<?php echo $form->textFieldControlGroup($model,'search_for',array('id'=>'search_for','placeholder'=>tTools('dataFixer','search_for'),'class'=>'span4')); ?>
<?php echo $form->textFieldControlGroup($model,'replace_with',array('id'=>'replace_with','placeholder'=>tTools('dataFixer','replace_with'),'class'=>'span4')); ?>
<div class="form-actions">
<?php
echo CHtml::submitButton(t('common','submit'), array (
'id'=>'dataFixerSubmitBtn',
'class'=>'btn btn-primary',
'identity'=>'',
'dataFetched'=>'0',
'onclick'=>'ajaxReplaceValue(event);'
));
?>
</div>
<?php $this->endWidget(); ?>
finally i got the solution. We need to prepend Model Name befor id as below
'id'=>'DataFixer_table_name'
where DataFixer is model name

how to make a list selected in my dropdownlist yii?

I get a list of email address from my query and i want the list to be selected by default in my form.How to achieve that? My code is
<div class="row col2">
<?php echo $form->labelEx($model,'email_to'); ?>
<?php
foreach ($mailList as $eachValue){
$selectedOptions[$eachValue] = array('selected' => 'selected');
}
echo $form->dropDownList($model,'email_to',$mailList,array('class'=>'span4 chosen','maxlength'=>20,'multiple' => 'multiple','options'=>$selectedOptions,'readonly'=>true));
?>
<?php echo $form->error($model,'email_to'); ?>
</div>
My $mailList contains only email address.
Your code is fine except the foreach loop:
foreach ($mailList as $eachValue){
$selectedOptions[$eachValue] = array('selected' => 'selected');
}
Assuming $mailList is an array like:
$mailList = array("a#a.com", "b#b.com", "c#c.com");
You have to preselect the value not the content of the option tag, so, modify your foreach something like:
foreach ($mailList as $optionKey=>$optionVal) {
if ($optionVal) {
$selectedOptions[$optionKey] = array('selected' => 'selected');
}
}
This will add the selected attribute to the array keys.

Notification for user in user account opencart

Thanks for anyone who helps or points me in the right direction.
I want to show a pending notification to user in their my account page after login. This notification will show only when their any order status is pending. After changing any other status from admin will remove that notification.
This notification will show like:
YOUR ORDER ID:
ORDER STATUS:
and [ A button with custom Url]
if multiple order then will show multiple order id.
My Open cart Version 1.5.6.3 with custom Theme.
$this->load->model('account/order');
$results = $this->model_account_order->getOrders();
foreach ($results as $result) {
$product_total = $this->model_account_order->getTotalOrderProductsByOrderId($result['order_id']);
$voucher_total = $this->model_account_order->getTotalOrderVouchersByOrderId($result['order_id']);
if( $result['status'] =! 5){ // 5 order status means its completed
$this->data['orders'][] = array(
'order_id' => $result['order_id'],
'name' => $result['firstname'] . ' ' . $result['lastname'],
'status' => $result['status'],
'date_added' => date($this->language->get('date_format_short'), strtotime($result['date_added'])),
'products' => ($product_total + $voucher_total),
'total' => $this->currency->format($result['total'], $result['currency_code'], $result['currency_value']),
'href' => $this->url->link('account/order/info', 'order_id=' . $result['order_id'], 'SSL'),
'reorder' => $this->url->link('account/order', 'order_id=' . $result['order_id'], 'SSL')
);
}
}
In account.tpl add this code
<div id="resent_order" class="recent_order">
<a style="float:right; margin-bottom:15px;" href="<?php echo $manage_order; ?>" class="button">Pending orders</a>
<h4>Recent Order</h4>
<ul style="clear:both;">
<?php if( isset($orders) && count($orders > 0 ) ){
foreach ($orders as $order) { ?>
<li>
<div><strong>Order:#</strong><?php echo $order['order_id']; ?></div>
<div><strong>Date:</strong> <?php echo $order['date_added']; ?></div>
<div><strong>Amount:</strong> <?php echo $order['total']; ?></div>
<div><strong>Status:</strong> <?php echo $order['status']; ?></div>
<div class="editPan"><a class="" title="Edit" href="<?php echo $order['href']; ?>">Edit</a></div>
</li>
<?php } ?>
<?php }else{?> <li>You have no pending orders.</li><?php } ?>
</ul>
</div>

changing my forms get url params

i made a simple form with checkboxlist() when i submit the form using get it goes to the next page, but the url is nasty looking.
http://mysite/dev/research/abc/all/?Abc[type]=N&Abc[type][]=1&Abc[type][]=2&Abc[type][]=3&yt0=Search
how would i change it to something like this?
http://mysite/dev/research/abc/all/?type=N&type[]=1&type[]=2&type[]=3
or if possible something nicer looking like
?type=1,2,3
note that i don't want &yt0=Search either
in my controller
public function actionIndex()
{
$model=new ABC;
$this->render('index',array(
'model'=>$model
));
}
in my view i have this
<?php $form = $this->beginWidget('CActiveForm', array(
'id'=>'shop',
'action'=>$this->createUrl('/modulename/abc/all'),
'method'=>'get',
'enableAjaxValidation'=>false,
));
echo $form->checkBoxList($model,'type', $arr,
array('separator'=>'',
'template'=>'<div class="col-md-6 col-xs-12">{input} {label}</div>',
'uncheckValue'=>N,
)
);
echo CHtml::submitButton('Search', array('class'=>'btn btn-success'));
echo CHtml::button('Clear Filter', array('class'=>'btn btn-link', 'type'=>'reset'));
$this->endWidget();
?>
UPDATE:
figured it out. had to add 'name'=> 'type'
but how do i remove &yt0=Search
echo $form->checkBoxList($model,'type', $arr,
array('name'=> 'type',
'separator'=>'',
'template'=>'<div class="col-md-6 col-xs-12">{input} {label}</div>',
'uncheckValue'=>N,
you could use CHtml:button to not post the &yt0=Search
<?php
echo CHtml::button('Search',
array(
'submit'=>array('/modulename/abc/all'),
'class'=>'btn btn-success'
)
);
?>

Yii CActiveForm expects object and not array

My Goal:
I am trying to filter a model, based on a GET parameter, and populate a form based on this.
What I require is that when users select the update icon on the Gridview
I will
grab the 'telephone number' they want to edit,
populate a form with the telephonenumber's data
allow the user to edit this data for the telephonenumber and submit
I then run my own custom sql update query based on the new data.
My Problem
My gridview can successfully capture the telephonenumber for a selected row.
It can successfully send this to the Controller Update method (see below)
I cannot however filter a model based on this telephonenumber and then populate a form with this model.
My Error
get_class() expects parameter 1 to be object, array given
/framework/web/helpers/CHtml.php(2220)
/framework/web/helpers/CHtml.php(2220): get_class(array())
/framework/web/helpers/CHtml.php(1236): CHtml::resolveName(array(), "TelephoneNumbers_TelephoneNumber")
/framework/web/widgets/CActiveForm.php(562): CHtml::activeLabelEx(array(), "TelephoneNumbers_TelephoneNumber", array())
/views/dateAudiid/editupdateform.php(18): CActiveForm->labelEx(array(), "TelephoneNumbers_TelephoneNumber")
/framework/web/CBaseController.php(126): require("/var/www/OMReport/protected/views/dateAudiid/editupdateform.php")
Here's my Gridview.
$this->widget('bootstrap.widgets.TbGridView', array(
'id'=>'dateaudiidcondensed-grid',
'dataProvider'=>$model->search(),
'filter'=>$model,
'columns'=>array(
array(
'class'=>'bootstrap.widgets.TbButtonColumn',
'template'=>'{update}',
'buttons'=>array
(
'update' => array
(
'url'=>'Yii::app()->createUrl("dateAudiid/Update/",array("TelephoneNumbers_TelephoneNumber"=>$data->TelephoneNumbers_TelephoneNumber))',
),
),
),
'TelephoneNumbers_TelephoneNumber',
'FormId_Formid',
'Date',
'AudibeneID_Audibene_ID'
),
));
Here's my Controller
public function actionUpdate($TelephoneNumbers_TelephoneNumber)
{
$criteria=new CDbCriteria;
$criteria->compare('TelephoneNumbers_TelephoneNumber',$_GET['TelephoneNumbers_TelephoneNumber'],true);
$criteria->limit = 1;
$criteria->offset = 1;
$model = DateAudiidCondensedByAudibeneId::model()->findAll($criteria);
$this->render('editupdate',array('model'=>$model));
}
Here's my View
<?php
/* #var $this DateAudiidController */
/* #var $model DateAudiidCondensedByAudibeneId */
?>
<h1>Update Assignments </h1>
<?php echo $this->renderPartial('editupdateform', array('model'=>$model)); ?>
Here's my Form
<div class="form">
<?php
$form=$this->beginWidget('CActiveForm', array(
'id'=>'date-audiid-condensed-by-audibene-id-customupdate-form',
'enableAjaxValidation'=>false,
)); ?>
<p class="note">Fields with <span class="required">*</span> are required.</p>
<?php
echo $form->errorSummary($model); ?>
<div class="row">
<?php echo $form->labelEx($model,'TelephoneNumbers_TelephoneNumber'); ?>
<?php echo $form->textField($model,'TelephoneNumbers_TelephoneNumber'); ?>
</div>
<div class="row">
<?php echo $form->labelEx($model,'FormId_Formid'); ?>
<?php echo $form->textField($model,'FormId_Formid'); ?>
<?php echo $form->error($model,'FormId_Formid'); ?>
</div>
<div class="row">
<?php echo $form->labelEx($model,'Date'); ?>
<?php echo $form->textField($model,'Date'); ?>
<?php echo $form->error($model,'Date'); ?>
</div>
<div class="row">
<?php echo $form->labelEx($model,'AudibeneID_Audibene_ID'); ?>
<?php echo $form->textField($model,'AudibeneID_Audibene_ID'); ?>
<?php echo $form->error($model,'AudibeneID_Audibene_ID'); ?>
</div>
<div class="row buttons">
<?php echo CHtml::submitButton('Submit'); ?>
</div>
<?php $this->endWidget(); ?>
</div><!-- form -->
My Thoughts / What I've tried so far
I am returning the model as an array...but my form wants it as an object.
I need to change something in the way I filter my model in the Controller Update action, however I cannot see how to do this.
All my other methods use similar model filtering code.
here is what you can do to fix this :
your form is trying to use models labeling but you have given an array, ->findAll() will return an array of models, here you need a single object of model
the error your having is because $model in filter of your grid needs to be an object of model which here will try to validate using this model, so won't work when you are giving it an array of your models,
if you want to filter the results based on something, you need to do this where the dataprovider of your grid is being populated, so in this case, is in $model->search()
get the parameter and append it to that criteria
so your grid could look like this:
$this->widget('bootstrap.widgets.TbGridView', array(
'id'=>'dateaudiidcondensed-grid',
'dataProvider' => $model->search(), //create a new model with search scenario
'filter' => $model, // here use that model to validate fields
'columns'=>array(
.
.
.
),
));
and in your models search method:
public function search() {
$criteria = new CDbCriteria;
// grab the sent data and use it here
$tel = Yii::app()->request->getParam('TelephoneNumbers_TelephoneNumber' , null);
if(!empty($tel))
$criteria->compare('TelephoneNumbers_TelephoneNumber' , $tel , true);
.
.
.
return new CActiveDataProvider($this, array(
'criteria' => $criteria,
));
}
Here's what eventually worked for me
The usage of 'findByAttributes' to filter and return a model to the Form
public function actionUpdate($TelephoneNumbers_TelephoneNumber)
{
$model = DateAudiidCondensedByAudibeneId::model()->findByAttributes(array("TelephoneNumbers_TelephoneNumber" => $_GET['TelephoneNumbers_TelephoneNumber']));
$this->render('editupdate',array('model'=>$model));
}