Odoslanie formulára s adresou up?mode=register po odsúhlasení podmienok ako na to?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
SontoEremo
Člen | 341
+
0
-

Zdravím páni a dámy…
Mám SignPresenter
v ktorom mám toto

<?php
namespace ForumModule;
use Nette\Application\UI\Form;
use Nette\Utils\Html;
class SignPresenter extends \BasePresenter
{
	/** @persistent */
	public $backlink = '';

	protected function createComponentSignUpForm()
	{
		$SignUp_form = new Form();
		$SignUp_form->addText('username', 'Username');
		$SignUp_form->addSubmit('signUp', 'Register');
		$SignUp_form->onSuccess[] = callback($this, 'SignUpFormSuccessSubmited');
 		return $SignUp_form;
	}

	public function SignUpFormSuccessSubmited(Form $SignUp_form)
	{
		// ....
	}

	protected function createComponentAgreeSubmitedForm()
	{
		$Agree_form = new Form;
		$Agree_form->addSubmit('agreed', 'I agree to these terms');
		$Agree_form->addSubmit('not_agreed', 'I do not agree to these terms');
		$Agree_form->onValidate[] = $this->AgreeSuccessAccepted;

		return $Agree_form;
	}

	public function AgreeSuccessAccepted(Form $Agree_form)
	{
		if($Agree_form['agreed']->isSubmittedBy())
		{
			$this->redirect('up', array('mode' => 'register'));
		}elseif($Agree_form['not_agreed']->isSubmittedBy()) {

			$this->redirect('Index:');
		}
	}
}

a potom dve šablóny jedna je up.latte kde sú definované podmienky a druhá je register.latte v ktorom je formulár, potreboval by som aby po kliknutí agreed bol presmerovaný na formulár register.latte kde adresa by bola http:// … /up?mode=register lenže adresa i keď sa zobrazí nepresmeruje sa na formulár ale ostane to na up.latte viem, že to ide aj normálne proste po kliknutí redirectnúť ale ja potrebujem aby boli najprv odsúhlasené podmienky až potom by bolo možné zobraziť formulár.
Nejaké nápady?
ďakujem vopred všetkým.

David Matějka
Moderator | 6445
+
0
-

proc tam resis nejaky mode? snad to register je akce, ne? takze $this->redirect('register')

SontoEremo
Člen | 341
+
0
-

Dobre ďakujem ale predsa sa opítam ako teda poriešiť aby sa užívateľ dostal na formulár až po prijatí podmienok? niečo ako ma phpbb3 najprv súhlas a až potom formulár a ak zadá aj adresu …/ucp?mode=register tak vždy naň vybehne potvrdenie podmienok a ja potrebujem ak zadá adresu …/sign/register aby ho to hodilo späť na …/sign/up kde odsúhlasí podmienky.
Teraz ak príde na …/sign/up je tam formulár pre súhlas s podmienkami ak ich odsúhlasi tak ho to hodí na formulár čiže na …/sign/register a ak s nimi nesúhlasi tak späť na hlavnú stránku, lenže neviem ako zadať opak čiže vždy aby najprv boli podmienky a až potom formulár.

besanek
Člen | 128
+
0
-

Ukládej si do session, jestli uživatel už odsouhlasil. Pokud ne a zobrazí formulář, tak ho přesměruj na odsouhlasení.

SontoEremo
Člen | 341
+
0
-

Pokúšal som sa o niečo takéto ale skončíto chybou:

Stránku sa nepodarilo správne presmerovať

Firefox zistil, že server smeruje požiadavku tejto stránky spôsobom, ktorým sa presmerovanie nikdy neukončí.

<?php
namespace ForumModule;
use Nette\Application\UI\Form;
use Nette\Utils\Html;
class SignPresenter extends \BasePresenter
{
	/** @persistent */
	public $backlink = '';
	public $Agree_form = 'Agree_form';

	public function startUp()
	{
		parent::startUp();

		if(!$this->session->getSection($this->Agree_form))
		{
			$this->redirect('register');
		} else {
			$this->redirect('up');
		}
	}

	protected function createComponentSignUpForm($name)
	{
		$SignUp_form = new Form($this, $name);
		$SignUp_form->addText('username', 'Username');
		$SignUp_form->addSubmit('signUp', 'Register');
		$SignUp_form->onSuccess[] = callback($this, 'SignUpFormSuccessSubmited');
 		return $SignUp_form;
	}

	public function SignUpFormSuccessSubmited(Form $SignUp_form)
	{
		// ....
	}

	protected function createComponentAgreeSubmitedForm()
	{
		$Agree_form = new Form;
		$Agree_form->addSubmit('agreed', 'I agree to these terms');
		$Agree_form->addSubmit('not_agreed', 'I do not agree to these terms');
		$Agree_form->onValidate[] = $this->AgreeSuccessAccepted;

		return $Agree_form;
	}

	public function AgreeSuccessAccepted(Form $Agree_form)
	{
		if($Agree_form['agreed']->isSubmittedBy())
		{
			$this->redirect('register');
		} elseif($Agree_form['not_agreed']->isSubmittedBy()) {

			$this->redirect('Index:');
		}
	}
}
Milo
Nette Core | 1283
+
0
-

Bijou se Ti routy Nette a redirect Apache. Tohle se stane, když máš v Apache nastaveno „vše přesměruj na SSL“ a routy SSL nejsou.

David Matějka
Moderator | 6445
+
0
-

ty se divis, ze se to porad presmerovava?

if(!$this->session->getSection($this->Agree_form))
  {
      $this->redirect('register');
  } else {
      $this->redirect('up');
  }
SontoEremo
Člen | 341
+
0
-

Milo napsal(a):

Bijou se Ti routy Nette a redirect Apache. Tohle se stane, když máš v Apache nastaveno „vše přesměruj na SSL“ a routy SSL nejsou.

Sorry ale nepochopil som nič :)

môj router:

<?php

use Nette\Application\Routers\RouteList,
	Nette\Application\Routers\Route,
	Nette\Application\Routers\SimpleRouter;


/**
 * Router factory.
 */
class RouterFactory
{

	/**
	 * @return Nette\Application\IRouter
	 */
	public function createRouter()
	{
		$router = new RouteList();
		$router[] = new Route('index.php', 'Forum:Index:default', Route::ONE_WAY);

		$router[] = new Route('admin/<presenter>/<action>[/<id>]', array(
			'module' => 'Admin',
			'presenter' => 'Index',
			'action' => 'default',
			'id' => NULL,
		));

		$router[] = new Route('forum/<presenter>/<action>[/<id>]', array(
			'module' => 'Forum',
			'presenter' => 'Index',
			'action' => 'default',
			'id' => NULL,
		));

		$router[] = new Route('<presenter>/<action>[/<id>]', 'Forum:Index:default');
		return $router;
	}

}

**a teraz som na Locale kde mám nastavené v httpd.conf **

#Listen 0.0.0.0:80
#Listen [::]:80
Listen 80
David Matějka
Moderator | 6445
+
0
-

router ani apache za to nemuze, muze za to ten startup(), viz muj predchozi prispevek

SontoEremo
Člen | 341
+
0
-

matej21 napsal(a):

router ani apache za to nemuze, muze za to ten startup(), viz muj predchozi prispevek

Sorry nevšimol som ho…
No hej ale ako teda poriešiť to session? nie je tak, že čo je v startUp()-u tak sa vykonáva ako prvé?
Takže som si myslel, keďže chcem najprv zistiť či bolo odsúhlasené alebo nie a až potom presmerovávať.

besanek
Člen | 128
+
0
-

Přesměrování přesunout ze startupu do action metod.

SontoEremo
Člen | 341
+
0
-
public $Agree_form;

	public function actionAgreed()
	{
		if($this->session->getSection($this->Agree_form['agreed']))
		{
			$this->redirect('register');
		} else {
			$this->redirect('up');
		}
	}

Nič sa nedeje a dá sa bez problémov prejsť na register

besanek
Člen | 128
+
0
-

Však máš Register a Up, ne? Kde jsi vzal Agreed? Navíc tu session ani nikde nenastavuješ.

Možná by se chtělo trochu zamyslet, než začneš střílet od boku otázky.

// ...
$this->getSession('signup')->agreed = true; // Když uživatel klikl na souhlasím
// ...

public function actionRegister()
	{
		if( $this->getSession('signup')->agreed !== true ) {
			$this->redirect('up');
		}
	}
SontoEremo
Člen | 341
+
0
-

besanek napsal(a):

Však máš Register a Up, ne? Kde jsi vzal Agreed? Navíc tu session ani nikde nenastavuješ.

Možná by se chtělo trochu zamyslet, než začneš střílet od boku otázky.

// ...
$this->getSession('signup')->agreed = true; // Když uživatel klikl na souhlasím
// ...

public function actionRegister()
	{
		if( $this->getSession('signup')->agreed !== true ) {
			$this->redirect('up');
		}
	}

Ďakujem veľmi pekne a ospravedlňujem sa ale i tak tvoj kód ma nepustí ďalej i keď sa s podmienkami odsúhlasi čiže ostane to na ../sign/up ale na druhej strane ak zadám ../sign/register tak ma to redirectne na podmienky ale tam to aj ostane
Ale aj tak ďakujem veľmi pekne.

besanek
Člen | 128
+
0
-

To přesměrování tam budeš muset nechat. Jinak Nette těžko zjistí, že má zobrazit něco jiného. :)

Jinak v tomhle případě bych i zapřemýšlel, jestli metoda AgreeSuccessAccepted() není trochu zbytečná, když jen zjistí na jaké tlačítko se kliklo a provede přesměrování. Nástřel továrničky formuláře bez ní.

protected function createComponentAgreeSubmitedForm()
    {
    		$that = $this;	//PHP 5.3.* workaround
        	$form = new Form;
        	$form->addSubmit('agreed', 'I agree to these terms')->onClick[] = function () use ( $that ) {
        		$that->getSession('signup')->agreed = true;
        		$that->redirect('register');
        	};
        	$form->addSubmit('not_agreed', 'I do not agree to these terms')->onClick[] = function () use ( $that ) {
        		$that->redirect('Index:');
        	};
			return $form;
    }