%PDF- %PDF-
| Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/compat/ |
| Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/compat/HForm.php |
<?php
/**
* @link https://www.humhub.org/
* @copyright Copyright (c) 2017 HumHub GmbH & Co. KG
* @license https://www.humhub.com/licences
*/
namespace humhub\compat;
use humhub\modules\content\widgets\richtext\RichText;
use humhub\modules\content\widgets\richtext\RichTextField;
use humhub\modules\file\components\FileManager;
use humhub\modules\ui\form\widgets\DatePicker;
use humhub\modules\ui\form\widgets\MultiSelect;
use humhub\modules\ui\form\widgets\SortOrderField;
use Yii;
use yii\helpers\Html;
use yii\widgets\ActiveField;
use yii\widgets\ActiveForm;
/**
* HForm - Yii1 compatible form generator
*
* @author luke
*/
class HForm extends \yii\base\Component
{
const EVENT_BEFORE_VALIDATE = 'beforeValidate';
const EVENT_AFTER_VALIDATE = 'afterValidate';
/**
* @since 1.2.6
*/
const EVENT_AFTER_INIT = 'afterInit';
/**
* @since 1.2.6
*/
const EVENT_BEFORE_RENDER = 'beforeRender';
public $showErrorSummary;
/**
* @var ActiveForm
*/
protected $form;
public $primaryModel = null;
public $models = [];
public $definition = [];
/**
* @var boolean manually mark form as submitted
*/
public $markedAsSubmitted = false;
public function __construct($definition = [], $primaryModel = null)
{
$this->definition = $definition;
$this->primaryModel = $primaryModel;
$this->init();
$this->trigger(static::EVENT_AFTER_INIT);
}
public function submitted($buttonName = "")
{
if (Yii::$app->request->method == 'POST') {
if ($buttonName == "" || isset($_POST[$buttonName])) {
foreach ($this->models as $model) {
$model->load(Yii::$app->request->post());
}
if ($this->primaryModel !== null) {
$this->primaryModel->load(Yii::$app->request->post());
}
return true;
}
} elseif ($this->markedAsSubmitted) {
return true;
}
return false;
}
public function validate()
{
$hasErrors = false;
$this->trigger(self::EVENT_BEFORE_VALIDATE);
if ($this->primaryModel !== null) {
if (!$this->primaryModel->validate()) {
$hasErrors = true;
}
}
foreach ($this->models as $model) {
if (!$model->validate()) {
$hasErrors = true;
}
}
$this->trigger(self::EVENT_AFTER_VALIDATE);
return !$hasErrors;
}
public function clearErrors()
{
if ($this->primaryModel !== null) {
$this->primaryModel->clearErrors();
}
foreach ($this->models as $model) {
$model->clearErrors();
}
}
public function save()
{
$hasErrors = false;
if ($this->primaryModel !== null) {
if (!$this->primaryModel->save()) {
$hasErrors = true;
}
$this->primaryModel->save();
}
(new FileManager(['record' => $this->primaryModel]))->attach(Yii::$app->request->post('fileList'));
foreach ($this->models as $model) {
if (!$model->save()) {
$hasErrors = true;
}
}
return !$hasErrors;
}
public function render($form)
{
$this->form = $form;
$this->trigger(static::EVENT_BEFORE_RENDER);
$out = $this->renderElements($this->definition['elements']);
$out .= $this->renderButtons($this->definition['buttons']);
return $out;
}
public function renderElements($elements, $forms = [])
{
$output = "";
foreach ($elements as $name => $element) {
if (isset($element['type']) && $element['type'] == 'form') {
$forms[] = $name;
if (isset($element['elements']) && count($element['elements']) > 0) {
$output .= $this->renderForm($element);
$output .= $this->renderElements($element['elements'], $forms);
$output .= $this->renderFormEnd($element);
}
} else {
$output .= $this->renderField($name, $element, $forms);
}
}
return $output;
}
public function renderForm($element)
{
$class = "";
if (isset($element['class'])) {
$class = $element['class'];
}
$output = "<fieldset class='" . $class . "'>";
if (isset($element['title'])) {
$output .= "<legend>" . $element['title'] . "</legend>";
} else {
#$output .= "Untitled Form";
}
return $output;
}
public function renderFormEnd($element)
{
return "</fieldset>";
}
public function renderButtons($buttons)
{
$output = "";
foreach ($buttons as $buttonName => $definition) {
$definition['isVisible'] = isset($definition['isVisible']) ? $definition['isVisible'] : true;
if ($definition['type'] == 'submit' && $definition['isVisible']) {
$output .= \yii\helpers\Html::submitButton($definition['label'], ['name' => $buttonName, 'class' => $definition['class'], 'data-ui-loader' => '']);
$output .= " ";
}
}
return $output;
}
public function renderField($name, $definition, $forms)
{
if (isset($definition['isVisible']) && !$definition['isVisible']) {
return;
}
$output = "";
// Determine Model
$model = null;
foreach ($forms as $formName) {
if (isset($this->models[$formName])) {
$model = $this->models[$formName];
}
}
if ($model == null && $this->primaryModel !== null) {
$model = $this->primaryModel;
}
if ($model) {
$options = [];
if (isset($definition['id'])) {
$options['id'] = $definition['id'];
}
if (isset($definition['readonly']) && $definition['readonly']) {
$options['readOnly'] = true;
$options['disabled'] = true;
}
if (isset($definition['value'])) {
$options['value'] = $definition['value'];
}
if (isset($definition['prompt']) && $definition['prompt']) {
$options['prompt'] = $definition['prompt'];
}
if (isset($definition['label']) && $definition['label']) {
$options['label'] = $definition['label'];
}
if (isset($definition['htmlOptions']) && is_array($definition['htmlOptions'])) {
$options = array_merge($options, $definition['htmlOptions']);
}
if (isset($definition['type'])) {
switch ($definition['type']) {
case 'text':
$field = $this->form->field($model, $name)->textInput($options);
break;
case 'multiselectdropdown':
$field = $this->form->field($model, $name)->widget(MultiSelect::class, [
'items' => $definition['items'],
'options' => $definition['options'],
'maxSelection' => $definition['maxSelection'] ?? 50,
]);
break;
case 'dropdownlist':
$field = $this->form->field($model, $name)->dropDownList($definition['items'], $options);
break;
case 'checkbox':
if (isset($options['readOnly']) && $options['readOnly']) {
$options['disabled'] = 'disabled';
}
$field = $this->form->field($model, $name)->checkbox($options);
break;
case 'checkboxlist':
if (isset($options['readOnly']) && $options['readOnly']) {
$options['disabled'] = 'disabled';
}
$value = $model->$name;
if (is_string($value)) {
$delimiter = isset($definition['delimiter']) ? $definition['delimiter'] : ',';
$model->$name = explode($delimiter, $model->$name);
}
$field = $this->form->field($model, $name)->checkboxList($definition['items'], $options);
break;
case 'textarea':
if (isset($definition['class'])) {
$options['class'] = $definition['class'];
}
$field = $this->form->field($model, $name)->textarea($options);
break;
case 'hidden':
$field = $this->form->field($model, $name)->hiddenInput($options);
$definition['label'] = false;
break;
case 'password':
$field = $this->form->field($model, $name)->passwordInput($options);
break;
case 'datetime':
$format = Yii::$app->formatter->dateFormat;
if (isset($definition['format'])) {
$format = $definition['format'];
}
$yearRange = isset($definition['yearRange']) ? $definition['yearRange'] : (date('Y') - 100) . ":" . (date('Y') + 100);
$field = $this->form->field($model, $name)->widget(DatePicker::class, [
'dateFormat' => $format,
'clientOptions' => [
'changeYear' => true,
'yearRange' => $yearRange,
'changeMonth' => true,
'disabled' => (isset($options['readOnly']) && $options['readOnly'])
],
'options' => [
'class' => 'form-control']
]);
break;
case 'markdown':
$options['id'] = $name;
if (isset($options['readOnly']) && $options['readOnly']) {
// TODO: Once the richtext supports readonly view remove this line
return RichText::output(Html::getAttributeValue($model, $name));
}
$field = $this->form->field($model, $name)->widget(RichTextField::class, $options);
break;
case 'sortOrder':
$field = $this->form->field($model, $name)->widget(SortOrderField::class, $options);
break;
default:
if (method_exists($definition['type'], 'widget')) {
$field = $this->form->field($model, $name)->widget($definition['type'], $options);
break;
}
return "Field Type " . $definition['type'] . " not supported by Compat HForm";
}
if (isset($definition['label'])) {
$field->label($definition['label']);
}
if (!empty($definition['hint']) && $field instanceof ActiveField) {
$field->hint(Html::encode($definition['hint'], false));
}
return $field;
} else {
return "No type found for: FieldName: " . $name . " Forms: " . print_r($forms, 1) . "<br>";
}
} else {
return "No model for: FieldName: " . $name . " Forms: " . print_r($forms, 1) . "<br>";
}
return $output;
}
}