Ako preniesť výsledok z „ECHO“ do šablóny
- SontoEremo
- Člen | 341
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">×</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">×</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">×</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)
- Tabetha
- Člen | 140
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">×</a>
</div>
</div>
</div>
- David Matějka
- Moderator | 6445
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
@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">×</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">×</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">×</a>
</div>
</div>
</div>
{else}
<div class="row">
<div class="twelve columns">
<div class="alert-box alert">
{$result}
<a href="" class="close">×</a>
</div>
</div>
</div>
{/if}
Ale aj tak ďakujem za pomoc …
- SontoEremo
- Člen | 341
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">×</a>
</div>
</div>
</div>
{elseif isset($notAvailable)}
<div class="row">
<div class="twelve columns">
<div class="alert-box alert">
{$notAvailable}
<a href="" class="close">×</a>
</div>
</div>
</div>
{else}
{/if}
{/form}
- SontoEremo
- Člen | 341
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">×</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">×</a>
</div>
</div>
</div>
{else}
{/if}
{/form}
- hAssassin
- Člen | 293
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">×</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
@**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
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">×</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
@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">×</a>
</div>
</div>
</div>
- hAssassin
- Člen | 293
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
@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
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 <a href="/webpage/hosting/domain/">Zaregistrovať</a>
</div>
Editoval SontoEremo (24. 5. 2013 21:09)
- jiri.pudil
- Nette Blogger | 1032
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
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
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
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)
- SontoEremo
- Člen | 341
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
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.