předávání php pole do JS v template

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

ahoj všem.

Pls poraďte jak nejlépe předat php pole do JS.

Zatím to řeším:
presenter:

<?php
$neco[0]=5;
$neco[1]=10;
?>

template:

<script>
neco={$neco};
</script>

a vloží se něco takovýhleho:

<script>
neco={"0":"5","1":"10"};
</script>

no a tady nastáva problem s uvozovkama, protože:

neco[0]+neco[1] ⇒ 510 !!!

a jsem linej pořád psat parseFloat(neco[0])+parseFloat[1])

jak se zbavím těch uvozovek? Zkoušl jsem {!neco},{=neco}… a nic… Nebo jak lépe předat pole do JS

Díky

//edit: velikosti písmen

Editoval Rampa (19. 3. 2010 11:08)

toka
Člen | 253
+
0
-

První, co mne bez dlouhého přemýšlení napadlo, je vlastní helper. Zda-li to je jediné a správné řešení, pochybuji :-)

Rampa
Člen | 65
+
0
-

to mě taky napadlo. A napadlo mě i:

<?php
{foreach $neco as $key=>$val){
   neco[{$key}]=$val;
{/foreach}
?>

ale nebude to pak ve zdrojáku na klientovi hezky. A potřebuju poslat těch polí víc…

No prostě jsem myslel na nějakou magic metodu už hotovýho helperu :)

bazo
Člen | 620
+
0
-

to je niaka blbost lebo mne sa normalne vypise neco=[5,10]; bez pouzitia akehokolvek helperu alebo inej manipulacie

Ola
Člen | 385
+
0
-

verze Nette?

toka
Člen | 253
+
0
-

Máte pravdu, normálně to funguje.

Útržky:

...
public function renderDefault() {
  $this->template->pole = array(1,2,3,4,5,6);
}
...
...
<script type="text/javascript">
  /* <![CDATA[ */
  var pole = {$pole}
  /* ]]> */
</script>
...

Výsledek:

...
<script type="text/javascript">
  /* <![CDATA[ */
  var x = [1,2,3,4,5,6]
  /* ]]> */
</script>
...

Nette Framework 0.9.3 (revision cc750ea released on 2010–01–28)

Rampa
Člen | 65
+
0
-

nette verze 0.9.3 s name php 5.3

A opravdu mi to dělá. Tady je realný výstup
template:
options={$options};
a ve zdrojáku je pak toto:
options={"owner":"1","build_priority":"71","auto_fill":"0","tax":"43","build_type":"0"};

jo a ještě maličkost. $options je fetch přes dibi z mySQL
Žádný helpery ani filtry tam nejsou. Akorát je to obalený @{block main} kvůli layotu, ale to by s tím nemělo nic udělat.

//edit:
tak jsem si dal debug::dump($options) a hodilo mi to toto:
`object(DibiRow) (5) {
„owner“ ⇒ string(1) „1“
„build_priority“ ⇒ string(2) „71“
„auto_fill“ ⇒ string(1) „0“
„tax“ ⇒ string(2) „43“
„build_type“ ⇒ string(1) „0“
}
`
takže budu muset nějak dibi přinutit, aby to vrátil jako INT, tak jak je to definováno v mySQL :(

Editoval Rampa (22. 3. 2010 13:22)

toka
Člen | 253
+
0
-

A když dáš Debug::dump($options) tak se opravdu jedná o typ integer? Není to náhodou string?

Rampa
Člen | 65
+
0
-

stejný nápad, ale byl jsi rychlejší :)

toka
Člen | 253
+
0
-

A navíc tento zápis options={"owner":"1","build_priority":"71","auto_fill":"0","tax":"43","build_type":"0"}; je IMHO definice objektu, nikoliv pole.

toka
Člen | 253
+
0
-

Nevím proč, ale $result->detectTypes(); mi nejde, ale když použiješ $result->setType('id',Dibi::FIELD_INTEGER);, tak tato konstrukce nastaví sloupec id jako integer. Proč dibi vrací string, i když se jedná o int, to netuším.

bazo
Člen | 620
+
0
-

nemozes sa cudovat, ked do sablony predavas objekt(DibiRow), ze dostanes zapis objektu a nie pola. nabuduce napis hned, ze je to objekt a nie obycajne pole

toka
Člen | 253
+
0
-

toka napsal(a):

Nevím proč, ale $result->detectTypes(); mi nejde, ale když použiješ $result->setType('id',Dibi::FIELD_INTEGER);, tak tato konstrukce nastaví sloupec id jako integer. Proč dibi vrací string, i když se jedná o int, to netuším.

Jsem „blb“ :-) Nevím proč, ale testoval jsem to na verzi dibi 0.9 (revision 152 released on 2008/10/10 03:35:33). To ještě bylo dibi.compact.php, namísto dnešního dibi.min.php. Nevím, jak se mi to připletlo do testovacího adresáře, taková historie. S poslední verzí následující konstrukce samozřejmě funguje:

...
$result = dibi::query('...');
$result->detectTypes();
// Vypis s korektnimi typy
Debug::dump($result->fetch());
...
toka
Člen | 253
+
0
-

Na to pole se výborně hodí $res->fetchPairs('...', '...'), kde z prvního parametru uděláš klíč a z druhého hodnotu.

Rampa
Člen | 65
+
0
-

vyřešeno stažením nového buildu dibi a přidáním direktivy do configu.

Díky.