Saving a checkbox value in Yii - yii

I can't figure out how to properly save checkbox values in Yii. I have a MySQL column, active, defined as a tinyint. I have the following form creation code, which correctly shows the checkbox as checked if the value is 1 and unchecked if 0:
<?php echo $form->labelEx($model,'active'); ?>
<?php echo $form->checkBox($model,'active'); ?>
<?php echo $form->error($model,'active'); ?>
And the code to save the form correctly changes other, text-based values:
public function actionUpdate($id)
{
$model=$this->loadModel($id);
if(isset($_POST['Thing']))
{
$model->attributes=$_POST['Thing'];
if($model->save())
$this->redirect(array('thing/index'));
}
$this->render('update',array(
'model'=>$model,
));
}
The value of active is not saved. Where am I going wrong?

You can use htmlOptions array to specify value attribute. Below is the code example:
<?php echo $form->labelEx($model,'active'); ?>
<?php echo $form->checkBox($model,'active', array('value'=>1, 'uncheckValue'=>0)); ?>
<?php echo $form->error($model,'active'); ?>
Since version 1.0.2, a special option named 'uncheckValue' is
available that can be used to specify the value returned when the
checkbox is not checked. By default, this value is '0'.
(This text is taken from YII Documenration)

For every input that you are accepting from user, you need to define it in model::rule(). is active defined there in rule()?

In general, if you are having problems saving to the database, i would replace
$model->save();
with
if($model->save() == false) var_dump($model->errors);
that way, you can see exactly why it did not save. it is usually a validation error.

Please follow:
1. in protected/models/Thing.php add active as a numeric
public function rules()
{
// NOTE: you should only define rules for those attributes that
// will receive user inputs.
return array(
array('active', 'numerical', 'integerOnly'=>true),
//OR optional
array('active', 'safe'),
);
}
Controller action: Its ok
View:
<?php echo $form->labelEx($model,'active'); ?>
<?php echo $form->checkBox($model,'active', array('value'=>1, 'uncheckValue'=>0)); ?>
<?php echo $form->error($model,'active'); ?>
Hope this will work for you...

Article which can be helpful when figuring out how to handle booleans & checkboxes in Yii
http://www.larryullman.com/2010/07/25/handling-checkboxes-in-yii-with-non-boolean-values/

I used a bit type field in my DB and it didn't work.
1.- I changed the field type to tinyint
2.- In the rules function added:
array('active','numerical'),
3.-In the form (as D3K said) do:
<?echo $form->checkBox($model,'active',array('value'=>1, 'uncheckValue'=>0));?>

You can check by printing all the attributes which are being captured. If active is not captured, it must not be safe. you need to declare the variable as safe or define a rule around that variable. This will make the variable safe.

I have similar the same problemce before,I change data type is int,so it save

We can also add a rule as safe in model to pass the values from form to controller without missing.
array('active', 'safe'),

well this post is so old but I've found a solution very useful specially for giving checkbox a value specified rather than number. The new syntax is something like this
notice I'm using ActiveForm
field($model3, 'External_Catering')->checkbox(['id' => 'remember-me-ver', 'custom' => true,'value'=>"External_Catering", 'uncheckValue'=>"vide"]) ?>
1) where my model is =>model3
2) with the name External_Catering
3) that take the value External_Catering and empty when it's uncheckValue
4) in Controller you get the value just by specifying the model and it's attribute like
  $External_Catering=$model3->External_Catering.

Related

Adding new field in the database in Yii 1.1

I have added a field allergy in the user table. But after submitting the form it is not get inserted. I am new to Yii. I am not using any Gii generators since this is the existing code base. Is it possible to add the new field as I tried here or should I run any Yii generators (model,CRUD)
I changed the following areas.
\protected\views\userManagement\user.php
<?php echo $form->labelEx($model,'allergy'); ?>
<?php echo $form->error($model,'allergy'); ?>
\protected\models\User.php
In the attributeLabels() function:
'allergy' => 'Allergy',
In the search() function:
$criteria->compare('allergy',$this->allergy);
In the beforeSave() function:
if($this->allergy=='')
$this->setAttribute('allergy', NULL);
else
$this->setAttribute('allergy', $this->allergy);

Remove red * in required fields Yiibooster

I'm using yiibooster and it is really good extension for the frontend, my issues now is that I want to remove the red * that is rendered in the required fields but maintaining the required validator in the model, anyone knows how to do this????
thankss
This is an example of a label generated by a required field validator:
<label for="User_email" class="required">
Email Address <span class="required">*</span>
</label>
Therefore, you can hide it by adding this class to your site's CSS:
span.required {
display: none;
}
If you want to achieve what you want easily, I suggest you to do like below, which is simplest way(in my view point):
Just try to find * selector(the ID or CLASS) name.(using a firebug or any inspector)
Then just do like below in your document.ready():
$(SELECTOR).remove();
NOTES
THE * MIGHT BE CREATED DYNAMICALLY
THIS IS JUST AN SUGGESTION, YOU CAN FIND ANY OTHER POSSIBLE WAYS SUCH AS CHANGING THE CSS CLASS IN ORDER TO DO DISPLAY:NONE OR SOURCE MODIFICATION
<?php echo $form->textFieldGroup($model, 'username',array('label'=>Yii::t('model','Username'))); ?>
or edit line 1223 of TbActiveForm.php from
echo $this->labelEx($model, $attribute, $options['labelOptions']);
to
echo $this->label($model, $attribute, $options['labelOptions']);
Red * is adding according to your validators definition in your model. you have two options.
First in your model add On => 'scenario name' for required validator for the property you want. so you can control the behavior of yii-booster components because they only apply those rules which matches the scenario of the model. for example:
array('password_repeat', 'required', 'on'=>'register'),
It will show Red * only in register scenario (if you set it via $model->setScenario('register');) and in normal times no red * will shown.
Another option for you is when you are creating the form element based on the property marked required by validator rules in model, you can prevent that * from showing but this way will not ignore that validation rule and if you try to submit the form while this form field is empty you will get error from yii (because you just solve showing but in background you have your required validator). for this method, you only need to provide label in your yii-booster form element:
<?php echo $form->textFieldGroup($model,'textField',
array(
'wrapperHtmlOptions' => array(
'class' => 'col-sm-5',
),
'hint' => 'In addition to freeform text, any HTML5 text-based input appears like so.',
>>>>> 'label' => 'Your new value for label which will have no red *',
)
); ?>

How to make Yii CListView to display WYSIWYG formatted text?

On the admin side, I've used a WYSIWYG editor for all textareas.
When we format that with bold for example, the following string is stored in the database:
<b>hello bold</b>
However, when I try to see that text in bold, I, instead see something like this:
"<b>hello bold</b>"
The goal (so I suppose) would be to remove those double quotes, in order to allow us to see the proper formatted text.
Here's the widget call:
<?php $this->widget('bootstrap.widgets.BsListView',array(
'dataProvider'=>$dataProvider,
'itemView'=>'_view',
));
Here's the view he is calling:
<b><?php echo CHtml::encode($data->getAttributeLabel('description')); ?>:</b>
<?php echo $data->description; ?><!-- Removed the encode from this line-->
<br />
If I remove the CHtml::encode, this works, but, if I have like 500 textareas, should I go to each view and remove this CHtml::encode :s
Any clue?
You can solve this with PHP "html_entity_decode" function
take a look here : http://www.yiiframework.com/forum/index.php/topic/22237-clistview-raw-html/
<?php
$orig = "I'll \"walk\" the <b>dog</b> now";
$b = html_entity_decode($a);
echo $b; // I'll "walk" the <b>dog</b> now
?>
Ref: http://www.php.net/html_entity_decode
Update
You should remove chtml::encode when you print html tags contain data. thats the issue here.
The usage of encode() is to Encode special characters into HTML entities http://yiiframework.com/doc/api/1.1/CHtml#encode-detail

I have two models message and messageto and I am using message models attributes in the messageto form page how to validate those attributes

I have two models message and messageto and I am using message models attributes in the messageto form page how to validate those attributes using ajax validation, I am new to YII.
I am using application.extensions.tokeninput.TokenInput to display the fields and I am unable to validate fields on these widgets. Thank you waiting for your answer.
A good understanding of How-Yii-Ajax-Validation-Works will help you a lot in using this feature & do some customization to it.
I am afraid i did not use tokeninput extension but regarding your two models ajax validation, the following general plan should work:
in your View, make sure you have:
$form = $this->beginWidget('CActiveForm', array(
'id'=>'some-id-for-your-form',
'enableAjaxValidation'=>true //turn on ajax validation on the client side
));
Moreover in the View, any field with validation rule should have:
<?php echo $form->textField($model, 'some_attribute'); ?>
<?php echo $form->error($model, 'some_attribute'); ?> // This is used to present validations error
and in your Controller, in create or update action before you load View inputs through POST, put the following lines:
$messageModel = new Message;
$messageToModel = New MessageTo;
if(Yii::app()->getRequest()->getIsAjaxRequest())
{
echo CActiveForm::validate( array( $messageModel,$messageToModel));
Yii::app()->end();
}
/*
The rest of your code goes here
*/
As for the extension you are using, if its auto-generate the View code, then you need to know how to configure it to put the needed enableAjaxValidation => true & the $form->error($model,'some_attribute') Parts.
Hope this helped!!

Yii: How to populate a Select input with another model data?

I'm playing around with a small app in order to learn to use Yii.
I've created a small webapp with 2 models / tables: Projects and tasks. (1-to-many relationship, properly configured in the model classes).
I'm now trying to customize the Task/create view, replacing the text input field with a select box proposing the list of available projects.
I opened the form view and tried this:
<div class="row">
<?php echo $form->labelEx($model,'project_id'); ?>
<?php echo $form->textField($model,'project_id'); ?>
<?php
// my hack starts here
$projects = Project::model()->findAll();
$list = CHtml::listData($projects, 'id', 'name');
echo $form->listBox($model,'project_id','', $list); ?>
// my hack ends here
<?php echo $form->error($model,'project_id'); ?>
</div>
But it keeps throwing warnings or error (such as Invalid argument supplied for foreach(), and definitely does not work. I'm failing to understand what i'm doing wrong. Can you help ?
Your arguments are not in order (it should be):
$frameworks = Framework::model()->findAll();
$list = CHtml::listData($frameworks, 'id', 'name');
echo $form->listBox($model,'framework_id', $list,array());
Check the documentation
OK, i found it, thanks to Larry Ullman excellent tutorial.
Here it is:
<?php echo $form->dropDownList($model,'project_id', CHtml::listData(Project::model()->findAll(), 'id', 'name')); ?>