Zend Framework 1.6 a ajax pomocí jQuery
Jak jsem psal v Zend Framework 1.6 a moje zkušenosti s Dojo TabContainer, nakonec jsem použil jQuery. Ve formuláři se dají měnit některá data, které jsou závislá na dalších, které automaticky předvyplňuji a na to jsem použil při změnách ajax. Docela mě potěšilo jak jednoduše a pěkně se to dá udělat pomocí jQuery.
<script>
$(document).ready(function(){
$("#example > ul").tabs();
$('#page1-deadline_vyzva').datepicker();
$('#page3-datum_zahajeni').datepicker();
$('#page3-datum_ukonceni').datepicker();
$('#page1-editor').change(function(){
$.ajax({
type: "POST",
url: "<?php echo $this->baseUrl();?>/user/info/idcvut/" + $(this).val(),
success: function(xml){
if ($.browser.msie)
{
xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async="false";
xmlDoc.loadXML(xml);
$("#page1-navrhovatel_jmeno")[0].value = xmlDoc.getElementsByTagName("name")[0].childNodes[0].nodeValue;
$("#page1-navrhovatel_email")[0].value = xmlDoc.getElementsByTagName("email")[0].childNodes[0].nodeValue;
$("#page1-navrhovatel_telefon")[0].value = xmlDoc.getElementsByTagName("phone")[0].childNodes[0].nodeValue;
$("#page1-navrhovatel_pracoviste")[0].value = xmlDoc.getElementsByTagName("dept")[0].childNodes[0].nodeValue;
}
else
{
$("#page1-navrhovatel_jmeno")[0].value = $("name", xml).text();
$("#page1-navrhovatel_email")[0].value = $("email", xml).text();
$("#page1-navrhovatel_telefon")[0].value = $("phone", xml).text();
$("#page1-navrhovatel_pracoviste")[0].value = $("dept", xml).text();
}
}
}); // end ajax
}); // end change function
}); // end document ready
</script>
...
Původní skript jsem rošířil o několik dalších funkcí, přidal jsem datapickery pro datumy a potom ten ajax. Nejprve pomocí vybere prvek a přidáme mu attribut onChange.
$('#page1-editor').change(function(){ … });
Do této funkce jsem vložil volání ajaxu. Je to jednoduché a dobře pochopitelné. Type je typ GET nebo POST, v url je URL Controlleru, který vrací XML s potřebnými daty. Pomocí $(this.val) si šáhnu na vyplněnou hodnotu v políčku na které jsem aplikoval onChange(). Success vrací data, které si jednoduše parsuji přes $(„name“, xml).text(), kde name je <name></name> z xml dat, které posílá php.
Je to jednoduché a moc pěkný kód, který najde uplatnění. Dobré je, že není potřeba do formuláře přidávat do atributů funkci onchange, jak jsem to musel dělat, když jsem nepoužívat jQuery.
Ještě přidám část kódu z controlleru:
…
function infoAction()
{
$this->_helper->layout->disableLayout();
$this->_helper->getHelper('ViewRenderer')->setNoRender();
$idcvut = (int)$this->_request->getParam('idcvut');
//echo $idcvut;
$ssu = new Usermap($this->config);
// make xml
//Zend_Debug($i);
$i=$ssu->getUsermapInfoByID($idcvut);
$xml = '<user><name>'.$i[‘cn’].'</name><email>'.$i['email'].'</email><phone>'.$i[‘phone’].'</phone><dept>'.$i[‘department’].'</dept></user>';
echo $xml;
}
…
Snad to někomu pomůže, moc příkladů na Zend a jQuery ajax jsem nikde nenašel.
Pokud se někomu špatně zobrazuje v IE 6,7 kód, tak má dvě možnosti. Použít Firefox, Chrome, Safari nebo Operu (tady je zas chyba v odsazení kódu) nebo IE8, tam je to ok. Doufám, že to v GSH časem opraví.
Ale co je toto za „prasacinka“:
url: „baseUrl();?>/user/info/idcvut/“ +…
Od coho je ZF view helper „url()“. Okrem toho v action Controllery je vhodne kontrolovat, ci dosly request je AJAXoveho typu, vsetkym ostatnym vykreslit chybovu/informacnu stranku:
function infoAction()
{
if ($this->_request->isXmlHttpRequest()) {
// horeuvedeny kod
} else {
// inf pre nahodneho okoloiduceho
}
}
Samozřejme by toto bylo asi elegantni: url: „< ?php echo $this->url(array(‘controller’=>’user’,'action’=>’info’,'idcvut’=> $this->id)); ?>,
ale problem byl jak to spojit s tim kusem javascriptovym $(this.val) tak jsem to udelal jako strinf. Samozrejme reseni s kontrolou kontroleru me nenapadlo, diky za tu radu.