Cum facem ca un index sa afiseze datele tuturor companiilor la care am eu acces. De exemplu AVBS are nevoie ca lista de clienti sa poata fi si cross-company. Exemplificam deci pe lista de clienti.
Pas 1: in search model creeam o proprietate searchCrossCompanies:
class PartnerSearch extends Partner {
public $searchCrossCompanies = true;
/**
* @inheritdoc
*/
public function rules() {
return [
[[....,'searchCrossCompanies'], 'safe'],
];
}
public function attributeLabels() {
$labels = parent::attributeLabels();
$labels['searchCrossCompanies'] = \Yii::t('app','Search all companies');
return $labels;
}
Pas 2: in index creeam un checkbox pentru aceasta proprietate, in formularul de search pre-requisites:
<?= $form->field($searchModel, 'searchCrossCompanies', [
'horizontalCheckboxTemplate' => '<div class="checkbox-custom checkbox-primary white-bg-field padding-right-10">{input}{label}</div>'
])->checkbox(['onclick' => '$("#filterForm").attr("target","_self").submit();']) ?>
Pas 3: inapoi in search model, adaptam search-ul – pentru a face cautarea fie dupa companyId fie dupa relevent companies; nu uitam sa scoatem fosta cautare dupa companyId (!):
if ($this->searchCrossCompanies && \Yii::$app->user && \Yii::$app->user->identity) {
$relevantCompanies = \Yii::$app->user->identity->getRelevantCompanies(1);
$relevantCompanyIds = ArrayHelper::map($relevantCompanies, "id", "id");
$query->andWhere(['in', 'partner.companyId', $relevantCompanyIds]);
}
else {
$query->andWhere(['partner.companyId' => $this->companyId]);
}
Pas 4: inapoi in index, daca checkbox-ul searchCrossCompanies este bifat, atunci afisam si coloana “Company” – ca user-ul sa stie cui apartie fiecare item (daca item-ii au companie!):
$columns = [
['class' => 'yii\grid\SerialColumn',
'headerOptions' => ['class' => 'text-right andDot width-40'],
'filterOptions' => ['class' => 'empty'],
'contentOptions' => ['class' => 'text-right andDot'],
]];
if($searchModel->searchCrossCompanies){
$columns['companyId'] = [
'attribute' => 'companyId',
//'label' => Yii::t('app', 'Name'),
'headerOptions' => ['class' => 'text-left width-auto'],
'filterOptions' => ['class' => 'text-left'],
'contentOptions' => ['class' => 'text-left'],
'value' => function (Partner $model) {
return $model->company->name;
},
];
}
$columns += [... restul de coloane ...];
(....)
echo GridView::widget([
'id' => 'partnersList',
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'layout' => $gridLayout,
'tableOptions' => ['class' => 'table table-bordered fixed-table'],
'summary' => Yii::t('app', 'Page {page} of {pageCount}, containing {count} items of total {totalCount}, from {begin} to {end}.'),
'columns' => $columns, // <- atasam coloanele
]);
Future enhancement: sa facem asta generic si automat, si sa fie “instalabila” pe oricare alt index.