Index (search) cross-company (i.e. pe toate companiile mele)

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.

About

Software Development Manager, Architect

Leave a Reply

Your email address will not be published. Required fields are marked *

[TOP]