Version: current

      1 <?php
      2 /**
      3  * Личный кабинет
      4  *
      5  * @package auth
      6  * @author inxo, dvp
      7  */
      8 class ProfilePage extends Page {
      9
     10     static $icon = "auth/img/user";
     11     static $allowed_children = 'none';
     12
     13     static $default = array(
     14         'URLSegment' => 'profile',
     15         'AutoChild' => 0,
     16     );
     17
     18     static function find_link($action = '') {
     19         if (!$page = DataObject::get_one('ProfilePage')) {
     20             user_error('Создайте страницу "Личный кабинет"', E_USER_ERROR);
     21         }
     22
     23         return $page->Link($action);
     24     }
     25
     26     function getCMSFields() {
     27         $fields = parent::getCMSFields();
     28         $fields->removeByName('AutoChild'); // Удалим переход к нижним элементам
     29         return $fields;
     30     }
     31
     32     function canCreate($member = false) {
     33         if (DataObject::get_one('ProfilePage')) return false;
     34         if (!Director::isDev()) return false;
     35         return parent::canCreate($member);
     36     }
     37
     38     function canDelete() {
     39         return Director::isDev();
     40     }
     41 }
     42
     43 class ProfilePage_Controller extends Page_Controller {
     44
     45     static $allowed_actions = array('index', 'edit', 'EditProfileForm');
     46
     47     function init() {
     48         parent::init();
     49         if (!Member::currentUserID()) {
     50             return Security::permissionFailure($this);
     51         }
     52     }
     53
     54     /**
     55      * Возвращает локальное меню для личного кабинета
     56      * возможно расширение на сайте с помощью updateUserMenu(array &$items)
     57      * @TODO выделять текущий пункт меню
     58      *
     59      * @return DataObjectSet - список пунктов меню с полями Link Title
     60      */
     61     function UserMenu($current = false) {
     62         $items = array(
     63             array(
     64                 'Link' => $this->Link(),
     65                 'Title' => _t('ProfilePage.MenuProfile', 'My Profile'),
     66             ),
     67             array(
     68                 'Link' => $this->Link('edit'),
     69                 'Title' => _t('ProfilePage.MenuEdit', 'My Profile'),
     70             ),
     71 /*
     72             array(
     73                 'Link' => Security::Link('changepassword'),
     74                 'Title' => _t('ProfilePage.MenuPassword', 'Change Password'),
     75             )
     76 */
     77         );
     78
     79         $this->extend('updateUserMenu', $items);
     80
     81         //Определение текущего action
     82         if (!$current)
     83             $current = $this->getAction();
     84
     85         foreach ($items as &$item) {
     86             $link = $item['Link'];
     87             if (strpos($item['Link'], '?') > 0) {
     88                 $link = substr($link, 0, strpos($link, '?'));
     89             }
     90             $action = trim(substr($link, strrpos($link, '/') + 1));
     91             if (!$action) $action = 'index';
     92             $item['IsCurrent'] = ($current == $action) ? 1 : 0;
     93             $item['LinkOrCurrent'] = ($current == $action) ? 'current' : 'link';
     94             $item['LinkingMode'] = ($current == $action) ? 'current' : 'link';
     95         }
     96
     97         return new DataObjectSet($items);
     98     }
     99
    100     /**
    101      * Редактирование профиля
    102      */
    103     function edit() {
    104         if (!$form = $this->EditProfileForm())
    105             $form = '<p class="error message">' . _t('UserProfile.WRONGPERMISSION', 'You don\'t have the permission to edit that member.') . '</p>';
    106
    107         return array(
    108             "Title" => _t('ProfilePage.TitleEdit', 'Edit Profile'),
    109             "Form" => $form,
    110         );
    111     }
    112
    113     /**
    114      * Форма редактирование профиля пользователя
    115      * Список полей получает от Member
    116      *
    117      * @return Form
    118      */
    119     function EditProfileForm() {
    120         $member = Member::currentUser();
    121         $fields = $member->getMemberFormFields();
    122         $fields->push(new HiddenField('ID', 'ID', $member->ID));
    123         if ($member && $member->hasMethod('canEdit') && $member->canEdit()) {
    124             $form = new Form(
    125                 $this,
    126                 'EditProfileForm',
    127                 $fields,
    128                 new FieldSet(new FormAction("saveprofile", _t('ProfilePage.SaveProfile', 'Save'))),
    129                 $member->getValidator()
    130             );
    131             $this->extend('updateEditProfileForm', $form);
    132             $form->loadDataFrom($member);
    133             return $form;
    134         }
    135         return null;
    136     }
    137
    138     /**
    139      * Сохраняет изменения в профиле пользователя
    140      * Вызывается из формы EditProfileForm
    141      *
    142      * @param array $data - данные формы
    143      * @param Form $form  - объект EditProfileForm
    144      */
    145     function saveprofile($data, $form) {
    146         $member = Member::currentUser();
    147         $form->saveInto($member);
    148         $member->write();
    149         $backURL = Session::get('BackURL');
    150         if ($backURL) {
    151             Director::redirect($backURL);
    152         } else {
    153             Director::redirect($this->Link());
    154         }
    155     }
    156
    157 }
    158

[Raise a SilverStripe Framework issue/bug](https://github.com/silverstripe/silverstripe-framework/issues/new)
- [Raise a SilverStripe CMS issue/bug](https://github.com/silverstripe/silverstripe-cms/issues/new)
- Please use the Silverstripe Forums to ask development related questions. -