Setting the template property on Yii2 GridView / ActionColumn? - php

First ... old school, rusty Pascal/Clipper/VB developer trying to learn PHP and Yii2 at the same time.
Looking at http://www.yiiframework.com/doc-2.0/yii-grid-actioncolumn.html#$template-detail I should be able to easily remove the update and delete buttons in the ActionColumn ... I just don't know how / where to set the property.
Our GridView code is:
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
['class' => 'yii\grid\SerialColumn'],
'last_name',
'first_name',
'email1:email',
['class' => 'yii\grid\ActionColumn'],
],
]); ?>
My gut tells me it's something to do with instantiating the ActionColumn class before we throw that in as a column ... but I've combed the forums and documentation and just can't find any example.

You are searching for the template properly. http://www.yiiframework.com/doc-2.0/yii-grid-actioncolumn.html#$template-detail
your column should be
[
'class' => 'yii\grid\ActionColumn',
'template' => "{view}",
],

Related

Yii2 GridView multiple rows for one record

I am new in Yii2 framework. I did Gii table, and I wanted to show multiple data related to one ID.
Here is my Grid View:
<?= GridView::widget([
'dataProvider' => $dataProvider,
'columns' => [
'asosSlave.tovar_nom',
],
]); ?>
However, it is only showing one piece of information related to that id:
is this mean?
<?= GridView::widget([
'dataProvider' => $dataProvider,
'columns' => [
'asosSlave.tovar_nom',
['label'=>'title','value'=>function($model){
// do you want to do and return
)}]
],
]); ?>

Yii2 Export redirects to destination page

i'm currently implementing an export function for our yii2 based application. (An humhub module)
I use for this the "kartik-v/yii2-export" module.
The action contains:
$gridColumns = [
['class' => 'yii\grid\SerialColumn'],
'id',
'language',
'time_zone',
['class' => 'yii\grid\ActionColumn'],
];
$dataProvider = new SqlDataProvider([
'sql' => 'SELECT * FROM user WHERE status=:status'
]);
return $this->render('export',[
'dataProvider' => $dataProvider,
'gridColumns' => $gridColumns
]);
The view contains:
echo ExportMenu::widget([
'dataProvider' => $dataProvider,
'columns' => $gridColumns
]);
When I klick on the export function a new popup windows opens with an information that it creates the file now. After a few seconds it should start a download, but redirects to the destination page.
Do I need to add something to the controller or did I do anything else wrong?
Thanks for your help.
It's not clearly defined if that you need the "exportRequestParam" needs to be set.
echo ExportMenu::widget([
'dataProvider' => $dataProvider,
'columns' => $gridColumns,
'exportRequestParam' => 'user'
]);
This way it works.

Remove Update button from GridView?

In the view, adding buttons creates error page.
How do I remove the Update button ?
Here is my view :
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
['class' => 'yii\grid\SerialColumn'],
'user.username',
'title',
'img_title',
'note_type',
['class' => 'yii\grid\ActionColumn'],
// I do not want the Update button.
// Adding this 'button' creates a error.
// 'buttons' => ['{view},{delete}']
],
]); ?>
The error when adding the 'button'
Unknown Property – yii\base\UnknownPropertyException
Setting unknown property: yii\grid\DataColumn::0
Sorry, for other users who have the same issue :
The values :
['class' => 'yii\grid\ActionColumn'],
changed to :
[
'class' => 'yii\grid\ActionColumn',
'template' => '{view} {delete}'
],
did the trick.

yii2 : how to keep the url same in kartik grid view?

I am using kartik grid view to display my data in yii 2 with pjax enabled. Every time, I search a data in the grid view, the search is done using ajax but the url keeps changing. Is there a way to keep the url unchanged? Please help me with the solution. Here is my code:
<?php use kartik\grid\GridView;?>
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'pjax'=>true,
'pjaxSettings'=>[
'neverTimeout'=>true,
],
'columns' => [
['class' => 'yii\grid\SerialColumn'],
'hotel_id',
'name',
'address',
'phone_no',
'contact_person',
// 'email_address:email',
// 'website',
['class' => 'yii\grid\ActionColumn'],
],
]); ?>
You can disable pushState feature like this:
'pjax' => true,
'pjaxSettings' => [
'options' => [
'enablePushState' => false,
],
],

Yii Framework 2.0 GridView and data from the join table

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

Categories