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.