Yii Framework 2.0 GridView and data from the join table - php

I have two database tables 'user' and 'role'. I used Yii framework 2.0 Gii to create CRUD with User model and UserSearch model. By default, Gii uses GridView::widget for the index page for the 'user' model.
In the search($params) method inside of the UserSearch model, I used the following code to join the above tables together
$query = User::find()->with('role');
Everything works fine with the query.
By default Gii does not include the data from the joined table 'role' in the GridView::widget inside of the views/user/index.php page. With the join query above I could retrieve data from both tables. In the views/user/index.php page I have injected the GridView::widget with the following code so that it also includes the data and column names from the joined table (role).
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
['class' => 'yii\grid\SerialColumn'],
'userid',
'username',
'role.role_name',
['class' => 'yii\grid\ActionColumn'],
],
]); ?>
Everything works fine with the role data 'role_name included in the GridView::widget. But the problem is that there is no search box for the role_name. The GridView::widget creates search box for the User properties only. Is there any way to add search box for the properties of the joined table 'role' because I also would like to search through 'role_name' as well as through other properties of the User model.

Try this way:
In your UserSearch model add
UserSearch extends ...
{
public $roleFilterInputName; //the name of the filter search input
//important
function rules()
{
//add roleFilterInputName as safe
return [
[['xxx', 'roleFilterInputName'], 'safe'], //!!!!
];
}
}
in your grid:
'columns':
[
//...
[
'attribute' => 'roleFilterInputName',
'value' => 'role.role_name'
],
//...
]
in UserSearch::search()
$query->andFilterWhere(['like', 'role.role_name', $this->roleFilterInputName])
But I guess you'll have to use 'joinWith' instead of 'with'.

Inside CGridView add below code. It will enable filter with dropDownList.
[
'attribute' => 'act_role_id',
'label' => 'Actor Role',
'value' => 'actRole.role_name',
'filter' => yii\helpers\ArrayHelper::map(app\models\ActorRole::find()->orderBy('role_name')->asArray()->all(),'act_role_id','role_name')
],
CGridView code Snippet is as below:
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
['class' => 'yii\grid\SerialColumn'],
'userid',
'username',
[
'attribute' => 'act_role_id',
'label' => 'Actor Role',
'value' => 'actRole.role_name',
'filter' => yii\helpers\ArrayHelper::map(app\models\ActorRole::find()->orderBy('role_name')->asArray()->all(),'act_role_id','role_name')
],
['class' => 'yii\grid\ActionColumn'],
],
]); ?>

Try it with
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
['class' => 'yii\grid\SerialColumn'],
'userid',
'username',
//'role.role_name',
['attribute' => 'role', 'value' => 'role.role_name'],
['class' => 'yii\grid\ActionColumn'],
],
]); ?>
I just have tried it in my code, so I'm not sure if this works also with your code. But if so, I don't know why it has to be defined this way.
I guess the answer of rajesh ujade also includes this definition, however, for Yii 1.

This worked for me
Table = Lead (id , year_id)
Table = Year (id, text)
Added text in lead (index.php)
Year::find()->all() = This code pull all value from table/ all years.
[
'attribute'=> 'year_id',
'format' => 'html',
'value' => 'year.value',
'label' => 'Year',
'filter' => Html::activeDropDownList($searchModel, 'year', yii\helpers\ArrayHelper::map(Year::find()->all(), 'year_id', 'value'), ['class' => 'form-control', 'prompt' => '---']),
],
Also it shows dropdown as well sorting.
image Showing Dropdown in Grdiview

#Ekonoval is going in right way.
Just add following in serch function of UserSearch:
After initializing ActiveDataProvider object like this:
$dataProvider = new ActiveDataProvider([
'query' => $query,
'pagination' => [
'pageSize' => 5,
],
]);
$dataProvider->sort->attributes['roleFilterInputName'] = [
'asc' => ['role.role_name' => SORT_ASC],
'desc' => ['role.role_name' => SORT_DESC]
];

You may write query in your UserSearch model like
if($this->role)
{
$query->join('LEFT JOIN','role','role.user_id = user.id')->andFilterWhere(['role.item_name' => $this->role]);
}

Related

yii2 gridview column headers not translated

Currently a problem with getting the headers translated when using the GridView Widget, supplied by Yii themselves.
The page and item indicator and all other features of the page are being translated, and when I build this table without the GridView Widget everything is fine. However now after doing a few tables manually I would like to see if someone knows a solution for this problem.
Just to sum things up:
i18N is working properly on the entire website
Translation is not working on GridView Widget
Translation is working on for example ActiveForm
All headers are added to the correct Message file.
And Here the corresponding code:
//Controller-Action
$releaseQuery = new Query();
$releaseQuery->
select("`amount` AS 'Amount',
`created` AS 'Created',
`user`.`email` AS 'User',
`cinema`.`name` AS 'Cinema',
`date` AS 'Date'")->
from("`release`")->
join('left join', '`user`', '`release`.`created_by` = `user`.`id`')->
join('left join', '`cinema`', '`release`.`cinemaid` = `cinema`.`id`');
$dataProvider = new ActiveDataProvider([
'query' => $releaseQuery,
'pagination' => [
'pageSize' => 50,
],
]);
// View
<?= GridView::widget([
'dataProvider' => $dataProvider,
'columns' => [
'Amount:currency',
'Created',
'User',
'Cinema',
'Date',
],
]) ?>
Check if in your model you have the i18n in attributeLabel
like this sample (if you don'have you must add or add them in label parameter for gridview)
public function attributeLabels()
{
return [
'name' => Yii::t('app', 'Name'),
'type' => Yii::t('app', 'Type'),
'description' => Yii::t('app', 'Description'),
'rule_name' => Yii::t('app', 'Rule Name'),
'data' => Yii::t('app', 'Data'),
'created_at' => Yii::t('app', 'Created At'),
'updated_at' => Yii::t('app', 'Updated At'),
];
}
if you generate the model with gii remenber to set i18n checkbox
If you use new column name in query these became attribute in gridview e you must manager the relative label with proper translation function
<?= GridView::widget([
'dataProvider' => $dataProvider,
'columns' => [
['attribute' => 'Amount',
'label' => Yii::t('app', 'Amount'),],
.......
],
]) ?>

How can I use a simple Dropdown list with filtering in the search box of GridView::widget, Yii2?

I have two tables "attendance" with attributes id, status, date and "staff". staff_id is used as foreign key in attendance table. In _form.php of attendance I used
<?= $form->field($model, 'status')->dropDownList([ 'Present' => 'Present', 'Absent' => 'Absent', 'Leave' => 'Leave',], ['prompt' => 'Select status']) ?>
for dropdown. Now I want to a dropdown in gridview search columns with property of filtering and searching. I would like my gridview to be filtered by the dropdown list I have. So when I choose a value from the dropdown list, it should search on base of choosed value. Any help would be highly appriciated.
I think your question is about status field
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
['class' => 'yii\grid\SerialColumn'],
........
[
'attribute' => 'status',
'label' => 'Status',
'filter' => [ 'Present' => 'Present', 'Absent' => 'Absent', 'Leave' => 'Leave',]
],
......
add this code in your cgridview,
array(
'name'=>'name_of_field',
'value'=>function($data){
echo $data->relation_name->name;
},
'filter'=>CHtml::listData(Model::model()->findAll('condition_if_any'),'id','name'),
'htmlOptions' => array('style' => "text-align:center;"),
),
Try this for add drop down in filter.
[
'attribute' => 'name_of_field',
'value' => function($model){
return $model->relationName->name;
},
'filter' => \yii\helpers\ArrayHelper::map(Model::find()->all(), 'id', 'name'),
],
fetch data from tables automatically:
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
[
'attribute' => 'deptname',
'value' => 'deptname',
'filter'=>ArrayHelper::map(Attendance::find()->joinWith('staff')->orderBy('id')->all(), 'status', 'status'),
],
]
]);
?>

How to pass "elementId" in barcode generator in Gridview Yii2?

I have gone through this:
http://www.yiiframework.com/extension/yii-barcode-generator-8-types/
https://github.com/Vilochane/Yii-Barcode-Generator
http://www.yiiframework.com/extension/yii2-barcode-generator-8-types/
But doesn't get it work. My gridView:
<?= GridView::widget([
'dataProvider' => new yii\data\ActiveDataProvider(['query' => $model->getLibBookMasters()]),
'summary' => '',
'columns' => [
['class' => 'yii\grid\SerialColumn'],
'lbm_book_no',
[
'attribute' => 'lbm_barcode_no',
//'type' => 'raw',
'value'=> function($model){
return \barcode\barcode\BarcodeGenerator::widget(
[
'elementId' => 'lbm_barcode_no',
'value'=> 'lbm_barcode_no',
'type'=>'ean13',
]);},
],
],
]); ?>
I need to pass elementId that do the trick but doesn't found it.
I just installed Barcode Generator and don't know how to play around with.
You need to pass different elementIds. As your code is currently your are passing the literal 'lbm_barcode_no' instead of the value of the lbm_barcode_no attribute of your models. In addition, you have to create the divs where the barcode is to be shown and set the format of the column to raw or html:
'columns' => [
['class' => 'yii\grid\SerialColumn'],
'lbm_book_no',
[
'attribute' => 'lbm_barcode_no',
'format' => 'raw',
'value'=> function($model){
return yii\helpers\Html::tag('div', '', ['id' => 'barcode-'.$model->lbm_barcode_no]).
\barcode\barcode\BarcodeGenerator::widget([
'elementId' => 'barcode-'.$model->lbm_barcode_no,
'value'=> $model->lbm_barcode_no,
'type'=>'ean13',
]);
},
],
],
I prefixed the tags with barcode- to avoid collisions (you never know).

Displaying Related Data in Gridview Using Yii2

I have being struggling with related model data for a while and can't seem to pin point the problem, I have been reduced to using a very simple example.
I have two models Dog and Owner, which have the following relations.
Owner:
public function getDogs()
{
return $this->hasMany(Dog::className(), ['owner_id' => 'id']);
}
Dog:
public function getOwner()
{
return $this->hasOne(Owner::className(), ['id' => 'owner_id']);
}
As a simple test I want to get the dog to disaply from the grid view in the index page in Owner view
This is my index.php in the Owner view
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
['class' => 'yii\grid\SerialColumn'],
'id',
'name',
[
'attribute' => 'type',
'value' => 'dog.type',
],
['class' => 'yii\grid\ActionColumn'],
],
]); ?>
I must be missing something fundamental here?
You cannot display multiple related items like this, but you could simply use a callback, e.g. :
[
'label' => 'Dog types',
'value' => function($model) {
return join(', ', yii\helpers\ArrayHelper::map($model->dogs, 'id', 'type'));
},
],

How can I show two attributes values in one column through relation in Yii 2 GridView

i have Gridview in index i want to show width and height both in one column how can i do it
here is the view code
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
['class' => 'yii\grid\SerialColumn'],
'fld_id',
'fld_name',
[
'label' => 'Material Name',
'attribute' => 'fld_material_id',
'value' => 'fldMaterial.fld_name',
],
[
'label' => 'Size',
'attribute' => 'fld_size_id',
'value' => 'fldSize.fld_width',
],
// 'fld_size_id',
['class' => 'yii\grid\ActionColumn'],
],
]); ?>
i have relation fldSize in model here it is just only displaying fld_width i want to show it in the format fld_width."x".fld_height how can i do it in Yii2
You should simply use value callback, e.g. :
[
'label' => 'Size',
'attribute' => 'fld_size_id',
'value' => function ($model) {
return $model->fldSize->fld_width . 'x' . $model->fldSize->fld_height;
},
],
Sorry that after more than one year, but it works (not a dropdown but Select2).
Here is the code for the form
<?= $form->field($model, 'ID_MACH')->widget(Select2::classname(), [
'data'=> ArrayHelper::map(Maschines::find()->all(),'ID_MACH','fullname'),
'language'=>'ru',
'theme'=>'krajee',
'options'=>['placeholders'=>'suda...',
'prompt'=>'10-'],
'pluginOptions'=>[
'allowclear'=>true
],
Next is the Model for Mashines:
public function getFullName()
{
return $this->customer.','.$this->Manufacturer.','.$this->type.','.$this->serial;}

Categories