%PDF- %PDF-
Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/modules/user/models/ |
Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/modules/user/models/ProfileField.php |
<?php /** * @link https://www.humhub.org/ * @copyright Copyright (c) 2016 HumHub GmbH & Co. KG * @license https://www.humhub.com/licences */ namespace humhub\modules\user\models; use humhub\components\ActiveRecord; use humhub\libs\Helpers; use humhub\modules\user\models\fieldtype\BaseType; use Yii; use yii\db\ActiveQuery; use yii\helpers\Html; /** * This is the model class for table "profile_field". * * @property integer $id * @property integer $profile_field_category_id * @property string $module_id * @property string $field_type_class * @property string $field_type_config * @property string $internal_name * @property string $title * @property string $description * @property integer $sort_order * @property integer $required * @property integer $show_at_registration * @property integer $editable * @property integer $visible * @property string $created_at * @property integer $created_by * @property string $updated_at * @property integer $updated_by * @property string $ldap_attribute * @property string $translation_category * @property integer $is_system * @property integer $searchable * @property integer $directory_filter * * @property-read BaseType $fieldType */ class ProfileField extends ActiveRecord { /** * Field Type Instance * * @var BaseType */ private $_fieldType = null; /** * @inheritdoc */ public static function tableName() { return 'profile_field'; } /** * @return array validation rules for model attributes. */ public function rules() { return [ [['profile_field_category_id', 'field_type_class', 'internal_name', 'title', 'sort_order'], 'required'], [['profile_field_category_id', 'required', 'editable', 'searchable', 'show_at_registration', 'visible', 'sort_order', 'directory_filter'], 'integer'], [['module_id', 'field_type_class', 'title'], 'string', 'max' => 255], ['internal_name', 'string', 'max' => 100], [['ldap_attribute', 'translation_category'], 'string', 'max' => 255], ['internal_name', 'checkInternalName'], ['internal_name', 'match', 'not' => true, 'pattern' => '/[^a-zA-Z0-9_]/', 'message' => Yii::t('UserModule.profile', 'Only alphanumeric characters allowed!')], ['internal_name', 'match', 'pattern' => '/[a-zA-Z]/', 'message' => Yii::t('UserModule.profile', 'Must contain at least one character.')], ['field_type_class', 'checkType'], [['description'], 'safe'], ]; } /** * @return ActiveQuery */ public function getCategory() { return $this->hasOne(ProfileFieldCategory::class, ['id' => 'profile_field_category_id']); } /** * @return array customized attribute labels (name=>label) */ public function attributeLabels() { return [ 'id' => Yii::t('UserModule.profile', 'ID'), 'profile_field_category_id' => Yii::t('UserModule.profile', 'Profile Field Category'), 'module_id' => Yii::t('UserModule.profile', 'Module'), 'field_type_class' => Yii::t('UserModule.profile', 'Fieldtype'), 'field_type_config' => Yii::t('UserModule.profile', 'Type Config'), 'internal_name' => Yii::t('UserModule.profile', 'Internal Name'), 'visible' => Yii::t('UserModule.profile', 'Visible'), 'editable' => Yii::t('UserModule.profile', 'Editable'), 'ldap_attribute' => Yii::t('UserModule.profile', 'LDAP Attribute'), 'show_at_registration' => Yii::t('UserModule.profile', 'Show at registration'), 'translation_category' => Yii::t('UserModule.profile', 'Translation Category ID'), 'required' => Yii::t('UserModule.profile', 'Required'), 'searchable' => Yii::t('UserModule.profile', 'Searchable'), 'directory_filter' => Yii::t('UserModule.profile', 'Use as Directory filter'), 'title' => Yii::t('UserModule.profile', 'Title'), 'description' => Yii::t('UserModule.profile', 'Description'), 'sort_order' => Yii::t('UserModule.profile', 'Sort order'), 'created_at' => Yii::t('UserModule.profile', 'Created at'), 'created_by' => Yii::t('UserModule.profile', 'Created by'), 'updated_at' => Yii::t('UserModule.profile', 'Updated at'), 'updated_by' => Yii::t('UserModule.profile', 'Updated by'), ]; } /** * Before deleting a profile field, inform underlying ProfileFieldType for * cleanup. */ public function beforeDelete() { if ($this->is_system) { return false; } $this->fieldType->delete(); return parent::beforeDelete(); } /** * After Save, also saving the underlying Field Type */ public function afterSave($insert, $changedAttributes) { # Cause Endless #$this->fieldType->save(); return parent::afterSave($insert, $changedAttributes); } /** * Returns the ProfileFieldType Class for this Profile Field * * @return BaseType * @throws \yii\base\Exception */ public function getFieldType(): ?BaseType { if ($this->_fieldType != null) return $this->_fieldType; if ($this->field_type_class != '' && Helpers::CheckClassType($this->field_type_class, fieldtype\BaseType::class)) { $type = $this->field_type_class; $this->_fieldType = new $type; $this->_fieldType->setProfileField($this); return $this->_fieldType; } return null; } /** * Returns The Form Definition to edit the ProfileField Model. * * @return array CForm Definition */ public function getFormDefinition() { $categories = ProfileFieldCategory::find()->orderBy('sort_order')->all(); $profileFieldTypes = new fieldtype\BaseType(); $isVirtualField = (!$this->isNewRecord && $this->getFieldType()->isVirtual); $canBeDirectoryFilter = (!$this->isNewRecord && $this->getFieldType()->canBeDirectoryFilter); return [ 'ProfileField' => [ 'type' => 'form', #'showErrorSummary' => true, 'elements' => [ 'internal_name' => [ 'type' => 'text', 'maxlength' => 32, 'class' => 'form-control', 'readonly' => !$this->isNewRecord, // Cannot be changed for existing record ], 'title' => [ 'type' => 'text', 'maxlength' => 32, 'class' => 'form-control', ], 'description' => [ 'type' => 'textarea', 'class' => 'form-control', ], 'sort_order' => [ 'type' => 'sortOrder', 'maxlength' => 32, 'class' => 'form-control', ], 'translation_category' => [ 'type' => 'text', 'maxlength' => 32, 'class' => 'form-control', 'value' => $this->getTranslationCategory(), ], //ToDo: Hide me, when Ldap Support is disabled 'ldap_attribute' => [ 'type' => 'text', 'maxlength' => 255, 'class' => 'form-control', 'isVisible' => (!$isVirtualField) ], 'required' => [ 'type' => 'checkbox', 'isVisible' => (!$isVirtualField) ], 'visible' => [ 'type' => 'checkbox', ], 'show_at_registration' => [ 'type' => 'checkbox', 'isVisible' => (!$isVirtualField) ], 'editable' => [ 'type' => 'checkbox', 'isVisible' => (!$isVirtualField) ], 'searchable' => [ 'type' => 'checkbox', 'isVisible' => (!$isVirtualField) ], 'directory_filter' => [ 'type' => 'checkbox', 'isVisible' => ($canBeDirectoryFilter) ], 'profile_field_category_id' => [ 'type' => 'dropdownlist', 'items' => \yii\helpers\ArrayHelper::map($categories, 'id', 'title'), 'class' => 'form-control', ], 'field_type_class' => [ 'type' => 'dropdownlist', 'items' => $profileFieldTypes->getFieldTypes(), 'htmlOptions' => ['options' => $profileFieldTypes->getFieldTypeItemOptions()], 'class' => 'form-control', 'readonly' => !$this->isNewRecord, // Cannot be changed for existing record ], ] ]]; } /** * Validator which checks the given internal name. * * Also ensures that internal_name could not be changed on existing records. */ public function checkInternalName() { // Little bit cleanup $this->internal_name = strtolower($this->internal_name); $this->internal_name = trim($this->internal_name); if (!$this->isNewRecord) { // Dont allow changes of internal_name - Maybe not the best way to check it. $currentProfileField = ProfileField::findOne(['id' => $this->id]); if ($this->internal_name != $currentProfileField->internal_name) { $this->addError('internal_name', Yii::t('UserModule.profile', 'Internal name could not be changed!')); } } else { // Check if Internal Name is not in use yet if (Profile::columnExists($this->internal_name)) { $this->addError('internal_name', Yii::t('UserModule.profile', 'Internal name already in use!')); } } } /** * Validator which checks the fieldtype * * Also ensures that field_type_class could not be changed on existing records. */ public function checkType() { if (!$this->isNewRecord) { // Dont allow changes of internal_name - Maybe not the best way to check it. $currentProfileField = ProfileField::findOne(['id' => $this->id]); if ($this->field_type_class != $currentProfileField->field_type_class) { $this->addError('field_type_class', Yii::t('UserModule.profile', 'Field Type could not be changed!')); } } else { $profileFieldTypes = new fieldtype\BaseType(); if (!key_exists($this->field_type_class, $profileFieldTypes->getFieldTypes())) { $this->addError('field_type_class', Yii::t('UserModule.profile', 'Invalid field type!')); } } } /** * Returns the users value for this profile field. * * @param User $user * @param bool $raw * @return string */ public function getUserValue(User $user, $raw = true): ?string { return $this->fieldType->getUserValue($user, $raw); } /** * Returns the translation category * Defaults to: models_Profile * * @return string */ public function getTranslationCategory() { if ($this->translation_category != "") { return $this->translation_category; } return "UserModule.profile"; } }