Commit 86e514c8 by semenov

1

parent 7139dcdc
...@@ -13,7 +13,6 @@ use skeeks\modules\cms\form\components\FormRegisteredWidgets; ...@@ -13,7 +13,6 @@ use skeeks\modules\cms\form\components\FormRegisteredWidgets;
/** /**
* *
* @property FormRegisteredElements $formRegisteredElements * @property FormRegisteredElements $formRegisteredElements
* @property FormRegisteredWidgets $formRegisteredWidgets
* *
* Class Application * Class Application
* @package yii\web * @package yii\web
......
...@@ -12,34 +12,34 @@ use skeeks\cms\components\CollectionComponents; ...@@ -12,34 +12,34 @@ use skeeks\cms\components\CollectionComponents;
use skeeks\cms\components\RegisteredWidgets; use skeeks\cms\components\RegisteredWidgets;
use skeeks\cms\models\StorageFile; use skeeks\cms\models\StorageFile;
use skeeks\cms\models\WidgetDescriptor; use skeeks\cms\models\WidgetDescriptor;
use skeeks\modules\cms\form\elements\Base;
use Yii; use Yii;
use yii\base\Component; use yii\base\Component;
use yii\helpers\ArrayHelper; use yii\helpers\ArrayHelper;
use yii\web\UploadedFile; use yii\web\UploadedFile;
/** /**
* * Class FormRegisteredElements
* @method WidgetDescriptor[] getComponents() * @package skeeks\modules\cms\form\components
* @method WidgetDescriptor getComponent($id)
*
* Class RegisteredWidgets
* @package skeeks\cms\components
*/ */
class FormRegisteredElements extends RegisteredWidgets class FormRegisteredElements extends RegisteredWidgets
{ {
public function baseElements() public function baseElements()
{ {
return [ return [
'skeeks\modules\cms\form\elements\textarea\Textarea' => 'skeeks\modules\cms\form\elements\textarea\Textarea' =>
[ [
'name' => 'Текстовое поле (textarea)', 'name' => 'Текстовое поле (textarea)',
'description' => '',
], ],
'skeeks\modules\cms\form\elements\textInput\TextInput' => 'skeeks\modules\cms\form\elements\textInput\TextInput' =>
[ [
'name' => 'Текстовый input (TextInput)', 'name' => 'Текстовый input (TextInput)',
],
'skeeks\modules\cms\form\elements\button\Button' =>
[
'name' => 'Кнопка отправки формы',
'description' => '', 'description' => '',
], ],
]; ];
......
...@@ -7,14 +7,66 @@ ...@@ -7,14 +7,66 @@
*/ */
namespace skeeks\modules\cms\form\controllers; namespace skeeks\modules\cms\form\controllers;
use skeeks\cms\base\Controller; 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 * Class BackendController
* @package skeeks\modules\cms\form\controllers * @package skeeks\modules\cms\form\controllers
*/ */
class BackendController extends Controller 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() 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; ...@@ -9,14 +9,9 @@ namespace skeeks\modules\cms\form\elements;
use skeeks\cms\base\Widget; use skeeks\cms\base\Widget;
abstract class Base extends Widget class Base extends Widget
{ {
/** public $elementCode = '';
* @var bool Элемент или виджет
*/
public $element = true;
public $elementCode;
public $value; public $value;
public $attributeClass; 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; ...@@ -12,4 +12,5 @@ use skeeks\modules\cms\form\elements\Base;
class Textarea extends Base class Textarea extends Base
{ {
public $elementCode = 'textarea'; public $elementCode = 'textarea';
} }
\ No newline at end of file
...@@ -22,6 +22,8 @@ use yii\web\ErrorHandler; ...@@ -22,6 +22,8 @@ use yii\web\ErrorHandler;
*/ */
class Form extends Core class Form extends Core
{ {
const FROM_PARAM_ID_NAME = 'sx-auto-form';
/** /**
* @inheritdoc * @inheritdoc
*/ */
...@@ -130,7 +132,7 @@ class Form extends Core ...@@ -130,7 +132,7 @@ class Form extends Core
public function createValidateModel() public function createValidateModel()
{ {
return new FormValidateModel([ return new FormValidateModel([
'form' => $this 'modelForm' => $this
]); ]);
} }
...@@ -172,7 +174,7 @@ class Form extends Core ...@@ -172,7 +174,7 @@ class Form extends Core
} catch (\Exception $e) } catch (\Exception $e)
{ {
ob_end_clean(); ob_end_clean();
//ErrorHandler::convertExceptionToError($e); ErrorHandler::convertExceptionToError($e);
return 'Ошибка рендеринга формы: ' . $e->getMessage(); return 'Ошибка рендеринга формы: ' . $e->getMessage();
} }
} }
......
...@@ -12,6 +12,11 @@ use skeeks\cms\models\behaviors\HasDescriptionsBehavior; ...@@ -12,6 +12,11 @@ use skeeks\cms\models\behaviors\HasDescriptionsBehavior;
use skeeks\cms\models\behaviors\HasStatus; use skeeks\cms\models\behaviors\HasStatus;
use skeeks\cms\models\behaviors\Implode; use skeeks\cms\models\behaviors\Implode;
use skeeks\cms\models\Core; 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 * Class FormEmail
...@@ -32,7 +37,25 @@ class FormField extends Core ...@@ -32,7 +37,25 @@ class FormField extends Core
*/ */
public function behaviors() 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 ...@@ -43,8 +66,9 @@ class FormField extends Core
return array_merge(parent::rules(), [ return array_merge(parent::rules(), [
[['created_by', 'updated_by', 'created_at', 'updated_at', 'form_id'], 'integer'], [['created_by', 'updated_by', 'created_at', 'updated_at', 'form_id'], 'integer'],
[['hint'], 'string'], [['hint'], 'string'],
[['element_config'], 'safe'],
[['priority'], 'integer'], [['priority'], 'integer'],
[['widget', 'rules'], 'safe'], [['rules'], 'safe'],
[[ 'form_id', 'element'], 'required'], [[ 'form_id', 'element'], 'required'],
['attribute', 'default', 'value' => function(FormField $model, $attribute) ['attribute', 'default', 'value' => function(FormField $model, $attribute)
{ {
...@@ -97,4 +121,85 @@ class FormField extends Core ...@@ -97,4 +121,85 @@ class FormField extends Core
{ {
return $this->findForm()->one(); 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; ...@@ -15,6 +15,7 @@ use skeeks\cms\models\Core;
use yii\base\Exception; use yii\base\Exception;
use yii\base\InvalidConfigException; use yii\base\InvalidConfigException;
use yii\base\Model; use yii\base\Model;
use yii\helpers\ArrayHelper;
use yii\helpers\BaseHtml; use yii\helpers\BaseHtml;
/** /**
...@@ -27,18 +28,18 @@ class FormValidateModel extends Model ...@@ -27,18 +28,18 @@ class FormValidateModel extends Model
/** /**
* @var Form * @var Form
*/ */
public $form = null; public $modelForm = null;
public function init() public function init()
{ {
parent::init(); parent::init();
if (!$this->form instanceof Form) if (!$this->modelForm instanceof Form)
{ {
throw new InvalidConfigException; throw new InvalidConfigException;
} }
if ($fields = $this->form->fields()) if ($fields = $this->modelForm->fields())
{ {
foreach ($fields as $field) foreach ($fields as $field)
{ {
...@@ -52,8 +53,21 @@ class FormValidateModel extends Model ...@@ -52,8 +53,21 @@ class FormValidateModel extends Model
* @var array attribute values indexed by attribute names * @var array attribute values indexed by attribute names
*/ */
private $_attributes = []; 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. * PHP getter magic method.
...@@ -188,13 +202,6 @@ class FormValidateModel extends Model ...@@ -188,13 +202,6 @@ class FormValidateModel extends Model
/**
* @inheritdoc
*/
public function rules()
{
return array_merge(parent::rules());
}
/*public function scenarios() /*public function scenarios()
{ {
...@@ -213,7 +220,7 @@ class FormValidateModel extends Model ...@@ -213,7 +220,7 @@ class FormValidateModel extends Model
{ {
$result = []; $result = [];
foreach ($this->form->fields() as $field) foreach ($this->modelForm->fields() as $field)
{ {
$result[$field->attribute] = $field->label; $result[$field->attribute] = $field->label;
} }
......
...@@ -45,6 +45,13 @@ use common\models\User; ...@@ -45,6 +45,13 @@ use common\models\User;
<?= $form->field($model, 'attribute')->textInput(); ?> <?= $form->field($model, 'attribute')->textInput(); ?>
<?= $form->field($model, 'label')->textInput(); ?> <?= $form->field($model, 'label')->textInput(); ?>
<?= $form->field($model, 'hint')->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; ?> <? endif; ?>
......
...@@ -89,4 +89,13 @@ use common\models\User; ...@@ -89,4 +89,13 @@ use common\models\User;
<?= $form->buttonsCreateOrUpdate($model); ?> <?= $form->buttonsCreateOrUpdate($model); ?>
<?php ActiveForm::end(); ?> <?php ActiveForm::end(); ?>
<?= $model->render(); ?> <div class="row">
\ No newline at end of file <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 @@ ...@@ -8,15 +8,15 @@
* @var $formField \skeeks\modules\cms\form\models\FormField * @var $formField \skeeks\modules\cms\form\models\FormField
* @var $model \skeeks\modules\cms\form\models\FormValidateModel * @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([ <?php $form = ActiveForm::begin([
'id' => 'sx_form_' . $model->form->id, 'modelForm' => $model->modelForm,
]); ?> ]); ?>
<? if ($fields) : ?> <? if ($fields) : ?>
<? foreach ($fields as $formField) : ?> <? foreach ($fields as $formField) : ?>
<?= $form->field($model, $formField->attribute)->textInput(); ?> <?= $formField->renderActiveForm($form, $model)?>
<? endforeach; ?> <? endforeach; ?>
<? endif; ?> <? 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 ...@@ -56,7 +56,7 @@ class FormWidget extends Widget
$formModel = Form::find()->where(['id' => $this->form_id])->one(); $formModel = Form::find()->where(['id' => $this->form_id])->one();
if ($formModel) if ($formModel)
{ {
return $formModel->render();
} }
return ''; 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