Passed
Push — master ( 0f1828...ed6c8e )
by Aimeos
04:20
created

Standard::init()   A

Complexity

Conditions 5
Paths 5

Size

Total Lines 29
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 5
eloc 17
nc 5
nop 0
dl 0
loc 29
rs 9.3888
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * @license LGPLv3, http://opensource.org/licenses/LGPL-3.0
5
 * @copyright Metaways Infosystems GmbH, 2013
6
 * @copyright Aimeos (aimeos.org), 2015-2021
7
 * @package Client
8
 * @subpackage Html
9
 */
10
11
12
namespace Aimeos\Client\Html\Checkout\Standard;
13
14
15
/**
16
 * Default implementation of standard checkout HTML client.
17
 *
18
 * @package Client
19
 * @subpackage Html
20
 */
21
class Standard
22
	extends \Aimeos\Client\Html\Common\Client\Factory\Base
23
	implements \Aimeos\Client\Html\Common\Client\Factory\Iface
24
{
25
	/** client/html/checkout/subparts
26
	 * List of HTML sub-clients rendered within the checkout standard section
27
	 *
28
	 * The output of the frontend is composed of the code generated by the HTML
29
	 * clients. Each HTML client can consist of serveral (or none) sub-clients
30
	 * that are responsible for rendering certain sub-parts of the output. The
31
	 * sub-clients can contain HTML clients themselves and therefore a
32
	 * hierarchical tree of HTML clients is composed. Each HTML client creates
33
	 * the output that is placed inside the container of its parent.
34
	 *
35
	 * At first, always the HTML code generated by the parent is printed, then
36
	 * the HTML code of its sub-clients. The order of the HTML sub-clients
37
	 * determines the order of the output of these sub-clients inside the parent
38
	 * container. If the configured list of clients is
39
	 *
40
	 *  array( "subclient1", "subclient2" )
41
	 *
42
	 * you can easily change the order of the output by reordering the subparts:
43
	 *
44
	 *  client/html/<clients>/subparts = array( "subclient1", "subclient2" )
45
	 *
46
	 * You can also remove one or more parts if they shouldn't be rendered:
47
	 *
48
	 *  client/html/<clients>/subparts = array( "subclient1" )
49
	 *
50
	 * As the clients only generates structural HTML, the layout defined via CSS
51
	 * should support adding, removing or reordering content by a fluid like
52
	 * design.
53
	 *
54
	 * @param array List of sub-client names
55
	 * @since 2014.03
56
	 * @category Developer
57
	 */
58
	private $subPartPath = 'client/html/checkout/subparts';
59
60
	/** client/html/checkout/standard/address/name
61
	 * Name of the address part used by the checkout standard client implementation
62
	 *
63
	 * Use "Myname" if your class is named "\Aimeos\Client\Html\Checkout\Standard\Address\Myname".
64
	 * The name is case-sensitive and you should avoid camel case names like "MyName".
65
	 *
66
	 * @param string Last part of the client class name
67
	 * @since 2014.03
68
	 * @category Developer
69
	 */
70
71
	/** client/html/checkout/standard/delivery/name
72
	 * Name of the delivery part used by the checkout standard client implementation
73
	 *
74
	 * Use "Myname" if your class is named "\Aimeos\Client\Html\Checkout\Standard\Delivery\Myname".
75
	 * The name is case-sensitive and you should avoid camel case names like "MyName".
76
	 *
77
	 * @param string Last part of the client class name
78
	 * @since 2014.03
79
	 * @category Developer
80
	 */
81
82
	/** client/html/checkout/standard/payment/name
83
	 * Name of the payment part used by the checkout standard client implementation
84
	 *
85
	 * Use "Myname" if your class is named "\Aimeos\Client\Html\Checkout\Standard\Payment\Myname".
86
	 * The name is case-sensitive and you should avoid camel case names like "MyName".
87
	 *
88
	 * @param string Last part of the client class name
89
	 * @since 2014.03
90
	 * @category Developer
91
	 */
92
93
	/** client/html/checkout/standard/summary/name
94
	 * Name of the summary part used by the checkout standard client implementation
95
	 *
96
	 * Use "Myname" if your class is named "\Aimeos\Client\Html\Checkout\Standard\Summary\Myname".
97
	 * The name is case-sensitive and you should avoid camel case names like "MyName".
98
	 *
99
	 * @param string Last part of the client class name
100
	 * @since 2014.03
101
	 * @category Developer
102
	 */
103
104
	/** client/html/checkout/standard/process/name
105
	 * Name of the process part used by the checkout standard client implementation
106
	 *
107
	 * Use "Myname" if your class is named "\Aimeos\Client\Html\Checkout\Standard\Process\Myname".
108
	 * The name is case-sensitive and you should avoid camel case names like "MyName".
109
	 *
110
	 * @param string Last part of the client class name
111
	 * @since 2015.07
112
	 * @category Developer
113
	 */
114
	private $subPartNames = array( 'address', 'delivery', 'payment', 'summary', 'process' );
115
	private $view;
116
117
118
	/**
119
	 * Returns the HTML code for insertion into the body.
120
	 *
121
	 * @param string $uid Unique identifier for the output if the content is placed more than once on the same page
122
	 * @return string HTML code
123
	 */
124
	public function body( string $uid = '' ) : string
125
	{
126
		$context = $this->getContext();
127
		$view = $this->getView();
128
129
		try
130
		{
131
			$view = $this->view = $this->view ?? $this->getObject()->data( $view );
132
133
			$html = '';
134
			foreach( $this->getSubClients() as $subclient ) {
135
				$html .= $subclient->setView( $view )->body( $uid );
136
			}
137
			$view->standardBody = $html;
138
		}
139
		catch( \Aimeos\Client\Html\Exception $e )
140
		{
141
			$error = array( $context->translate( 'client', $e->getMessage() ) );
142
			$view->standardErrorList = array_merge( $view->get( 'standardErrorList', [] ), $error );
143
		}
144
		catch( \Aimeos\Controller\Frontend\Exception $e )
145
		{
146
			$error = array( $context->translate( 'controller/frontend', $e->getMessage() ) );
147
			$view->standardErrorList = array_merge( $view->get( 'standardErrorList', [] ), $error );
148
		}
149
		catch( \Aimeos\MShop\Exception $e )
150
		{
151
			$error = array( $context->translate( 'mshop', $e->getMessage() ) );
152
			$view->standardErrorList = array_merge( $view->get( 'standardErrorList', [] ), $error );
153
		}
154
		catch( \Exception $e )
155
		{
156
			$error = array( $context->translate( 'client', 'A non-recoverable error occured' ) );
157
			$view->standardErrorList = array_merge( $view->get( 'standardErrorList', [] ), $error );
158
			$this->logException( $e );
159
		}
160
161
		/** client/html/checkout/template-body
162
		 * Relative path to the HTML body template of the checkout standard client.
163
		 *
164
		 * The template file contains the HTML code and processing instructions
165
		 * to generate the result shown in the body of the frontend. The
166
		 * configuration string is the path to the template file relative
167
		 * to the templates directory (usually in client/html/templates).
168
		 *
169
		 * You can overwrite the template file configuration in extensions and
170
		 * provide alternative templates. These alternative templates should be
171
		 * named like the default one but with the string "standard" replaced by
172
		 * an unique name. You may use the name of your project for this. If
173
		 * you've implemented an alternative client class as well, "standard"
174
		 * should be replaced by the name of the new class.
175
		 *
176
		 * @param string Relative path to the template creating code for the HTML page body
177
		 * @since 2014.03
178
		 * @category Developer
179
		 * @see client/html/checkout/template-header
180
		 */
181
		$tplconf = 'client/html/checkout/template-body';
182
		$default = 'checkout/standard/body-standard';
183
184
		return $view->render( $view->config( $tplconf, $default ) );
185
	}
186
187
188
	/**
189
	 * Returns the HTML string for insertion into the header.
190
	 *
191
	 * @param string $uid Unique identifier for the output if the content is placed more than once on the same page
192
	 * @return string|null String including HTML tags for the header on error
193
	 */
194
	public function header( string $uid = '' ) : ?string
195
	{
196
		$view = $this->getView();
197
198
		try
199
		{
200
			$view = $this->view = $this->view ?? $this->getObject()->data( $view );
201
202
			$html = '';
203
			foreach( $this->getSubClients() as $subclient ) {
204
				$html .= $subclient->setView( $view )->header( $uid );
205
			}
206
			$view->standardHeader = $html;
207
208
			/** client/html/checkout/template-header
209
			 * Relative path to the HTML header template of the checkout standard client.
210
			 *
211
			 * The template file contains the HTML code and processing instructions
212
			 * to generate the HTML code that is inserted into the HTML page header
213
			 * of the rendered page in the frontend. The configuration string is the
214
			 * path to the template file relative to the templates directory (usually
215
			 * in client/html/templates).
216
			 *
217
			 * You can overwrite the template file configuration in extensions and
218
			 * provide alternative templates. These alternative templates should be
219
			 * named like the default one but with the string "standard" replaced by
220
			 * an unique name. You may use the name of your project for this. If
221
			 * you've implemented an alternative client class as well, "standard"
222
			 * should be replaced by the name of the new class.
223
			 *
224
			 * @param string Relative path to the template creating code for the HTML page head
225
			 * @since 2014.03
226
			 * @category Developer
227
			 * @see client/html/checkout/template-body
228
			 */
229
			$tplconf = 'client/html/checkout/template-header';
230
			$default = 'checkout/standard/header-standard';
231
232
			return $view->render( $view->config( $tplconf, $default ) );
233
		}
234
		catch( \Exception $e )
235
		{
236
			$this->logException( $e );
237
		}
238
239
		return null;
240
	}
241
242
243
	/**
244
	 * Returns the sub-client given by its name.
245
	 *
246
	 * @param string $type Name of the client type
247
	 * @param string|null $name Name of the sub-client (Default if null)
248
	 * @return \Aimeos\Client\Html\Iface Sub-client object
249
	 */
250
	public function getSubClient( string $type, string $name = null ) : \Aimeos\Client\Html\Iface
251
	{
252
		/** client/html/checkout/standard/decorators/excludes
253
		 * Excludes decorators added by the "common" option from the checkout standard html client
254
		 *
255
		 * Decorators extend the functionality of a class by adding new aspects
256
		 * (e.g. log what is currently done), executing the methods of the underlying
257
		 * class only in certain conditions (e.g. only for logged in users) or
258
		 * modify what is returned to the caller.
259
		 *
260
		 * This option allows you to remove a decorator added via
261
		 * "client/html/common/decorators/default" before they are wrapped
262
		 * around the html client.
263
		 *
264
		 *  client/html/checkout/standard/decorators/excludes = array( 'decorator1' )
265
		 *
266
		 * This would remove the decorator named "decorator1" from the list of
267
		 * common decorators ("\Aimeos\Client\Html\Common\Decorator\*") added via
268
		 * "client/html/common/decorators/default" to the html client.
269
		 *
270
		 * @param array List of decorator names
271
		 * @since 2014.05
272
		 * @category Developer
273
		 * @see client/html/common/decorators/default
274
		 * @see client/html/checkout/standard/decorators/global
275
		 * @see client/html/checkout/standard/decorators/local
276
		 */
277
278
		/** client/html/checkout/standard/decorators/global
279
		 * Adds a list of globally available decorators only to the checkout standard html client
280
		 *
281
		 * Decorators extend the functionality of a class by adding new aspects
282
		 * (e.g. log what is currently done), executing the methods of the underlying
283
		 * class only in certain conditions (e.g. only for logged in users) or
284
		 * modify what is returned to the caller.
285
		 *
286
		 * This option allows you to wrap global decorators
287
		 * ("\Aimeos\Client\Html\Common\Decorator\*") around the html client.
288
		 *
289
		 *  client/html/checkout/standard/decorators/global = array( 'decorator1' )
290
		 *
291
		 * This would add the decorator named "decorator1" defined by
292
		 * "\Aimeos\Client\Html\Common\Decorator\Decorator1" only to the html client.
293
		 *
294
		 * @param array List of decorator names
295
		 * @since 2014.05
296
		 * @category Developer
297
		 * @see client/html/common/decorators/default
298
		 * @see client/html/checkout/standard/decorators/excludes
299
		 * @see client/html/checkout/standard/decorators/local
300
		 */
301
302
		/** client/html/checkout/standard/decorators/local
303
		 * Adds a list of local decorators only to the checkout standard html client
304
		 *
305
		 * Decorators extend the functionality of a class by adding new aspects
306
		 * (e.g. log what is currently done), executing the methods of the underlying
307
		 * class only in certain conditions (e.g. only for logged in users) or
308
		 * modify what is returned to the caller.
309
		 *
310
		 * This option allows you to wrap local decorators
311
		 * ("\Aimeos\Client\Html\Checkout\Decorator\*") around the html client.
312
		 *
313
		 *  client/html/checkout/standard/decorators/local = array( 'decorator2' )
314
		 *
315
		 * This would add the decorator named "decorator2" defined by
316
		 * "\Aimeos\Client\Html\Checkout\Decorator\Decorator2" only to the html client.
317
		 *
318
		 * @param array List of decorator names
319
		 * @since 2014.05
320
		 * @category Developer
321
		 * @see client/html/common/decorators/default
322
		 * @see client/html/checkout/standard/decorators/excludes
323
		 * @see client/html/checkout/standard/decorators/global
324
		 */
325
326
		return $this->createSubClient( 'checkout/standard/' . $type, $name );
327
	}
328
329
330
	/**
331
	 * Processes the input, e.g. store given values.
332
	 *
333
	 * A view must be available and this method doesn't generate any output
334
	 * besides setting view variables.
335
	 */
336
	public function init()
337
	{
338
		$view = $this->getView();
339
		$context = $this->getContext();
340
341
		try
342
		{
343
			parent::init();
344
		}
345
		catch( \Aimeos\Client\Html\Exception $e )
346
		{
347
			$error = array( $context->translate( 'client', $e->getMessage() ) );
348
			$view->standardErrorList = array_merge( $view->get( 'standardErrorList', [] ), $error );
349
		}
350
		catch( \Aimeos\Controller\Frontend\Exception $e )
351
		{
352
			$error = array( $context->translate( 'controller/frontend', $e->getMessage() ) );
353
			$view->standardErrorList = array_merge( $view->get( 'standardErrorList', [] ), $error );
354
		}
355
		catch( \Aimeos\MShop\Exception $e )
356
		{
357
			$error = array( $context->translate( 'mshop', $e->getMessage() ) );
358
			$view->standardErrorList = array_merge( $view->get( 'standardErrorList', [] ), $error );
359
		}
360
		catch( \Exception $e )
361
		{
362
			$error = array( $context->translate( 'client', 'A non-recoverable error occured' ) );
363
			$view->standardErrorList = array_merge( $view->get( 'standardErrorList', [] ), $error );
364
			$this->logException( $e );
365
		}
366
	}
367
368
369
	/**
370
	 * Returns the list of sub-client names configured for the client.
371
	 *
372
	 * @return array List of HTML client names
373
	 */
374
	protected function getSubClientNames() : array
375
	{
376
		return $this->getContext()->getConfig()->get( $this->subPartPath, $this->subPartNames );
377
	}
378
379
380
	/**
381
	 * Sets the necessary parameter values in the view.
382
	 *
383
	 * @param \Aimeos\MW\View\Iface $view The view object which generates the HTML output
384
	 * @param array &$tags Result array for the list of tags that are associated to the output
385
	 * @param string|null &$expire Result variable for the expiration date of the output (null for no expiry)
386
	 * @return \Aimeos\MW\View\Iface Modified view object
387
	 */
388
	public function data( \Aimeos\MW\View\Iface $view, array &$tags = [], string &$expire = null ) : \Aimeos\MW\View\Iface
389
	{
390
		$context = $this->getContext();
391
392
		$basketCntl = \Aimeos\Controller\Frontend::create( $context, 'basket' );
393
		$view->standardBasket = $basketCntl->get();
394
395
396
		/** client/html/checkout/standard/url/step-active
397
		 * Name of the checkout process step to jump to if no previous step requires attention
398
		 *
399
		 * The checkout process consists of several steps which are usually
400
		 * displayed one by another to the customer. If the data of a step
401
		 * is already available, then that step is skipped. The active step
402
		 * is the one that is displayed if all other steps are skipped.
403
		 *
404
		 * If one of the previous steps misses some data the customer has
405
		 * to enter, then this step is displayed first. After providing
406
		 * the missing data, the whole series of steps are tested again
407
		 * and if no other step requests attention, the configured active
408
		 * step will be displayed.
409
		 *
410
		 * The order of the steps is determined by the order of sub-parts
411
		 * that are configured for the checkout client.
412
		 *
413
		 * @param string Name of the confirm standard HTML client
414
		 * @since 2014.07
415
		 * @category Developer
416
		 * @category User
417
		 * @see client/html/checkout/subparts
418
		 */
419
		$default = $view->config( 'client/html/checkout/standard/url/step-active', 'summary' );
420
421
		/** client/html/checkout/standard/onepage
422
		 * Shows all named checkout subparts at once for a one page checkout
423
		 *
424
		 * Normally, the checkout process is divided into several steps for entering
425
		 * addresses, select delivery and payment options as well as showing the
426
		 * summary page. This enables dependencies between two steps like showing
427
		 * delivery options based on the address entered by the customer. Furthermore,
428
		 * this is good way to limit the amount of information displayed which is
429
		 * preferred by mobile users.
430
		 *
431
		 * Contrary to that, a one page checkout displays all information on only
432
		 * one page and customers get an immediate overview of which information
433
		 * they have to enter and what options they can select from. This is an
434
		 * advantage if only a very limited amount of information must be entered
435
		 * or if there are almost no options to choose from and no dependencies
436
		 * between exist.
437
		 *
438
		 * Using this config options, shop developers are able to define which
439
		 * checkout subparts are combined to a one page view. Simply add the names
440
		 * of all checkout subparts to the list. Available checkout subparts for
441
		 * a one page checkout are:
442
		 *
443
		 * * address
444
		 * * delivery
445
		 * * payment
446
		 * * summary
447
		 *
448
		 * @param array List of checkout subparts name
449
		 * @since 2015.05
450
		 * @category Developer
451
		 */
452
		$onepage = $view->config( 'client/html/checkout/standard/onepage', [] );
453
		$onestep = ( !empty( $onepage ) ? array_shift( $onepage ) : $default ); // keep the first one page step
454
455
		$steps = (array) $context->getConfig()->get( $this->subPartPath, $this->subPartNames );
456
		$steps = array_values( array_diff( $steps, $onepage ) ); // remove all remaining steps in $onepage and reindex
457
458
		// use first step if default step isn't available
459
		$default = ( !in_array( $default, $steps ) ? reset( $steps ) : $default );
460
		$current = $view->param( 'c_step', $default );
461
462
		// use $onestep if the current step isn't available due to one page layout
463
		if( !in_array( $current, $steps ) ) {
464
			$current = $onestep;
465
		}
466
467
		// use $onestep if the active step isn't available due to one page layout
468
		if( isset( $view->standardStepActive ) && in_array( $view->standardStepActive, $onepage ) ) {
469
			$view->standardStepActive = $onestep;
470
		}
471
472
		$cpos = array_search( $current, $steps );
473
474
		if( !isset( $view->standardStepActive )
475
			|| ( ( $apos = array_search( $view->standardStepActive, $steps ) ) !== false
476
			&& $cpos !== false && $cpos < $apos )
477
		) {
478
			$view->standardStepActive = $current;
479
		}
480
481
		$cpos = (int) array_search( $view->standardStepActive, array_values( $steps ) );
482
483
		$view->standardStepsBefore = array_slice( $steps, 0, $cpos );
484
		$view->standardStepsAfter = array_slice( $steps, $cpos + 1 );
485
486
		$view = $this->addNavigationUrls( $view, $steps, $view->standardStepActive );
487
		$view->standardSteps = $steps;
488
489
		return parent::data( $view, $tags, $expire );
490
	}
491
492
493
	/**
494
	 * Adds the "back" and "next" URLs to the view
495
	 *
496
	 * @param \Aimeos\MW\View\Iface $view View object
497
	 * @param array $steps List of checkout step names
498
	 * @param string $activeStep Name of the active step
499
	 * @return \Aimeos\MW\View\Iface Enhanced view object
500
	 * @since 2016.05
501
	 */
502
	protected function addNavigationUrls( \Aimeos\MW\View\Iface $view, array $steps, string $activeStep ) : \Aimeos\MW\View\Iface
503
	{
504
		/** client/html/checkout/standard/url/target
505
		 * Destination of the URL where the controller specified in the URL is known
506
		 *
507
		 * The destination can be a page ID like in a content management system or the
508
		 * module of a software development framework. This "target" must contain or know
509
		 * the controller that should be called by the generated URL.
510
		 *
511
		 * @param string Destination of the URL
512
		 * @since 2014.03
513
		 * @category Developer
514
		 * @see client/html/checkout/standard/url/controller
515
		 * @see client/html/checkout/standard/url/action
516
		 * @see client/html/checkout/standard/url/config
517
		 */
518
		$cTarget = $view->config( 'client/html/checkout/standard/url/target' );
519
520
		/** client/html/checkout/standard/url/controller
521
		 * Name of the controller whose action should be called
522
		 *
523
		 * In Model-View-Controller (MVC) applications, the controller contains the methods
524
		 * that create parts of the output displayed in the generated HTML page. Controller
525
		 * names are usually alpha-numeric.
526
		 *
527
		 * @param string Name of the controller
528
		 * @since 2014.03
529
		 * @category Developer
530
		 * @see client/html/checkout/standard/url/target
531
		 * @see client/html/checkout/standard/url/action
532
		 * @see client/html/checkout/standard/url/config
533
		 */
534
		$cCntl = $view->config( 'client/html/checkout/standard/url/controller', 'checkout' );
535
536
		/** client/html/checkout/standard/url/action
537
		 * Name of the action that should create the output
538
		 *
539
		 * In Model-View-Controller (MVC) applications, actions are the methods of a
540
		 * controller that create parts of the output displayed in the generated HTML page.
541
		 * Action names are usually alpha-numeric.
542
		 *
543
		 * @param string Name of the action
544
		 * @since 2014.03
545
		 * @category Developer
546
		 * @see client/html/checkout/standard/url/target
547
		 * @see client/html/checkout/standard/url/controller
548
		 * @see client/html/checkout/standard/url/config
549
		 */
550
		$cAction = $view->config( 'client/html/checkout/standard/url/action', 'index' );
551
552
		/** client/html/checkout/standard/url/config
553
		 * Associative list of configuration options used for generating the URL
554
		 *
555
		 * You can specify additional options as key/value pairs used when generating
556
		 * the URLs, like
557
		 *
558
		 *  client/html/<clientname>/url/config = array( 'absoluteUri' => true )
559
		 *
560
		 * The available key/value pairs depend on the application that embeds the e-commerce
561
		 * framework. This is because the infrastructure of the application is used for
562
		 * generating the URLs. The full list of available config options is referenced
563
		 * in the "see also" section of this page.
564
		 *
565
		 * @param string Associative list of configuration options
566
		 * @since 2014.03
567
		 * @category Developer
568
		 * @see client/html/checkout/standard/url/target
569
		 * @see client/html/checkout/standard/url/controller
570
		 * @see client/html/checkout/standard/url/action
571
		 * @see client/html/url/config
572
		 */
573
		$cConfig = $view->config( 'client/html/checkout/standard/url/config', [] );
574
575
576
		$bTarget = $view->config( 'client/html/basket/standard/url/target' );
577
		$bCntl = $view->config( 'client/html/basket/standard/url/controller', 'basket' );
578
		$bAction = $view->config( 'client/html/basket/standard/url/action', 'index' );
579
		$bConfig = $view->config( 'client/html/basket/standard/url/config', [] );
580
581
582
		$step = null;
583
		do {
584
			$lastStep = $step;
585
		}
586
		while( ( $step = array_shift( $steps ) ) !== null && $step !== $activeStep );
587
588
589
		if( $lastStep !== null ) {
0 ignored issues
show
introduced by
The condition $lastStep !== null is always false.
Loading history...
590
			$param = array( 'c_step' => $lastStep );
591
			$view->standardUrlBack = $view->url( $cTarget, $cCntl, $cAction, $param, [], $cConfig );
592
		} else {
593
			$view->standardUrlBack = $view->url( $bTarget, $bCntl, $bAction, [], [], $bConfig );
594
		}
595
596
		if( !isset( $view->standardUrlNext ) && ( $nextStep = array_shift( $steps ) ) !== null ) {
597
			$param = array( 'c_step' => $nextStep );
598
			$view->standardUrlNext = $view->url( $cTarget, $cCntl, $cAction, $param, [], $cConfig );
599
		}
600
		// don't overwrite $view->standardUrlNext so process step URL is used
601
602
		return $view;
603
	}
604
}
605