sablona pri gmapformcontrol

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

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

podarilo sa :)

spravil som nasledovne:

  1. hodil som GmapFormControl.php do /libs aj s template.latte
  2. 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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-
<?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
+
0
-

Hm, ja som to podľa tvojho popisu skúšal v sandboxe a fungovalo mi to fajn.