yii2: SqlDataProvider with pagination and searcModel getting error preg_match() expects parameter 2 to be string, object given - pagination

i want to show data using sqlDataProvider to gridview from different table and calculate it, here my code in siteController.php
public function actionSyahriyah()
{ $searchModel = new SyahriyahSearch();
$db = Yii::$app->db;
$bayar = $db ->createCommand('SELECT sy.no_syahriyah, sy.banyak, sa.nama, sy.tgl, sa.tarif
FROM santri sa, syahriyah sy
WHERE sa.no_induk = sy.no_induk
ORDER BY sy.tgl');
$dataProvider = new SqlDataProvider([
'sql' => $bayar,
'pagination' => [
'pageSize' => 5
],
]);
return $this->render('syahriyah',[
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
]);
}
and this is the gridview:
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
// ['class' => 'yii\grid\SerialColumn'],
'tgl',
'banyak',
],
'export' => false,
]);
?>

You can use dataProvider
<?php
$bayar = $db ->createCommand('SELECT sy.no_syahriyah, sy.banyak, sa.nama, sy.tgl, sa.tarif
FROM santri sa, syahriyah sy
WHERE sa.no_induk = sy.no_induk
ORDER BY sy.tgl');
$dataProvider = new SqlDataProvider([
'sql' => $bayar,
'pagination' => [
'pageSize' => 5
],
],
]);
?>

Related

Sorting calculated fields in Yii2 (Grid View) getter param

How get i sort my rows by field i get from model getter like this
* Returns the score for this team
*/
public function getScore() {
$score = 0;
if (!empty($this->bonus_points)) {
$score += $this->bonus_points;
}
foreach (Attempt::find()->where(['team_id' => $this->id, 'marked' => 1])->all() as $attempt) {
$score -= $attempt->cost;
$score += $attempt->reward;
}
return $score;
}
View Code
GridView::widget([
'id' => 'quickfire-grid',
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'filterPosition' => GridView::FILTER_POS_HEADER,
'tableOptions' => [
'class' => 'table'
],
'layout' => "{summary}\n{items}\n{pager}",
'columns' => [
['class' => 'yii\grid\CheckboxColumn'],
'name',
[
'attribute' => 'bonus_points',
'label' => 'Adjustment',
'filter' => false
],
[
'attribute' => 'score',
'label' => 'Score',
'filter' => false,
],
[
'label' => 'Adjust score',
'format' => 'raw',
'value' => function ($data) use ($game) {
return Html::input('text', 'score-' . $data->id, '0', ['id' => 'score-' . $data->id]) . ' ' . Html::a('Adjust score', '#', ['class' => 'btn btn-danger btn-adjust-score', 'data-team-id' => $data->id, 'data-href' => Url::toRoute(['adjust-scores', 'game_id' => $game->id, 'skipConfirmation' => true])]);
},
],
],
]);
Is it possible to sort grid by score field ? I think need to add some javascript code. I have read this article but there is no solution https://www.yiiframework.com/wiki/621/filter-sort-by-calculatedrelated-fields-in-gridview-yii-2-0.
Team::find()->select(['total_score' => 'ifnull(s.score, 0)+team.bonus_points'])
->leftJoin([
's' => Attempt::find()
->select('team_id, SUM(reward-cost) as score')
->where(['marked' => 1])
->groupBy('team_id')
], 's.team_id=team.id')
->orderBy('total_score')
Something like this) Modify select with your needs...

set pagination for gridview have filters in yii2 basic app

i use yii2 basic app and have gridview with filter and search.
i want pagination that for each 10 record. what can i do?
i know add pagination in dataprovider but how can add this to my function?
please help me.
this is important for me.
i do many search but can't find solution for this
controller:
public function actionIndex()
{
$searchModel = new ContactSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
return $this->render('index', [
'searchModel'=>$searchModel,
'dataProvider' => $dataProvider,
]);
}
model\contactsearch.php
<?php
namespace app\models;
use app\models\Contact;
use yii\base\Model;
use yii\data\ActiveDataProvider;
class ContactSearch extends Contact {
public function rules() {
return [
[['f_name', 'l_name', 'phone_number', 'Mobile_number'], 'safe'],
];
}
public function scenarios() {
return Model::scenarios();
}
public function search($params) {
$query = Contact::find();
$dataProvider = new ActiveDataProvider([
'query' => $query,
'sort' => [
'defaultOrder' => [
'l_name' => SORT_DESC,
],
],
]);
if (!(($this->load($params) && $this->validate()))) {
return $dataProvider;
}
$query->andFilterWhere(['like', 'f_name', $this->f_name])
->andFilterWhere(['like', 'l_name', $this->l_name])
->andFilterWhere(['like', 'phone_number', $this->phone_number])
->andFilterWhere(['like', 'Mobile_number', $this->Mobile_number]);
//->andorderBy('id asc');
return $dataProvider;
}
}
?>
view
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel'=>$searchModel,
'columns' => [
['class' => 'yii\grid\SerialColumn'],
'f_name',
'l_name',
'phone_number',
'Mobile_number',
['class' => 'yii\grid\ActionColumn'],
],
]); ?>
To customize record amount in gridview
$dataProvider = new ActiveDataProvider([
'query' => $query,
//show 10 items per page
'pagination' => [
'pagesize' => 10,
],
'sort' => [
'defaultOrder' => [
'l_name' => SORT_DESC,
],
Other option is:
stackoverflow link
In controller:
function actionIndex()
{
$query = Article::find()->where(['status' => 1]);
$countQuery = clone $query;
$pages = new Pagination(['totalCount' => $countQuery->count()]);
$models = $query->offset($pages->offset)
->limit($pages->limit)
->all();
return $this->render('index', [
'models' => $models,
'pages' => $pages,
]);
}
In view file:
foreach ($models as $model) {
// display $model here
}
// display pagination
echo LinkPager::widget([
'pagination' => $pages,
]);

Yii2 search with empty param throws all records

There are 3 search fields in view2.php, search is working properly when i enter something into search field and hit search button. But the problem is when I hit search/Enter button without entering anything into search fields, it displays all the entries related to that model from DB.
Below is my Machine model:
public function search($params)
{
$query = Supplier::find();
$query->joinWith(['user', 'cities', 'industrialareas','supplierMachines', 'subCategory', 'types0','supplierCertificates' ]);
$dataProvider = new ActiveDataProvider([
'query' => $query,
'pagination' => [
'pageSize' => 20,
],
]);
if (!($this->load($params) && $this->validate())) {
$query->where('1 <> 1');
}
else {
// grid filtering conditions
$query->andFilterWhere([
'id' => $this->id,
'yoe' => $this->yoe,
]);
$query->andFilterWhere(['like', 'company_constitution', $this->company_constitution])
->andFilterWhere(['like', 'street', $this->street])
->andFilterWhere(['like', 'locality', $this->locality])
}
return $dataProvider;
}
}
machine controller which calls view2 function(it displays search fields)
public function actionView2()
{
//Display machines based on the customer search
$searchModel = new SupplierMachineSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
// render
return $this->render('view2', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
]);
}
View2.php
<?= $form->field($searchModel, 'enter_city')->widget(AutoComplete::classname(), [
'options' => ['placeholder' => 'Select a city ...', 'class' => 'form-control'],
'clientOptions' => [
'source' => ArrayHelper::getColumn($data, 'city_name'), ],
]) ?>
<?= $form->field($searchModel, 'enter_iarea')->widget(AutoComplete::classname(), [
'options' => ['placeholder' => 'Select a iarea ...', 'class' => 'form-control'],
'clientOptions' => [
'source' => ArrayHelper::getColumn($data1, 'iarea_name'), ],
]) ?>
<?= $form->field($searchModel, 'machine')->widget(AutoComplete::classname(), [
'options' => ['placeholder' => 'Select a iarea ...', 'class' => 'form-control'],
'clientOptions' => [
'source' => ArrayHelper::getColumn($all, 'name' ), ],
]) ?>
<?= Html::activeHiddenInput($searchModel, 'id')?>
<div class="form-group">
<?= Html::submitButton('Apply', ['class' => 'btn btn-success']) ?>
<?= Html::a('Reset', ['view2']);?>
</div>
<?php ActiveForm::end(); ?>
</div>
<?=
ListView::widget([
'dataProvider' => $dataProvider,
'itemView' => '_viewmain',
'viewParams' => [
'fullView' => false,
'context' => 'main-page',
],
]);
Check if the search parameters, once loaded, are empty:
if ( !($this->load($params) && $this->validate()) or
(empty($this->search_param1) and empty($this->search_param2) and empty($this->search_param3)) ) {
$query->where('1 <> 1');
}

How to change export sheet/doc properties in Yii2 krajee grid export?

We have used yii2 krajee export for exporting grid data.How can we modify default title, description , lastmodifiedby?
echo ExportMenu::widget([
'dataProvider' => $dataProvider,
'columns' => $gridColumns,
'target' => ExportMenu::TARGET_SELF,
'exportConfig' => [
ExportMenu::FORMAT_PDF => false,
],
'filename' => 'export-list_' . date('Y-m-d_H-i-s'),
]);
What I did to get my task done-
I have in my header as-
use yii\helpers\Html;
use kartik\grid\GridView;
Then in gridView -
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'pjax'=>true,
'id' => 'grid',
'toolbar' => [
['content'=>
Html::a('<i class="glyphicon glyphicon-repeat"></i>', ['ctrl-action'], ['data-pjax'=>false, 'class' => 'btn btn-default', 'title'=>'Reset Grid'])
],
'{export}',
'{toggleData}'
],
'panel' => [
'heading'=>'<h3 class="panel-title"><i class="glyphicon glyphicon-cloud"></i> Output Daily Data </h3>',
'type'=>'primary',
'before'=>Html::a(''),
'after'=>Html::a(''),
'showFooter'=>false
],
'columns' => [
['class' => 'kartik\grid\SerialColumn'],
'id',
'name'
['class' => 'yii\grid\ActionColumn'],
],
'responsive'=>true,
'hover'=>true,
'exportConfig' => [
GridView::CSV => ['label' => 'Export as CSV', 'filename' => 'File_Name-'.date('d-M-Y')],
GridView::HTML => ['label' => 'Export as HTML', 'filename' => 'File_Name -'.date('d-M-Y')],
GridView::PDF => ['label' => 'Export as PDF', 'filename' => 'File_Name -'.date('d-M-Y')],
GridView::EXCEL=> ['label' => 'Export as EXCEL', 'filename' => 'File_Name -'.date('d-M-Y')],
GridView::TEXT=> ['label' => 'Export as TEXT', 'filename' => 'File_Name -'.date('d-M-Y')],
],
'export' => [
'fontAwesome' => true
],
]); ?>
That worked for me.
just make changes in 'exportConfig' section for rename file.
Try This :
Here is a example of CSV. You can do like wise for others also.
use yii\helpers\Html;
use kartik\grid\GridView;
use kartik\export\ExportMenu;
$gridColumns = [
['class' => 'yii\grid\SerialColumn'],
'id',
'name',
'desc',
['class' => 'yii\grid\ActionColumn'],
];
// Renders a export dropdown menu
echo ExportMenu::widget([
'dataProvider' => $dataProvider,
'columns' => $gridColumns
]);
GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => $gridColumns,
'exportConfig'=> [
GridView::CSV=>[
'label' => 'CSV',
'icon' => '',
'iconOptions' => '',
'showHeader' => false,
'showPageSummary' => false,
'showFooter' => false,
'showCaption' => false,
'filename' => 'yii',
'alertMsg' => 'created',
'options' => ['title' => 'Semicolon - Separated Values'],
'mime' => 'application/csv',
'config' => [
'colDelimiter' => ";",
'rowDelimiter' => "\r\n",
],
],
],
]);

Error: This page can't be reached in Kartik Yii2 Export

In Kartik Yii2 Export, While exporting as Excel am getting This Page Cant't Reached Error in Localhost.
if i export as Text or CSV, export get worked but if i open the exported file Text or CSV, Half the
report is printing like html code
Help will be really appreciated.
GridCode:
<?php $gridColumns = [
['class' => 'yii\grid\SerialColumn'],
'membercode',
'member_name',
[
'attribute' => 'payment_category',
'format' => 'raw',
'label' => 'Payment Category',
'value' => function($model, $key, $index, $grid) {
$temp = $model->payment_category;
$si = Category::find()->where(['category_id' => $temp])->one();
return $si['category_name'];
},
],
'member_gender',
'member_address:ntext',
'payment_date',
'amount',
'receipt_no',
'payment_mode',
'pledge_amount',
'young_amount',
'tv_amount',
'building_amount',
[
'attribute' => 'payment_subcategory',
'format' => 'raw',
'value' => function($model, $key, $index, $grid) {
$exp = explode(',', $model->payment_subcategory);
$relation_name = ArrayHelper::map(Subcategory::find()->where(['subcategory_id' => $exp])->all(), 'subcategory_id', 'subcategory_name');
$relation = implode(',', $relation_name);
return $relation;
},
'filter' => Html::activeDropDownList($searchModel, 'payment_subcategory', ArrayHelper::map(Subcategory::find()->asArray()->all(), 'id', 'subcategory_name'),['class'=>'form-control','multiple' => true]),
],
['class' => 'yii\grid\ActionColumn'],
]; ?>
<?= ExportMenu::widget([
'dataProvider' => $dataProvider,
'columns' => $gridColumns,
'columnSelectorOptions'=>[
'label' => 'Columns',
'class' => 'btn btn-danger'
],
'fontAwesome' => true,
'dropdownOptions' => [
'label' => 'Export All',
'class' => 'btn btn-primary'
]
]); ?>
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => $gridColumns,
'pager' => [
'firstPageLabel' => 'First',
'lastPageLabel' => 'Last',
],
]); ?>
Above is my Grid view Code.
Help will be really appreciated.
Updated:
Error geeting while exporting as CSV:
Error geeting while exporting as EXCEL
There is an issue in your gridview, one of the field in gridview carries "=" equal to sign. please check it out PhpOffice/PhpExcel
Try exportConfig settings this
<?= ExportMenu::widget([
'dataProvider' => $dataProvider,
'columns' => $gridColumns,
'columnSelectorOptions'=>[
'label' => 'Columns',
'class' => 'btn btn-danger'
],
'fontAwesome' => true,
'dropdownOptions' => [
'label' => 'Export All',
'class' => 'btn btn-primary'
]
'exportConfig' => [
ExportMenu::FORMAT_HTML => false,
ExportMenu::FORMAT_TEXT => false,
],
]); ?>
Try this code for your GridVew::Widget:
GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => $gridColumns,
'exportConfig'=> [
GridView::CSV=>[
'label' => 'CSV',
'icon' => '',
'iconOptions' => '',
'showHeader' => false,
'showPageSummary' => false,
'showFooter' => false,
'showCaption' => false,
'filename' => 'yii',
'alertMsg' => 'created',
'options' => ['title' => 'Semicolon - Separated Values'],
'mime' => 'application/csv',
'config' => [
'colDelimiter' => ";",
'rowDelimiter' => "\r\n",
],
],
],
]);

Resources