Custom fields / campuri custom per sectiune

Exista cererea de la clienti de a avea posibilitatea de a creea campuri custom in formularele de factura, contract si partener.

Pentru a avea custom fields intr-o sectiune (adica controller + model) trebuie sa faci asa (vom exemplifica pe factura):

Pas 1: in CustomField.php creeaza o constanta care specifica “tipul de model” si seteaza-i caption-ul :

static $MODELTYPE_INVOICE = 1;

(...)

static function getModelTypes() {
  return [
    self::$MODELTYPE_INVOICE  => Yii::t("app", "Invoice"),
    self::$MODELTYPE_PARTNER  => Yii::t("app", "Partner"),
    self::$MODELTYPE_CONTRACT => Yii::t("app", "Contract"),
  ];
}

Pas 2: in model (Invoice.php in cazul nostru) extinde DActiveRecord, seteaza theModelType in init() cu constanta creeata la pasul 1 si incarca regulile si label-urile dinamice:

class Invoice extends DActiveRecord
(...)
public function init() { 
  $this->theModelType = CustomField::$MODELTYPE_INVOICE; 
  parent::init(); 
}
(...)
public function rules() { 
  $rules = [ 
  [['companyId', 'userId', 'hasFiscalReceipt', 'records', (...) 'transactionType'], 'required' ], 
  (...) 
  [['note', 'transactionType'], 'string'], ]; 
  $this->attachCustomRules($rules); 
  return $rules; 
}
(...)
public function attributeLabels() {
 $labels = [
 'companyId' => Yii::t('app', 'Company'),
 (...)
 'customsVAT' => Yii::t('app', 'Customs VAT'),
 ];
 $this->attachCustomFieldLabels($labels);
 return $labels;
}

Pas 3: in search model : la fel ca in model (vezi mai sus) si in plus, in search adaugam :

$this->attachCustomSearch($query);

 

Pas 4: in _form.php (invoice) introdu generarea automata a campurilor dinamice, in locul in care vrei sa apara:

<?php
if ($model->hasCustomFields()) {
  print '<div id="items-prerequisites" class="row border-top-dashed padding-20">';
  $model->attachCustomFieldsToForm($form);
  print "</div>";
}
?>

Pas 5: optional, acolo unde trebuiesc afisate campurile dinamice; de exemplu in PDF :

<?php
if ($model->hasCustomFields()) {
  print '<tr><td colspan="6">';
  print $model->attachCustomFieldsToView();
  print "</td></tr>";
}
?>

Pas 6: optional, legat de afisarea custom a coloanelor in index

Daca folosim MaxGridView::widget([…]) in index, atunci acolo trebuie sa specificam model type:

MaxGridView::widget([
( ... )
'customFieldModelType'   => CustomField::$MODELTYPE_CUSTOMER

 

 

Daca vrei sa vezi cum poti sa creezi reguli noi pentru campurile dinamice, da click aici.

About

Software Development Manager, Architect

Leave a Reply

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

[TOP]