Ako preniesť výsledok z „ECHO“ do šablóny

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

Zdravím ľudkovia…

Mám tento DomainPresenter pomocou ktorého generejuem formulár na overenie dostupnosti domén.

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

	protected function createComponentSearchDomainForm()
	{
		$form = new Form();
		$form->addText('domainName')
			 ->setAttribute('placeholder', 'vasadomena')
		     ->setRequired('Zadajte prosím názov domény')
		     ->addRule(Form::MIN_LENGTH, 'Názov domény je príliš krátky. Zadajte minimálne %d znaky', 2);
		$domainsXX = $this->domainList();
		$form->addSelect('domainList', '.sk', $domainsXX)
			   ->setAttribute('class', 'default')
			   ->setAttribute('tabindex', '3')
			   ->setDefaultValue('.sk');

		$form->addSubmit('domainSearch', 'Zistiť voľnú doménu');
		$form->onSuccess[] = callback($this, 'SearchDomainSuccessFormSubmited');

		return $form;
	}

	public function SearchDomainSuccessFormSubmited(Form $form)
	{
		$values = $form->getValues();
		if($values){
		    $domain_checker = "$values[domainName]"."$values[domainList]";
		    $arrHost = @gethostbynamel("$domain_checker");

		    if(empty($arrHost)){
		        echo "Domain $domain_checker is available";
		    } else {
		        echo "Domain $domain_checker is not available.";
		    }
		}
	}
}

Potreboval by som pomôcť ako preniesť výsledky z echo do šablóny?

{form searchDomainForm}
      <div class="row">
       <div class="eight columns  centered">
        <div class="row">
         <div class="seven columns formpadding">
          {input domainName}
         </div>
         <div class="three columns formpadding">
          {input domainList}
         </div>
         <div class="two columns formpadding">
          {input domainSearch class=>"button"}
         </div>
        </div>
       </div>
      </div>
      <div class="row">
       <div class="twelve columns">
        <div class="alert-box alert">
         VÝSLEDOK SEM
         <a href="" class="close">&times;</a>
        </div>
       </div>
  	  </div>
     {/form}

Kokrétnejšie potrebujem tieto dva kódy

<div class="row">
       <div class="twelve columns">
        <div class="alert-box success">
         VÝSLEDOK ÚSPECH ak je voľná
         <a href="" class="close">&times;</a>
        </div>
       </div>
  	  </div>
<div class="row">
       <div class="twelve columns">
	<div class="alert-box alert">
     VÝSLEDOK NEÚSPECH ak je obsadená
     <a href="" class="close">&times;</a>
     </div>
       </div>
  	  </div>

Snažil som sa to pomocou

{if $form->errors}...{else}....{/if}

Ale ako som zistil a pochopil error sa používa na validovanie chýb formuláru

ďakujem vopred všetkým.

Editoval SontoEremo (23. 5. 2013 23:27)

David Matějka
Moderator | 6445
+
0
-

$this->template->foo = 'bar'
https://doc.nette.org/cs/quickstart#…

SontoEremo
Člen | 341
+
0
-

Ešte také menšie nakopnutie?

ďakujem.

Tabetha
Člen | 140
+
0
-
public function SearchDomainSuccessFormSubmited(Form $form)
{
    $values = $form->getValues();
    if($values){
        $domain_checker = "$values[domainName]"."$values[domainList]";
        $arrHost = @gethostbynamel("$domain_checker");

        if(empty($arrHost)){
         //   echo "Domain $domain_checker is available";
		$this->presenter->template->result = "Domain $domain_checker is available";
        } else {
         //   echo "Domain $domain_checker is not available.";
		//bud takto
		$this->presenter->template->result = "Domain $domain_checker is not available";
		//alebo takto ...nie som si istý či je to teraz ekvivalentné
		$this->template->result = "Domain $domain_checker is not available";
        }
    }
}

a latte

<div class="row">
       <div class="twelve columns">
    <div class="alert-box alert">
     {$result}
     <a href="" class="close">&times;</a>
     </div>
       </div>
      </div>
David Matějka
Moderator | 6445
+
0
-

Tabetha: $this->presenter v presenteru vraci sam sebe, takze je to zbytecny. volat $this->presenter ma nejake opodstatneni v komponentach (treba presmerovani, flash message..), ale i to by se melo minimalizovat

SontoEremo
Člen | 341
+
0
-

@Tabetha
Vďaka to je presne čo potrebujem len ak nie je form vyplnený a odoslaný vyhodí mi ladenka
Undefined variable: result

ešte sa chcem spýtať potrebujem to ešte pri zmene
is available

<div class="row">
       <div class="twelve columns">
    <div class="alert-box success">
     {$result}
     <a href="" class="close">&times;</a>
     </div>
       </div>
      </div>

a is not available

<div class="row">
       <div class="twelve columns">
    <div class="alert-box alert">
     {$result}
     <a href="" class="close">&times;</a>
     </div>
       </div>
      </div>

pokúšal som sa nejako takto

{if $result>0}
<div class="row">
       <div class="twelve columns">
    <div class="alert-box success">
     {$result}
     <a href="" class="close">&times;</a>
     </div>
       </div>
      </div>
{else}
<div class="row">
       <div class="twelve columns">
    <div class="alert-box alert">
     {$result}
     <a href="" class="close">&times;</a>
     </div>
       </div>
      </div>
{/if}

Ale aj tak ďakujem za pomoc …

Zdeno1981
Člen | 115
+
0
-

https://latte.nette.org/cs/tags#…, najdeš tam co hledáš.

Tabetha
Člen | 140
+
0
-

matej21 jasné, ja som si len nebol v tom odoslaní formulára tým istý, či sa tam dá dobre pristúpiť k template, ale ked som sa pozeral k sebe, tak hej, ide to bez presenter a je to lepšie …

SontoEremo
Člen | 341
+
0
-

Takže som to ako tak dal dokopy funguje to len sa chcem spýtať či to mám dobre a či to môžem aj použiť ďakujem vopre

DomainPresenter

public function SearchDomainSuccessFormSubmited(Form $form)
	{
	    $values = $form->getValues();
	    if($values){
	        $domain_checker = "$values[domainName]"."$values[domainList]";
	        $arrHost = @gethostbynamel("$domain_checker");

	        if(empty($arrHost))
	        {
	    		$this->template->available = "Domain $domain_checker is available";
	        } else {
	    		$this->template->notAvailable= "Domain $domain_checker is not available";
	        }
	    }
	}

Domain/default.latte

{if isset($available)}
      <div class="row">
       <div class="twelve columns">
        <div class="alert-box success">
         {$available}
         <a href="" class="close">&times;</a>
        </div>
       </div>
      </div>
      {elseif isset($notAvailable)}
      <div class="row">
       <div class="twelve columns">
        <div class="alert-box alert">
         {$notAvailable}
         <a href="" class="close">&times;</a>
        </div>
       </div>
      </div>
      {else}

     {/if}
     {/form}
Tabetha
Člen | 140
+
0
-

čo takto

{if isset($available) || isset($notAvailable)}
      <div class="row">
       <div class="twelve columns">
        <div class="alert-box success">
         {isset($available) ? $available : $notAvailable)}
         <a href="" class="close">&times;</a>
        </div>
       </div>
      </div>
      {else}

     {/if}
     {/form}
SontoEremo
Člen | 341
+
0
-

Tabetha napsal(a):

čo takto

{if isset($available) || isset($notAvailable)}
      <div class="row">
       <div class="twelve columns">
        <div class="alert-box success">
         {isset($available) ? $available : $notAvailable)}
         <a href="" class="close">&times;</a>
        </div>
       </div>
      </div>
      {else}

     {/if}
     {/form}

syntax error, unexpected ‚)‘, expecting ‚,‘ or ‚;‘

Lenže mne ide o to

{if isset($Available) || isset($notAvailable)}
      <div class="row">
       <div class="twelve columns">
        <div class="alert-box success <-- Available else alert <-- not Available">
         {isset($Available) ? $available : $notAvailable)}
         <a href="" class="close">&times;</a>
        </div>
       </div>
      </div>
      {else}

     {/if}

     {/form}
hAssassin
Člen | 293
+
0
-

sorry, ale nejak nechapu co tady resite? A cely to je divny… Jelikoz se jedna o zpracovani formulare, nemelo by se spis nastavit flashMessage nebo Error formulari nez to nastavovat jako promennou to sablony nekde v callbacku handle metody, tedy nekde v predpekli mezi action a render. Prijde mi to dost divny. Navic, co kdyzpak nekde zavolas redirect? Promenna se ti nenaplni a jsi v prd…


Jinak teda jeste k ty sablone, co takto:

{if isset($Available) || isset($notAvailable)}
      <div class="row">
       <div class="twelve columns">
        <div n:class="alert-box, (isset($Available)) ? success : error">
         {isset($Available) ? $available : $notAvailable)}
         <a href="" class="close">&times;</a>
        </div>
       </div>
      </div>
{/if}

Ale stejne bych si kdyzuz pripravil dve promenny, $message a $available (bool), podle ni bych nastavil CSS klasu a $message jen vypsal (ta by uz obsahoval spravny text). A nebo pouzil flashMessage kde si muzu nastavit CSS tridu rovnou…

Editoval hAssassin (24. 5. 2013 15:16)

MartinitCZ
Člen | 580
+
0
-

@**SontoEremo**: Dobrá prasárna. Co si do šalony předávat v proměnné jen TRUE/FALSE a podle toho měnit text. Ušetříš tim kod jak v php, tak i v šabloně. Hlavně to bude čistější než to co áš ted!

hAssassin
Člen | 293
+
0
-

ok, tak si sem to precetl jeste jednou a poradne a stejne mi to prijde cely spatne :) Udelal bych to tak, ze bych mel akci s parametrem domain, ktery by se dal zadat rucne do URL a formular bych odeslal, zpracoval a presmeroval na akci s tim parametrem. A az v ty akci bych zpracoval ten dotaz. Cili nejak takto:

<?php
namespace hostingModule;
use Nette\Application\UI\Form;
use Nette\Utils\Html;

class DomainPresenter extends BasePresenter
{
    /** @persistent */
    public $backlink = '';

    private $hosts = NULL;

    public function actionDefault($domain = NULL)
    {
        if ($domain !== NULL) {
            $this->hosts = @gethostbynamel("$domain");
        }
    }


    public function renderDefault($domain = NULL)
    {
        $this->template->hosts = $this->hosts;
    }

    protected function createComponentSearchDomainForm()
    {
        $form = new Form();
        $form->addText('domainName')
             ->setAttribute('placeholder', 'vasadomena')
             ->setRequired('Zadajte prosím názov domény')
             ->addRule(Form::MIN_LENGTH, 'Názov domény je príliš krátky...', 2);
        $domainsXX = $this->domainList();
        $form->addSelect('domainList', '.sk', $domainsXX)
               ->setAttribute('class', 'default')
               ->setAttribute('tabindex', '3')
               ->setDefaultValue('.sk');

        $form->addSubmit('domainSearch', 'Zistiť voľnú doménu');
        $form->onSuccess[] = callback($this, 'SearchDomainSuccessFormSubmited');

        return $form;
    }

    public function SearchDomainSuccessFormSubmited(Form $form)
    {
        $values = $form->getValues();
        if($values){
            $domain = "$values[domainName]"."$values[domainList]";
            $this->redirect(this, array('domain' => $domain);
            die;
        }
    }
}

No a pak sablona nejak takto:

{form searchDomainForm}
      <div class="row">
       <div class="eight columns  centered">
        <div class="row">
         <div class="seven columns formpadding">
          {input domainName}
         </div>
         <div class="three columns formpadding">
          {input domainList}
         </div>
         <div class="two columns formpadding">
          {input domainSearch class=>"button"}
         </div>
        </div>
       </div>
      </div>
      <div class="row">
       <div class="twelve columns">
        <div n:class="alert-box, ($hosts) ? alert : success">
         {if $hosts}Domena je obsazena{else}Domena je volna{/if}
         <a href="" class="close">&times;</a>
        </div>
       </div>
      </div>
{/form}

Ale stejne se nemuzu ubranit tomu, ze to co ty zobrazuje je pouha flashMessage, uz je protoze tam mas ten krizek na zavreni a ani tam zadny hosts neprochazis a nevypisujes ty obsazeny domeny. Takze ten muj prvni prispevek je stale platny.

SontoEremo
Člen | 341
+
0
-

@hAssassin
Nazdar ako myslíš cez **flashMessage **?
Nejako takto?

public function SearchDomainSuccessFormSubmited(Form $form)
    {
        $values = $form->getValues();
        if($values){
            $domain = "$values[domainName]"."$values[domainList]";
            $this->flashMessage($domain);
            $this->redirect('this', array('domain' => $domain ));
            die;
        }
    }

A šablóna

<div class="row">
        <div class="twelve columns">
          <div n:foreach="$flashes as $flash" n:class="alert-box, ($hosts) ? alert : success, $flash->type">
          {if $hosts}
          Doména <strong>{$flash->message}</strong> je obsadená
          {else}
          Doména <strong>{$flash->message}</strong> je voľná || môžete si ju <a href="">Zaregistrovať</a>
          {/if}
           <a href="" class="close">&times;</a>
          </div>
        </div>
      </div>
hAssassin
Člen | 293
+
0
-

ne, ted patlas dokupy oba pristupy :) bud jeden nebo druhy. Pres flash messages jednoduse takto:

public function SearchDomainSuccessFormSubmited(Form $form)
{
    $values = $form->getValues();
    if($values){
        $domain_checker = "$values[domainName]"."$values[domainList]";
        $arrHost = @gethostbynamel("$domain_checker");

        if(empty($arrHost)){
            $this->flashMessage("Domain $domain_checker is available", 'error');
        } else {
            $this->flashMessage("Domain $domain_checker is not available.", 'success');
        }
    }

	$this->redirect(this);
}

A sablonu ani nemusis upravovat, proste ji nechas tak jak je (za predpokladu ze tam nekde flashmessages vypisuje ala sandbox).

SontoEremo
Člen | 341
+
0
-

@hAssassin Tak si to teda zhrňme :)

<?php
namespace hostingModule;
use Nette\Application\UI\Form;
use Nette\Utils\Html;

class DomainPresenter extends BasePresenter
{
    /** @persistent */
    public $backlink = '';

    private $hosts = NULL;

    public function actionDefault($domain = NULL)
    {
        if ($domain !== NULL) {
            $this->hosts = @gethostbynamel("$domain");
        }
    }


    public function renderDefault($domain = NULL)
    {
        $this->template->hosts = $this->hosts;
    }

    protected function createComponentSearchDomainForm()
    {
        $form = new Form();
        $form->addText('domainName')
             ->setAttribute('placeholder', 'vasadomena')
             ->setRequired('Zadajte prosím názov domény')
             ->addRule(Form::MIN_LENGTH, 'Názov domény je príliš krátky...', 2);
        $domainsXX = $this->domainList();
        $form->addSelect('domainList', '.sk', $domainsXX)
               ->setAttribute('class', 'default')
               ->setAttribute('tabindex', '3')
               ->setDefaultValue('.sk');

        $form->addSubmit('domainSearch', 'Zistiť voľnú doménu');
        $form->onSuccess[] = callback($this, 'SearchDomainSuccessFormSubmited');

        return $form;
    }

    public function SearchDomainSuccessFormSubmited(Form $form)
    {
        $values = $form->getValues();
        if($values){
            $domain = "$values[domainName]"."$values[domainList]";
            $arrHost = @gethostbynamel("$domain");

            if(empty($arrHost)){
                $this->flashMessage("Doména $domain je voľná", 'success');
            } else {
                $this->flashMessage("Doména $domain je obsadená", 'alert');
            }
        }

        $this->presenter->redirect('this', array('domainName' => $domain));
    }
}
{form searchDomainForm}
      <div class="row">
       <div class="eight columns  centered">
        <div class="row">
         <div class="seven columns formpadding">
          {input domainName}
         </div>
         <div class="three columns formpadding">
          {input domainList}
         </div>
         <div class="two columns formpadding">
          {input domainSearch class=>"button"}
         </div>
        </div>
       </div>
      </div>
      <div class="row">
        <div class="twelve columns">
         <div n:foreach="$flashes as $flash" n:class="alert-box, $flash->type">
          {$flash->message}
         </div>
        </div>
      </div>
     {/form}
SontoEremo
Člen | 341
+
0
-

A sakra teraz som zistil, že využitie flashMessage nebude dobre keďže to escapuje html tagy
nakoľko ja potrebujem v správe

doména $domain je voľná a môžete si ju <a href="link">Zaregistorvať</a>

alebo

doména $domain je obsadená <a href="link">Transfer</a>

Skúšal som

$link1 = Html::el('a')->href($this->link('default'))->setText('Zaregistrovať');
            if(empty($arrHost)){
                $this->flashMessage("Doména $domain je voľná a môžete si ju $link1", 'success');
            } else {
                $this->flashMessage("Doména $domain je obsadená", 'alert');
            }

no ak je $link1 v "" výsledok je

<div class="alert-box success">
          Doména vamp-labs.sk je voľná a môžete si ju &lt;a href="/webpage/hosting/domain/"&gt;Zaregistrovať&lt;/a&gt;
         </div>

Editoval SontoEremo (24. 5. 2013 21:09)

jiri.pudil
Nette Blogger | 1032
+
0
-

Mělo by fungovat

$message = Html::el()->setHtml("Doména $domain je voľná a môžete si ju $link1");
$this->flashMessage($message, "success");
SontoEremo
Člen | 341
+
0
-

jiri.pudil napsal(a):

Mělo by fungovat

$message = Html::el()->setHtml("Doména $domain je voľná a môžete si ju $link1");
$this->flashMessage($message, "success");

Áno áno áno ďakujem a miliónkrát ďakujem :)

SontoEremo
Člen | 341
+
0
-

Ešte sa chcem ako by ste riešili pridanie voľnej domény do košíka?
ako také niečo

$link1 = Html::el('a')->href($this->link("default?add=$domain"))
                                  ->setClass('small radius green button')
                                  ->setText('Zaregistrovať');

predsa len tento produkt nie je v DB.
Rozmýšlal som, že po kliknutí na tlačidlo Zaregistrovať by sa doména vložila do DB
odkiaľ by som ju potiahol a zobrazil v košiku a ak by užívateľ chcel proste by ju X-kol čo by viedlo k zmazaniu z DB.
No neviem sú to len moje predstavy preto sa pýta Vás asi nie určite poznáte lepší spôsob.

Editoval SontoEremo (25. 5. 2013 0:15)

SontoEremo
Člen | 341
+
0
-

Nikto nič podobné neriešil?
Sedím už dva dni pritom a skúšam všetko možné čo sa len dá + čo som našiel na fóre alebo v dokumentácii
Neviem si radi ako ak je doména voľna pridať danú doménu do košíka a hneď zobraziť aj počet položiek v header čiže (1) či (2) atď…
Zas neviem ako spraviť aby do inputu kde sa vklada text nebolo možné pridať http:// www , . iba - aj to len medzi textom čiže nazov-domeny som s toho na konci sil.

Ešte sa chcem spýtať čo je lepšie mať to všetko v presenteri alebo vytvoriť si nejaký ten Domain.php komponentu a tu predať do presenter DomainPresenter.php lebo by som chcel využiť ten vyhľadávač v sekcii Domény a aj v sekcii Objednávka

ďakujem vopred všetkym.

Editoval SontoEremo (25. 5. 2013 17:27)

Aearsis
Člen | 57
+
0
-

Misto „default?add=domain“ pravděpodobně hledáš signály.

A na „aby nebylo možné napsat“ budeš potřebovat javascript, nejlepší by asi bylo využít regulárního výrazu jako (http\:\/\/)?(www\.)?([^\.]+\.(cz|eu|com)) po opuštění pole a nahradit jeho obsah jen tou správnou částí.

SontoEremo
Člen | 341
+
0
-

Aearsis napsal(a):

Misto „default?add=domain“ pravděpodobně hledáš signály.

A na „aby nebylo možné napsat“ budeš potřebovat javascript, nejlepší by asi bylo využít regulárního výrazu jako (http\:\/\/)?(www\.)?([^\.]+\.(cz|eu|com)) po opuštění pole a nahradit jeho obsah jen tou správnou částí.

Prosím ta a čo je lepšie Vytvoriť si nejakú komponentu napr. SearchDomainControl.php a tú predať do BasePresenter.php aby som mohol zobraziť formulár aj v sekcii domény a aj v sekcii objednávky keďže obe dedia z BasePresenter-a.
Alebo ju mám nechať ako továrničku v Presenteri ďakujem.

Editoval SontoEremo (26. 5. 2013 13:32)

hAssassin
Člen | 293
+
0
-

odpovedel sis vicemene sam, ale vicemene spatne :) Samozrejmne ze je lepsi vytvorit to jako komponenty, pokud to budes pouzivat na vice mistech. Ale soucasne je spatne to davat do BasePresenteru, pokud to nebudes vyuzivat vsude (nebo temer vsude). A jelikoz si psal jen o dvou presenterech tak je to zbytecny.

Takze jako komponenta ano, ale tovarnicku bych dal zvlast do OrderPresenter i do DomainPresenter.