use common\CKEditor;
$form->field($model, 'opis')->widget(CKEditor::className(), [
'options' => ['rows' => 10],
'preset' => 'advanced',
'clientOptions' => [
'extraPlugins' =>'justify',
]
])->label('Opis');
?>
==== Ładowanie treści do edytora za pomocą JS ====
CKEDITOR.instances['dynamicmodel-tresc'].setData(data);
===== Zabezpieczenie przed podwójnym wysłaniem formularza JS =====
// nie wolno nadawać przyciskowi 'id'=>'submit'
'form-create']); ?>
...
= Html::submitButton('Zapisuję się', ['class' => 'btn btn-success','id'=>'sub' ]) ?>
...
registerJs('
form = $("#form-create");
$("#spin1").hide();
$("#sub").on("click", function () {
$(this).hide();
$("#spin1").show();
});
$(form).on("afterValidate", function (event, messages, errorAttributes) {
if (errorAttributes.length > 0) {
$("#spin1").hide();
$("#sub").show();
}
});
');
===== Zabezpieczenie przed podwójnym wysłaniem formularza =====
W modelu tworzymy funkcję:
public function getToken() {
$token = \Yii::$app->getSecurity()->generateRandomString();
$token = str_replace('+', '.', base64_encode($token));
\Yii::$app->session->set('form_token', $token);
return Html::hiddenInput('form_token', $token,['id'=>'form_token']);
}
W formularzu dodajemy:
$form = ActiveForm::begin([
'action' => '/regulacje/create?id=' . $id_struktura_dokumentow,
'method' => 'post',
'id' => 'form-vertical',
'options' => [
'data-pjax' => true,
'onsubmit' => '$("#subbut").disabled = true;$("#form_token").val("-")',
],
]);
= $model->token?>
= Html::submitButton('Zapisz', ['class' => 'btn btn-success', 'id' => 'subbut']) ?>
W kontrolerze zapisanie modelu:
public function actionCreate() {
...
$formTokenName = 'form_token';
$formTokenValue = Yii::$app->request->post($formTokenName);
$sessionTokenValue = Yii::$app->session->get($formTokenName);
if($formTokenValue == $sessionTokenValue){
$model->save();
Yii::$app->session->remove($formTokenName);
}
}
===== Zabezpieczenie przed wysłaniem formularza ENTERem =====
$(document).ready(function () {
$(window).keydown(function (event) {
if (event.keyCode === 13) {
event.preventDefault();
return false;
}
});
});
**Wersja AI - lepsza, uwzględniająca ENTER w polu textarea**
$(window).keydown(function (event) {
var activeElement = document.activeElement;
if (activeElement.tagName.toLowerCase() === "textarea") {
return true;
} else {
event.preventDefault();
return false;
}
});
----
===== CSRF - token =====
Jeśli robisz formularz ręcznie w HTML nie używając metod Yii2 to:
Yii2 ma zabezpieczenia przed atakami CSRF Cross-site request forgery
i z formularzem trzeba wysłać specjalny token.
----
===== Liczby dziesiętne - przecinek na kropkę =====
Przy wprowadzaniu liczb dziesiętnych chcemy aby separatorem był przecinek lub kropka.\\
Domyślnym znakiem jest kropka bo tak zapisuje się do bazy danych.\\
Użytkownicy przyzwyczajeni są do przecinków.
Rozwiązanie zamienia "w locie" przecinek na kropkę.
= field($model, 'ilosc')->textInput([
'class'=>'coma form-control'
]) ?>
na końcu pliku formularza:
registerJs("
$('.coma').on('keyup', function(e){
$(this).val($(this).val().replace(/[,]/g, '.'));
});
");
----
===== Czerwone gwiazdki przy wymaganych polach =====
W modelu w funkcji rules ustalono wybrane pola jako wymagane (required)
W pliku formularza (_form.php) należy dodać na końcu
<?php
$this->registerCSS('
form div.required label.control-label:before {
content:" * ";
color:red;
}
');
Zamiast **before** można wpisać **after**
----
===== Formularz w Bootstrap modal =====
Aby w prawidłowo obsługiwać formularz w wyskakującym oknie (bootstrap modal)
formularz musi korzystać z technologii Ajax.\\
Technologię Ajax obsługuje widget Pjax.
'log-in']) ?>
'login-form',
'options' => ['data-pjax' => true]
]); ?>
...
----
===== Własne akcje w formularzu =====
Zależnie od tego czy tworzymy nowy rekord //(isNewRecord = true)// czy modyfikujemy istniejący
if($model->isNewRecord){
$action = 'kontroler/createakcja/';
} else {
$action = 'kontroler/updateakcja/';
}
$form = ActiveForm::begin([
'action' => [$action . $id],
...
----
===== Tablice dni, godzin i minut =====
W formularzu potrzebne są czasami tablice dni godzin i minut do list wyboru.
$dni_tygodnia = ['1' => 'Poniedziałek', '2' => 'Wtorek', '3' => 'Środa',
'4' => 'Czwartek', '5' => 'Piątek', '6' => 'Sobota', '7' => 'Niedziela'];
Godziny od 07 do 21
$godziny = array_map(function($n) {
return sprintf('%02d', $n);
}, array_combine(range(7, 21), range(7, 21)) );
wynik:
$godziny[7] = '07'
...
Minuty od 0 do 55 co 5
$minuty = array_map(function($n) {
return sprintf('%02d', $n);
},array_combine(range(0, 55, 5), range(0, 55, 5)));
wynik:
$minuty[0] = '00';
$minuty[5] = '05';
$minuty[10] = '10';
...
===== Formularz niezapisany JS =====
JavaScript - podświetla na żółto zmienione pola i pokazuje przycisk SUBMIT (id="sub")
$('#sub').hide();
$('form :input').change(function() {
$(this).addClass('bg-warning');
$('#sub').show();
});
===== Datepicker =====
use yii\jui\DatePicker;
...
$form->field($model, 'data_urodzenia')->widget(DatePicker::classname(), [
'language' => 'pl',
'dateFormat' => 'yyyy-MM-dd',
'clientOptions' =>[
'changeMonth'=> true,
'changeYear'=> true,
'yearRange'=>'1950:2099',
]
])->label('Data urodzenia');