Commit 86e514c8 by semenov

1

parent 7139dcdc
......@@ -13,7 +13,6 @@ use skeeks\modules\cms\form\components\FormRegisteredWidgets;
/**
*
* @property FormRegisteredElements $formRegisteredElements
* @property FormRegisteredWidgets $formRegisteredWidgets
*
* Class Application
* @package yii\web
......
......@@ -12,34 +12,34 @@ use skeeks\cms\components\CollectionComponents;
use skeeks\cms\components\RegisteredWidgets;
use skeeks\cms\models\StorageFile;
use skeeks\cms\models\WidgetDescriptor;
use skeeks\modules\cms\form\elements\Base;
use Yii;
use yii\base\Component;
use yii\helpers\ArrayHelper;
use yii\web\UploadedFile;
/**
*
* @method WidgetDescriptor[] getComponents()
* @method WidgetDescriptor getComponent($id)
*
* Class RegisteredWidgets
* @package skeeks\cms\components
* Class FormRegisteredElements
* @package skeeks\modules\cms\form\components
*/
class FormRegisteredElements extends RegisteredWidgets
{
public function baseElements()
{
return [
'skeeks\modules\cms\form\elements\textarea\Textarea' =>
[
'name' => 'Текстовое поле (textarea)',
'description' => '',
],
'skeeks\modules\cms\form\elements\textInput\TextInput' =>
[
'name' => 'Текстовый input (TextInput)',
],
'skeeks\modules\cms\form\elements\button\Button' =>
[
'name' => 'Кнопка отправки формы',
'description' => '',
],
];
......
......@@ -7,14 +7,66 @@
*/
namespace skeeks\modules\cms\form\controllers;
use skeeks\cms\base\Controller;
use skeeks\modules\cms\form\models\Form;
use yii\filters\VerbFilter;
use yii\helpers\ArrayHelper;
use yii\web\Response;
use yii\widgets\ActiveForm;
/**
* Class BackendController
* @package skeeks\modules\cms\form\controllers
*/
class BackendController extends Controller
{
/**
* @return array
*/
public function behaviors()
{
return ArrayHelper::merge(parent::behaviors(), [
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'validate' => ['post'],
'submit' => ['post'],
],
],
]);
}
/**
* Процесс отправки формы
* @return array
*/
public function actionSubmit()
{
}
/**
* Валидация данных с формы
* @return array
*/
public function actionValidate()
{
if (\Yii::$app->request->isAjax && !\Yii::$app->request->isPjax)
{
if ($formId = \Yii::$app->request->post(Form::FROM_PARAM_ID_NAME))
{
/**
* @var $modelForm Form
*/
$modelForm = Form::find()->where(['id' => $formId])->one();
$model = $modelForm->createValidateModel();
$model->load(\Yii::$app->request->post());
\Yii::$app->response->format = Response::FORMAT_JSON;
return ActiveForm::validate($model);
}
}
}
}
\ No newline at end of file
......@@ -9,14 +9,9 @@ namespace skeeks\modules\cms\form\elements;
use skeeks\cms\base\Widget;
abstract class Base extends Widget
class Base extends Widget
{
/**
* @var bool Элемент или виджет
*/
public $element = true;
public $elementCode;
public $elementCode = '';
public $value;
public $attributeClass;
......
<?php
/**
* @author Semenov Alexander <semenov@skeeks.com>
* @link http://skeeks.com/
* @copyright 2010 SkeekS (СкикС)
* @date 16.03.2015
*/
namespace skeeks\modules\cms\form\elements\button;
use skeeks\cms\base\InputWidget;
use skeeks\cms\widgets\formInputs\storageFiles\Widget;
use skeeks\modules\cms\form\elements\Base;
use yii\helpers\Html;
class Button extends InputWidget
{
public function run()
{
$submit = Html::submitButton("Отправить", ['class' => 'btn btn-primary']);
return Html::tag('div',
$submit,
['class' => 'form-group']
);
}
}
\ No newline at end of file
......@@ -12,4 +12,5 @@ use skeeks\modules\cms\form\elements\Base;
class Textarea extends Base
{
public $elementCode = 'textarea';
}
\ No newline at end of file
......@@ -22,6 +22,8 @@ use yii\web\ErrorHandler;
*/
class Form extends Core
{
const FROM_PARAM_ID_NAME = 'sx-auto-form';
/**
* @inheritdoc
*/
......@@ -130,7 +132,7 @@ class Form extends Core
public function createValidateModel()
{
return new FormValidateModel([
'form' => $this
'modelForm' => $this
]);
}
......@@ -172,7 +174,7 @@ class Form extends Core
} catch (\Exception $e)
{
ob_end_clean();
//ErrorHandler::convertExceptionToError($e);
ErrorHandler::convertExceptionToError($e);
return 'Ошибка рендеринга формы: ' . $e->getMessage();
}
}
......
......@@ -12,6 +12,11 @@ use skeeks\cms\models\behaviors\HasDescriptionsBehavior;
use skeeks\cms\models\behaviors\HasStatus;
use skeeks\cms\models\behaviors\Implode;
use skeeks\cms\models\Core;
use skeeks\modules\cms\form\elements\Base;
use yii\base\Model;
use yii\helpers\ArrayHelper;
use yii\widgets\ActiveField;
use yii\widgets\ActiveForm;
/**
* Class FormEmail
......@@ -32,7 +37,25 @@ class FormField extends Core
*/
public function behaviors()
{
return array_merge(parent::behaviors(), []);
return ArrayHelper::merge(parent::behaviors(), [
Implode::className() =>
[
'class' => Implode::className(),
'fields' => ['rules']
]
]);
}
/**
* @return array
*/
static public function availableRules()
{
return [
'required' => 'Обязательно к заполнению',
'email' => 'Проверка на email',
'integer' => 'Целое число'
];
}
/**
......@@ -43,8 +66,9 @@ class FormField extends Core
return array_merge(parent::rules(), [
[['created_by', 'updated_by', 'created_at', 'updated_at', 'form_id'], 'integer'],
[['hint'], 'string'],
[['element_config'], 'safe'],
[['priority'], 'integer'],
[['widget', 'rules'], 'safe'],
[['rules'], 'safe'],
[[ 'form_id', 'element'], 'required'],
['attribute', 'default', 'value' => function(FormField $model, $attribute)
{
......@@ -97,4 +121,85 @@ class FormField extends Core
{
return $this->findForm()->one();
}
/**
* @return \skeeks\cms\models\WidgetDescriptor
*/
public function elenentDescriptor()
{
return \Yii::$app->formRegisteredElements->getComponent($this->element);
}
/**
* @return array
*/
public function rulesForActiveForm()
{
$result = [];
if ((array) $this->rules)
{
foreach ((array) $this->rules as $ruleCode)
{
$result[] = [[$this->attribute], $ruleCode];
}
} else
{
$result[] = [[$this->attribute], 'safe'];
}
return $result;
}
/**
* @param ActiveForm $activeForm
* @param Model $model
* @return mixed
*/
public function renderActiveForm(ActiveForm $activeForm, Model $model)
{
if ($element = $this->elenentDescriptor())
{
$elementConfig = (array) $this->element_config;
/**
* @var $field ActiveField
*/
$field = $activeForm
->field($model, $this->attribute);
if (!$field)
{
return '';
}
//Элемент или виджет
if (is_subclass_of($this->element, Base::className()))
{
$element = new $this->element;
$field->{$element->elementCode}($elementConfig);
} else
{
$field->widget($this->element, $elementConfig);
}
if ($this->hint)
{
$field->hint((string) $this->hint);
}
if ($this->label)
{
$field->label($this->label);
} else
{
$field->label(false);
}
return $field;
}
return '';
}
}
\ No newline at end of file
......@@ -15,6 +15,7 @@ use skeeks\cms\models\Core;
use yii\base\Exception;
use yii\base\InvalidConfigException;
use yii\base\Model;
use yii\helpers\ArrayHelper;
use yii\helpers\BaseHtml;
/**
......@@ -27,18 +28,18 @@ class FormValidateModel extends Model
/**
* @var Form
*/
public $form = null;
public $modelForm = null;
public function init()
{
parent::init();
if (!$this->form instanceof Form)
if (!$this->modelForm instanceof Form)
{
throw new InvalidConfigException;
}
if ($fields = $this->form->fields())
if ($fields = $this->modelForm->fields())
{
foreach ($fields as $field)
{
......@@ -52,8 +53,21 @@ class FormValidateModel extends Model
* @var array attribute values indexed by attribute names
*/
private $_attributes = [];
private $_related = [];
public function rules()
{
$result = parent::rules();
foreach ($this->modelForm->fields() as $field)
{
$result = ArrayHelper::merge($result, $field->rulesForActiveForm());
}
return $result;
}
/**
* PHP getter magic method.
......@@ -188,13 +202,6 @@ class FormValidateModel extends Model
/**
* @inheritdoc
*/
public function rules()
{
return array_merge(parent::rules());
}
/*public function scenarios()
{
......@@ -213,7 +220,7 @@ class FormValidateModel extends Model
{
$result = [];
foreach ($this->form->fields() as $field)
foreach ($this->modelForm->fields() as $field)
{
$result[$field->attribute] = $field->label;
}
......
......@@ -45,6 +45,13 @@ use common\models\User;
<?= $form->field($model, 'attribute')->textInput(); ?>
<?= $form->field($model, 'label')->textInput(); ?>
<?= $form->field($model, 'hint')->textInput(); ?>
<?= $form->field($model, 'rules')->widget(
\skeeks\widget\chosen\Chosen::className(),
[
'items' => \skeeks\modules\cms\form\models\FormField::availableRules(),
'multiple' => true
]
); ?>
<? endif; ?>
......
......@@ -89,4 +89,13 @@ use common\models\User;
<?= $form->buttonsCreateOrUpdate($model); ?>
<?php ActiveForm::end(); ?>
<?= $model->render(); ?>
\ No newline at end of file
<div class="row">
<div class="col-md-12">
<div class="" style="border: 1px solid rgba(32, 168, 216, 0.23); padding: 10px; margin-top: 10px;">
<h2>Вот так будет выглядеть форма:</h2>
<hr />
<?= $model->render(); ?>
</div>
</div>
</div>
......@@ -8,15 +8,15 @@
* @var $formField \skeeks\modules\cms\form\models\FormField
* @var $model \skeeks\modules\cms\form\models\FormValidateModel
*/
use \skeeks\cms\base\widgets\ActiveForm;
use skeeks\modules\cms\form\widgets\ActiveForm;
?>
<?php $form = ActiveForm::begin([
'id' => 'sx_form_' . $model->form->id,
'modelForm' => $model->modelForm,
]); ?>
<? if ($fields) : ?>
<? foreach ($fields as $formField) : ?>
<?= $form->field($model, $formField->attribute)->textInput(); ?>
<?= $formField->renderActiveForm($form, $model)?>
<? endforeach; ?>
<? endif; ?>
......
<?php
/**
* @author Semenov Alexander <semenov@skeeks.com>
* @link http://skeeks.com/
* @copyright 2010 SkeekS (СкикС)
* @date 18.03.2015
*/
namespace skeeks\modules\cms\form\widgets;
use skeeks\modules\cms\form\models\Form;
/**
* Class ActiveForm
* @package skeeks\modules\cms\form\widgets
*/
class ActiveForm extends \skeeks\cms\base\widgets\ActiveForm
{
/**
* @var Form
*/
public $modelForm;
public function __construct($config = [])
{
$this->validationUrl = \skeeks\cms\helpers\UrlHelper::construct('form/backend/validate')->toString();
$this->action = \skeeks\cms\helpers\UrlHelper::construct('form/backend/submit')->toString();
$this->enableAjaxValidation = true;
parent::__construct($config);
}
public function init()
{
parent::init();
echo \yii\helpers\Html::hiddenInput(Form::FROM_PARAM_ID_NAME, $this->modelForm->id);
}
}
......@@ -56,7 +56,7 @@ class FormWidget extends Widget
$formModel = Form::find()->where(['id' => $this->form_id])->one();
if ($formModel)
{
return $formModel->render();
}
return '';
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment