Checked and Unchecked value of checkbox get submitted to controller - checkbox

I have this form with 14 checkboxes, some may be checked and the user is free to uncheck them as needed.
<?php $form = ActiveForm::begin(); ?>
<h3>New Courses</h3>
<?= GridView::widget([
'dataProvider' => $ns_dataProvider,
'summary' => "{totalCount} courses",
'columns' => [
[
'label'=>'Register',
'format' => 'raw',
'value'=>function ($data) use($student, $active_session_semester) {
// return Html::a(Html::encode("Register"),'site/index');
$studentsubject = \app\models\Studentsubject::find()->where([
'student_id' => $student->id,
'subject_id' => $data->id,
'level_id' => $student->current_level_id,
'session_semester_id' => $active_session_semester->id,
])->all();
$countstudentsubject = count($studentsubject);
if ($countstudentsubject > 0) {
return Html::checkbox('subject_id[]',true,['uncheck'=>"r".$data->id,'value'=>$data->id]);}
else {
return Html::checkbox('subject_id[]', false, ['uncheck'=>"r".$data->id,'value' => $data->id]);
}
},
],
'subject_title',
],
]); ?>
<div class="form-group">
<?= Html::submitButton($model->isNewRecord ? Yii::t('app', 'Create') : Yii::t('app', 'Update'), ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
</div>
<?php ActiveForm::end(); ?>
</div>
I retrieved the value of the checkbox like this
if (Yii::$app->request->post()) {
$x = Yii::$app->request->Post();
$subject_ids = $x['subject_id'];
var_dump($subject_ids);
}
However i get this as the array with 16 values returned instead of 14:
array (size=16)
0 => string 'r273' (length=4)
1 => string '273' (length=3)
2 => string 'r274' (length=4)
3 => string '274' (length=3)
4 => string 'r275' (length=4)
5 => string 'r295' (length=4)
6 => string 'r296' (length=4)
7 => string 'r297' (length=4)
8 => string 'r423' (length=4)
9 => string 'r424' (length=4)
10 => string 'r425' (length=4)
11 => string 'r590' (length=4)
12 => string 'r591' (length=4)
13 => string 'r592' (length=4)
14 => string 'r593' (length=4)
15 => string 'r594' (length=4)
When i check a checkbox, both the checked and unchecked values are sent. Am i missing something? Am fairly new to yii2. Any advice, suggestions and solutions would be highly appreciated.

In your model there is a check box with 16 values and the submit return all of them, the fact these are checked or uncheck don'means they don't be submitted. This is not a Yii2 problem.This is normal behavior for the POST submit method

Related

Getting always last value when trying to create a radio button using loop in cakephp

I'm trying to create a radio button using a loop
<?= $this->Form->create($account) ?>
<?php foreach($gametitles as $gametitle): ?>
<?= $this->Form->radio(
'gametitle_id',
[
['value' => $gametitle->id,'text'=>'','hiddenField' => false],
]
);
?>
<?php endforeach; ?>
<?= $this->Form->button(__('Submit')) ?>
<?= $this->Form->end() ?>
I have added 'hiddenField' => false , but in DOM I'm seeing still hidden field displaying. In output I'm getting always empty value if I select without last radio button.
[
'gametitle_id' => '',
]
If I use name as an array gametitle_id[] I am getting an array
'gametitle_id' => [
(int) 0 => '',
(int) 1 => '',
(int) 2 => '4',
(int) 3 => '',
(int) 4 => '',
],
How I will get only one value that has selected in radio button ? I have used 'hiddenField' => false, still why hidden field is displaying ?
You have set 'hiddenField' => false in options ! You have to set it with name.
echo $this->Form->radio(
'favorite_color',
[
['value' => 'r', 'text' => 'Red', 'style' => 'color:red;']
],
['hiddenField' => false]
)

how to save belongstomany checkboxes in cakephp

I have a set of checkboxes with a belongs to many relationship. I couldnt use a multiple checkbox option for various reasons. The table Tutors has a belongsToMany relationship with subjects table. I get the correct checkboxes checked when it loads and when I update the checboxes I get the correct checkbox data returned but how do i save this? The docs say i need to put the id's in an array for the correct Subjects to be checked . I tried a few things but I couldnt save the data. I dont get an error, just not saving.
//view
foreach ($subjects as $key => $item) {
$sub=$item->name;
$val=0;
foreach ($tutor->subjects as $key2 => $item2) {
$sub2=$item2->name;
if ($sub==$sub2){
$val=1;
break;
}
}
echo $this->Form->hidden('subjects.'.$key.'.id', ['value'=>$item->id]);
echo $this->Form->input('subjects.'.$key.'.checkedvalue', ['label'=>$sub,
'checked'=> $val,'type'=>'checkbox']);
}
//controller
public function edittest5($id = null)
{
$tutor = $this->Tutors->get($id, [
'contain' => ['AvailabilityForTutors','Subjects']
]);
if ($this->request->is(['patch', 'post', 'put'])) {
$tutor = $this->Tutors->patchEntity($tutor, $this->request->data(),['associated' => ['AvailabilityForTutors','Subjects']] );
// $tutor->dirty('availability_for_tutors', true);
debug($tutor);
$this->Tutors->save($tutor,[
// 'atomic'=>false,
'validate' => false,
'associated' => ['Subjects']
]);
return $this->redirect(['action' => 'edittest5',$id]);
}
$subjects = $this->Tutors->Subjects->find('all', ['limit' => 200]);
returned data
'first_name' => 'drew',
'subjects' => [
(int) 0 => [
'id' => '1',
'checkedvalue' => '1'
],
(int) 1 => [
'checkedvalue' => '0'
],
(int) 2 => [
'checkedvalue' => '0'
],
(int) 3 => [
'checkedvalue' => '0'
],
(int) 4 => [
'id' => '5',
'checkedvalue' => '1'

Cakephp - SQL not being generated for all records being inserted

I have the following code in my controller to insert records.
//Perform Inserts
$success = true;
foreach($toinsertrecords as $toinsertrecord) {
$this->BillingCenterDetail->create();
if (!$this->BillingCenterDetail->save($toinsertrecord)) {
$success = false;
echo "insert fail";
} else {echo "insert success";}
}
if ($troubleshoot) {
$log = $this->BillingCenterDetail->getDataSource()->getLog(false, false);
echo "<pre>Output from Datasource Log";
var_dump($log);
echo "</pre>";
}
The array being looped at, has the following contents (Note that the last record has the field order slightly switched, but as this is an associative array, i thought it should not matter)
array (size=3)
0 =>
array (size=1)
'BillingCenterDetail' =>
array (size=12)
'startdate' => string '2014-03-10' (length=10)
'enddate' => string '2014-03-10' (length=10)
'billing_center_id' => string '50' (length=2)
'isactive' => boolean false
'addr1' => string 'melbourne' (length=9)
'addr2' => string 'melbourne' (length=9)
'addr3' => string 'melbourne' (length=9)
'city' => string 'melbourne' (length=9)
'postcode' => string '777' (length=3)
'country' => string 'aus' (length=3)
'email' => string 'a#a.com' (length=7)
'phone' => string '1234' (length=4)
1 =>
array (size=1)
'BillingCenterDetail' =>
array (size=12)
'startdate' => string '2014-03-12' (length=10)
'enddate' => string '2028-12-10' (length=10)
'billing_center_id' => string '50' (length=2)
'isactive' => boolean false
'addr1' => string 'melbourne' (length=9)
'addr2' => string 'melbourne' (length=9)
'addr3' => string 'melbourne' (length=9)
'city' => string 'melbourne' (length=9)
'postcode' => string '777' (length=3)
'country' => string 'aus' (length=3)
'email' => string 'a#a.com' (length=7)
'phone' => string '1234' (length=4)
2 =>
array (size=1)
'BillingCenterDetail' =>
array (size=12)
'billing_center_id' => string '50' (length=2)
'startdate' => string '2014-03-11' (length=10)
'enddate' => string '2014-03-11' (length=10)
'isactive' => string '1' (length=1)
'addr1' => string 'test' (length=4)
'addr2' => string 'test' (length=4)
'addr3' => string 'test' (length=4)
'city' => string 'test' (length=4)
'postcode' => string 'test' (length=4)
'country' => string 'test' (length=4)
'email' => string 'test#test' (length=9)
'phone' => string 'test' (length=4)
This is the output from my getDataSource()->getLog statement
Output from Datasource Log
array (size=3)
'log' =>
array (size=4)
0 =>
array (size=5)
'query' => string 'SELECT `BillingCenterDetail`.`id`, `BillingCenterDetail`.`startdate`, `BillingCenterDetail`.`enddate`, `BillingCenterDetail`.`billing_center_id`, `BillingCenterDetail`.`isactive`, `BillingCenterDetail`.`addr1`, `BillingCenterDetail`.`addr2`, `BillingCenterDetail`.`addr3`, `BillingCenterDetail`.`city`, `BillingCenterDetail`.`postcode`, `BillingCenterDetail`.`country`, `BillingCenterDetail`.`email`, `BillingCenterDetail`.`phone`, `BillingCenterDetail`.`created`, `BillingCenterDetail`.`modified` FROM `bm`.`bil'... (length=718)
'params' =>
array (size=0)
...
'affected' => int 1
'numRows' => int 1
'took' => float 0
1 =>
array (size=5)
'query' => string 'BEGIN' (length=5)
'params' =>
array (size=0)
...
'affected' => int 1
'numRows' => int 1
'took' => float 0
2 =>
array (size=5)
'query' => string 'INSERT INTO `bm`.`billing_center_details` (`startdate`, `enddate`, `billing_center_id`, `isactive`, `addr1`, `addr2`, `addr3`, `city`, `postcode`, `country`, `email`, `phone`, `modified`, `created`) VALUES ('2014-03-10', '2014-03-11', 50, '0', 'melbourne', 'melbourne', 'melbourne', 'melbourne', '777', 'aus', 'a#a.com', '1234', '2014-03-11 15:47:15', '2014-03-11 15:47:15')' (length=374)
'params' =>
array (size=0)
...
'affected' => int 1
'numRows' => int 1
'took' => float 0
3 =>
array (size=5)
'query' => string 'INSERT INTO `bm`.`billing_center_details` (`startdate`, `enddate`, `billing_center_id`, `isactive`, `addr1`, `addr2`, `addr3`, `city`, `postcode`, `country`, `email`, `phone`, `modified`, `created`) VALUES ('2014-03-13', '2028-12-10', 50, '0', 'melbourne', 'melbourne', 'melbourne', 'melbourne', '777', 'aus', 'a#a.com', '1234', '2014-03-11 15:47:15', '2014-03-11 15:47:15')' (length=374)
'params' =>
array (size=0)
...
'affected' => int 1
'numRows' => int 1
'took' => float 0
'count' => int 4
'time' => float 0
You can clearly see that it has only tried to insert the first 2 records, but for some reason it hasn't inserted the 3rd record. Based on the log, it also didn't generate the 3rd Insert SQL statement?
By the time it hits the 3rd loop, the "Save" function fails, this causes $success = false in the end.
Can anyone guess why this is happening?
My guess is the data in the third entry isn't passing validation.
Possibly your model has the postcode field as numeric only? In that case this data will fail:
'postcode' => string 'test' (length=4)
To debug this, I'd add this line inside your existing failure routine:
var_dump($this->BillingCenterDetail->invalidFields());

Cleaner way to get HABTM value with associated Model using CakePHP

I have the following setup:
Model: User
Model: Client
User hasAndBelongsToMany Client
Client hasAndBelongsToMany User
DB Tables:
Users
id
lots of fields
Clients
id
lots of fields
Cliens_Users
id
client_id
user_id
status
Everything is working just peachy but I am wondering if there is a better way to get the status field (associated with the HABTM table) with my Client model.
Here is what I'm doing:
ClientsController.php
public function view($id = null) {
$this->Client->id = $id;
if (!$this->Client->exists()) {
throw new NotFoundException(__('Invalid client'));
}
$this->Client->contain('User.id');
$this->Client = $this->Client->read(null, $id);
$this->set('client', $this->Client);
}
the var_dump on my $this->Client looks like this:
array
'Client' =>
array
'id' => string '1' (length=1)
'first_name' => string 'Matt' (length=4)
'last_name' => string 'Moses' (length=4)
'address_1' => string '123 S Happy Lane' (length=16)
'address_2' => string '' (length=0)
'city' => string 'Yourtown' (length=5)
'state' => string 'TX' (length=2)
'zip' => string '12345' (length=5)
'phone_home' => string '8014567899' (length=10)
'phone_work' => string '8014567899' (length=10)
'phone_cell' => string '8014567899' (length=10)
'email' => string 'matt#matt.com' (length=13)
'created' => string '2012-06-13 04:41:19' (length=19)
'modified' => string '2012-06-13 04:41:19' (length=19)
'User' =>
array
0 =>
array
'id' => string '1' (length=1)
'ClientsUser' =>
array
...
Clients/view.ctp
...
<?php echo $client['User'][0]['ClientsUser']['status']; ?>
...
To me this last line screams "there is a cleaner way" but I can't seem to find anything on the matter. Any thoughts?

Retireving data from arrays

I have this data spited out from my cake php query.. This is the problem.. How can i retrieve this data so that it fits this structure. How can I do this in my view?, I am just having trouble understanding how to retrieve each value
so this part I want it in a <p></p> in my page
array
'id' => string '1' (length=1)
'category_name' => string 'Appetizers' (length=10)
'category_keywords' => string 'appetizer, appetizers' (length=21)
'category_title' => string 'Our Side Dishes' (length=15)
'category_info' => string 'Hello This is the category info' (length=30)
'dish_id' => string '1' (length=1)
This other part returned of the query i want to put it in a 3 x 2 table. like
<table>
<tr>
<td> the data from the array 0</td>
<td> the data from the array 1</td>
<td> the data from the array 2>/td>
</tr>
<tr>
<td> the data from the array 3</td>
<td> the data from the array 4</td>
<td> the data from the array 5>/td>
</tr>
here are all the those arrays. I would like to use a for loop with a mod if 3 %== 0 and then create a new <tr>, i tried it but it gave me an error...
array
'id' => string '1' (length=1)
'category_name' => string 'Appetizers' (length=10)
'category_keywords' => string 'appetizer, appetizers' (length=21)
'category_title' => string 'Our Side Dishes' (length=15)
'category_info' => string 'Hello This is the category info' (length=441)
'dish_id' => string '1' (length=1)
array
0 =>
array
'id' => string '1' (length=1)
'dish_name' => string 'Arepa Con Pollo!' (length=16)
'dish_disc' => string 'Exquisite corn patti, the best yyy' (length=34)
'dish_price' => string '2.90' (length=4)
'dish_image' => string '/img/arepa rellena con pollo.jpeg' (length=33)
'dish_category_id' => string '1' (length=1)
'dish_price_label' => string 'Delicious Arepa ' (length=16)
1 =>
array
'id' => string '2' (length=1)
'dish_name' => string 'Arepa Con Queso' (length=15)
'dish_disc' => string 'Corn patie with Cheese' (length=22)
'dish_price' => string '2.65' (length=4)
'dish_image' => string '/img/arepa rellena con queso.jpeg' (length=33)
'dish_category_id' => string '1' (length=1)
'dish_price_label' => string '' (length=0)
2 =>
array
'id' => string '3' (length=1)
'dish_name' => string 'Empanadas de Carne' (length=18)
'dish_disc' => string 'Patties with beef' (length=17)
'dish_price' => string '1.60' (length=4)
'dish_image' => string '/img/empanadas de carne.jpeg' (length=28)
'dish_category_id' => string '1' (length=1)
'dish_price_label' => string '' (length=0)
3 =>
array
'id' => string '4' (length=1)
'dish_name' => string 'Empanadas de Pollo' (length=18)
'dish_disc' => string 'Patties with Chicken' (length=20)
'dish_price' => string '1.94' (length=4)
'dish_image' => string '/img/empanadas de pollo.jpeg' (length=28)
'dish_category_id' => string '1' (length=1)
There are more arrays besides these.. but they all have the same format.
These come from working with the following controllers
class DishCategory extends AppModel{
public $hasMany = array(
'Dish' => array(
'className' => 'Dish',
'foreignKey' => 'dish_category_id'
)
);
}
class DishCategoriesController extends AppController {
function get_categories($id)
{
// find category with a dish of $id
$this->set('dishes', $this->DishCategory->find('first', array(
'conditions' => array(
'DishCategory.id' => $id
)
)));
// set master layout
$this->layout = 'master_layout';
}
}
Use this->set('variableName', $data); to pass your arrays from the controller to the view.
You can then access the example above as $variableName in your view. I would recommend doing a <?php debug($variableName); ?> first to see what your array looks like in the view. It should be the same, but it will help you know what indices to use.
For more info: http://book.cakephp.org/view/979/set

Resources