Send Form data with ajax to cakephp controller

23666The following example shows how to submit a form with AJAX to a Cakephp controller;

Jquery Javascript Funtion;

	/*
	sends the form to the controller, ensure form fields names match up 
	with escpected values.
	*/
	function testajaxaddv3(){		
		jQuery.ajax({
			type:'POST',
			async: true,
			cache: false,
			url: 'http://localhost/mycakeapp/messages/ajaxadd',
			success: function(response) {					
				//success
				console.log(response);                
			},
			error: function(response) {					
				console.log(response);
			},
			data:jQuery('form').serialize()
		});
	}

CakePHP 3 Form:

<?= $this->Form->create(null) ?>
<fieldset>
<legend><?= __('Add Quizzes Answer') ?></legend>
<?php
echo $this->Form->input('message');
?>
</fieldset>

<?= $this->Form->end() ?>
</div>

<?php
echo $this->Form->button('save',['onclick'=>'testajaxaddv3()']);
?>

 

Cakephp3 Ajax data submission example

23666How to create a javascript function to send a AJAX request to your cakePHP controller action;

 

 

function testajaxadd(question_id,answerindex){ 

var mydata=new Object();
mydata.question_id=question_id;
mydata.answerindex=answerindex;

jQuery.ajax({
type:'POST',
async: true,
cache: false,
data: mydata,
url: 'http://localhost/myquiz/questions-answers/ajaxadd',
success: function(response) { 
//success
console.log(response); 
},
error: function(response) { 
console.log(response);
}
});
}

Cakephp controller action;

public function ajaxadd(){

$questionsAnswer = $this->QuestionsAnswers->newEntity(); 
if ($this->request->is('ajax')) {

$questionsAnswer = $this->QuestionsAnswers->patchEntity($questionsAnswer, $this->request->data);

// Added this line which makes the record belong to the logged in user
$questionsAnswer->user_id = $this->Auth->user('id');

if ($this->QuestionsAnswers->save($questionsAnswer)) {

$status['msg']="Saved Record"; 

} else {
$status['msg']="Error Saving Record"; 
}

//return the message to js function
$this->response->body(json_encode($status));
return $this->response; 
}
}

 

Fixing the Add action in your controller to save the user_id

23666One of the key things youll do with cakephp is to ensure that when your saving data that the user logged in owns thats you save their user_id as well.

the simpliest way to do this is with one line of code added to your add action;

Sample Code from a Controller called Joke;

public function add()
{
$joke = $this->Jokes->newEntity();
if ($this->request->is('post')) {

$joke = $this->Jokes->patchEntity($joke, $this->request->data); 

// Added this line, set the userid to the logged in user  $joke->user_id = $this->Auth->user('id');

if ($this->Jokes->save($joke)) {
$this->Flash->success(__('The joke has been saved.'));
return $this->redirect(['action' => 'index']);
} else {
$this->Flash->error(__('The joke could not be saved. Please, try again.'));
}
}
$users = $this->Jokes->Users->find('list', ['limit' => 200]);
$jokescategories = $this->Jokes->Jokescategories->find('list', ['limit' => 200]);
$this->set(compact('joke', 'users', 'jokescategories'));
$this->set('_serialize', ['joke']);
}

 

Creating Plugins

23666Open up your command prompt in your app/bin folder;

enter the command;

//non vendor specified
cake bake plugin ContactManager 

//vendor specified 
cake bake plugin Gmcd/ContactManager

Baking the  controller for your plugin;

//no vendor

cake bake controller --plugin ContactManager Contacts

cake bake controller --plugin Gmcd/ContactManager Contacts

Baking the Model View and Controller:

cake bake all --plugin Gerrymcdonnell/jokes jokes

Read more here:
http://book.cakephp.org/3.0/en/plugins.html#creating-your-own-plugins

Cakephp3 make a field unique

23666To do this, simple open your table model file and add the following;

public function validationDefault(Validator $validator)
{

//the below code makes the field "title" validate as unique
$validator
->requirePresence('title', 'create')
->add('title', 'unique', ['rule' => 'validateUnique', 'provider' => 'table','message'=>'Error: Title already exists.'])
->notEmpty('title');

return $validator;
}

 Manual:
http://book.cakephp.org/3.0/en/core-libraries/validation.html