I seem to have run into an issue in which my controller is not receiving the post data being sent to it via the postLink form helper.
I have multiple controllers, all of which seem to run OK with this action, however, this specific one will not.
I have attempted to debug, and have found that the Delete action does not seem to be receiving any Post data.
View postLink code:
echo $this->Form->postLink(__('Delete'), array('controller' => 'tokens', 'action' => 'delete', $data['token']['id']), null, __('Are you sure you want to delete this data?'));
Controller code:
public function delete($id = null) {
$this->request->allowMethod(['post', 'delete']);
if (!$this->request->is('post')) {
throw new MethodNotAllowedException();
}
$this->Token->id = $id;
if (!$this->Token->exists()) {
throw new NotFoundException(__('Invalid Token'));
}
if ($this->Token->delete()) {
$this->Session->setFlash(__('The token has been deleted.'));
} else {
$this->Session->setFlash(__('The token could not be deleted. Please, try again.'));
}
$this->redirect(array('controller' => 'accounts', 'action' => 'addToken'));
}
I'm really not sure where I'm going wrong or what could be causing it, I've been racking my brain and testing different theories all day but nothing seems to change. All componenets, helpers, etc. are loaded in the same manner the other controllers.
Any help is greatly appreciated!
(CakePHP Version 2.6.2)
EDIT
It looks like there is something going on with a session redirect, in which Cake is redirecting me to /accounts/users/sessionStatus.
I'm have no idea why this is happening.
EDIT
After further digging, I have noticed that when I enter the URl directly into the address bar, everything works as expected, however, clicking the link that was generated by the postLink method prevents the post data from being available.
I'm open to any suggestions/questions/help, this is driving me crazy!
After 8 long hours, I finally determined the cause.
The javascript function handling the form is treating a zero (0) as a null so while the var exists and isset, no value is being passed.
If someone knows/understands more about this, please share!
Related
I have been working the entire day just get this solved.I baked the code for basic crud operations but Whenever an action loads(add,edit,delete) and process it, Then it doesnt redirect back to controller.It just shows a blank page.But the data seems to updating.Also I get the follwing warning in every controller.
Warning (2): preg_match(): Numeric named subpatterns are not allowed [CORE\Cake\Routing\Route\CakeRoute.php, line 191]
Warning (2): preg_match() [function.preg-match]: Numeric named subpatterns are not allowed [CORE\Cake\Routing\Route\CakeRoute.php, line 191]
here is my action for add
public function add() {
if ($this->request->is('post')) {
$this->Doctor->create();
if ($this->Doctor->save($this->request->data)) {
$this->Session->setFlash(__('The doctor has been saved'));
return $this->redirect(array('controller'=>'Doctor','action'=>'index'))
} else {
$this->Session->setFlash(__('The doctor could not be saved. Please, try again.'));
}
}
$patiences = $this->Doctor->Patience->find('list');
$this->set(compact('patiences'));
}
Whenever you will call the add controller function, it will result in displaying the add.ctp file. Maybe you have a blank add.ctp file.
Or to redirect to another controller just use this in your add function -
$this->redirect(array('controller'=>'Doctor','action'=>'index'))
I found it.It was problem with routing config.
This issue is caused because I baked a project previously with admin routing not this one.
Just removed the configuration from core.php code :
Configure::write('Routing.prefixes', array('whateveryoursiteaddress/controller/admin'));
thanks to ndm
I'm new to cake and I'm trying to get the function to redirect after an event has been saved.. it works in other code e.g. users, but not in the events one..
THE FUNCTION DOES SAVE THE EVENT, ITS JUST IT WONT REDIRECT OR USE THE SETFLASH
Here is the code for my event controller add funciton:
public function add() {
if ($this->request->is('post')) {
$this->Event->create();
if ($this->Event->save($this->request->data)) {
$this->Session->setFlash(__('The event has been saved'));
$this->redirect(array('action' => 'eventmanage'));
} else {
$this->Session->setFlash(__('The event could not be saved. Please, contact the administrator.'));
}
}
}
Any help would be great thanks!
The most probable cause is that your application is outputting some data before the redirect headers are sent.
Check if there is a space before your <?php tag, or after the ?> closing tag (you should remove those anyway in php-only files), or if your file contains a utf-8 BOM, etc.
You may be able to check this by inspecting the response inside firebug or Chrome webinspector
I just wanted to add a comment, but couldn't yet.
If you are wondering which is the file that is outputting that data that is preventing the redirect you must be very thorough.
In my case was something as aparently inocent as a comment (html comment) that I put in the MODEL from which view I wanted to redirect (not so obvious to find).
This blank page not redirected could be as simple as a line feed or and space just before the <?php ?> both VERY hard to find, and both would prevent redirection.
If you are having this problem hope my hints help you.
Use this one in before filter function
header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0"); // // HTTP/1.1
header("Pragma: no-cache");
I'm attempting to do this: (pseudo code)
if(USER IS LOGGED IN){
Router::connect('/', array('controller' => 'films', 'action' => 'index'));
} else {
Router::connect('/', array('controller' => 'users', 'action' => 'register'));
}
Which simply redirects them to their 'dashboard' if they are logged in or asks them to register if they aren't signed up!
Is this bad practice to have this IF statement inside the routes.php of CakePHP?
it is likely to create problems because the session usually gets initiated later.
why not switching the action / view inside a so called "OverviewController" like I do?
if (UID) {
$this->_actionOne();
} else {
$this->_actionTwo();
}
which then call their own view:
$this->render('some_view');
Yes, it is. and although #mark pointed reasons from cake's view, the reason is because you are mixing modules functions.
When someone gets to the films/index and you want him to register first, you are redirecting him from the films controller. so, simply add a redirect or, a link for registration.
If you still want it to do it automatically, you probably should create a router_controller (bad idea).
The cake solution is to stay in the films controller, and in the index function..
But, in the view, don't show the default output, but some kind of "register" element..
I'm just getting started with cakePHP, and things aren't going so well so far.
I have a controller that handles confirming user emails. On registration the user is sent an email with a confirmcode in a link. Depending on the confirm code they give, the controller gives different text responses. One of these responses includes a hyperlink in order to log in.
I'm trying to use the Html helper, but although I've loaded it in $helpers at the top of the class, I an only make it work if I then use App::import, and then instantiate it.
It all seems overkill to simply make a hyperlink! How many times do I have to load the same class?
Wherever I look on the web it keeps telling me it's a bad idea to use a helper in a controller, but how else am I supposed to get the link made?
So I have
var $helpers = array('Html');
at the top of the controller, and:
if (isset($this->User->id)) { // Check the user's entered it right
// Do some stuff to remember the user has confirmed
// This is to load the html helper - supposedly bad form, but how else do I make the link?
App::import('Helper', 'Html');
$html = new HtmlHelper();
$this->set('message', __("Your email address has been confirmed.", TRUE)." ".$html->link(__("Please log in", TRUE), array('controller' => "users", 'action' => "login" )));
} else {
$this->set('message', __("Please check your mail for the correct URL to confirm your account", TRUE));
}
in the controller's confirm method and
<div>
<?php echo $message;?>
</div>
in the view to output the resulting message
Surely I'm going wrong somewhere - can anyone explain how?
You're not supposed to use Helpers in the Controller. As #Lincoln pointed out, you should construct the link in the View. You may construct the URL in the Controller, since a URL is basically data, but a link is a very medium-specific (HTML) implementation of a URL.
Either way, you'll need to create a full URL (including host) if you want to send it in an Email. The most universal way is to use Router::url:
$fullUrl = Router::url(array('controller' => ...), true); // 'true' for full URL
Do this in either the Controller or the View. For creating a link, use this in the View:
echo $html->link('Title', $fullUrl);
The idea is that all the data you need to render the page is sent to the view with set, then any conditional logic or formatting is done in the view with helpers, so send whole query results when appropriate (suppose you need to alter a link to include the user's screen name, you'll have it handy).
in controller action
$this->set('user', $this->User);
in view (this is slightly different depending on if your in <= 1.2 or 1.3
if ($user->id) //available because of Controller->set
{
//1.2
$link = $html->link(__("Please log in", TRUE), array('controller' => "users", 'action' => "login" ));
//1.3
$link = $this->Html->link(__("Please log in", TRUE), array('controller' => "users", 'action' => "login" ));
echo __("Your email address has been confirmed.", TRUE)." $link";
}
else
{
$this->set('message', __("Please check your mail for the correct URL to confirm your account", TRUE));
}
What you are trying to do should be done with the SessionComponent. $this->Session->setFlash('your message here');
and in your layout with the session helper put $this->Session->flash();
About your wanting urls in the controller, Router::url is correct as deceze said, but there is no use for it there as you should not be building html in a controller.
what you want to do it use the session::setFlash() method above and then redirect them using
$this->redirect(array('controller' => "users", 'action' => "login" ));
I am a 3+ years old in cakephp and facing a somewhat strange issue
with submitting a form to plugin controller's action (i am using
plugin first time). After trying different known things i am posting
this one.
Going straight into the matter here is the form in my "forum" plugin's search_controller.php's "index" view:
echo $form->create("Search", array('url'=>array('controller' =>
'search', 'action' => 'index','plugin'=>'forum'),
'id'=>'searchFormMain'));
<input type="text" name="data[Search][keyword]" style="width:357px; margin-left:9px;"><p><span id="searchButton"><input
type="image" src="/img/button_search.jpg" style="height:40px;width:
136px;border:0;" class="handcursor"></span></p>
</form>
As i am submitting this form to "index" action of search controller of
forum plugin, the following code does print nothing:
public function index($type='') {
if(!empty($this->data)) {
pr($this->data);
die;
}
}
While if i try the same code within beforeFilter of the same
controller i.e. search_controller.php it works well and prints as
follows:
Array
(
[Search] => Array
(
[keyword] => Hello Forum
)
)
And finally here is the beforeFilter code (of search_controller.php):
public function beforeFilter() {
parent::beforeFilter();
if(!empty($this->data)) {
pr($this->data);
}
}
Fyi, it does not matter if i comment out "parent::beforeFilter();" or
even disable $uses of my controller (if they look doubtful to you)
the result is same i.e. the control is not going in to "index" action
in the case of form submit while is working fine in the case of page
call. The url/action to page is http://localhost.rfdf.org/forum/search/index.
If i call the url directly it loads the form fine but when i submit it, it
never gets into the "index" action of the controller thus no view
rendered.
If i try the same set of code out of "forum" plugin environment i.e. in normal application it works just fine
I have been trying to find a way out of this for last 3+ hours now but
no success. I would appreciate any help in solving this puzzle.
I got it, finally!
It was Securty compontent dropping the request into the blackHole whenever it failed to find a security token with the form data. I learned that "Security" component "interferes" with $form->create() method and places a token as a hidden field with each $form->create() call. On the form submit, just after beforeFilter and right before getting into the controller "action" it checks for this token and simply dies everything on a validation failure. Unfortunately there is no error message or entry to cake log.
In my case i had been creating my own custom tag and not with the help of $form->create method so no token was being generated which lead to all the pain.
I resolved it by placing
$this->Security->validatePost = false;
at the end of beforeFilter.
Thanks everyone!
Have you tried putting an else into that if(!empty($this->data)) and doing a pr() as it could be that your post is not empty.
Either that or the format of your url array is not correct.
From ln759, http://api.cakephp.org/view_source/router/#line-757
$defaults = $params = array('plugin' => null, 'controller' => null, 'action' => 'index');
So I guess you need plugin first?
Are you using ACL or any of the like? In the beforeFilter, do a pr of the request. See which action is being requested to make sure that the request is correct