I have two forms, one to edit room details and the other to edit Extras. Within the forms I pull in a file upload and pass in the id. For some reason one requires a url and the id does not get passed in. Both have the same code. Can see why they are differnt.
Room form
<div class="boxgrid grid_8">
<?php echo $this->element('attachments',array('control'=>'upgrades','id'=>$this->data['AddOn']['id'],'att'=>$this->data['Attachment'])); ?>
</div>
Room upload
Form->create('Room', array('type' => 'file'));?>
<legend><?php __('Upload Room Images'); ?></legend>
<?php
echo $this->Form->input('id');
?>
<input type="hidden" name="data[Attachment][0][model]" value="Room" id="Attachment0Model" />
<input type="hidden" name="data[Attachment][0][group]" value="attachment" id="Attachment0Group" />
<div class="input file required"><input type="file" name="data[Attachment][0][file]" class="" id="Attachment0File" /></div>
<div class="submit"><button>Upload</button></div>
<div>Upload files</div>
Extras Form
<div class="boxgrid grid_8">
<?php echo $this->element('attachments',array('control'=>'upgrades','id'=>$this->data['AddOn']['id'],'att'=>$this->data['Attachment'])); ?>
</div>
Extras Upload
Form->create('Upgrade', array('type' => 'file','url'=>'/admin/upgrades/addfiles','id'=>'AddOnAdminAddfilesForm'));?>
<legend><?php __('Upload Addon Images'); ?></legend>
<?php
echo $this->Form->input('id');
?>
<input type="hidden" name="data[Attachment][0][model]" value="AddOn" id="Attachment0Model" />
<input type="hidden" name="data[Attachment][0][group]" value="attachment" id="Attachment0Group" />
<div class="input file required"><input type="file" name="data[Attachment][0][file]" class="" id="Attachment0File" /></div>
<div class="submit"><button>Upload</button></div>
<div>Upload files</div>
Javascript on each form:
<script type="text/javascript">
$(document).ready(function() {
$("div#uploader").resloader();
$("div#uploader").load('<?=BASE_URL?>/admin/upgrades/addfiles/<?=$this->data['AddOn']['id']?>',null,function(){}).fadeIn();
Upgrades Contoller
function admin_addfiles($id = null) {
$this->layout = null;
if (!$id && empty($this->data)) {
$this->Session->setFlash(__('Invalid Add On', true));
$this->redirect(array('controller' => 'upgrades', 'action' => 'index'));
}
if (!empty($this->data)) {
$this->layout = null;
//if(empty($this->data['AddOn']['id'])){unset($this->data['AddOn']);}
// restructure data for uploader plugin // NEED TO GET RID OF THIS ? MOVE IT
$tmp_file = $this->data['Attachment'][0]['file'];
$tmp_file['extension'] = array_reverse(explode('.', $tmp_file['name']));
$tmp_file['extension'] = $tmp_file['extension'][0];
$tmp_file['title'] = strtolower(substr($tmp_file['name'],0,(0-strlen('.'.$tmp_file['extension']))));
$this->data['Attachment'][0]['alternative'] = ucwords(str_replace('_',' ', $tmp_file['title']));
if ($this->AddOn->saveAll($this->data, array('validate' => 'first'))) {
$id = $this->AddOn->Attachment->getLastInsertID();
$att = $this->AddOn->Attachment->query("SELECT * from attachments WHERE id = ".$id);
$this->set('attachment',$att[0]['attachments']);
} else {
$tmp_file['name'] = 'INVALID FILE TYPE';
}
//debug($this->data);
$this->set('file', $tmp_file);
$this->RequestHandler->renderAs($this, 'ajax');
$this->render('../elements/ajax');
}
if (empty($this->data)) {
$this->data = $this->AddOn->read(null, $id);
}
}
}
Your problem is with the $this->data. Check how it is filled in your controller.
Both views are NOT the same, the main difference is in the create form.
Form->create('Room', array('type' => 'file'));?>
Form->create('Upgrade', array('type' => 'file','url'=>'/admin/upgrades/addfiles','id'=>'AddOnAdminAddfilesForm'));?>
As you can see, one has the first parameter 'Room' and the other one is 'Upgrade', this IS important since you call the id like this
echo $this->Form->input('id');
Cake expects that for the first case you have something like, $this->data['Room']['id'] and the second one $this->data['Upgrade']['id']
If you pass from the controller your id variable like this
$this->set('id',$id);
then in the view you can do somthing like this
<?php
echo $this->Form->input('id', array('value'=>$id, 'type'=>'hidden'));
?>
Hope this solves your answer, if not, please post the $this->data value of each and the part of the controller where you assign $this->data
Related
I'm new to cakephp 2x. I have multiple drop down in my form. All the drop downs are using same list data, from one table called -> Students. Now what I want is ,when the user select first student in first drop down ,then that student should be minus from the next four drop down or disabled in next four drop downs.So that the user wouldn't be able to add the same student repeately. Plz Help! Thanks! in advance.
//Here is my controller add file:
public function add(){
if ($this->request->is('post')) {
$this->Group->create()
if ($this->Group->save($this->request->data)) {
$this->Session->setFlash(__('The group has been saved.'));
return $this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash(__('The group could not be saved. Please, try again.'));
}
}
$this->loadModel('Student');
$student1s = $this->Student->find('list');
//pr ($student1s);
$this->set(compact('student1s'));
}
// Here is my add.ctp
< div class="Groups form">
<div class="row">
<div class="col-md-12">
<div class="page-header">
<h1><?php echo __('Add Students'); ?></h1>
</div>
</div>
</div>
<div class="row">
<?php echo $this->Form->create('Groups', array('role' => 'form')); ?>
<div class="col-md-5 col-md-offset-3">
<div class="form-group">
<?php echo $this->Form->input('0.name', array('type'=>'select','options'=>$student1s,'empty' => 'Please choose a student','class'=>'form-control'));?>
</div>
<div class="form-group" >
<?php echo $this->Form->input('1.name', array('type'=>'select',"options"=>$student1s,'empty' => 'Please choose a student','class'=>'form-control',));?>
</div>
<div class="form-group">
<?php echo $this->Form->input('2.name', array('type'=>'select',"options"=>$student1s,'empty' => 'Please choose a student','class'=>'form-control'));?>
</div>
<div class="form-group">
<?php echo $this->Form->input('3.name', array('type'=>'select',"options"=>$student1s,'empty' => 'Please choose a student','class'=>'form-control'));?>
</div>
<div class="form-group">
<?php echo $this->Form->input('4.name', array('type'=>'select',"options"=>$student1s,'empty' => 'Please choose a student','class'=>'form-control'));?>
</div>
<div class="form-group">
<?php echo $this->Form->submit(__('Submit'), array('class' => 'btn btn-primary')); ?>
</div>
<?php echo $this->Form->end() ?>
</div><!-- end col md 12 -->
</div><!-- end row -->
</div>
find solution for my problem to avoid duplication of data,This link helps -> Validating multiple fields with the same name. All i have to do is put this code ->array('validate' => 'true')<- in this line
if ($this->Group->save($this->request->data),array('validate' => 'true')) {
and all done no need to disable the selected list value.
This is my AdminsController class where I have included the Cookie Component, and used the cookie creation code given below in #1. #2 is the code I am using in my view.
Whenever I fire the url, it is showing the error: "Helper class CookieHelper could not be found.".
Why is this error is showing, as I have asked to use CookieComponent to set and get the value of the cookie. I have followed instructions and code syntax from the CakePHP docs that they have provided on their website. I'm really having trouble on setting and getting the cookie. I need help on this. The CakePHP version that i'm using is 2.6.
#1 - Controller:
class AdminsController extends AppController {
/**
* This controller does not use a model
*
* #var array
*/
//public $uses = array('Admin');
/**
* Displays a view
*
* #return void
* #throws NotFoundException When the view file could not be found
* or MissingViewException in debug mode.
*/
public $components = array('Cookie');
public function index() {
$this->layout=false;
//echo "=users index====";
//$this->layout = 'adminlayout';
if($this->request->is('post'))
{
$username = $this->request->data['Admin']['username'];
$password = $this->request->data['Admin']['password'];
$remember_me = $this->request->data['Admin']['remember_me'];
$sql = $this->Admin->find('count',array(
'conditions' => array('Admin.username'=>$username,'Admin.password'=>md5($password))
));
//$this->Session->write('is_admin_login','Y');
if($sql>0)
{
$this->Session->write('is_admin_login','Y');
if(!empty($remember_me))
{
//*** set cookie starts
if($this->Cookie->check('username_cookie'))
{
$this->Cookie->delete('username_cookie');
$this->Cookie->write('username_cookie', $username, false, '30 Days');
}
if($this->Cookie->check('password_cookie'))
{
$this->Cookie->delete('password_cookie');
$this->Cookie->write('password_cookie', $password, false, '30 Days');
}
//*** set cookie ends
}
else
{
if($this->Cookie->check('username_cookie'))
{
$this->Cookie->delete('username_cookie');
}
if($this->Cookie->check('password_cookie'))
{
$this->Cookie->delete('password_cookie');
}
}
$this->redirect('/admin/home');
}
else
{
$this->Session->setFlash('Invalid username or password','default',array('class'=>'error_msg'));
}
}
$this->render('admin_login');
}
}
#2 - AdminLogin View
<div class="form-box" id="login-box">
<div class="header">Sign In</div>
<?php echo $this->Form->create(null, array(
'url' => array('controller' => 'Admins', 'action' => 'index')
)); ?>
<div class="body bg-gray">
<div class="row">
<div class="col-md-12 col-lg-12 col-sm-12 col-xs-12">
<?php echo $this->Session->flash(); ?>
</div>
</div>
<div class="form-group">
<?php /*?> <input type="text" name="user_name" id="user_name" class="form-control" placeholder="User ID" value="<?php // echo get_cookie("username_cookie"); ?>"/><?php */?>
<?php
$options=array();
$options['id']='username';
$options['class']='form-control';
$options['placeholder']='User ID';
$options['label']=false;
if($this->Cookie->check('username_cookie'))
{
$options['value']=$this->Cookie->read('username_cookie');
}
echo $this->Form->input('username',$options);
?>
</div>
<div class="form-group">
<?php /*?><input type="password" name="password" id="password" class="form-control" placeholder="Password" value="<?php // echo get_cookie("password_cookie"); ?>"/><?php */?>
<?php
$options=array();
$options['id']='password';
$options['class']='form-control';
$options['placeholder']='Password';
$options['label']=false;
if($this->Cookie->check('password_cookie'))
{
$options['value']=$this->Cookie->read('password_cookie');
}
echo $this->Form->input('password',$options);
?>
</div>
<div class="form-group">
<?php
$options=array();
$options['id']='remember_me';
//$options['class']='form-control';
$options['type']='checkbox';
$options['label']=false;
$options['div']=false;
$checked="";
if($this->Cookie->check('username_cookie') || $this->Cookie->check('password_cookie'))
{
$options['checked']="checked";
}
echo $this->Form->input('remember_me', $options);
?> Remember me
</div>
</div>
<div class="footer">
<button type="submit" class="btn bg-olive btn-block">Sign me in</button>
<p>Forgot my password</p>
</div>
<?php
echo $this->Form->end();
?>
<div class="margin text-center">
<!-- <span>Sign in using social networks</span>-->
<br/>
</div>
You are trying to use a Component in a view, which is why it is telling you there is no helper class called Cookie.
Use the Cookie component in your Controller action to set a variable, and then use the variable in your view:
Remove these lines from your view:
$this->Cookie->check('username_cookie')
$this->Cookie->check('password_cookie')
Use them in your controller action to set view variables ...something similar to:
$this->set('username_cookie', $this->Cookie->read('username_cookie'));
$this->set('password_cookie', $this->Cookie->read('password_cookie'));
Then you will be able to use the set variables in your view:
if(!empty($username_cookie)) {
//do something
}
//or
if(!empty($password_cookie)) {
//do something
}
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']);
}
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()?
I am having problems with updating records using cakephp, this is the second time it happens and cant figure out what it is.. When I click on 'Submit' to update a record it always, always sends me to the login and it either logs me in or logs me out.. I dont understand..and it never updates the record it just jumps to the login stuff...the registration page same thing.. it was working before.. the only thing i changed.. was in app_controller instead of specifying the controls to allow I just added the '*' for all and now its not allowing to update or save anything.. the reason why i did that was because other pages that are under pages/contact_us or pages/about_us they were also being blocked by the Auth but with the '*' it went away..
In my App_Controller I have set it up to allow everything in the before filter, also in the controller itself i have a beforeFilter again saying the same thing.. I have tried about everything.. Here is my code
App_Controller
<?php
class AppController extends Controller {
var $helpers = array('Html', 'Form', 'Javascript', 'Session');
var $components = array('Auth', 'Session');
function beforeFilter() {
$this->Auth->allowedActions = array('*');
$this->Auth->autoRedirect = false;
}
}
?>
one of my controllers where I update
<?php
class DishRatingsController extends AppController {
function list_ratings() {
$this->loadModel('Dish');
$this->set('list_ratings', $this->Dish->find('all'));
$this->layout = 'master_layout';
}
function rate_dish($id = null)
{
$this->layout = 'master_layout';
$this->set('rate_dishes', $this->DishRating->find('all', array(
'conditions' => array(
'Dish.id' => $id
)
)));
if(!empty($this->data)) {
if($this->DishRating->save($this->data)) {
$this->Session->setFlash("Rating Saved!");
$this->redirect(array('action' => 'dish_ratings'));
}
// set master layout
}
}
function beforeFilter() {
parent::beforeFilter();
$this->Auth->allowedActions = array('*');
}
}
and My view where the submit button is
<?php
echo $this->Form->create('DishRating', array('action' => 'rate_dish'));
echo '<div><h3>Rate this Dish...</h3><p>You can rate this dish on this page and view other ratings from out customers... </p></div>
<table id="recipes">
<tr>
<td style="padding:10px;">';
//<input type="hidden" name="userID" value="'.$rate_dishes[0]["DishRating"]["user_id"].'">
echo $this->Form->hidden('id', array('value'=> $rate_dishes[0]["DishRating"]["user_id"]));
//<input type="hidden" name="dish_id" value="'.$dish_rateid.'">
echo $this->Form->hidden('rate_id', array('value'=> $rate_dishes[0]["DishRating"]["dish_id"]));
echo '
<span style="font-size: 20px; vertical-align:top;">Comments</span>
</td>
<td style="padding:10px;">';
echo $this->Form->input('comments', array('type' => 'textarea', 'escape' => false , 'rows'=>'2','cols'=>'40', 'div' =>'false', 'label'=>''));
//<textarea name="comments" cols="40" rows="2"></textarea>
echo '</td>
<td>
<div>
<input name="star1000" value "1" type="radio" class="star"/>
<input name="star1000" value="2" type="radio" class="star"/>
<input name="star1000" value="3" type="radio" class="star"/>
<input name="star1000" value="4" type="radio" class="star"/>
<input name="star1000" value="5" type="radio" class="star"/>
</div>
</td>
<td>';
// <input type="submit" value="Submit" name="submitrating" class="button"/>
echo $this->Form->end(array('value'=>'Submit','name'=>'submitrating', 'type' =>'submit', 'class'=>'button'));
echo '</td>
<tr>
</table>';
print("<table id='results'><tr><th>User Name</th><th>Comments</th><th>Star Rating</th></tr>");
$j = 0;
foreach ($rate_dishes as $key => $rate_dish):
print("<tr>");
print("<td width='20px'>");
print("<p style='font-size:14px; color:blue; padding:0;'>".$rate_dishes[$j]['User']['username']."</p>");
print("</td>");
print("<td width='100px'>");
print("<p style='font-size:14px; color:blue; padding:0;'>".$rate_dishes[$j]['DishRating']['rate_comments']."</p>");
print("</td>");
print("<td width='100px'>");
print("<div>");
for($i = 1; $i < 6;$i++)
{
if($i != $rate_dishes[$j]['DishRating']['rate_num'])
{
echo '<input name="star'.$j.'" type="radio" class="star" disabled="disabled"/>';
}
else
{
echo '<input name="star'.$j.'" type="radio" class="star" disabled="disabled" checked="checked"/>';
}
}
print("</div>");
print("</td>");
print("</tr>");
$j++;
endforeach;
print("</table>");
if($j> 6)
{
echo '<div id="pageNavPosition"></div>
<div> </div>';
echo $this->Html->script('padminbottom.js');
}
?>
Please help solve this issue, I have researched, went to the cakePHP cookbook, nothing...
if you want to allow every action of every controller your beforeFilter in app_controller should be like
function beforeFilter() {
$this->Auth->allow('*');
$this->Auth->autoRedirect = false;
}
specifying $this->allowedActions is a different thing and in that case your Auth's authorize variable should be set to 'controller'. That means whenever a user requests an action he/she will be checked for their correct username, password. After that user will be checked by the isAuthorize() function implemented by every controller to grant access based on some additional logic.
Since you are not using that feature you don't need to specify allowedAction. If you are using controller for authorization specifying allowedActions will allow certain actions by default without checking them in Controller::isAuthorize().