adding settings form.
This commit is contained in:
parent
d7d10057ae
commit
ad03270d57
2 changed files with 280 additions and 0 deletions
235
app/forms/UserSettings.php
Normal file
235
app/forms/UserSettings.php
Normal file
|
|
@ -0,0 +1,235 @@
|
|||
<?php
|
||||
|
||||
namespace Form;
|
||||
|
||||
/**
|
||||
* Models
|
||||
*/
|
||||
use Model\Data\User as UserModel;
|
||||
|
||||
/**
|
||||
* Phalcon Form
|
||||
*/
|
||||
use Phalcon\Forms\Form as FormBase,
|
||||
Phalcon\Forms\Element as FormElement;
|
||||
|
||||
/**
|
||||
* Element types
|
||||
*/
|
||||
use Phalcon\Forms\Element\Text,
|
||||
Phalcon\Forms\Element\Password,
|
||||
Phalcon\Forms\Element\Submit;
|
||||
|
||||
/**
|
||||
* Validators
|
||||
*/
|
||||
use Phalcon\Validation\Validator\Callback as CallbackValidator,
|
||||
Phalcon\Validation\Validator\Uniqueness as UniquenessValidator,
|
||||
\Validation\Validator\Alpha as AlphaValidator,
|
||||
Phalcon\Validation\Validator\Alnum as AlnumValidator,
|
||||
Phalcon\Validation\Validator\PresenceOf as PresenceOfValidator,
|
||||
Phalcon\Validation\Validator\Email as EmailValidator,
|
||||
Phalcon\Validation\Validator\Confirmation as ConfirmationValidator,
|
||||
Phalcon\Validation\Validator\StringLength as StringLengthValidator,
|
||||
Phalcon\Validation\Validator\Identical as IdenticalValidator;
|
||||
|
||||
|
||||
class UserSettings extends FormBase
|
||||
{
|
||||
public function initialize()
|
||||
{
|
||||
$this->setValidation(new \Phalcon\Validation());
|
||||
|
||||
// Id
|
||||
$id = new Text('id', array(
|
||||
'class' => 'form-control',
|
||||
'readonly' => '',
|
||||
));
|
||||
$id->addValidator(new IdenticalValidator([
|
||||
'accepted' => $this->getEntity()->getId(),
|
||||
]));
|
||||
|
||||
$id->setLabel('ID');
|
||||
$this->add($id);
|
||||
|
||||
// Username
|
||||
$username = new Text('username', array(
|
||||
'class' => 'form-control',
|
||||
'placeholder' => 'Username',
|
||||
));
|
||||
|
||||
$username->setLabel('Username');
|
||||
|
||||
$username->addValidator(new AlnumValidator());
|
||||
|
||||
$validator = new UniquenessValidator(array(
|
||||
'model' => new UserModel(),
|
||||
'message' => 'The username already exists.',
|
||||
'attribute' => 'username',
|
||||
'except' => [ $this->getEntity()->getUsername() ]
|
||||
));
|
||||
|
||||
$username->addValidator($validator);
|
||||
|
||||
$this->add($username);
|
||||
|
||||
// Name
|
||||
$name = new Text('name', array(
|
||||
'class' => 'form-control',
|
||||
'placeholder' => 'Name',
|
||||
));
|
||||
|
||||
$name->setLabel('Name');
|
||||
$name->addValidator(new AlphaValidator([
|
||||
'allowSpace' => true,
|
||||
'allowEmpty' => true,
|
||||
]));
|
||||
|
||||
$this->add($name);
|
||||
|
||||
// Email
|
||||
$email = new Text('email', array(
|
||||
'class' => 'form-control',
|
||||
'placeholder' => 'Email',
|
||||
'readonly' => '',
|
||||
));
|
||||
|
||||
$email->addValidator(new IdenticalValidator([
|
||||
'accepted' => $this->getEntity()->getEmail(),
|
||||
]));
|
||||
|
||||
$email->setLabel('Email');
|
||||
|
||||
$this->add($email);
|
||||
|
||||
// Passwords
|
||||
$this->_passwords();
|
||||
|
||||
// Submit
|
||||
$submit = new Submit('Save', array('class' => 'button button-default'));
|
||||
$this->add($submit);
|
||||
}
|
||||
|
||||
/**
|
||||
* Password section
|
||||
*/
|
||||
protected function _passwords()
|
||||
{
|
||||
$current_pw = $this->getEntity()->getPassword();
|
||||
|
||||
// Current
|
||||
if (strlen($current_pw) > 0) {
|
||||
$current = new Password('passwordCurrent', array(
|
||||
'class' => 'form-control',
|
||||
));
|
||||
$current->setLabel('Current password');
|
||||
$this->add($current);
|
||||
}
|
||||
|
||||
// New
|
||||
$new = new Password('passwordNew', array(
|
||||
'class' => 'form-control',
|
||||
));
|
||||
$new->setLabel('New password');
|
||||
$this->add($new);
|
||||
|
||||
// Confirm
|
||||
$confirm = new Password('passwordConfirm', array(
|
||||
'class' => 'form-control',
|
||||
));
|
||||
$confirm->setLabel('Confirm');
|
||||
$this->add($confirm);
|
||||
|
||||
// Validation
|
||||
$validation = $this->getValidation();
|
||||
|
||||
if (strlen($current_pw) > 0) {
|
||||
$validation->add('passwordCurrent', new CallbackValidator([
|
||||
'callback' => function($data) {
|
||||
$new_pw = $data['passwordNew'];
|
||||
if (strlen($new_pw) > 0) {
|
||||
$value = $data['passwordCurrent'];
|
||||
$hash = $this->getEntity()->getPassword();
|
||||
|
||||
// Only fail if there is a password and they did not match.
|
||||
if (strlen($hash) > 0 && password_verify($value, $hash) === false) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
},
|
||||
'message' => 'Password is not valid.'
|
||||
]));
|
||||
}
|
||||
|
||||
$validation->add('passwordNew', new StringLengthValidator([
|
||||
'allowEmpty' => true,
|
||||
'min' => 8,
|
||||
'messageMinimum' => 'Password must be atleast 8 characters long',
|
||||
]));
|
||||
|
||||
$validation->add('passwordConfirm', new ConfirmationValidator([
|
||||
'message' => 'Passwords does not match',
|
||||
'with' => 'passwordNew',
|
||||
]));
|
||||
}
|
||||
|
||||
public function renderDecorated($name, $opt = [])
|
||||
{
|
||||
$options = [
|
||||
'label-class' => 'control-label',
|
||||
'class' => 'col-sm-10',
|
||||
'message' => ''
|
||||
];
|
||||
|
||||
$ele = $this->get($name);
|
||||
|
||||
if (isset($opt['label-length'])) {
|
||||
$length = (int) $opt['label-length'];
|
||||
} else {
|
||||
$length = 2;
|
||||
}
|
||||
$options['label-class'] .= ' col-sm-' . $length;
|
||||
|
||||
if (isset($opt['length'])) {
|
||||
|
||||
$len = $opt['length'];
|
||||
|
||||
if ($len === 'full') {
|
||||
$options['class'] = '';
|
||||
} else {
|
||||
$options['class'] = 'col-sm-' . $opt['length'];
|
||||
}
|
||||
}
|
||||
|
||||
if ($ele->hasMessages()) {
|
||||
$options['class'] .= ' has-error';
|
||||
$options['message'] = $ele->getMessages()->current();
|
||||
}
|
||||
|
||||
return $this->_render($ele, $options);
|
||||
}
|
||||
|
||||
protected function _render(FormElement $ele, $opt)
|
||||
{
|
||||
$xhtml = '';
|
||||
|
||||
if (strlen($ele->getLabel()) > 0) {
|
||||
|
||||
$xhtml .= sprintf(
|
||||
'<label class="%s" for="%s">%s</label>',
|
||||
$opt['label-class'], $ele->getName(), $ele->getLabel());
|
||||
}
|
||||
|
||||
$xhtml .= '<div class="' . $opt['class'] . '">'
|
||||
. $ele->render();
|
||||
|
||||
if (strlen($opt['message']) > 0) {
|
||||
$xhtml .= '<span class="help-block">' . $opt['message'] . '</span>';
|
||||
}
|
||||
|
||||
$xhtml .= '</div>';
|
||||
|
||||
return $xhtml;
|
||||
}
|
||||
}
|
||||
45
app/views/user/settings.volt
Normal file
45
app/views/user/settings.volt
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
|
||||
<div class="section">
|
||||
|
||||
<form class="form-horizontal" method="post" action="">
|
||||
|
||||
<div class="form-group">
|
||||
{{ form.renderDecorated('username', [ 'length': 7 ]) }}
|
||||
{{ form.renderDecorated('id', [ 'length': 2, 'label-length' : 1 ]) }}
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
{{ form.renderDecorated('name') }}
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
{{ form.renderDecorated('email') }}
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<h4>Password</h4>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% if form.has('passwordCurrent') %}
|
||||
<div class="form-group">
|
||||
{{ form.renderDecorated('passwordCurrent') }}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="form-group">
|
||||
{{ form.renderDecorated('passwordNew') }}
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
{{ form.renderDecorated('passwordConfirm') }}
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
{{ form.render('Save') }}
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
Reference in a new issue