yii modal box form validation - yii

I am using yii framework for my website. I have a signup form in modal box. If i submit the form without fill the validation errors should show within the modal box without refresh. But now it redirects to some other page. How can i show the validation errors within the modal box in the same page?
This is the code that i have used for sign up view
<?php
$model=new SignupForm;
$form=$this->beginWidget('CActiveForm', array(
'id'=>'signup-form',
'enableAjaxValidation'=>true,
'action'=>'site/signup'
));
?>
<?php echo $form->errorSummary($model); ?>
<?php echo $form->textField($model,'name',array('value'=>'Enter Your Name', 'onclick'=>'javascript:this.value=""', 'onblur'=> 'this.value = ( this.value == "" ) ? "Enter Your Name" : this.value;')); ?><br />
<?php echo $form->textField($model,'email',array('value'=>'Enter Your Email ID', 'onclick'=>'javascript:this.value=""', 'onblur'=> 'this.value = ( this.value == "" ) ? "Enter Your Email ID" : this.value;')); ?><br />
<?php echo $form->textField($model,'phone',array('value'=>'Telephone', 'onclick'=>'javascript:this.value=""', 'onblur'=> 'this.value = ( this.value == "" ) ? "Telephone" : this.value;')); ?><br />
<!--<input type="text" value="username" onClick="this.value=''"/><br/>
<input type="password" value="Password" onClick="this.value=''"/> -->
<div class="d-login"><?php echo CHtml::submitButton('Submit'); ?>
<?php /*?><input type="image" alt="Login" title="Login" src="<?php echo Yii::app()->request->baseUrl; ?>/images/signup.png"/><?php */?>
</div>
<?php $this->endWidget(); ?>
The code in controller:
public function actionSignup()
{
$model=new SignupForm;
// if it is ajax validation request
if(isset($_POST['ajax']) && $_POST['ajax']==='signup-form')
{
$model->attributes=$_POST['SignupForm'];
echo CActiveForm::validate($model);
Yii::app()->end();
}
// collect input data
if(isset($_POST['SignupForm']))
{
$model->attributes=$_POST['SignupForm'];
$name=$model->name;
$email=$model->email;
$phone=$model->phone;
$newsletter = new Newsletter();
if($model->validate())
{
//insert data
$newsletter->varName = $name;
$newsletter->varEmail = $email;
$newsletter->varPhone = $phone;
if($newsletter->save()) {
$url = Yii::app()->getBaseUrl();
Yii::app()->getRequest()->redirect($url);
}
}
}
$this->render('signup',array('model'=>$model));
}

You have to use ajax and renderPartial if you want to validate a model inside a dialog modal box. below is an untested code.(From this link )
in your views/signup.php
<div class="form">
<?php $form=$this->beginWidget('CActiveForm', array(
'id'=>'signup-form',
'enableAjaxValidation'=>false,
));
?>
<?php echo $form->errorSummary($model); ?>
<?php echo $form->textField($model,'name',array('value'=>'Enter Your Name', 'onclick'=>'javascript:this.value=""', 'onblur'=> 'this.value = ( this.value == "" ) ? "Enter Your Name" : this.value;')); ?><br />
<?php echo $form->textField($model,'email',array('value'=>'Enter Your Email ID', 'onclick'=>'javascript:this.value=""', 'onblur'=> 'this.value = ( this.value == "" ) ? "Enter Your Email ID" : this.value;')); ?><br />
<?php echo $form->textField($model,'phone',array('value'=>'Telephone', 'onclick'=>'javascript:this.value=""', 'onblur'=> 'this.value = ( this.value == "" ) ? "Telephone" : this.value;')); ?><br />
<div class="d-login">
<?php echo CHtml::submitButton('Submit'); ?>
</div>
<?php $this->endWidget(); ?>
</div>
In your controller
public function actionSignup()
{
$model=new SignupForm;
if(isset($_POST['SignupForm']))
{
$model->attributes=$_POST['SignupForm'];
$name=$model->name;
$email=$model->email;
$phone=$model->phone;
$newsletter = new Newsletter();
if($model->save())
{
//insert data
$newsletter->varName = $name;
$newsletter->varEmail = $email;
$newsletter->varPhone = $phone;
if($newsletter->save())
{
if (Yii::app()->request->isAjaxRequest)
{
echo CJSON::encode(array(
'status'=>'success',
));
exit;
}
else
{
$url = Yii::app()->getBaseUrl();
Yii::app()->getRequest()->redirect($url);
}
}
}
if (Yii::app()->request->isAjaxRequest)
{
echo CJSON::encode(array(
'status'=>'failure',
'div'=>$this->renderPartial('signup', array('model'=>$model), true)));
exit;
}
else
$this->render('signup',array('model'=>$model,));
}
And finally in your view file where you want to display the signup modal box
<?php echo CHtml::link('Signup', "", // the link for open the dialog modal
array(
'style'=>'cursor: pointer; text-decoration: underline;',
'onclick'=>"{doSignup(); $('#dialogSignup').dialog('open');}"));?>
<?php
$this->beginWidget('zii.widgets.jui.CJuiDialog', array( // the dialog
'id'=>'dialogSignup',
'options'=>array(
'title'=>'Signup',
'autoOpen'=>false,
'modal'=>true,
'width'=>550,
'height'=>470,
),
));?>
<div class="divForForm"></div>
<?php $this->endWidget();?>
<script type="text/javascript">
function doSignup()
{
<?php echo CHtml::ajax(array(
'url'=>array('site/signup'),
'data'=> "js:$(this).serialize()",
'type'=>'post',
'dataType'=>'json',
'success'=>"function(data)
{
if (data.status == 'failure')
{
$('#dialogSignup div.divForForm').html(data.div);
$('#dialogSignup div.divForForm form').submit(doSignup);
}
else
{
window.location.href =".Yii::app()->getBaseUrl().";
}
} ",
))?>;
return false;
}
</script>

You should define the validation rules in signup model.. Or paste your sign up model here..

Related

Opencart Multi Store login with same store customer not others

I am using opencart Multi store , as per my code we are having up to 10 stores , every store we have customers , the customers who is registered with particular store he can able to login to that store only, if he tries to login with any other store which he not registered there must be a error message like you are not registered with this store or else something else...
as per my code if customer login with other store which not registered he is redirecting to his store only but not login, it should not redirect and he should get error message...
Below is my controller :
<?php
class ControllerAccountLogin extends Controller {
private $error = array();
public function index() {
//echo 44; exit;
$this->load->model('account/customer');
// Login override for admin users
if (!empty($this->request->get['token'])) {
$this->event->trigger('pre.customer.login');
$this->customer->logout();
$this->cart->clear();
unset($this->session->data['wishlist']);
unset($this->session->data['payment_address']);
unset($this->session->data['payment_method']);
unset($this->session->data['payment_methods']);
unset($this->session->data['shipping_address']);
unset($this->session->data['shipping_method']);
unset($this->session->data['shipping_methods']);
unset($this->session->data['comment']);
unset($this->session->data['order_id']);
unset($this->session->data['coupon']);
unset($this->session->data['reward']);
unset($this->session->data['voucher']);
unset($this->session->data['vouchers']);
$customer_info = $this->model_account_customer->getCustomerByToken($this->request->get['token']);
if ($customer_info && $this->customer->login($customer_info['email'], '', true)) {
// Default Addresses
$this->load->model('account/address');
if ($this->config->get('config_tax_customer') == 'payment') {
$this->session->data['payment_address'] = $this->model_account_address->getAddress($this->customer->getAddressId());
}
if ($this->config->get('config_tax_customer') == 'shipping') {
$this->session->data['shipping_address'] = $this->model_account_address->getAddress($this->customer->getAddressId());
}
$this->event->trigger('post.customer.login');
$this->response->redirect($this->url->link('account/account', '', 'SSL'));
}
}
if ($this->customer->isLogged()) {
$this->response->redirect($this->url->link('account/account', '', 'SSL'));
}
$this->load->language('account/login');
$this->document->setTitle($this->language->get('heading_title'));
if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->validate()) {
//echo $this->config->get('config_store_id'); exit;
if ($this->config->get('config_store_id')) {
// echo 'sravz';
// echo $this->customer->getStoreId(); exit;
if ($this->customer->getStoreId() != 0) {
if ($this->customer->getStoreId() != $this->config->get('config_store_id')) {
$this->load->model('setting/store');
// $store_info = $this->model_setting_store->getStore($this->customer->getStoreId());
$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "store where store_id=".$this->customer->getStoreId()."");
$store_info = $query->row;
$this->response->redirect($store_info['url']);
}
}
}
unset($this->session->data['guest']);
// Default Shipping Address
$this->load->model('account/address');
if ($this->config->get('config_tax_customer') == 'payment') {
$this->session->data['payment_address'] = $this->model_account_address->getAddress($this->customer->getAddressId());
}
if ($this->config->get('config_tax_customer') == 'shipping') {
$this->session->data['shipping_address'] = $this->model_account_address->getAddress($this->customer->getAddressId());
}
// Add to activity log
$this->load->model('account/activity');
$activity_data = array(
'customer_id' => $this->customer->getId(),
'name' => $this->customer->getFirstName() . ' ' . $this->customer->getLastName()
);
$this->model_account_activity->addActivity('login', $activity_data);
// Added strpos check to pass McAfee PCI compliance test (http://forum.opencart.com/viewtopic.php?f=10&t=12043&p=151494#p151295)
if (isset($this->request->post['redirect']) && (strpos($this->request->post['redirect'], $this->config->get('config_url')) !== false || strpos($this->request->post['redirect'], $this->config->get('config_ssl')) !== false)) {
$this->response->redirect(str_replace('&', '&', $this->request->post['redirect']));
} else {
$this->response->redirect($this->url->link('account/account', '', 'SSL'));
}
}
$data['breadcrumbs'] = array();
$data['breadcrumbs'][] = array(
'text' => $this->language->get('text_home'),
'href' => $this->url->link('common/home')
);
$data['breadcrumbs'][] = array(
'text' => $this->language->get('text_account'),
'href' => $this->url->link('account/account', '', 'SSL')
);
$data['breadcrumbs'][] = array(
'text' => $this->language->get('text_login'),
'href' => $this->url->link('account/login', '', 'SSL')
);
$data['heading_title'] = $this->language->get('heading_title');
$data['text_new_customer'] = $this->language->get('text_new_customer');
$data['text_register'] = $this->language->get('text_register');
$data['text_register_account'] = $this->language->get('text_register_account');
$data['text_returning_customer'] = $this->language->get('text_returning_customer');
$data['text_i_am_returning_customer'] = $this->language->get('text_i_am_returning_customer');
$data['text_forgotten'] = $this->language->get('text_forgotten');
$data['entry_email'] = $this->language->get('entry_email');
$data['entry_password'] = $this->language->get('entry_password');
$data['button_continue'] = $this->language->get('button_continue');
$data['button_login'] = $this->language->get('button_login');
if (isset($this->error['warning'])) {
$data['error_warning'] = $this->error['warning'];
} else {
$data['error_warning'] = '';
}
$data['action'] = $this->url->link('account/login', '', 'SSL');
$data['register'] = $this->url->link('account/register', '', 'SSL');
$data['forgotten'] = $this->url->link('account/forgotten', '', 'SSL');
// Added strpos check to pass McAfee PCI compliance test (http://forum.opencart.com/viewtopic.php?f=10&t=12043&p=151494#p151295)
if (isset($this->request->post['redirect']) && (strpos($this->request->post['redirect'], $this->config->get('config_url')) !== false || strpos($this->request->post['redirect'], $this->config->get('config_ssl')) !== false)) {
$data['redirect'] = $this->request->post['redirect'];
} elseif (isset($this->session->data['redirect'])) {
$data['redirect'] = $this->session->data['redirect'];
unset($this->session->data['redirect']);
} else {
$data['redirect'] = '';
}
if (isset($this->session->data['success'])) {
$data['success'] = $this->session->data['success'];
unset($this->session->data['success']);
} else {
$data['success'] = '';
}
if (isset($this->request->post['email'])) {
$data['email'] = $this->request->post['email'];
} else {
$data['email'] = '';
}
if (isset($this->request->post['password'])) {
$data['password'] = $this->request->post['password'];
} else {
$data['password'] = '';
}
$data['column_left'] = $this->load->controller('common/column_left');
$data['column_right'] = $this->load->controller('common/column_right');
$data['content_top'] = $this->load->controller('common/content_top');
$data['content_bottom'] = $this->load->controller('common/content_bottom');
$data['footer'] = $this->load->controller('common/footer');
$data['header'] = $this->load->controller('common/header');
$data['account'] = $this->load->controller('module/account');
if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/account/login.tpl')) {
$this->response->setOutput($this->load->view($this->config->get('config_template') . '/template/account/login.tpl', $data));
} else {
$this->response->setOutput($this->load->view('default/template/account/login.tpl', $data));
}
}
protected function validate() {
//echo $this->request->post['email'];exit;
$this->event->trigger('pre.customer.login');
// Check how many login attempts have been made.
$login_info = $this->model_account_customer->getLoginAttempts($this->request->post['email']);
if ($login_info && ($login_info['total'] >= $this->config->get('config_login_attempts')) && strtotime('-1 hour') < strtotime($login_info['date_modified'])) {
$this->error['warning'] = $this->language->get('error_attempts');
}
// Check if customer has been approved.
$customer_info = $this->model_account_customer->getCustomerByEmail($this->request->post['email']);
//print_r($customer_info);exit;
if ($customer_info && !$customer_info['approved']) {
$this->error['warning'] = $this->language->get('error_approved');
}
//print_r( $this->error); exit;
if (!$this->error) {
if (!$this->customer->login($this->request->post['email'], $this->request->post['password'])) {
//echo 44; exit;
// $this->error['warning'] = $this->language->get('error_login');
// $this->model_account_customer->addLoginAttempt($this->request->post['email']);
} else {
$this->model_account_customer->deleteLoginAttempts($this->request->post['email']);
$this->event->trigger('post.customer.login');
}
}
return !$this->error;
}
}
Below is my View :
<?php echo $header; ?>
<div class="container">
<ul class="breadcrumb">
<?php foreach ($breadcrumbs as $breadcrumb) { ?>
<li><?php echo $breadcrumb['text']; ?></li>
<?php } ?>
</ul>
<?php if ($success) { ?>
<div class="alert alert-success"><i class="fa fa-check-circle"></i> <?php echo $success; ?></div>
<?php } ?>
<?php if ($error_warning) { ?>
<div class="alert alert-danger"><i class="fa fa-exclamation-circle"></i> <?php echo $error_warning; ?></div>
<?php } ?>
<div class="row"><?php echo $column_left; ?>
<?php if ($column_left && $column_right) { ?>
<?php $class = 'col-sm-6 no-pad'; ?>
<?php } elseif ($column_left || $column_right) { ?>
<?php $class = 'col-sm-9'; ?>
<?php } else { ?>
<?php $class = 'col-sm-12'; ?>
<?php } ?>
<div id="content" class="<?php echo $class; ?>"><?php echo $content_top; ?>
<div class="panel panel-primary">
<div class="top">
<div class="panel-heading title-heading search-head"><?php echo $heading_title; ?></div>
</div>
<div class="panel-body">
<div class="row">
<!-- <h2></h2>-->
<div class="col-sm-6">
<b style="margin-bottom: 2px; display: block;"><?php echo $text_new_customer; ?></b>
<div class="well left">
<!-- <p><strong><?php echo $text_register; ?></strong></p>-->
<p><?php echo $text_register_account; ?></p>
<!-- <?php echo "Go to Shopping"; ?> --></div>
</div>
<div class="col-sm-6">
<b style="margin-bottom: 2px; display: block;"><?php echo $text_returning_customer; ?></b>
<div class="well">
<!-- <h2><?php echo $text_returning_customer; ?></h2>-->
<p><?php echo $text_i_am_returning_customer; ?></p>
<form action="<?php echo $action; ?>" method="post" enctype="multipart/form-data">
<div class="form-group">
<label class="control-label" for="input-email"> <strong> <?php echo $entry_email; ?></strong></label>
<input type="text" name="email" value="<?php echo $email; ?>" placeholder="<?php echo $entry_email; ?>" id="input-email" class="form-control" />
</div>
<div class="form-group">
<label class="control-label" for="input-password"> <strong> <?php echo $entry_password; ?></strong></label></strong>
<input type="password" name="password" value="<?php echo $password; ?>" placeholder="<?php echo $entry_password; ?>" id="input-password" class="form-control" />
<?php echo $text_forgotten; ?></div>
<input type="submit" value="<?php echo $button_login; ?>" class="btn btn-primary" />
<?php if ($redirect) { ?>
<input type="hidden" name="redirect" value="<?php echo $redirect; ?>" />
<?php } ?>
</form>
</div>
</div>
</div>
</div>
<?php echo $content_bottom; ?></div></div>
<div class="clearfix hidden-sm hidden-md hidden-lg"></div>
<?php echo $column_right; ?>
<div class="hidden-sm hidden-md hidden-lg"><div class="container"><?php echo $account; ?></div></div>
</div>
</div>
<?php echo $footer; ?>
To give back an error message to the customer you must check that the customer is part of the Customer Group assigned to that store. Use this at the start of the validate() method in catalog/controller/account/login.php:
$customer_info = $this->model_account_customer->getCustomerByEmail($this->request->post['email']);
$customerGroupId = isset($customer_info['customer_group_id']) ? $customer_info['customer_group_id'] : -1;
$allowedCustomerGroups = $this->config->get('config_customer_group_display');
if(!is_array($allowedCustomerGroups) || !in_array($customerGroupId, $allowedCustomerGroups)) {
$this->error['warning'] = $this->language->get('error_login');
return false;
}
Remember that this will not take care if your customer logs in into the right store and then goes to another store.
If you want to log customer out when they change store use this code and paste after the $data variable declaration in catalog/controller/common/header.php at around line 90:
if ($this->customer->isLogged() && ($this->config->get('config_store_id') != $this->customer->getStoreId())) {
$this->url->link('account/logout', '', true);
$this->customer->logout();
}
Then
You will have to add this method in the system/library/cart/customer.php file:
public function getStoreId() {
return $this->store_id;
}
Hope this helps :)

Yii combine yiistrap and a languages array

This is my array that prints fields for each language
<?php foreach (Yii::app()->params['translatedLanguages'] as $l => $lang) :
if($l === Yii::app()->params['defaultLanguage']) $suffix = '';
else $suffix = '_'.$l;
?>
<fieldset>
<legend><?php echo $lang; ?></legend>
<div class="row">
<?php echo $form->labelEx($model,'title'); ?>
<?php echo $form->textField($model,'title'.$suffix,array('size'=>60,'maxlength'=>255)); ?>
<?php echo $form->error($model,'title'.$suffix); ?>
</div>
<div class="row">
<?php echo $form->labelEx($model,'content'); ?>
<?php echo $form->textArea($model,'content'.$suffix); ?>
<?php echo $form->error($model,'content'.$suffix); ?>
</div>
</fieldset>
<?php endforeach; ?>
This is the yiistrap code for the tabs
http://www.getyiistrap.com/site/widgets#tabs
<?php $this->widget('bootstrap.widgets.TbTabs', array(
'placement' => 'below',
'tabs' => array(
array('label' => 'Home', 'content' => 'home test', 'active' => true),
array('label' => 'Profile', 'content' => 'profile test.'),
),
)); ?>
How can I replace the content (e.g. home test) with the fields from my form?
So in the end I have a tab for each language (like opencart)
This is the code for the tabs in my view
<?php $tabs = array(); ?>
<?php foreach (Yii::app()->params['translatedLanguages'] as $l => $lang) :
if($l === Yii::app()->params['defaultLanguage']) $suffix = '';
else $suffix = '_'.$l;
?>
<?php $tabs[] = array('label' => $lang, 'view' => '_fields', 'viewData' => array('form' => $form, 'model' => $model, 'suffix' => $suffix)); ?>
<?php endforeach; ?>
<?php $this->widget('bootstrap.widgets.TbTabs', array(
'tabs' => $tabs,
'viewData' => array('form' => $form, 'model' => $model, 'suffix' => $suffix),
)); ?>
And I added another view _fields.php
<?php echo $form->textFieldControlGroup($model,'title'.$suffix,array('span'=>5,'maxlength'=>128)); ?>
<?php echo $form->textAreaControlGroup($model,'content'.$suffix,array('rows'=>6,'span'=>8)); ?>
and I changed this in TbTabs.php ($tabOptions['viewData'])
protected function normalizeTabs($tabs)
{
$controller = $this->getController();
if (isset($controller)) {
foreach ($tabs as &$tabOptions) {
$items = TbArray::getValue('items', $tabOptions, array());
if (!empty($items)) {
$tabOptions['items'] = $this->normalizeTabs($items);
} else {
if (isset($tabOptions['view'])) {
$view = TbArray::popValue('view', $tabOptions);
if ($controller->getViewFile($view) !== false) {
$tabOptions['content'] = $controller->renderPartial($view, $tabOptions['viewData'], true);
}
}
}
}
}
return $tabs;
}

kohana, can't load orm model

I have problem saving data to database in Kohana using ORM. I am not an expert but i did more complex stuff than this. I guess the lack of basics lead to this.
I will add the model, form, and controller action code below. If anything else is needed you can ask. ps. This is my first time posting so I hope no rules are broken.
model:
class Model_Polloptionvote extends ORM {
protected $_table_name = "poll_option_votes";
protected $_primary_key = "id";
protected $_belongs_to = array(
'option' => array(
'model' => 'polloption'
)
);
protected $_table_columns = array(
'id' => array('type' => 'int'),
'option_id' => array('type' => 'int'),
'cookie' => array('type' => 'string')
);
}
form calling action:
<form action="<?php echo Route::url("home", array(
"controller" => "polls",
"action" => "vote"
)); ?>" method="POST">
<?php
if(isset($optionmodel)) {
foreach ($optionmodel as $option) { ?>
<label><?php
echo Form::radio('option_id', $option->id, FALSE);
echo $option->name; ?> </label> <?php
echo "</br>";
}
} ?>
</br>
<input type="submit" name="submit" id="submit" value="<?php echo __("Vote"); ?>" />
</form>
poll controler action:
<?php defined('SYSPATH') or die('No direct script access.');
class Controller_Polls extends Controller_Base {
public function action_vote() {
$votemodel = ORM::factory("polloptionvote");
$id = $this->request->post("option_id");
if ($id != "") {
$optionmodel = ORM::factory("polloption", $id);
if ($votemodel->loaded()) {
$votemodel->option_id = $id;
$votemodel->cookie = "cookie";
$votemodel->save();
}
$this->request->redirect(Route::url("home", array(
"controller" => "index"
)));
}
The view loads fine but it seems that $votemodel->loaded() is always false. If change that condition to 1==1 I get error. Probably because action doesn't know what to save where.
UPDATE AFTER LOOKING error.log:
error log:
PHP Fatal error: Call to a member function route() on a non-object in /home/mywebsite/public_html/new/application/views/kohana/error.php on line 144
<?php if (Model_Korisnik::current() !== null) : ?>
<ul>
<li>Korisnik/ca: <span><?php echo Model_Korisnik::current()->username; ?></span></li>
<li class="profile"><a href="<?php echo Route::url("viewUser", array(
"ignore" => Model_Korisnik::current()->username,
"id" => Model_Korisnik::current()->id
)); ?>" title="<?php echo __("Profile"); ?>"><?php echo __("Profile"); ?></a></li>
<li class="settings"><?php echo __("Settings"); ?></li>
<li class="logout"><a href="<?php echo Route::url("auth", array(
"action" => "logout"
)); ?>?redirect=<?php echo rawurlencode(Request::current()->route()->uri(Request::current()->param()) . URL::query()); ?>" title="<?php echo __("Log out"); ?>"><?php echo __("Log out"); ?></a></li>
</ul>
<?php else : ?>
Last line is 146

yii modal dialog login

I've been looking all over the internet and I can't seem to find the solution to just a simple login via header. I tried all sorts of way. The problem I have right now just reloads every time i hit login. It's only when I go to ?r=site/login it'll let me login. Is there some kind of controller for headers!??! Not sure what is wrong anymore.
Right now i have this in my header:
<?php $this->beginWidget(
'bootstrap.widgets.TbModal',
array('id' => 'login')
); ?>
<?php
$model=new LoginForm;
$this->renderPartial('//site/login', array('model'=>$model));
?>
<?php $this->endWidget(); ?>
//stuff here
<?php $this->widget(
'bootstrap.widgets.TbButton',
array(
'label' => 'Signin',
'type' => 'warning',
'htmlOptions' => array(
'data-toggle' => 'modal',
'data-target' => '#login',
),
)
);
?>
And then in site/login:
<div class="spacing">
<div class="form">
<?php $form=$this->beginWidget('CActiveForm', array(
'id'=>'login-form',
'enableClientValidation'=>true,
'clientOptions'=>array(
'validateOnSubmit'=>true,
),
)); ?>
<div class="form" id="login-form">
<div class="login-container">
<div class="login-header">
<h1 title="login">Sign In</h1>
</div>
<div class="login-form">
<div class="input-position">
<?php echo $form->labelEx($model,'Email',array('class'=>'span3','style'=>'text-align:left')); ?>
<?php echo $form->textField($model,'email', array('class'=>'span3')); ?>
<?php echo $form->error($model,'email'); ?>
</div>
<div class="input-position">
<?php echo $form->labelEx($model,'password',array('class'=>'span3','style'=>'text-align:left')); ?>
<?php echo $form->passwordField($model,'password',array('class'=>'span3',)); ?>
<?php echo $form->error($model,'password'); ?>
</div>
<div class="input-position ">
<div class="rememberMe">
<?php echo $form->checkBox($model,'rememberMe'); ?>
<?php echo $form->label($model,'rememberMe'); ?>
<?php echo $form->error($model,'rememberMe'); ?>
</div>
</div>
<div class="row buttons">
<?php echo CHtml::submitButton('Login'); ?>
</div>
<?php $this->endWidget(); ?>
</div>
</div>
</div>
</div>
</div>
controller
public function actionLogin()
{
$model=new LoginForm;
// if it is ajax validation request
if(isset($_POST['ajax']) && $_POST['ajax']==='login-form')
{
echo CActiveForm::validate($model);
Yii::app()->end();
}
// collect user input data
if(isset($_POST['LoginForm']))
{
$model->attributes=$_POST['LoginForm'];
// validate user input and redirect to the previous page if valid
if($model->validate() && $model->login())
$this->redirect(Yii::app()->user->returnUrl);
}
// display the login form
$this->render('login',array('model'=>$model));
}
As per my understanding, please keep your login script inside some loop like this to escape it from reloading every time.
if(Yii::app()->user->isGuest and (Yii::app()->controller->id=='site' and Yii::app()->controller->action->id = 'login')){
$this->beginWidget('bootstrap.widgets.TbModal', array('id' => 'login'));
---
$this->endWidget();
}else{
// keep some log out or other script here.
}
Here is the login what i have implemented on Modal login style:
Component/Header:
<?php
Yii::import('zii.widgets.CPortlet');
class Header extends CPortlet
{
protected function renderContent()
{
$this->render('Header');
}
}
Components/view/Header.php
<?php if(Yii::app()->user->isGuest){?>
<?php echo TbHtml::link('<i class="sign-in"></i>Sign in', '#', array(
'data-toggle' => 'modal',
'data-target' => '#loginModal',
));?>
<?php } else{ echo 'Hi!'.$user; } ?>
In View/Layout/Main.php
<?php
$model = new LoginForm;
$this->widget('bootstrap.widgets.TbModal', array(
'id' => 'loginModal',
'header' => '<h3 id="loginModal">Sign In</h3>',
'content'=> $this->renderPartial('userlogin',array('model'=>$model),true),
'remote' => $this->createUrl('site/userlogin'),
'onShow'=>'function(){$("#login-form")[0].reset(); }',
'show'=>false,)); ?>
View/Site/Userlogin.php
<?php $form = $this->beginWidget('bootstrap.widgets.TbActiveForm', array(
'id'=>'login-form',
//'helpType'=>'help-none',
'action'=>Yii::app()->createUrl('userlogin'),
//'enableAjaxValidation' => false,
'enableClientValidation'=>true,
'clientOptions' => array(
'validateOnSubmit' => true,
'validateOnChange'=>false,
'afterValidate' => 'js:function(form, data, hasError) {
if (!hasError){
str = $("#login-form").serialize() + "&ajax=login-form";
$.ajax({
type: "POST",
url: "' . Yii::app()->createUrl('site/userlogin') . '",
data: str,
dataType: "json",
beforeSend : function() {
$("#login").attr("disabled",true);
},
success: function(data, status) {
if(data.authenticated)
{
window.location = data.redirectUrl;
}
else
{
$.each(data, function(key, value) {
var div = "#"+key+"_em_";
$(div).text(value);
$(div).show();
});
$("#login").attr("disabled",false);
}
},
});
return false;
}
}',
),
));?>
<?php echo $form->textFieldControlGroup($model,'username',array('span'=>5,'maxlength'=>255,'required'=>true)); ?>
<?php echo $form->passwordFieldControlGroup($model,'password',array('span'=>5,'maxlength'=>255,'required'=>true)); ?>
<?php echo TbHtml::submitbutton('Sign In',array('class'=>'btn btn-primary')); ?>
<?php $this->endWidget(); ?>
This will Authenticate via Ajax
SiteController:
$model=new LoginForm;
// if it is ajax validation request
if(isset($_POST['ajax']) && $_POST['ajax']==='login-form')
{
$errors = CActiveForm::validate($model);
if ($errors != '[]')
{
echo $errors;
Yii::app()->end();
}
}
if(isset($_POST['LoginForm']))
{
$model->attributes=$_POST['LoginForm'];
// validate user input and redirect to the previous page if valid
if ($model->validate() && $model->login()) {
if (isset($_POST['ajax']) && $_POST['ajax'] === 'login-form') {
$user_id = Yii::app()->user->id;
$arr = array();
$record = Users::model()->findByPk($user_id);
if ($record) {
echo CJSON::encode(array( 'authenticated' => true,
'redirectUrl' => CController::createUrl('users/trainerprofile'),
"id" => $record->id,));
Yii::app()->end();
}
}

Yii - How to display display captcha in CPortlet?

I'm using portlet to display contact form - the very same as is on static page which comes generated as standard. I'm using the same ContactForm model. The form displays but captcha is not displaying and reports "CCaptchaValidator.action "captcha" is invalid. Unable to find such an action in the current controller."
I'm new to yii so it takes awfully lot of time to figure everything out. Any quick advice what I shell do to make it working?
Best!
Yii::import('zii.widgets.CPortlet');
class ContactFormCard extends CPortlet
{
public $title='Contact';
protected function renderContent()
{
$model=new ContactForm;
if(isset($_POST['ContactForm']))
{
$model->attributes=$_POST['ContactForm'];
if($model->validate())
$this->controller->refresh();
}
$this->render('contactFormCard',array('model'=>$model));
}
public function actions()
{
return array(
'captcha'=>array(
'class'=>'CCaptchaAction',
'backColor'=>0xFFFFFF,
),
);
}
}
and in portlet view:
<?php if(CCaptcha::checkRequirements()): ?>
<div class="row">
<?php echo $form->labelEx($model,'verifyCode'); ?>
<div>
<?php $this->widget('CCaptcha'); ?>
<?php echo $form->textField($model,'verifyCode'); ?>
</div>
<div class="hint">Please enter the letters as they are shown in the image above.
<br/>Letters are not case-sensitive.</div>
<?php echo $form->error($model,'verifyCode'); ?>
</div>
<?php endif; ?>
In you SiteController.php add:
public function actions() {
return array(
'captcha' => array(
'class' => 'CCaptchaAction',
'backColor' => 0xFFFFFF,
),
// [...]
);
}
In you ContactForm.php add:
public function rules() {
return array(
// [...]
array('verifyCode', 'captcha', 'allowEmpty' => !CCaptcha::checkRequirements(), 'message' => Yii::t('formsErros', 'Código de verificação incorreto.')),
// [...]
);
}
In you view.php
<!-- [...] -->
<?php if(CCaptcha::checkRequirements()): ?>
<div class="captcha">
<?=$form->labelEx($contactFormModel, 'verifyCode')?>
<?php $this->widget('CCaptcha', array('clickableImage' => true, 'showRefreshButton' => true, 'imageOptions' => array('id' => 'captchaContactForm', 'class' => 'clickableCursor'), 'buttonLabel' => '')); ?>
<?=$form->textField($contactFormModel, 'verifyCode', array('class' => 'verticalAlignBottom'))?>
<?=$form->error($contactFormModel, 'verifyCode')?>
</div>
<?php endif; ?>
<!-- [...] -->