Zdvojené renderovanie FormControl
- OndroNR
- Člen | 8
Mám problém so zdvojeným renderovaním vlastného FormControl. Prvý sa ukáže na svojom mieste a druhý (vrátane tabulky) na konci formu pred CSRF tokenom.
<?php
class GMapsControl extends NFormControl
{
/** @var Html container element template */
protected $container;
protected $gmapsdiv;
protected $latId = null;
protected $longId = null;
protected $enableAddress = false;
protected $mestomcastId = null;
protected $streetId = null;
protected $numberId = null;
protected $homeLat = null;
protected $homeLong = null;
/**
* @param string label
*/
public function __construct($label = NULL)
{
parent::__construct($label);
$this->gmapsdiv = NHtml::el('div');
$this->gmapsdiv->class[] = 'gmaps';
//$this->gmapsdiv->setText('bu');
$this->container = NHtml::el();
}
public static function addGMapsControl(NForm $form, $name, $label)
{
return $form[$name]=new self($label);
}
protected function updateRel()
{
$this->gmapsdiv->rel = json_encode(array(
'address' => $this->enableAddress,
'latId' => $this->latId,
'lngId' => $this->longId,
'mestomcastId' => $this->mestomcastId,
'streetId' => $this->streetId,
'numberId' => $this->numberId,
'homeLat' => $this->homeLat,
'homeLng' => $this->homeLong,
));
}
public function setAddress($bool)
{
$this->enableAddress = $bool;
}
public function setAddressElements($mestomcast, $street, $number)
{
$this->mestomcastId = $mestomcast;
$this->streetId = $street;
$this->numberId = $number;
$this->enableAddress = true;
$this->updateRel();
}
public function setCoordElements($lat, $long)
{
$this->latId = $lat;
$this->longId = $long;
$this->updateRel();
}
public function setHome($lat, $long)
{
$this->homeLat = $lat;
$this->homeLong = $long;
$this->updateRel();
}
public function getControl()
{
//dump('getcontrol');
//dump(debug_backtrace());
$container = clone $this->container;
$container->add($this->gmapsdiv);
return $container;
}
?>
<?php
// BasePresenter
protected function startup()
{
parent::startup();
...
NFormContainer::extensionMethod('addGMapsControl', 'GMapsControl::addGMapsControl');
...
}
?>
<?php
// tvorba formu
$form->addGMapsControl('gmaps', 'Poloha:');
$form['gmaps']->setAddressElements($form['mestomcast']->getHtmlId(), $form['ulica']->getHtmlId(), $form['cislo']->getHtmlId());
$form['gmaps']->setCoordElements($form['lat']->getHtmlId(), $form['long']->getHtmlId());
$form['gmaps']->setHome(48.743, 19.313); // stred slovenska
?>
Control vloží <div class="gmaps"></div>
na ktorý
sa cez JS vložia mapy aj s ich obsluhou. getControl()
sa zavolá
2×. PswdInput sa zobrazí normálne, čiže predpokladám chybu v mojom kóde.
Používam najnovšie Nette 1.0 prefixed na PHP 5.3 (vývoj aplikácie začal
na 5.2). Prosím o pomoc, ďakujem.
Ešte ma napadá… ako donútiť aby sa ‚rel‘ neescapovalo? Teraz to riešim v JS – vymením entity za úvodzovky.
Editoval OndroNR (4. 9. 2010 14:28)
- OndroNR
- Člen | 8
klonovanie – prebral som to z addonu Captcha.. ked tam priamo dam
$container = NHtml::el();
tak sa nič nezmení. Nepomôže ani
priamo vrátiť control return $this->gmapsdiv;
rel
– buď neviem ako to spraviť alebo to nepomôže
<?php
// žiadna zmena, setText tiež nič nezmení
$rel = NHtml::el();
$rel->add(json_encode(array(
'address' => $this->enableAddress,
'latId' => $this->latId,
'lngId' => $this->longId,
'mestomcastId' => $this->mestomcastId,
'streetId' => $this->streetId,
'numberId' => $this->numberId,
'homeLat' => $this->homeLat,
'homeLng' => $this->homeLong,
)));
$this->gmapsdiv->rel = $rel;
?>
- westrem
- Člen | 398
Uz ma napadlo kde mas chybu. Vid tento riadok Treba tomu controlu nastavit ze bol rendered, inak to Form nevie a preto este dodatocne vykresli na konci formulara pred CSRF.
K tomu neescapovanemu rel
, tam som myslel setHtml
,
nie add
ani setText, tie sa obe escapuju.
- OndroNR
- Člen | 8
Ďakujem, nastaviť rendered
pomohlo :)
Ani setHtml
nepomôže. Control sám escapuje aj
data
atribúty aj normálne atribúty :( a tú podivnú formu JSON
čo robí nette-rules
neprejde cez jQuery parser, ani validátor :(
Už sa v tom strácam, teraz som zistil, že to funguje aj bez
relstr.replace('"', '"');
pričom v HTML zdrojáku je " a
pri alert($(this).attr('rel'));
to vypíše neescapované.
Prevádza to jQuery naspäť na použiteľnú formu automaticky?
- Matúš Matula
- Člen | 257
Necital som to cele, ale k tomu escapovaniu ma napadlo, ci nemas prave na mysli nette feature context-sensitive escaping, pozri napr. do dokumentacie