sablona pri gmapformcontrol
- stewe
- Člen | 20
zdravim,
pokusam sa vykreslit sablonu pre gmapformcontrol (https://componette.org/search/?…) a nedava mi to zmysel.
Mam prezenter, v nom funkciu aka tovarnu na mapovu komponentu:
<?php
public function createComponentMapForm() {
$form = new Form;
$form->addGmap('map', 'Mapa', array(
'width' => 500,
'height' => 250,
'center' => array(49.124936, 18.33017),
'zoom' => 14,
))->setDefaultValue(array(
'latitude' => 49.398102864265695,
'longitude' => 18.706451738281203,
));
return $form;
}
?>
potom mam funkciu v tom istom prezenteri:
<?php
public function renderTemplate() {
$this->template->form = $this->createComponentMapForm();
}
?>
V tom istom adresari ako je template template.latte (akoze defaultny pre tu komponentu) mam ten php skript s map control (GMapFormControl.php). Pre pochopenie napisem len blok #map z toho template.latte
{block #map}
<div id="{$control_id}-container" class="GMapFormControl">
<label for="{$latitude->id}">Latitude:</label>
{$latitude}
<br />
<label for="{$longitude->id}">Longitude:</label>
{$longitude}
</div>
{/block}
ak vsak chcem vykreslit tu stranku, tak ladenka na mna huci, ze nepozna $control_id. No dobre, tak do renderTemplate chcem pridat
<?php
$this->template->control_id = ....
?>
ale neviem co :/
Proste, ako nazeniem do tej sablony parametre z tej mapy?
- JakubJarabica
- Gold Partner | 184
Ahoj!
Naplnenie šablóny je v réžii komponenty. Konkrétne tu: riadok 113 si komponenta pri renderovaní sama vytvorí vlastnú šablónu a predá jej potrebné info. Nie je mi teda zatiaľ jasné, prečo sa to nezavolá.
Ak som dobre pochopil, tak používaš predvolenú šablónu?
Anyway, vieš sem prosím hodiť aj šablónu presenteru, v ktorej tento
form vykresluješ? Volať factory metódu v renderi do premennej nie je dobré
riešenie. Skúšal si v príslušnej šablóne
{control mapForm}
?
Editoval JAM3SoN (20. 7. 2011 0:02)
- stewe
- Člen | 20
Subor EventsPresenter.php v adresari presenters
<?php
class EventsPresenter extends BasePresenter {
....
public function createComponentMapForm() {
$form = new Form;
$form->addGmap('map', 'Mapa', array(
'width' => 500,
'height' => 250,
'center' => array(49.124936, 18.33017),
'zoom' => 14,
))->setDefaultValue(array(
'latitude' => 49.398102864265695,
'longitude' => 18.706451738281203,
));
return $form;
}
public function renderTemplate() {
$this->template->form = $this->createComponentMapForm();
}
...
}
?>
subor templates/Events/@layout.latte
<html>
<head>
<script type="text/javascript" src="{$basePath}/js/jquery-1.5.1.min.js"></script>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
</head>
<body>
{block #content}
{/block}
{block #map}{/block}
{block #script}{/block}
</body>
</html>
subor templates/Events/template.latte je presne taky isty ako ten defaultny v zipe s komponentou
V tomto istom adresari (templates/Events/) je aj subor GmapFormControl.php. Adresar templates a presenters su v tej istej hlbke vzhladom na /
Uz mi pomaly zacina svitat. Takze ten GmapFormControl.php pouzije vlastnu sablonu template.latte. Ja vsak chcem vykreslit tu komponentu do mojej vlastnej sablony, tak musim pozit tu funkciu setTemplate() pri jej vytvarani v tovarne kde ju specifikujem a potom ako presne odkazem na ten map form?
Nepoznam iny sposob robenia formularov ako cez tovarnu v presenteri. Doteraz mi to celkom slo, rad sa necham poucit ako to robit inak a lepsie. Neviem totiz, ako pridat komponenty do sablony bez toho, ako by som spravil ako si videl hore … $this->template->form = $this->create…();
Sam vidim ze to je hlupost, ten template.latte je „interna“ sablona pre tu map komponentu, len neviem ako ju zaclenit do custom sablony, potreboval by som to napisat viac polopate :)
Editoval stewe (20. 7. 2011 6:55)
- JakubJarabica
- Gold Partner | 184
Ahoj,
takže postupne:
$this->template->form = $this->createComponentMapForm();
toto je zbytočné. Jednak potláčaš lazy loading formulára – v šablóne
sa vetvením nemusíš dostať k jeho vykresleniu, ale aj tak ho máš už
v premennej vyrobený. Po druhé, v šablóne @layout.latte
treba
použiť makro {control mapForm}
, ktoré vykreslí formulár.
Už aj ja začínam chápať ako sa to snažíš použiť. Ja som doporučil dať GmapFormControl do priečinka /libs, aby to nemýlilo s klasickými šablónami presenterov. Ako hovoríš, pri vykreslovaní formulára si Nette interne vytiahne defaultnú(alebo ako to zmeníš, tak inú) šablónu a vykreslí ju. Ty v layoute alebo viewi presenteru nemôžeš definovať bloky ani nič iné.
Takže skús:
- vyhodiť priradenie formu do premennej
- v layoute zavolať makro
{control mapForm}
… a daj vedieť.
Editoval JAM3SoN (20. 7. 2011 9:55)
- stewe
- Člen | 20
podarilo sa :)
spravil som nasledovne:
- hodil som GmapFormControl.php do /libs aj s template.latte
- mapu som siel vykreslit do template-u map.latte
{include '@layout.latte'}
{block #content}
{control mapForm}
{/block}
kde @layout.latte obsahuje
<html>
<head>
<script type="text/javascript" src="{$basePath}/js/jquery-1.5.1.min.js"></script>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
</head>
<body>
{block #content}
{/block}
</body>
</html>
v presenteri je ta ista tovarna / funkcia pre mapu
<?php
public function createComponentMapForm() {
$form = new Form;
$form->addGmap('map', 'Mapa', array(
'width' => 500,
'height' => 250,
'center' => array(49.124936, 18.33017),
'zoom' => 14,
))->setDefaultValue(array(
'latitude' => 49.398102864265695,
'longitude' => 18.706451738281203,
));
return $form;
}
?>
vyhodil som komplet funkciu public function renderMap() { $this->template …}, ani tam nie je treba …
takze pochopil som to, len toto je len pokusna sablona a treba to este zakomponovat do formulara co uz mam spraveny. Takze teoreticky by to malo ist tak, ze len pridam $form->addGmap() do existujuceho formulara, avsak pojde to aj v tom pripade? pretoze teraz vykreslujem ten velky formular, ktoreho sucastou bude aj ta mapa, do {form eventAddForm} kde zaciatok tej sablony vyzera ako
{include '@layout.latte'}
{block #content}
{form eventAddForm}
... tu je cely formular a sem treba nejako este zaclenit {control mapForm}
zial cas ma suri, ak ma nakopnes a ozrejmis budem len rad.
diky
- JakubJarabica
- Gold Partner | 184
Skvelé!
Ak chceš mapu začleniť do existujúceho formulára, tak do factory metódy
createComponentEventAddForm ako píšeš pridaj
$form->addGmap(...)
a v šablóne sa to vykreslí rovno pri
volaní {form eventAddForm}
. Nie je nutné žiadno hackovať
šanblóny ani nič, s počiatočným chovaním stačí len pridať do projektu
knižnicu a zavolať addGmap, o všetko sa postará už FW.
Snáď som ťa dobre pochopil :)
- stewe
- Člen | 20
urcite to myslis dobre, lenze ja ako na potvoru vykreslujem ten formular rucne, takze ked napr. definujem pole pre email v tej tovarni ako:
<?php
$form->addText('email', 'Email:')
->setEmptyValue('@')
->setRequired('Prosím vyplnte email')
->addRule(Form::EMAIL, 'Emailová adresa nie je validná');
?>
a vykreslim ho v template-e ako
<tr class="required"><th align="right">{label email /}</th><td>{input email} *</td></tr>
tak potom ked do tej tovarne pridam tu mapu cez $form->addGmap(…), tak v tej sablone dokazem vykreslit tu mapu jedine ako
{form eventAddForm}
...
<tr class="required"><th align="right"></th><td>{control mapForm}</td></tr>
...
{/form eventAddForm}
potreboval by som pristupit k dvom prvkom, k prvku {label mapForm} cize ku textovemu stringu „Mapa“, a k mape samotnej, tj nieco ako {input mapForm}
Editoval stewe (21. 7. 2011 2:35)
- JakubJarabica
- Gold Partner | 184
Prečo analogicky ako manuálne renderuješ e-mail nerenderuješ aj mapu? Je to taký istý prvok ako email.
V mojej aktuálnej verzii nette mi nechcú šlapať makrá {input ..} a {label .. /}, tak manuálny render formulára z príkladu v addons vyzerá takto:
<?php
{control mapForm begin}
{control mapForm errors}
{$control['mapForm']['mapa']->label}
{$control['mapForm']['mapa']->control}
{$control['mapForm']['ok']->control}
{control mapForm end}
?>
- stewe
- Člen | 20
ahaa, no jasne. vyborne, posledna vec a budem maximalne spokojny :)
male repete:
map.latte
{include '@layout.latte'}
{block #content}
{control mapForm begin}
{control mapForm errors}
{$control['mapForm']['mapa']->label}
{$control['mapForm']['mapa']->control}
{$control['mapForm']['ok']->control}
{control mapForm end}
{/block}
<?php
protected function createComponentMapForm($name) {
$form = new Form($this, $name);
$form->addGmap('mapa', 'Mapa', array(
'width' => 500,
'height' => 250,
'center' => array(49.124936, 18.33017),
'zoom' => 14,
))
->setDefaultValue(array(
'latitude' => 49.398102864265695,
'longitude' => 18.706451738281203,
));
$form->addSubmit('ok', 'Send');
$form->onSuccess[] = callback($this, 'mapFormSubmitted');
return $form;
}
public function mapFormSubmitted($form) {
Debug::dump($form->getValues());
}
?>
dump mi vyhodi, ze longitude a latitude su prazdne, teraz proste kliknem niekam do Puchova, kde to je defaultne nastavene, objavi sa marker, submitnem to a toto je vysledok dumpu:
<?php
Nette\ArrayHash(1) {
mapa => array(2) {
latitude => ""
longitude => ""
}
}
?>
vsimol som si, ze pri kresleni mapy tam obcas prebliknu input polia pre longitude a latitude, tie su sucastou tej mapy alebo su to nejake skryte polia? ako si to vykreslim?
skusal som veci ako {$control[‚mapForm‘][‚mapa‘]->latitude} ale samozrejme to nejde.
- stewe
- Člen | 20
vymenil som jquery 1.5.1 za
http://code.jquery.com/jquery-1.4.2.js
a kdekolvek marker oznacim, debug pise stale tie iste hodnoty, defaultne
Nette\ArrayHash(1) {
mapa => array(2) {
latitude => "49.398102864266" (15)
longitude => "18.706451738281" (15)
}
}
od tejto verzie vyssie su v longitude a latitude prazdne hodnoty
- JakubJarabica
- Gold Partner | 184
Vďaka, dostal som sa k tomu až teraz, už som to mergeol. Cez víkend aj upravím dokumentáciu, aby bolo jasnejšie ako to funguje.
- stewe
- Člen | 20
samotna komponenta funguje super ale problem je v tom, ze ak mam velky formular, kde ta mapa ma byt len jedna polozka (ako ten mail), tak potom nie som schopny pri odoslani toho formulara mat nacitane aj hodnoty z mapy. teraz ma ta mapa svoje vlastne send tlacitko. ak aj odoslem ten „velky“ formular, tak stlacenie send tlacitka tohto formulara nesposobi stlacenie send tlacitka mapy a teda v dump-e je map ⇒ null. inak ako cez {$control[‚mapForm‘][‚mapa‘]->label} atd nie som schopny prvky tej mapy vykreslit a neviem ako to proste dat dokopy.
v konecnom dosledku mi ide o to, ze uzivatel sam, ak chce, oznaci miesto na mape a toto sa odosle a spracuje. nechcem mat dva formulare a ani neviem, ako by som spracoval oba formulare kliknutim na submit toho „velkeho“ formulara s tym, ze sa mi tie hodnoty z mapy dajako presunu na stranu servera.
s jquery by sa dalo nejako krkolomne osetrit, ze by sa stlacilo pri stlaceni formularoveho tlacitka aj to mapove, ale to je nad moje jquery a nette schopnosti
Editoval stewe (22. 7. 2011 15:23)
- JakubJarabica
- Gold Partner | 184
Mne to funguje aj ako súčasť väčšieho formulára bez problémov.
Ono ta komponenta funguje takto:
- vytvorí si latitude a longitude inputy, ktoré sú zobrazené ak máš vypnutý JS
- ak máš zapnutý JS, tak JS ich skryje, presunie v rámci formu(už neviem presne prečo), vytvorí mapu a nabinduje jej click eventy, ktoré plnia tie skryté inputy.
Nemáš to niekde live? Stačilo by aj do mailu. Možno ak používaš vlastný renderer na form môže blbnúť Javascript. Dosť by to pomohlo, vo firebugu by som videl ako sa skrývajú a presúvajú inputy, či sa napĺňajú pri onClick/drag evente na mape. Prípadne mi napíš na ICQ, kde to vieme vyriešiť rýchlejšie.
- stewe
- Člen | 20
tak som na to prisiel, stacilo prepisat $control na $form
{$form['mapa']->label}
{$form['mapa']->control}
teraz to fici aj v tom velkom formulari, ked to dumpnem, tak mam hodnoty v
<?php
mapa => array(2) {
latitude => "49.398102864266" (15)
longitude => "18.706451738281" (15)
}
?>
- JakubJarabica
- Gold Partner | 184
Ako sa volá tvoja factory metóda na vytváranie veľkého formu aj s mapou a ako si to volal v šablóne s tou $control? Ak teraz normálne v šablóne máš $form, nevyužívaš dobre lazy loading komponenty(vytváraš ju vždy, aj keď niekedy nebude musieť byť vytvorená a obchádzaš Nette makrá). Anyway hlavne, že to ide :)
- stewe
- Člen | 20
<?php
class EventsPresenter extends BasePresenter {
protected function createComponentEventAddForm() {
$form = new Form;
....
?>
to je hlavny form aj s mapou, potom uz nemam nic ako renderAdd() { $this->template->form = $this->createComponentEventAddForm(); }
templates/Events/add.late vyzera potom
{include '@layout.latte'}
{block #content}
{form eventAddForm}
Editoval stewe (23. 7. 2011 0:46)
- JakubJarabica
- Gold Partner | 184
Hm, ja som to podľa tvojho popisu skúšal v sandboxe a fungovalo mi to fajn.