To jest stara wersja strony!
Spis treści
Formularz
CKEditor
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);
<textarea id="dynamicmodel-tresc"> ...
Zabezpieczenie przed podwójnym wysłaniem formularza JS
<div class="form-group">
<span id="spin1" class="btn btn-outline-secondary"><i class="fas fa-spinner fa-spin"></i></span>
<?= Html::submitButton('Zapisuję się', ['class' => 'btn btn-success submit']) ?>
</div>
...
$this->registerJs("
$('#spin1').hide();
$('#submit').on('click',function(){
$('#submit').hide();
$('#spin1').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;
}
});
});
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.
<input type="hidden" name="_csrf" value="<?= Yii::$app->request->getCsrfToken() ?>" />
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:
<?php $this->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.
<?php yii\widgets\Pjax::begin(['id' => 'log-in']) ?> <?php $form = ActiveForm::begin([ 'id' => 'login-form', 'options' => ['data-pjax' => true] ]); ?> ... <?php ActiveForm::end(); ?> <?php yii\widgets\Pjax::end() ?>
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');