Пример #1
0
 public function getItemForm($ctype, $fields, $action, $data = array(), $item_id = false, $item = false)
 {
     $user = cmsUser::getInstance();
     // Контейнер для передачи дополнительных списков:
     // $groups_list, $folders_list и т.д.
     extract($data);
     // Строим форму
     $form = new cmsForm();
     $fieldset_id = $form->addFieldset();
     // Если включены категории, добавляем в форму поле выбора категории
     if ($ctype['is_cats'] && ($action != 'edit' || $ctype['options']['is_cats_change'])) {
         $fieldset_id = $form->addFieldset(LANG_CATEGORY, 'category');
         $form->addField($fieldset_id, new fieldList('category_id', array('rules' => array(array('required')), 'generator' => function ($item) {
             $content_model = cmsCore::getModel('content');
             $ctype = $content_model->getContentTypeByName($item['ctype_name']);
             $tree = $content_model->getCategoriesTree($item['ctype_name']);
             $level_offset = 0;
             $last_header_id = false;
             $items = array('' => LANG_CONTENT_SELECT_CATEGORY);
             if ($tree) {
                 foreach ($tree as $c) {
                     if ($ctype['options']['is_cats_only_last']) {
                         $dash_pad = $c['ns_level'] - 1 >= 0 ? str_repeat('-', $c['ns_level'] - 1) . ' ' : '';
                         if ($c['ns_right'] - $c['ns_left'] == 1) {
                             if ($last_header_id !== false && $last_header_id != $c['parent_id']) {
                                 $items['opt' . $c['id']] = array(str_repeat('-', $c['ns_level'] - 1) . ' ' . $c['title']);
                             }
                             $items[$c['id']] = $dash_pad . $c['title'];
                         } else {
                             if ($c['parent_id'] > 0) {
                                 $items['opt' . $c['id']] = array($dash_pad . $c['title']);
                                 $last_header_id = $c['id'];
                             }
                         }
                         continue;
                     }
                     if (!$ctype['options']['is_cats_only_last']) {
                         if ($c['parent_id'] == 0 && !$ctype['options']['is_cats_open_root']) {
                             $level_offset = 1;
                             continue;
                         }
                         $items[$c['id']] = str_repeat('-- ', $c['ns_level'] - $level_offset) . ' ' . $c['title'];
                         continue;
                     }
                 }
             }
             return $items;
         })));
         if (cmsUser::isAllowed($ctype['name'], 'add_cat')) {
             $form->addField($fieldset_id, new fieldString('new_category', array('title' => LANG_ADD_CATEGORY_QUICK)));
         }
         if (!empty($ctype['options']['is_cats_multi'])) {
             $fieldset_id = $form->addFieldset(LANG_ADDITIONAL_CATEGORIES, 'multi_cats', array('is_empty' => true));
         }
     }
     // Если включены личные папки, добавляем в форму поле выбора личной папки
     if ($ctype['is_folders']) {
         $fieldset_id = $form->addFieldset(LANG_FOLDER, 'folder');
         $folders = array('0' => LANG_CONTENT_SELECT_FOLDER);
         if ($folders_list) {
             $folders = $folders + $folders_list;
         }
         $form->addField($fieldset_id, new fieldList('folder_id', array('items' => $folders)));
         $form->addField($fieldset_id, new fieldString('new_folder', array('title' => LANG_ADD_FOLDER_QUICK)));
     }
     // Если есть поля-свойства, то добавляем область для них
     if ($ctype['props']) {
         $form->addFieldset('', 'props', array('is_empty' => true, 'class' => 'highlight'));
     }
     // Если этот контент можно создавать в группах (сообществах) то добавляем
     // поле выбора группы
     if ($action == 'add' && $groups_list && $groups_list != array('0' => '')) {
         $fieldset_id = $form->addFieldset(LANG_GROUP);
         $form->addField($fieldset_id, new fieldList('parent_id', array('items' => $groups_list)));
     }
     // Разбиваем поля по группам
     $fieldsets = cmsForm::mapFieldsToFieldsets($fields, function ($field, $user) {
         // пропускаем системные поля
         if ($field['is_system']) {
             return false;
         }
         // проверяем что группа пользователя имеет доступ к редактированию этого поля
         if ($field['groups_edit'] && !$user->isInGroups($field['groups_edit'])) {
             return false;
         }
         return true;
     });
     // Добавляем поля в форму
     foreach ($fieldsets as $fieldset) {
         $fieldset_id = $form->addFieldset($fieldset['title']);
         foreach ($fieldset['fields'] as $field) {
             // добавляем поле в форму
             $form->addField($fieldset_id, $field['handler']);
         }
     }
     //
     // Если включены теги, то добавляем поле для них
     //
     if ($ctype['is_tags']) {
         $fieldset_id = $form->addFieldset(LANG_TAGS);
         $form->addField($fieldset_id, new fieldString('tags', array('hint' => LANG_TAGS_HINT, 'autocomplete' => array('multiple' => true, 'url' => href_to('tags', 'autocomplete')))));
     }
     // Если ручной ввод SLUG, то добавляем поле для этого
     if (!$ctype['is_auto_url']) {
         $slug_field_rules = array(array('required'), array('slug'));
         if ($action == 'add') {
             $slug_field_rules[] = array('unique', $this->model->table_prefix . $ctype['name'], 'slug');
         }
         if ($action == 'edit') {
             $slug_field_rules[] = array('unique_exclude', $this->model->table_prefix . $ctype['name'], 'slug', $item_id);
         }
         $fieldset_id = $form->addFieldset(LANG_SLUG);
         $form->addField($fieldset_id, new fieldString('slug', array('prefix' => '/' . $ctype['name'] . '/', 'suffix' => '.html', 'rules' => $slug_field_rules)));
     }
     // Если разрешено управление видимостью, то добавляем поле
     if (cmsUser::isAllowed($ctype['name'], 'privacy')) {
         $fieldset_id = $form->addFieldset(LANG_PRIVACY);
         $form->addField($fieldset_id, new fieldList('is_private', array('items' => array(0 => LANG_PRIVACY_PUBLIC, 1 => LANG_PRIVACY_PRIVATE), 'rules' => array(array('number')))));
     }
     // если разрешено отключать комментарии к записи
     if (cmsUser::isAllowed($ctype['name'], 'disable_comments') && $ctype['is_comments']) {
         $fieldset_id = $form->addFieldset(LANG_RULE_CONTENT_COMMENT, 'is_comment');
         $form->addField($fieldset_id, new fieldList('is_comments_on', array('default' => 1, 'items' => array(1 => LANG_YES, 0 => LANG_NO))));
     }
     //
     // Если ручной ввод ключевых слов или описания, то добавляем поля для этого
     //
     if (!empty($ctype['options']['is_manual_title']) || !$ctype['is_auto_keys'] || !$ctype['is_auto_desc']) {
         $fieldset_id = $form->addFieldset(LANG_SEO);
         if ($ctype['options']['is_manual_title']) {
             $form->addField($fieldset_id, new fieldString('seo_title', array('title' => LANG_SEO_TITLE, 'rules' => array(array('max_length', 256)))));
         }
         if (!$ctype['is_auto_keys']) {
             $form->addField($fieldset_id, new fieldString('seo_keys', array('title' => LANG_SEO_KEYS, 'hint' => LANG_SEO_KEYS_HINT, 'rules' => array(array('max_length', 256)))));
         }
         if (!$ctype['is_auto_desc']) {
             $form->addField($fieldset_id, new fieldText('seo_desc', array('title' => LANG_SEO_DESC, 'hint' => LANG_SEO_DESC_HINT, 'rules' => array(array('max_length', 256)))));
         }
     }
     //
     // Если включен выбор даты публикации, то добавляем поля
     //
     $pub_fieldset_id = false;
     $is_dates = $ctype['is_date_range'];
     $is_pub_start_date = cmsUser::isAllowed($ctype['name'], 'pub_late');
     $is_pub_end_date = cmsUser::isAllowed($ctype['name'], 'pub_long', 'any');
     $is_pub_end_days = cmsUser::isAllowed($ctype['name'], 'pub_long', 'days');
     $is_pub_control = cmsUser::isAllowed($ctype['name'], 'pub_on');
     $is_pub_ext = cmsUser::isAllowed($ctype['name'], 'pub_max_ext');
     $pub_max_days = intval(cmsUser::getPermissionValue($ctype['name'], 'pub_max_days'));
     if ($user->is_admin) {
         $is_pub_end_days = false;
     }
     if ($is_pub_control) {
         $pub_fieldset_id = $pub_fieldset_id ? $pub_fieldset_id : $form->addFieldset(LANG_CONTENT_PUB);
         $form->addField($pub_fieldset_id, new fieldList('is_pub', array('title' => sprintf(LANG_CONTENT_IS_PUB, $ctype['labels']['create']), 'default' => 1, 'items' => array(1 => LANG_YES, 0 => LANG_NO))));
     }
     if ($is_dates) {
         if ($is_pub_start_date) {
             $pub_fieldset_id = $pub_fieldset_id ? $pub_fieldset_id : $form->addFieldset(LANG_CONTENT_PUB);
             $m = date('i');
             $form->addField($pub_fieldset_id, new fieldDate('date_pub', array('title' => LANG_CONTENT_DATE_PUB, 'default' => date('Y-m-d H:') . ($m - $m % 5), 'options' => array('show_time' => true), 'rules' => array(array('required')))));
         }
         if ($is_pub_end_date) {
             $pub_fieldset_id = $pub_fieldset_id ? $pub_fieldset_id : $form->addFieldset(LANG_CONTENT_PUB);
             $form->addField($pub_fieldset_id, new fieldDate('date_pub_end', array('title' => LANG_CONTENT_DATE_PUB_END, 'hint' => LANG_CONTENT_DATE_PUB_END_HINT)));
         }
         if ($action == 'add' && $is_pub_end_days || $action == 'edit' && $is_pub_ext && $is_pub_end_days) {
             $pub_fieldset_id = $pub_fieldset_id ? $pub_fieldset_id : $form->addFieldset(LANG_CONTENT_PUB);
             $title = $action == 'add' ? LANG_CONTENT_PUB_LONG : LANG_CONTENT_PUB_LONG_EXT;
             $hint = $action == 'add' ? false : sprintf(LANG_CONTENT_PUB_LONG_NOW, html_date($item['date_pub_end']));
             if ($pub_max_days) {
                 $days = array();
                 $rules = array();
                 if ($action == 'add') {
                     $rules[] = array('required');
                     $min = 1;
                 }
                 if ($action == 'edit') {
                     $min = 0;
                 }
                 $rules[] = array('number');
                 $rules[] = array('min', $min);
                 $rules[] = array('max', $pub_max_days);
                 if ($action == 'add') {
                     $rules[] = array('required');
                     $min = 1;
                 }
                 if ($action == 'edit') {
                     $min = 0;
                 }
                 for ($d = $min; $d <= $pub_max_days; $d++) {
                     $days[$d] = $d;
                 }
                 $form->addField($pub_fieldset_id, new fieldList('pub_days', array('title' => $title, 'hint' => $hint, 'items' => $days, 'rules' => $rules)));
             } else {
                 $rules = array();
                 if ($action == 'add') {
                     $rules[] = array('required');
                     $min = 1;
                 }
                 if ($action == 'edit') {
                     $min = 0;
                 }
                 $rules[] = array('min', $min);
                 $rules[] = array('max', 65535);
                 $form->addField($pub_fieldset_id, new fieldNumber('pub_days', array('title' => $title, 'default' => 10, 'rules' => $rules)));
             }
         }
     }
     return $form;
 }
Пример #2
0
 public function run()
 {
     if (cmsUser::isLogged() && !cmsUser::isAdmin()) {
         $this->redirectToHome();
     }
     $users_model = cmsCore::getModel('users');
     $form = $this->getForm('registration');
     //
     // Добавляем поле для кода приглашения,
     // если регистрация доступна только по приглашениям
     //
     if ($this->options['is_reg_invites']) {
         $fieldset_id = $form->addFieldsetToBeginning(LANG_REG_INVITED_ONLY);
         $form->addField($fieldset_id, new fieldString('inv', array('title' => LANG_REG_INVITE_CODE, 'rules' => array(array('required'), array('min_length', 10), array('max_length', 10)))));
     }
     //
     // Добавляем поле выбора группы,
     // при наличии публичных групп
     //
     $public_groups = $users_model->getPublicGroups();
     if ($public_groups) {
         $pb_items = array();
         foreach ($public_groups as $pb) {
             $pb_items[$pb['id']] = $pb['title'];
         }
         $form->addFieldToBeginning('basic', new fieldList('group_id', array('title' => LANG_USER_GROUP, 'items' => $pb_items)));
     }
     //
     // Добавляем в форму обязательные поля профилей
     //
     $content_model = cmsCore::getModel('content');
     $content_model->setTablePrefix('');
     $content_model->orderBy('ordering');
     $fields = $content_model->getRequiredContentFields('users');
     // Разбиваем поля по группам
     $fieldsets = cmsForm::mapFieldsToFieldsets($fields);
     // Добавляем поля в форму
     foreach ($fieldsets as $fieldset) {
         $fieldset_id = $form->addFieldset($fieldset['title']);
         foreach ($fieldset['fields'] as $field) {
             if ($field['is_system']) {
                 continue;
             }
             $form->addField($fieldset_id, $field['handler']);
         }
     }
     $user = array();
     if ($this->request->hasInQuery('inv')) {
         $user['inv'] = $this->request->get('inv');
     }
     $is_submitted = $this->request->has('submit');
     if ($is_submitted) {
         if (!$this->options['is_reg_enabled']) {
             cmsCore::error404();
         }
         $errors = false;
         $is_captcha_valid = true;
         //
         // Проверяем капчу
         //
         if ($this->options['reg_captcha']) {
             $is_captcha_valid = cmsEventsManager::hook('captcha_validate', $this->request);
             if (!$is_captcha_valid) {
                 $errors = true;
                 cmsUser::addSessionMessage(LANG_CAPTCHA_ERROR, 'error');
             }
         }
         //
         // Парсим и валидируем форму
         //
         if (!$errors) {
             $user = $form->parse($this->request, $is_submitted);
             $user['groups'] = array();
             if (!empty($this->options['def_groups'])) {
                 $user['groups'] = $this->options['def_groups'];
             }
             if (isset($user['group_id'])) {
                 if (!in_array($user['group_id'], $user['groups'])) {
                     $user['groups'][] = $user['group_id'];
                 }
             }
             //
             // убираем поля которые не относятся к выбранной пользователем группе
             //
             foreach ($fieldsets as $fieldset) {
                 foreach ($fieldset['fields'] as $field) {
                     if (!$field['groups_edit']) {
                         continue;
                     }
                     if (in_array(0, $field['groups_edit'])) {
                         continue;
                     }
                     if (!in_array($user['group_id'], $field['groups_edit'])) {
                         $form->disableField($field['name']);
                         unset($user[$field['name']]);
                     }
                 }
             }
             $errors = $form->validate($this, $user);
         }
         if (!$errors) {
             //
             // проверяем код приглашения
             //
             if ($this->options['is_reg_invites']) {
                 $invite = $this->model->getInviteByCode($user['inv']);
                 if (!$invite) {
                     $errors['inv'] = LANG_REG_WRONG_INVITE_CODE;
                 } else {
                     if ($this->options['is_invites_strict'] && $invite['email'] != $user['email']) {
                         $errors['inv'] = LANG_REG_WRONG_INVITE_CODE_EMAIL;
                     } else {
                         $user['inviter_id'] = $invite['user_id'];
                     }
                 }
             }
             //
             // проверяем допустимость e-mail, имени и IP
             //
             if (!$this->isEmailAllowed($user['email'])) {
                 $errors['email'] = sprintf(LANG_AUTH_RESTRICTED_EMAIL, $user['email']);
             }
             if (!$this->isNameAllowed($user['nickname'])) {
                 $errors['nickname'] = sprintf(LANG_AUTH_RESTRICTED_NAME, $user['nickname']);
             }
             if (!$this->isIPAllowed(cmsUser::get('ip'))) {
                 cmsUser::addSessionMessage(sprintf(LANG_AUTH_RESTRICTED_IP, cmsUser::get('ip')), 'error');
                 $errors = true;
             }
         }
         if (!$errors) {
             unset($user['inv']);
             //
             // Блокируем пользователя, если включена верификация e-mail
             //
             if ($this->options['verify_email']) {
                 $user = array_merge($user, array('is_locked' => true, 'lock_reason' => LANG_REG_CFG_VERIFY_LOCK_REASON, 'pass_token' => string_random(32, $user['email']), 'date_token' => ''));
             }
             $result = $users_model->addUser($user);
             if ($result['success']) {
                 $user['id'] = $result['id'];
                 cmsUser::addSessionMessage(LANG_REG_SUCCESS, 'success');
                 // отправляем письмо верификации e-mail
                 if ($this->options['verify_email']) {
                     $messenger = cmsCore::getController('messages');
                     $to = array('email' => $user['email'], 'name' => $user['nickname']);
                     $letter = array('name' => 'reg_verify');
                     $messenger->sendEmail($to, $letter, array('nickname' => $user['nickname'], 'page_url' => href_to_abs('auth', 'verify', $user['pass_token']), 'valid_until' => html_date(date('d.m.Y H:i', time() + $this->options['verify_exp'] * 3600), true)));
                     cmsUser::addSessionMessage(sprintf(LANG_REG_SUCCESS_NEED_VERIFY, $user['email']), 'info');
                 } else {
                     cmsEventsManager::hook('user_registered', $user);
                 }
                 $back_url = cmsUser::sessionGet('auth_back_url') ? cmsUser::sessionGet('auth_back_url', true) : false;
                 if ($back_url) {
                     $this->redirect($back_url);
                 } else {
                     $this->redirectToHome();
                 }
             } else {
                 $errors = $result['errors'];
             }
         }
         if ($errors && $is_captcha_valid) {
             cmsUser::addSessionMessage(LANG_FORM_ERRORS, 'error');
         }
     }
     // Капча
     if ($this->options['reg_captcha']) {
         $captcha_html = cmsEventsManager::hook('captcha_html');
     }
     return cmsTemplate::getInstance()->render('registration', array('user' => $user, 'form' => $form, 'captcha_html' => isset($captcha_html) ? $captcha_html : false, 'errors' => isset($errors) ? $errors : false));
 }
Пример #3
0
 public function run($profile, $do = false)
 {
     if (!cmsUser::isLogged()) {
         cmsCore::error404();
     }
     $user = cmsUser::getInstance();
     // если нужно, передаем управление другому экшену
     if ($do) {
         $this->runAction('profile_edit_' . $do, array($profile) + array_slice($this->params, 2));
         return;
     }
     // проверяем наличие доступа
     if ($profile['id'] != $user->id && !$user->is_admin) {
         cmsCore::error404();
     }
     // Получаем поля
     $content_model = cmsCore::getModel('content');
     $content_model->setTablePrefix('');
     $content_model->orderBy('ordering');
     $fields = $content_model->getContentFields('{users}');
     // Строим форму
     $form = new cmsForm();
     // Разбиваем поля по группам
     $fieldsets = cmsForm::mapFieldsToFieldsets($fields, function ($field, $user) {
         // проверяем что группа пользователя имеет доступ к редактированию этого поля
         if ($field['groups_edit'] && !$user->isInGroups($field['groups_edit'])) {
             return false;
         }
         return true;
     });
     // Добавляем поля в форму
     foreach ($fieldsets as $fieldset) {
         $fieldset_id = $form->addFieldset($fieldset['title']);
         foreach ($fieldset['fields'] as $field) {
             // добавляем поле в форму
             $form->addField($fieldset_id, $field['handler']);
         }
     }
     // Добавляем поле выбора часового пояса
     $config = cmsConfig::getInstance();
     $fieldset_id = $form->addFieldset(LANG_TIME_ZONE);
     $form->addField($fieldset_id, new fieldList('time_zone', array('default' => $config->time_zone, 'generator' => function ($item) {
         return cmsCore::getTimeZones();
     })));
     // Форма отправлена?
     $is_submitted = $this->request->has('submit');
     if ($is_submitted) {
         // Парсим форму и получаем поля записи
         $new = $form->parse($this->request, $is_submitted, $profile);
         $old = $profile;
         $profile = array_merge($profile, $new);
         // Проверям правильность заполнения
         $errors = $form->validate($this, $profile);
         if (!$errors) {
             $is_allowed = cmsEventsManager::hookAll('user_profile_update', $profile, true);
             if ($is_allowed !== true && in_array(false, $is_allowed)) {
                 $errors = true;
             }
         }
         if (!$errors) {
             // Обновляем профиль и редиректим на его просмотр
             $this->model->updateUser($profile['id'], $profile);
             // Отдельно обновляем часовой пояс в сессии
             cmsUser::sessionSet('user_data:time_zone', $profile['time_zone']);
             // Постим уведомление о смене аватара в ленту
             if (!$this->model->isAvatarsEqual($new['avatar'], $old['avatar'])) {
                 $activity_controller = cmsCore::getController('activity');
                 $activity_controller->deleteEntry($this->name, "avatar", $profile['id']);
                 if (!empty($new['avatar'])) {
                     $activity_controller->addEntry($this->name, "avatar", array('user_id' => $profile['id'], 'subject_title' => $profile['nickname'], 'subject_id' => $profile['id'], 'subject_url' => href_to('users', $profile['id']), 'is_private' => 0, 'group_id' => null, 'images' => array(array('url' => href_to('users', $profile['id']), 'src' => html_image_src($new['avatar'], 'normal'))), 'images_count' => 1));
                 }
             }
             $this->redirectTo('users', $profile['id']);
         }
         if ($errors) {
             cmsUser::addSessionMessage(LANG_FORM_ERRORS, 'error');
         }
     }
     return cmsTemplate::getInstance()->render('profile_edit', array('do' => 'edit', 'id' => $profile['id'], 'profile' => $profile, 'form' => $form, 'errors' => isset($errors) ? $errors : false));
 }
Пример #4
0
            <div class="value"><?php 
    echo $field['html'];
    ?>
</div>
        </div>

    <?php 
}
?>

    <?php 
if ($props && array_filter((array) $props_values)) {
    ?>
        <?php 
    $props_fields = $this->controller->getPropsFields($props);
    $props_fieldsets = cmsForm::mapFieldsToFieldsets($props);
    ?>
        <div class="content_item_props <?php 
    echo $ctype['name'];
    ?>
_item_props">
            <table>
                <tbody>
                    <?php 
    foreach ($props_fieldsets as $fieldset) {
        ?>
                        <?php 
        if ($fieldset['title']) {
            ?>
                            <tr>
                                <td class="heading" colspan="2"><?php 
Пример #5
0
?>

            </ul>

        </div>

    </div>

    <div id="right_column" class="column">

            <div id="information" class="content_item block">

                <?php 
$fieldsets = cmsForm::mapFieldsToFieldsets($fields, function ($field, $user) {
    if (in_array($field['name'], array('nickname', 'avatar'))) {
        return false;
    }
    return true;
}, $profile);
?>

                <?php 
foreach ($fieldsets as $fieldset) {
    ?>

                    <?php 
    if (!$fieldset['fields']) {
        continue;
    }
    ?>

                    <div class="fieldset">