use common\CKEditor;
$form->field($model, 'opis')->widget(CKEditor::className(), [ 'options' => ['rows' => 10], 'preset' => 'advanced', 'clientOptions' => [ 'extraPlugins' =>'justify', ] ])->label('Opis'); ?>
CKEDITOR.instances['dynamicmodel-tresc'].setData(data);
<textarea id="dynamicmodel-tresc"> ...
// nie wolno nadawać przyciskowi 'id'=>'submit'
<?php $form = ActiveForm::begin(['id' => 'form-create']); ?>
...
<div class="form-group float-right">
<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','id'=>'sub' ]) ?>
</div>
<?php ActiveForm::end(); ?>
...
<?php
$this->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();
}
});
');
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); } }
$(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;
}
});
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() ?>" />
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, '.')); }); ");
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
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() ?>
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], ...
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'; ...
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();
});
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');