Invision Community 4: SEO, prepare for v5 and dormant account notifications Matt November 11, 2024Nov 11
Posted November 5, 20159 yr I'm building an import script for one of my clients. Since it's dealing with thousands of entries, I've set up a multiple redirect using \IPS\Helpers\MultipleRedirect. Everything seems to be working, however: 1. It's really really REALLY slow. Painfully slow. And the script is doing almost nothing. Reads an email address, checks if it exists, otherwise creates a member account. It's not even sending emails (because this is a test run). I'm afraid that when I turn on the email notifications, it will take hours. 2. It's doing a full page refresh instead of that nice progress bar thing that happens when you install an app or a plugin. How do I make it behave like that?
November 6, 20159 yr Management You really want to use the ajax progress bar as it is much faster than the full page refresh. The full page refresh only occurs if the client does not have JS enabled, or there is a JS error on the page.
November 6, 20159 yr 1 hour ago, Matt said: You really want to use the ajax progress bar as it is much faster than the full page refresh. The full page refresh only occurs if the client does not have JS enabled, or there is a JS error on the page. @HeadStand had said that haha 15 hours ago, HeadStand said: . It's doing a full page refresh instead of that nice progress bar thing that happens when you install an app or a plugin. How do I make it behave like that? Edit: *derp* you said why it happens. <3 *removes asshat*
November 6, 20159 yr Author 6 hours ago, Matt said: You really want to use the ajax progress bar as it is much faster than the full page refresh. The full page refresh only occurs if the client does not have JS enabled, or there is a JS error on the page. Yes, that's my question. How do I use that? JS is already enabled, and there is no error.
November 7, 20159 yr How are you initializing the data within the MultipleRedirect? I banged my head against this for a while myself. I needed to pass in starting configuration data to the multiple redirect, but was having a hell of a time. I ended up redirecting to the page containing my MultipleRedirect while setting the "mr" querystring to my starting data. However, if you do this, it will trigger the MultipleRedirect to go into the non ajax mode. Are you doing this also? I finally solved it, but not until at least 45 minutes of WTF.
November 8, 20159 yr Author On 11/6/2015, 4:36:48, Mark said: Is it in the ACP or the front-end or...? ACP. 21 hours ago, Kevin Carwile said: How are you initializing the data within the MultipleRedirect? I banged my head against this for a while myself. I needed to pass in starting configuration data to the multiple redirect, but was having a hell of a time. I ended up redirecting to the page containing my MultipleRedirect while setting the "mr" querystring to my starting data. However, if you do this, it will trigger the MultipleRedirect to go into the non ajax mode. Are you doing this also? I finally solved it, but not until at least 45 minutes of WTF. You kind of lost me, but I THINK I'm doing the same thing as you are? I tried to copy what was done for the plugin installation.
November 8, 20159 yr I was doing something like this initially, which was causing the redirects to happen page by page : protected function startWhatever() { $form = new \IPS\Helpers\Form; $form->add( ... ); if ( $values = $form->values() ) { /* Create a starting multiple redirect configuration from form submission */ $config = array( ... ); /* Pass the configuration straight into the multiple redirect */ \IPS\Output::i()->redirect( \IPS\Http\Url::internal( "...&do=doWhatever" )->setQueryString( 'mr', base64_encode( urlencode( json_encode( $config ) ) ) ) ); } \IPS\Output::i()->output = $form; } protected function doWhatever() { \IPS\Output::i()->output = new \IPS\Helpers\MultipleRedirect ( \IPS\Http\Url::internal( "...&do=doWhatever" ), function( $data ) { /* $data is already initialized */ }, function() {} ); } Instead, I had to do this to get the ajax redirects: protected function startWhatever() { ... create starting configuration from form submission \IPS\Output::i()->redirect( \IPS\Http\Url::internal( "...&do=doWhatever" )->setQueryString( 'config', base64_encode( urlencode( json_encode( $config ) ) ) ) ); } protected function doWhatever() { $config = json_decode( urldecode( base64_decode( \IPS\Request::i()->config ) ), TRUE ); \IPS\Output::i()->output = new \IPS\Helpers\MultipleRedirect( \IPS\Http\Url::internal( "...&do=doWhatever" )->setQueryString( 'config', \IPS\Request::i()->config ), function( $data ) use ( $config ) { /* initialize $data using $config */ }, function() { }, ); }
November 8, 20159 yr Author Interesting. Can config be an empty array or does it have to have actual ccontent?
November 8, 20159 yr It could be empty. But I am using those values to determine what steps I need to take in my multiple redirect. The take away here is that in order for the multiple redirect to work using the ajax mode, the $data needs to start out empty. So if you want to get a starting configuration into your multiple redirect, you have to set it using a different url parameter than "mr".
November 9, 20159 yr Author @Mark, if you could provide any insight, it would be appreciated. I'm stuck with this until I can get this working at a more reasonable pace. Thanks.
November 10, 20159 yr Management We'd need to see your core really. There could be any number of reasons this isn't working but us guessing is attacking the problem from the wrong end.
November 10, 20159 yr Author Here you go. It's a code hook on an existing controller, but I don't think that should make a difference. ImportCustomers.php
November 11, 20159 yr Can you clarify - is it doing it with AJAX, but you seeing a spinning circle (rather than a progress bar) - or is it actually doing full redirects? If it's the former - you need to return the percentage as the 3rd element in the array, for example, change this: return array( array( 'step' => 'customers', 'start' => $start ), \IPS\Member::loggedIn()->language()->addToStack( 'importing_customers' ) ); To this: return array( array( 'step' => 'customers', 'start' => $start ), \IPS\Member::loggedIn()->language()->addToStack( 'importing_customers' ), 100 / count( $lines ) * $start ); And repeat in runPurchaseImport() If it's the latter - I didn't see this, but it's probably an error (if the multiple redirect hits an error, it performs an actual hard refresh with the intention that then it can show the user what the error is). Using the web inspector tools in your browser, monitor what comes back from the AJAX response before it redirects. If you can't figure it out, upload the csv files you're using so I can actually test it exactly as you are.
Archived
This topic is now archived and is closed to further replies.