/** * Render view. * * @return string */ public function content() { ob_start(); $facebook = $this->consumer ? $this->load_facebook() : false; $tabs = array('basic' => '<i class="hidden-sm fa fa-fw fa-user"></i> ' . __('Profile'), 'auth' => '<i class="hidden-sm fa fa-fw fa-key"></i> ' . __('Username & Email'), 'facebook' => '<i class="hidden-sm fa fa-fw fa-facebook"></i> ' . 'Facebook', 'forum' => '<i class="hidden-sm fa fa-fw fa-comments"></i> ' . __('Forum')); echo Form::open(); ?> <?php if ($this->errors) { ?> <div class="alert alert-danger"> <strong><?php echo __('Error happens!'); ?> </strong> <ul> <?php foreach ((array) $this->errors as $error) { ?> <li><?php echo $error; ?> </li> <?php } ?> </ul> </div> <?php } ?> <ul class="nav nav-pills nav-stacked col-sm-2"> <?php foreach ($tabs as $tab => $title) { ?> <li<?php echo $tab == $this->tab ? ' class="active"' : ''; ?> > <a href="#settings-<?php echo $tab; ?> " data-toggle="tab"><?php echo $title; ?> </a> </li> <?php } ?> </ul> <div class="tab-content col-md-10"> <div id="settings-basic" class="tab-pane<?php echo $this->tab == 'basic' ? ' active' : ''; ?> "> <fieldset id="fields-basic" class="col-sm-6"> <div class="row"> <div class="col-sm-10"> <?php echo Form::input_wrap('avatar', $this->user->avatar_url, null, __('Avatar'), Arr::get($this->errors, 'avatar')); ?> </div> <div class="col-sm-2"> <?php echo HTML::avatar($this->user->avatar_url, null, null, false); ?> </div> </div> <?php echo Form::input_wrap('name', $this->user->name, null, __('Name'), Arr::get($this->errors, 'name')); ?> <?php echo Form::radios_wrap('name_visibility', array(Model_User::NAME_VISIBLE => __('Visible'), Model_User::NAME_HIDDEN => __('Hidden')), $this->user->setting('user.name'), null, null, null, null, true); ?> <?php echo Form::input_wrap('homepage', $this->user->homepage, null, __('Homepage'), Arr::get($this->errors, 'homepage')); ?> <?php echo Form::radios_wrap('gender', array('f' => '<i class="fa fa-female female"></i> ' . __('Female'), 'm' => '<i class="fa fa-male male"></i> ' . __('Male'), 'o' => __('Other')), $this->user->gender, null, __('Gender'), Arr::get($this->errors, 'gender'), null, true); ?> <?php echo Form::input_wrap('dob', $this->user->dob ? Date::format('DMYYYY', $this->user->dob) : null, array('class' => 'date', 'maxlength' => 10, 'size' => 7, 'placeholder' => 'd.m.yyyy'), __('Date of Birth'), Arr::get($this->errors, 'dob')); ?> <?php echo Form::radios_wrap('dob_visibility', array(Model_User::DOB_VISIBLE => __('Visible'), Model_User::DOB_DATEONLY => __('Date only in profile'), Model_User::DOB_HIDDEN => __('Hidden')), $this->user->setting('user.dob'), null, null, null, null, true); ?> </fieldset> <fieldset id="fields-location" class="col-md-6"> <?php echo Form::input_wrap('location', $this->user->location, null, __('Where you at?'), Arr::get($this->errors, 'location'), __('e.g. <em>"Helsinki"</em> or <em>"Asema-aukio, Helsinki"</em>')); ?> <?php echo Form::input_wrap('city_name', $this->user->city_name, null, __('City'), Arr::get($this->errors, 'city_name')); ?> <div id="map"></div> </fieldset> </div> <div id="settings-auth" class="tab-pane<?php echo $this->tab == 'auth' ? ' active' : ''; ?> "> <fieldset id="fields-basic" class="col-md-6"> <?php echo Form::input_wrap('username', $this->user->username, array('required', 'placeholder' => __('Required')), __('Username'), Arr::get($this->errors, 'username')); ?> <?php echo Form::input_wrap('email', $this->user->email, array('required', 'placeholder' => __('Required')), __('Email'), Arr::get($this->errors, 'email')); ?> <?php echo Form::password_wrap('password', null, array('placeholder' => __('Optional')), __('New password'), Arr::get($this->errors, 'password'), __('Size <em>does</em> matter - the longer, the better.')); ?> <?php echo Form::password_wrap('current_password', null, array('placeholder' => __('Required')), __('Current password'), Arr::get($this->errors, 'current_password'), __('For your protection we require your current password.')); ?> </fieldset> </div> <div id="settings-facebook" class="tab-pane<?php echo $this->tab == 'facebook' ? ' active' : ''; ?> "> <fieldset id="fields-connections" class="col-md-6"> <?php if (!$this->external || !$this->external->loaded()) { ?> <?php echo HTML::anchor(Route::url('oauth', array('action' => 'login', 'provider' => 'facebook')), '<i class="fa fa-facebook"></i> ' . __('Connect to Facebook'), array('class' => 'btn btn-primary btn-lg', 'title' => __('Connect with your Facebook account'))); ?> <?php } elseif (is_array($facebook)) { $avatar = 'https://graph.facebook.com/' . $facebook['id'] . '/picture'; ?> <div class="media"> <?php echo HTML::avatar($avatar, null, 'pull-left facebook', false); ?> <div class="media-body"> <?php echo HTML::anchor($facebook['link'], HTML::chars($facebook['name']), array('target' => '_blank')); ?> <?php echo Form::checkbox_wrap('avatar', $avatar, $this->user->avatar_url == $avatar, null, __('Set as your avatar')); ?> <?php echo Form::checkbox_wrap('picture', $avatar . '?type=large', $this->user->picture == $avatar . '?type=large', null, __('Set as your profile image')); ?> <?php echo HTML::anchor(Route::url('oauth', array('action' => 'disconnect', 'provider' => 'facebook')), '<i class="icon-facebook"></i> ' . __('Disconnect your Facebook account'), array('class' => 'btn btn-danger facebook-delete', 'title' => __('Disconnect your Facebook account'))); ?> </div> </div> <?php } elseif ($facebook) { ?> <?php echo $facebook; ?> <?php echo HTML::anchor(Route::url('oauth', array('action' => 'disconnect', 'provider' => 'facebook')), '<i class="icon-facebook"></i> ' . __('Disconnect your Facebook account'), array('class' => 'btn btn-danger facebook-delete', 'title' => __('Disconnect your Facebook account'))); ?> <?php } ?> </fieldset> </div> <div id="settings-forum" class="tab-pane<?php echo $this->tab == 'forum' ? ' active' : ''; ?> "> <fieldset id="fields-forum" class="col-md-6"> <?php echo Form::input_wrap('title', $this->user->title, null, __('Title'), Arr::get($this->errors, 'title')); ?> <?php echo Form::textarea_wrap('signature', $this->user->signature, array('class' => 'monospace', 'rows' => 5), true, __('Signature'), Arr::get($this->errors, 'signature')); ?> </fieldset> </div> </div> <div class="row"> <fieldset class="col-xs-12 text-center"> <br> <?php echo Form::hidden('latitude', $this->user->latitude); ?> <?php echo Form::hidden('longitude', $this->user->longitude); ?> <?php echo Form::csrf(); ?> <?php echo Form::button('save', __('Save'), array('type' => 'submit', 'class' => 'btn btn-success btn-lg')); ?> <?php echo HTML::anchor(URL::user($this->user), __('Cancel'), array('class' => 'cancel')); ?> </fieldset> </div> <?php echo Form::close(); echo $this->javascript(); return ob_get_clean(); }
/** * Attempt to login with 3rd party account * * @param Model_User_External $external * @return boolean */ public function external_login(Model_User_External $external) { if ($external->loaded() && ($user = new Model_User($external->user_id))) { return $user->loaded() && $this->complete_login($user); } return false; }
/** * Update old token. * * @param Model_User_External $external * @param string $token * @return boolean If old matches provider */ protected function _update_token(Model_User_External &$external, $token) { if ($external->loaded() && $external->provider == $this->consumer->get_provider()) { $external->token = $token['access_token']; $external->modified = time(); $external->expires = time() + (int) $token['expires']; $external->save(); return true; } return false; }
/** * Register with code * * @param Model_Invitation $invitation * @param array $external * @param string $provider */ public function _join(Model_Invitation $invitation = null, array $external = null, $provider = null) { $user = new Model_User(); if ($invitation) { $user->email = $invitation->email; } else { if ($external) { $user->email = Arr::get($external, 'email'); $user->name = Arr::get($external, 'name'); $user->username = Arr::get($external, 'username', $user->name); $user->avatar_url = 'https://graph.facebook.com/' . $external['id'] . '/picture'; $user->picture = 'https://graph.facebook.com/' . $external['id'] . '/picture?type=large'; if ($location = Arr::get($external, 'location')) { $user->location = $location->name; $user->city_name = $location->name; } if ($gender = Arr::get($external, 'gender')) { switch ($gender) { case 'male': $user->gender = 'm'; break; case 'female': $user->gender = 'f'; break; } } if ($birthday = Arr::get($external, 'birthday')) { $user->dob = $birthday; } } } // Handle post $errors = array(); if ($_POST && !Arr::get($_POST, 'signup')) { $post = Arr::extract($_POST, array('username', 'password', 'password_confirm')); try { $user->username = $post['username']; $user->password_kohana = $post['password']; $user->created = time(); $user->save(); // Delete used invitation if ($invitation) { $invitation->delete(); } // Connect accounts if ($external && $provider) { $consumer = new OAuth2_Consumer($provider); $token = $consumer->get_token(); $external_user_id = $external['id']; if ($token && $external_user_id) { $external = new Model_User_External(); $external->set_fields(array('token' => $token['access_token'], 'user_id' => $user->id, 'external_user_id' => $external_user_id, 'created' => time(), 'expires' => time() + (int) $token['expires'], 'provider' => $provider)); $external->save(); } } // Login user $user->add_role('login'); Visitor::instance()->login($user, $_POST['password']); $this->request->redirect(URL::user($user)); } catch (Validation_Exception $e) { $user->password_kohana = $user->password_confirm = null; $errors = $e->array->errors('validation'); } } $this->view->add(View_Page::COLUMN_CENTER, $this->section_register($user, $errors, $invitation->code)); }