I use Digg-style Django-endless-pagination with activated ajax support for my project. The annoying thing that it hides parameter ?page=N from URI.
So if I, for example, go back from details page to the general list page it returns me to the first page instead of actual page=N where it comes from.
In case of AJAX deactivation it works as expected and passes "page" parameter to GET. But it disappears right after AJAX activation.
I've changed the string #103 at endless-pagination.js from
return false;
to
return true;
Page parameter is passed to URL properly, but it seems at the same time AJAX stopped working forced to reload the whole page when switching between pages.
Just added the following string to endless-pagination.js before string #103 return false;
window.history.pushState(3, document.title, context.url);
Now it works as expected.
Related
For example, when i'm fill the form that i want to submit, and then i want to go back to previous page. This is the code that i'm using to get previous page
$this->agent->referrer()
How exactly i get back to second page before since when i'm using the code above, i get back to the form that i have already submit.
I have tried another way like $_SERVER['HTTP_REFERER'] but i'm still get back to the form page.
Here is the code that I'm currently using :
$this->Model->updateDataProducts($id, $data);
$redirect = ($this->agent->referrer());
redirect($redirect);
Any solutions?
Set the redirection url in the controller :
In your redirect call, the second parameter is the "method" of redirection, so that's why your redirect is not working. what you want is something like this:
$this->Model->updateDataProducts($id, $data);
redirect('search/my+search+term'); // if you need redirect any methods
That's why we do the string concatenation, instead of passing the search term to the second parameter
I have an HTML region in the page, where I have few fields and button. Button is set to Submit page action.
On the same page I have Validation process, with Function returning Error text type.
This is the Validation expression 1:
if :P5_CELL_LEFT + :P5_CELL_RIGHT = 10 then
return 'Stop it!';
else
return null;
end if;
Validation expression 2 is empty. Now when there is no error and function doesn't return null, then the page URL stays intact (https://domain.com/f?p=333:5:0::NO:::). However, when validation is not passing, then I see the error message on top of page, but the current page url is changing to https://domain.com/wwv_flow.accept. How to prevent current page URL from changing, even if validation is not passed?
What is it that you're really trying to accomplish? Once you submit the page wwv_flow.accept is the standard APEX behavior. In addition to the APEX validation, you could use some JS for your validation and stop page submission. That would maintain the URL intact.
I have a modal view (the one from bootstrap) in the front end.
Upon clicking the submit button the user will be going to a function in controller:
Route::post('post_question', array('uses' => 'QuestionController#postQuestion'));
And at the end of the postQuestion i want to redirect to another page.
I tried:
return Redirect::to('mywebsite/question/1');
return Response::make( '', 302 )->header( 'Location', 'mywebsite/question/1' );
return Redirect::route('question/'.$question_id)->with("question",Question::find($question_id));
header("Location: mywebsite/question/$question_id");
none seem to work though.
The thing is, i can see the request in XHR but just that the page is not redirected.
Is the modal somehow blocking the behavior?
You can redirect with an AJAX request. However, you will find that the results will not be quite what you expected.
On a redirect, Laravel will should set your response code header as a redirect response and then the content of the redirected page would be sent.
You could do one of two things depending on how you wanted to handle things.
Send a JSON response back to the submitted form with a meta data parameter and then use this meta data in your success function to set window.location.
Your Laravel controller responding to the post would look a bit like this:
public function postQuestion()
{
// DO stuff to set your $question
return [
'question' => $question,
'meta' => [
'redirect_url' => url('mywebsite/question/'.$question->id),
'status' => '400',
// Any other meta data you may want to send
],
];
}
Then assuming you are doing some jQuery AJAX call, change your success callback (I'm calling it questionSubmitSuccess here):
questionSubmitSuccess = function (data) {
// Anything you may want to do before redirecting the user
if (data.meta.redirect_url) {
// This redirects the page
window.location = data.meta.redirect_url;
}
}
Continue redirecting from your controller and then do something a bit more similar to rails turbo links and replace the entire page with Javascript:
You can do this a few ways: using [Modify the URL without reloading the page browser History API), or using jQuery.load to submit your form.
The browser history API might work a bit easier as it would still allow you to handle response errors, but it only works in more modern browsers.
jQuery.load would likely require rewriting a bit of your AJAX submitting code and is harder to handle things like errors (it will replace your page content no matter the status code from what I can tell), but it has better browser support.
IMO, the first approach is a bit more maningful as the API endpoint is usable by something other than this single implementation.
Also, there are fewer points of failure and error states to manage compared to trying to replace your entire DOM without a page reload.
U can put button inside form and when u submit that button pass data from page to controller and from controller call the another page with that data
like return View::make('users.index,compact('data'));
I am using HtmlUnit to navigate through the Web of knowledge web page. I am using the code below to set an option button so that results on the page would be sorted appropriately. Unfortunately, nothing happens when I execute the code. Results on the page remains sorted in the same way as they ware before.
HtmlSelect ssort = (HtmlSelect) pageX.getFirstByXPath("//*[#id=\'topNavBar\']/tbody/tr/td[3]/form/select");
HtmlOption optionA = ssort.getOptionByValue("LC.D;PY.D;AU.A;SO.A;VL.D;PG.A");
ssort.setSelectedAttribute(optionA, true);
ssort.click();
I debuged the code and there is no errors. Do you have any idea what am I doing wrong?
As a general rule, functions like the .click() and .setSelectedAttribute(HTMLOption, boolean)(See JavaDoc) will return a HTMLPage that in most cases is the same as the current one, however in your case it will return a different HTMLPage. So to capture the new page you just need to assign the return value to a HTMLPage.
N.B: You could also use getCurrentWindow() on the WebClient instance.
I'm confused as to how to accomplish this. I have a page which, has a popup filter, which has some input elements and an "Apply" button (not a submit). When the button is clicked, two jquery .get() calls are made, which load a graph, a DataTables grid, photos, and miscellaneous info into four separate tabs. Inside the graph, if one clicks on a particular element, the user is taken to another page where the data is drilled down to a finer level. All this works well.
The problem is if the user decides to go back to the original page, but with the ajax generated graph/grid/photos etc. Originally I thought that I would store a session variable with the filter variables used to form the original query, and on returning to the page, if the session var was found, the original ajax call would be made again, re-populating the tabs.
The problem that I find with this method is that Coldfusion doesn't recognize that the session variable has been set when returning to the page using the browser's back button. If I dump out the session var at both the original and the second page, I can see the newly set var at the second page, and I can see it if I go to the original page through the navigation menu, but NOT if I use the back button.
SO.... from reading posts on here about ajax browser history plugins, it seems that there are various jquery plugins which help with this, including BBQ. The problem that I see with this approach is that it requires the use of anchor elements to trigger it, and then modifies the query string using the anchors' href attributes. I suppose that I could modify the page to include a hidden anchor.
My question, at long last is: is an ajax history plugin like BBQ the best way to accomplish this, or is there a way to make Coldfusion see the newly created session var when returning to the page via the back button? Or, should I consider re-architecting the page so that the ajax calls are replaced by a form submission back to the page instead?
Thanks in advance, as always.
EDIT: some code to help clarify things:
Here's the button that makes the original ajax calls:
<button id="applyFilter">APPLY</button>
and part of the js called on #applyFilter, wrapped in $(document).ready():
$('#applyFilter').click(function(){
// fill in the Photos tab
$.get('tracking/listPhotos.cfm',
{
id: id,
randParam: Math.random()
},
function(response){
$('#tabs-photos').html(response);
}
);
});
Finally, when the user calls the drill-down on the ajax generated graph, it uses the MaintAction form which has been populated with the needed variables:
function DrillDown() {
//get the necessary variables and populate the form inputs
document.MaintAction.action = "index.cfm?file=somepage.cfm&Config=someConfig";
document.MaintAction.submit();
}
and that takes us to the new page, from which we'd like to return to the first page but with the ajax-loaded photos.
The best bet is to use the BBQ method. For this, you don't have to actually include the anchor tags in your page; in fact, doing so would cause problems. This page: http://ajaxpatterns.org/Unique_URLs explains how the underlying process works. I'm sure a jQuery plugin would make the actual implementation much easier.
Regarding your other question, about how this could be done with session variables - I've actually done something similar to that, prior to learning about the BBQ method. This was specifically to save the state of a jqGrid component, but it could be easily changed to support any particular Ajax state. Basically, what I did was keep a session variable around for each instance of each component that stored the last parameters passed to the server via AJAX requests. Then, on the client side, the first thing I did was run a synchronous XHR request back to the server to fetch the state from that session variable. Using the callback method for that synchronous request, I then set up the components on my page using those saved parameters. This worked for me, but if I had to do it again I would definitely go with the BBQ method because it is much simpler to deal with and also allows more than one level of history.
Some example code based on your update:
$('#applyFilter').click(function(){
var id = $("#filterid").val(); // assumes the below id value is stored in some input on the page with the id "filterid"
// fill in the Photos tab
$.get('tracking/listPhotos.cfm',
{
id: id // I'm assuming this is what you need to remember when the page is returned to via a back-button...
//randParam: Math.random() - I assume this is to prevent caching? See below
},
function(response){
$('#tabs-photos').html(response);
}
);
});
/* fixes stupid caching behavior, primarily in IE */
$.ajaxSetup({ cache: false });
$.ajax({
async: false,
url: 'tracking/listPhotosSessionKeeper.cfm',
success: function (data, textStatus, XMLHttpRequest)
{
if (data.length)
{
$("#filterid").val(data);
$('#applyFilter').trigger('click');
}
}
});
This is what you need on the client-side to fetch the state of the photo list. On the server side, you'll need to add this modification to tracking/listPhotos.cfm:
<cfset session.lastUsedPhotoFilterID = URL.id>
And add this new one-line file, tracking/listPhotosSessionKeeper.cfm:
<cfif IsDefined("session.lastUsedPhotoFilterID")><cfoutput>#session.lastUsedPhotoFilterID#</cfoutput></cfif>
Together these changes will keep track of the last ID used by the user, and will load it up each time the page is rendered (whether via a back button, or simply by the user revisiting the page).