How to get url params in cakephp? - cakephp

I am using cakephp 2.6.7:
I have a password reset url like:
http://www.jegeachi.com/resellers/resetpw/9610f4e33d96ad6189c5a779ab90f10aBXX1066056669XXB12/
Here resellers is the controller and resetpw is the action and 9610f4e33d96ad6189c5a779ab90f10aBXX1066056669XXB12 is the argument I want to pass into resetpw function.
Now in resetpw.ctp:
<style type="text/css">
.alert {
padding: 6px;
margin-bottom: 5px;
border: 1px solid transparent;
border-radius: 4px;
text-align: center;
}
.alert.alert-error {
background: #A9B0B5;
color: #EF5858;
font-weight: normal;
}
</style>
<div class="page-content-wrapper">
<div class="page-content">
<!-- BEGIN PAGE CONTENT-->
<div class="content">
<!-- BEGIN LOGIN FORM -->
<?php
echo $this->Form->create('Reseller', array(
'inputDefaults' => array(
'label' => false,
'div' => false
),
'class' => 'login-form',
'url' => array('controller' => 'resellers', 'action' => 'resetpw')
)
);
?>
<h3 class="form-title">Type your new password</h3>
<div class="alert alert-danger display-hide">
<button class="close" data-close="alert"></button>
<span>
Enter your new password first. </span>
</div>
<div class="form-group">
<label class="control-label visible-ie8 visible-ie9">New Password</label>
<div class="input-icon">
<i class="fa fa-lock"></i>
<?php
echo $this->Form->input(
'password', array(
'class' => 'form-control placeholder-no-fix',
'type' => 'password',
'autocomplete' => 'off',
'placeholder' => 'New Password'
)
);
?>
</div>
</div>
<div class="form-actions">
<?php
echo $this->Form->button(
'Reset Password <i class="m-icon-swapright m-icon-white"></i>', array(
'class' => 'btn blue pull-right',
'type' => 'submit',
'escape' => false
)
);
?>
</div>
<?php echo $this->Form->end(); ?>
<!-- END LOGIN FORM -->
</div>
<!-- END PAGE CONTENT -->
</div>
</div>
<!-- END CONTENT -->
Inside resellers action:
function resetpw($a){
$this->layout = "public-login";
$this->loadModel('Reseller');
if ($this->request->is('post')) {
echo 'a : '.$a;
pr($this->params['url']); exit;
$a = func_get_args();
$keyPair = $a[0];
$key = explode('BXX', $keyPair);
$pair = explode('XXB',$key[1]);
$key = $key[0];
$pair = $pair[1];
$password = $this->request->data['Reseller']['password'];
unset($this->request->data['Reseller']['password']);
$uArr = $this->Reseller->findById($pair);
if($uArr['Reseller']['resetkey'] == $key) {
$this->Reseller->read(null, $pair);
$this->Reseller->set('password', $password);
if($this->Reseller->save()) {
$msg = ' <div class="alert alert-success">
<button type="button" class="close" data-dismiss="alert">×</button>
<strong>Your password has been reset</strong>
</div>';
} else {
$msg = ' <div class="alert alert-error">
<button type="button" class="close" data-dismiss="alert">×</button>
Something has gone wrong. Please try later or <strong>sign up again</strong>
</div>';
}
} else {
$msg = ' <div class="alert alert-error">
<button type="button" class="close" data-dismiss="alert">×</button>
<strong>Invalid link.Please check your reset link</strong> Invalid link.Please check your reset link
</div>';
}
$this->Session->setFlash($msg);
$this->redirect(array('controller'=>'resellers', 'action' => 'login'));
}
}
Here I want to catch the url data 9610f4e33d96ad6189c5a779ab90f10aBXX1066056669XXB12
But none of the following printing my data:
echo 'a : '.$a;
pr($this->params['url']); exit;
How can I get this url value.

As I said in one of my comments on your previous questions, you should first read the docs. What you are doing in this action is wrong on couple of levels, in cakephp sense. Normally you would get to this action by url I suppose
.../resellers/resetpw/9610f4e33d96ad6189c5a779ab90f10aBXX1066056669XXB12/
and by that you would already have that action argument in your controller:
public function resetpw($a = null)
Then you would check if $a is not null since you can't reset password without some kind of token. In your action $a already has this for value 9610f4e33d96ad6189c5a779ab90f10aBXX1066056669XXB12.
No need to use something like this:
$a = func_get_args();
Second thing, you should name arguments to be meaningful, $a doesn't mean nothing, but $token or something similar would make much difference.

There are multiple ways of doing it. In your function below (not writing entire one) you are trying to get the url argument in $a but you are passing parameter instead. Hence $a has no value
function resetpw($a){
$this->layout = "public-login";
$this->loadModel('Reseller');
if ($this->request->is('post')) {
echo 'a : '.$a; //$a will have no values here
pr($this->params['url']); exit;
In your case you need catch params like below
$a = $this->params['passed'][0];
Or to get argument your URL should be like below
http://www.jegeachi.com/resellers/resetpw?9610f4e33d96ad6189c5a779ab90f10aBXX1066056669XXB12/
so that you can collect it in $a. Hope this helps to you!

I solved this by removing 'url' in Form.
I changed
<?php
echo $this->Form->create('Reseller', array(
'inputDefaults' => array(
'label' => false,
'div' => false
),
'class' => 'login-form',
'url' => array('controller' => 'resellers', 'action' => 'resetpw')
)
);
?>
To
<?php
echo $this->Form->create('Reseller', array(
'inputDefaults' => array(
'label' => false,
'div' => false
),
'class' => 'login-form',
)
);
?>
Now it works. When you set url then parameter in url is removed.

Related

Why my variables are undefined i click on the submit button?

I have fields in a form with variables from the Controller TownsController, I use "set" to be able to affchés in sight. I arrive at the desired result, the problem is that when I want to send my information by clicking on the submit button, I have several errors telling me that the variable is undefined.
Before i click on the submit button :
After i click on the submit button :
The view :
<h2>Informations de votre ville</h2>
<?php echo $this->Form->create('Town'); ?>
<div class="form-group">
<div class="col-xs-6">
<?php echo $this->Form->input('statut',array(
'label' => 'Statut',
'type' => 'select',
'options' => array(
'Village'=>'Village',
'Ville'=>'Ville'),
'selected' => $selectedstatut,
'class' => 'form-control',
'id' => 'town_statut_municipal',
'empty' => __('Statut municipal')
));
?>
</div>
</div>
<div class="form-group">
<div class="col-xs-6">
<?php echo $this->Form->input('name', array('type' => 'text', 'id' => 'town_name', 'class' => 'form-control', 'placeholder' => 'Choisir un statut municipal', 'label' => 'Nom')); ?>
</div>
</div>
<div class="form-group">
<div class="col-xs-6">
<?php echo $this->Form->input('country', array('type' => 'select', 'class' => 'form-control', 'label' => 'Pays', 'id' => 'town_country', 'onchange' => "print_state('state',this.selectedIndex);", 'selected' => $selectedcountry, 'empty' => false,
'options' => array(
'Canada'=>'Canada',
'USA'=>'USA'))); ?>
</div>
</div>
<div class="form-group">
<div class="col-xs-6">
<?php
echo $this->Form->input('localisation', array('type' => 'select', 'class' => 'form-control', 'label' => 'Localisation', 'id' => 'state', 'empty' => $namelocalisation,
'options' => $localisations)); ?>
</div>
</div>
<div class="form-group">
<div class="col-xs-12">
<br>
<?php
$options = array('label' => 'Sauvegarder', 'class' => 'btn', 'div' => false, 'class' => 'btn btn-lg btn-success');
echo $this->Form->end($options);
?>
</div>
</div>
</form>
TownsController (edit view) :
public function edit(){
$town_id = $this->Auth->user('town_id');
$user_id = $this->Auth->user('user_id');
if(!$town_id && !$user_id) {
$this->redirect('/');
die();
}
$this->Town->id = $town_id;
if($this->request->is('put') || $this->request->is('post')) {
}
else {
$this->request->data = $this->Town->read(array('name', 'country', 'localisation', 'statut'), null);
$selectedstatut = $this->Session->read('Auth.Town.statut');
$this->set(compact('selectedstatut'));
$selectedcountry = $this->Session->read('Auth.Town.country');
$this->set(compact('selectedcountry'));
$countryuser = $this->Session->read('Auth.Town.country');
if($countryuser = 'Canada') {
$namelocalisation = 'Province';
$localisations = array(
'Alberta'=>"Alberta",
'British Columbia'=>"British Columbia",
'Manitoba'=>"Manitoba",
'New Brunswick'=>"New Brunswick",
'Newfoundland'=>"Newfoundland",
'Northwest Territories'=>"Northwest Territories",
'Nova Scotia'=>"Nova Scotia",
'Nunavut'=>"Nunavut",
'Ontario'=>"Ontario",
'Prince Edward Island'=>"Prince Edward Island",
'Quebec'=>"Quebec",
'Saskatchewan'=>"Saskatchewan",
'Yukon Territory'=>"Yukon Territory");
}
if($countryuser = 'USA') {
$namelocalisation = 'État';
$localisations = array(
'Alabama'=>"Alabama",
'Alaska'=>"Alaska",
'Arizona'=>"Arizona",
'Arkansas'=>"Arkansas",
'California'=>"California",
'Colorado'=>"Colorado",
'Connecticut'=>"Connecticut",
'Delaware'=>"Delaware",
'District Of Columbia'=>"District Of Columbia",
'Florida'=>"Florida",
'Georgia'=>"Georgia",
'Hawaii'=>"Hawaii",
'Idaho'=>"Idaho",
'Illinois'=>"Illinois",
'Indiana'=>"Indiana",
'Iowa'=>"Iowa",
'Kansas'=>"Kansas",
'Kentucky'=>"Kentucky",
'Louisiana'=>"Louisiana",
'Maine'=>"Maine",
'Maryland'=>"Maryland",
'Massachusetts'=>"Massachusetts",
'Michigan'=>"Michigan",
'Minnesota'=>"Minnesota",
'Mississippi'=>"Mississippi",
'Missouri'=>"Missouri",
'Montana'=>"Montana",
'Nebraska'=>"Nebraska",
'Nevada'=>"Nevada",
'New Hampshire'=>"New Hampshire",
'New Jersey'=>"New Jersey",
'New Mexico'=>"New Mexico",
'New York'=>"New York",
'North Carolina'=>"North Carolina",
'North Dakota'=>"North Dakota",
'Ohio'=>"Ohio",
'Oklahoma'=>"Oklahoma",
'Oregon'=>"Oregon",
'Pennsylvania'=>"Pennsylvania",
'Rhode Island'=>"Rhode Island",
'South Carolina'=>"South Carolina",
'South Dakota'=>"South Dakota",
'Tennessee'=>"Tennessee",
'Texas'=>"Texas",
'Utah'=>"Utah",
'Vermont'=>"Vermont",
'Virginia'=>"Virginia",
'Washington'=>"Washington",
'West Virginia'=>"West Virginia",
'Wisconsin'=>"Wisconsin",
'Wyoming'=>"Wyoming");
}
$this->set('localisations', $localisations);
$this->set('namelocalisation', $namelocalisation);
}
}
The reason is that you set those variables IF the request is not POST. When you click on Submit your code will enter in the "isPost" condition, hence the variables localisations, namelocalisation, selectedcountry and selectedstatut are never set.
Here's what I would do (pseudo code)
if ($this->request->is(array('post', 'put'))) {
if ($this->Post->save($this->request->data)) {
$this->Session->setFlash(__('Your post has been updated.'));
return $this->redirect(array('action' => 'index'));
}
}
$selectedstatut = $this->Session->read('Auth.Town.statut');
etc...
Notice I am setting the view variables outside the if statement so that if save fails (because validation) then we set the variables again.

Register button in cakephp

I made a login page in CakePHP and need to add a register button, this is the code of \View\Users\login.ctp:
<div class="container">
<div class="login-content">
<?php echo $this->Html->image('logo1.png', array('alt' => 'fivassist Logo')); ?>
<?php echo $this->Form->create('User'); ?>
<div class="login-form">
<h2>Bem-vindo!</h2>
<ul>
<li>
<label>E-mail:</label>
<?php echo $this->Form->input('email',
array('label' => false, 'autocomplete' => 'off')); ?>
</li>
<li><label>Password:</label>
<?php echo $this->Form->input('password',
array('label' => false, 'autocomplete' => 'off')); ?>
</li>
</ul>
</div> <!-- end login-form -->
<?php echo $this->Session->flash(); ?>
<?php echo $this->Form->submit('Login', array('id' => 'login-bt')); ?>
Esqueceu-se da sua password?
<?php echo $this->Form->button('Register'); ?>
</div> <!-- end login-content -->
</div> <!-- end container -->
How i redirect the register button to /user/add.ctp?
Can you help me please?
Thank you.
You need to point your form to your "register" action: I would advise making this action separate from your "New User" action- sometimes you want to have different logic.
This should submit to /users/register. Note the parameters on $this->Form->create:
echo $this->Form->create('User', array('url' => array('controller' => 'users', 'action' => 'register')));
echo $this->Form->input('email', array('class' => 'form-control', 'label' => false,'placeholder' => 'Email'));
echo $this->Form->input('pwd', array('class' => 'form-control', 'label' => false, 'placeholder' => 'Password'));
echo $this->Form->input('pwd_repeat', array('class' => 'form-control', 'label' => false, 'placeholder' => 'Password'));
echo $this->Form->submit('Register', array('class' => 'btn btn-large btn-primary'));
echo $this->Form->end();
I'd also suggest you read the docs for HtmlHelper, they can help a lot.
You want to when click button login that will submit to action login and click button register it's submit to action users/add ?
if so that you can use javascript or jQuery
$(function () {
// when click button login
$('#btn-login').on('click', function () {
// #form: id of form, you should named it
$('#form').atrr('action', 'login');
});
// when click button register
$('#btn-register').on('click', function () {
$('#form').atrr('action', 'register');
});
$('#form').submit();
});
And if you want to click button register it's will redirect to view add.ctp
So that you can use HtmlHelper
echo $this->Html->link('Register', array('action' => 'add'), array('class' => 'btn-register', 'id' => 'btn-register', 'escape' => false));
and then you define css for btn-register
.btn-register {
display: inline-block;
padding: 6px 12px;
margin-bottom: 0;
font-size: 14px;
font-weight: normal;
line-height: 1.42857143;
text-align: center;
white-space: nowrap;
vertical-align: middle;
cursor: pointer;
background-image: none;
border: 1px solid transparent;
border-radius: 4px;
color: #333;
background-color: #fff;
border-color: #ccc;
}

Yii - form with CMultiFileUpload won't submit files

I need some help with a little strange problem.
My problem is that submit button does not submit files to controller when using CMultiFileUpload.
I have this very simple view to upload multiple files:
<?php
$form = $this->beginWidget(
'CActiveForm',
array(
'id' => 'upload-form',
'htmlOptions'=>array('enctype' => 'multipart/form-data'),
));?>
<div class="row">
<?php echo $form->labelEx($model,'sourceCode'); ?>
<?php
$this->widget('CMultiFileUpload', array(
'model'=>$model,
'name' => 'sourceCode',
'attribute'=> 'sourceCode',
'max'=>5,
'accept' =>'zip',
'duplicate' => 'Duplicate file!',
'denied' => 'Invalid file type',));
echo $form->error($model,'sourceCode');?>
</div>
<div class="row buttons">
<?php echo CHtml::submitButton('Submit'); ?>
</div>
<?php $this->endWidget();?>
Here is my model:
class UploadSolutionForm extends CFormModel
{
public $sourceCode;
public function rules()
{
return array(
array('sourceCode', 'file', 'types'=>'zip', 'allowEmpty'=>false, 'wrongType'=>'Only .zip files allowed'),
);
}
public function attributeLabels()
{
return array(
'sourceCode' => 'Uploaded file',
);
}
}
And here is probably the simplest action ever:
public function actionUpload()
{
$model = new UploadSolutionForm();
if(isset($_POST['UploadSolutionForm']))
{
echo 'Got it!';
}
$this->render('solve',array('model'=>$model));
}
But when I click on submit it does not echo anything, but it does with this code (CMultiFileUpload is replaced with fileField):
<?php
$form = $this->beginWidget(
'CActiveForm',
array(
'id' => 'upload-form',
'htmlOptions'=>array('enctype' => 'multipart/form-data'),
));?>
<div class="row">
<?php echo $form->labelEx($model, 'sourceCode');?>
<br><?php echo $form->fileField($model, 'sourceCode');?>
<?php echo $form->error($model, 'sourceCode');?>
</div>
<div class="row buttons">
<?php echo CHtml::submitButton('Submit'); ?>
</div>
<?php
$this->endWidget();?>
Can someone tell me what's wrong?
Thanks in advance...
Try this it works
In your View file specify action attribute in form widget as shown in the below code
<?php
$form = $this->beginWidget(
'CActiveForm',
array(
'id' => 'upload-form',
'action'=>Yii::app()->createAbsoluteUrl('yourcontrollername/actionname'),
'htmlOptions'=>array('enctype' => 'multipart/form-data'),
));?>
<div class="row">
<?php $this->widget('CMultiFileUpload',array(
'name'=>'files',
'accept'=>'jpg|png',
'max'=>3,
'remove'=>Yii::t('ui','Remove'),
//'denied'=>'', message that is displayed when a file type is not allowed
//'duplicate'=>'', message that is displayed when a file appears twice
'htmlOptions'=>array('size'=>25),
)); ?>
</div>
<div class="row buttons">
<?php echo CHtml::submitButton('Submit'); ?>
</div>
<?php $this->endWidget();?>
In yourController actionUplaod as shown below
public function actionUpload(){
echo "hi";
var_dump($_FILES['files']);
}

User login null error

I am using cakephp 2.1 and I used login action in UsersController as follows.
public function login() {
if ($this->request->is('post')) {
if ($this->Auth->login()) {
$this->redirect($this->Auth->redirect());
} else {
$this->Session->setFlash('Invalid email or password, try again', 'default/flash_error');
}
}
}
And the login.ctp code is as follows.
<?php echo $this->Form->create('User', array('class' => 'form')); ?>
<div class="control-group">
<label class="control-label" for="inputEmail">Email</label>
<div class="controls">
<?php echo $this -> Form -> text('email', array('id' => 'inputEmail', 'placeholder' => 'Email')); ?>
<?php echo $this -> Form -> error('email', null, array('wrap' => 'span', 'class' => 'help-block')); ?>
</div>
</div>
<div class="control-group">
<label class="control-label" for="inputPassword">Password</label>
<div class="controls">
<?php echo $this -> Form -> password('password', array('id' => 'inputPassword', 'placeholder' => 'Password')); ?>
<?php echo $this -> Form -> error('password', null, array('wrap' => 'span', 'class' => 'help-block')); ?>
</div>
</div>
<div class="control-group">
<div class="controls">
<label class="checkbox">
<input type="checkbox"/>
Remember me </label>
<?php echo $this->Form->button('Sign in', array('type' => 'submit', 'class' => 'btn')); ?>
</div>
</div>
<?php echo $this->Form->end(); ?>
When the form get submitted with email and password, the user is not able to login so its showing an error 'Invalid email or password, try again'. Even I am passing the $this->request->data['User'] into $this->Auth->login() method and debugged $this->Session->read(Auth.User.id). Its giving me null. Please give me a solution for this.
You can try passing $this->request->data into the $this->Auth->login() method. It's not a great way to do it (see this post: CakePHP Auth Component Not logging in when using $this->Auth->login();), but it works for me. Have you debugged $this->Auth->login()?

Form checkbox and label with CakePHP and Bootstrap

I'm having some issues trying to get checkbox inputs and labels to output the correct HTML using CakePHP and Twitter Bootstrap.
The Bootstrap specific output should be:
<div class="control-group">
<div class="controls">
<label class="checkbox">
<input type="checkbox"> Keep me logged in
</label>
</div>
</div>
However, using the inputDefaults mentioned here (http://stackoverflow.com/a/9496242/1247225), this Cake form input:
echo $form->input('auto_login', array(
'type' => 'checkbox',
'label' => __('Keep me logged in', true)));
Outputs this:
<div class="control-group">
<input type="hidden" name="data[User][auto_login]" id="UserAutoLogin_" value="0" />
<input type="checkbox" name="data[User][auto_login]" class="" value="1" id="UserAutoLogin" />
<div class="controls">
<label for="UserAutoLogin">Keep me logged in</label>
</div>
</div>
Any ideas how to adjust this individual input so it outputs the correct Bootstrap HTML, like above?
The best way to control the form output, or the format of the output, is by passing a 'format' argument. Try playing with this:
'format' => array('before', 'label', 'input', 'between', 'after', 'error')
I don't think it is document, but by reading the code, you can find it in there.
the prettiest way to do it is this:
<?php
echo '<div class="col-lg-2">';
echo $this->Form->input('Content.checkbox', array(
'div' => array(
'class' => 'input-group',
),
'label' => false,
'type' => 'checkbox',
'before' => '<span class="input-group-addon">',
'after' => '</span><span class="input-group-addon"><label for="ContentCheckbox">What does the fox say?</label></span>',
));
echo '</div>';
I using :
<?php
echo $this->Form->input('coupDeCoeur',
array('div' => false,
'label' => false,
'type' => 'checkbox',
'before' => '<label class="checkbox">',
'after' => '<i></i>coupDeCoeur</label>'
));
?>
You need to build the form widget manually for checkboxes instead of using FormHelper::input.
For example:
echo '<div class="control-group">';
echo $this->Form->label('Model.field', null, array('class' => 'control-label'));
echo '<div class="controls">';
echo $this->Form->checkbox('Model.field');
echo '</div>';
echo '</div>';
Try following code:
<div class="control-group">
<div class="controls">
<label class="checkbox">
<?php echo $this->Form->input('auto_login', array('type'=>'checkbox','label' => false, 'div' => false,'class'=>false,'after'=>__('Keep me logged in')));?>
</label>
</div>
</div>
If you're using security component, you may have problems if you create your inputs without FormHelper::input. If that's the case, you should try with this:
echo "
<div class='control-group'>
<div class='controls'>
<label class='checkbox'>";
echo $this->Form->input('Model.field', array('label' => false, 'after' => 'Model.field'))."
</label>
</div>
</div>";
Here is the ready-to-use solution:
App::uses('FormHelper', 'View/Helper');
class InputHelper extends FormHelper {
// var $helpers = array('Form', 'Html');
public function create($model, $options = array()) {
$options['class'] = (isset($options['class']) && $options['class']) ? $options['class'] : 'form-horizontal table';
$options['inputDefaults'] = (isset($options['inputDefaults']) && $options['inputDefaults']) ? $options['inputDefaults'] : array(
'div' => 'control-group',
'label' => array('class' => 'control-label'),
'between' => '<div class="controls">',
'after' => '</div>'
);
return parent::create($model, $options);
}
public function input($fieldName, $options = array()) {
$this->setEntity($fieldName);
$options = $this->_parseOptions($options);
if ($options['type'] == 'checkbox') {
$options['format'] = array('before', 'label', 'between', 'input', 'after', 'error');
}
fdebug($options);
return parent::input($fieldName, $options);
}
}
If you want a "one line" answer i got it:
echo $this->Form->input('Model.Field', array('class'=>'form-inline', 'after'=>'</br>'));
In my case, I used AdminLTE template with Bootstrap 3 and this code was working for me:
<?php
echo $this->Form->input('Model.fieldname', array(
'label' => false,
'type' => 'checkbox',
'before' => '<label>',
'after' => 'Field name label here</label>',
));
?>
Good luck here!!!
Here's a simple solution that works for me:
The CSS (LESS):
input.form-control[type="checkbox"] {
width: auto;
height: auto;
margin-right: 5px;
display: inline;
}
Then use the Form helper:
echo $this->Form->input(
'field_name',
array(
'div' => 'form-group',
'class' => 'form-control',
'type' => 'checkbox',
'label' => array(
'text' => 'Your label',
'class' => 'label-checkbox'
),
'format' => array('input', 'label')
)
);

Resources