Ajax – ako zavolat metodu handleNieco cez javascript?
- maria288
- Člen | 38
majme metodu
<?php
protected $pom;
public function handleinsert($pomocna)
{
$this->template->pom = $pomocna;
}
?>
kde handle je nakonfigurovany v BasePresentery
chcem zavolat na udalost onChange selectboxu call handler
skusala som uz vselico
<script>
$("#blabla").live("change", function() {
// tu mam zavolat
$.get(..blabla..);
alert({$pom});
return false;
} );
</script>
poradte nieco dik
- nanuqcz
- Člen | 822
Ahoj, chápu to správně, že chceš po změně selectboxu dostat do
javascriptu proměnnou {$pom}
? Stačilo by to takhle?
public function handleInsert()
{
echo 'obsah proměnné $pom';
$this->terminate();
}
<script>
$("#blabla").live("change", function() {
$.get({link insert!}, function(data){
alert(data);
});
return false;
} );
</script>
Editoval xxxObiWan (10. 6. 2011 17:44)
- Mikulas Dite
- Člen | 756
Tak, nebo čistěji spíš
public function handleInsert($temp)
{
$this->sendResponse(Nette\Application\Responses\JsonResponse(array('temp' => $temp)));
}
$.get({link insert!, 'temp' => 'nejaka hodnota'}, function(response) {
alert(response.temp);
});
Editoval Mikulas Dite (10. 6. 2011 17:48)
- maria288
- Člen | 38
zmeni sa vlastne hodnota pom ?
ked ju chcem vlozit do templatu ? do remennej $pom ?
ked to zavolam ok vojde dnu ale nenastavi tu premennu do pom .. iba ak vypisem
alert (payload.pom)
ale premenna $pom je stale rovnaka ked ju vypisem alert({$pom})
uestla napsal(a):
Tak, nebo čistěji spíš
protected $pom; public function handleInsert() { $this->payload->pom = $this->pom; $this->sendPayload(); }
<script> $.get({link insert!}, function(payload) { alert(payload.pom); }); </script>
- maria288
- Člen | 38
ja skor potrebujem do premenne pom nieco vlozit a potom s nou pracovat na stranke
xxxObiWan napsal(a):
Ahoj, chápu to správně, že chceš po změně selectboxu dostat do javascriptu proměnnou
{$pom}
? Stačilo by to takhle?public function handleInsert() { echo 'obsah proměnné $pom'; $this->terminate(); }
<script> $("#blabla").live("change", function() { $.get({link insert!}, function(data){ alert(data); }); return false; } ); </script>
- nanuqcz
- Člen | 822
maria288 napsal(a):
ja skor potrebujem do premenne pom nieco vlozit a potom s nou pracovat na stranke
To můžeš, ale protože ji získáš přes AJAX, dostaneš ji do proměnné
pom
jen v javascriptu. PHP proměnné už jsou v té době dávno
vykreslené → HTML stránku tak můžeš měnit jen přes javascript.
Možná chceš něco takového?
<script>
$.get({link insert!}, function(data){
$('#selectMessage').html(data); //do divu s id="selectMessage" vloží získané data (např. zprávu "tento prvek si vybrat nemůžeš :-P")
});
</script>
Dokud neřekneš, na co to konkrétně potřebuješ, asi ti nikdo víc neporadí.
- maria288
- Člen | 38
jasne na zaklade toho co si vyberiem z comba, poslem vybrane id cez handler a nastavim nejaku premennu … a potom cez snippet zavolam invalidate snippet a zmenim vybrane veci do druheho comba
xxxObiWan napsal(a):
maria288 napsal(a):
ja skor potrebujem do premenne pom nieco vlozit a potom s nou pracovat na stranke
To můžeš, ale protože ji získáš přes AJAX, dostaneš ji do proměnné
pom
jen v javascriptu. PHP proměnné už jsou v té době dávno vykreslené → HTML stránku tak můžeš měnit jen přes javascript.Možná chceš něco takového?
<script> $.get({link insert!}, function(data){ $('#selectMessage').html(data); //do divu s id="selectMessage" vloží získané data (např. zprávu "tento prvek si vybrat nemůžeš :-P") }); </script>
Dokud neřekneš, na co to konkrétně potřebuješ, asi ti nikdo víc neporadí.
- 22
- Člen | 1478
mám pocit, že jí jde spíš o snippety:
...
$("#blabla").live("change", function(e) {
$.get({link insert!};
e.preventDefault();
});
...
...
public function handleInsert()
{
$this->value = 'new value';
$this->invalidateConotrol('div');
}
...
public function renderDefault()
{
$this->template->value = $this->value;
}
...
{snippet div}
{$value}
{/snippet}
...
edit: nezapomeň si nalinkovat jquery.nette.js
s doplňků…
Editoval 22 (11. 6. 2011 14:21)
- maria288
- Člen | 38
<?php
public function renderDefault()
{
$this->template->krajeid = $this->krajeid;
var_dump((object)$this->krajeid);exit;
}
public function handleSelectedKraj($id)
{
$this->krajeid =(object)$this->baseModel->getKraje($id);
$this->invalidateConotrol('selectKraj');
$this->sendPayload();
}
{snippet selectKraj}
<select name="reg_kraj" id="reg_kraj">
<option value="0">
</option>
{if isset($krajeid)}
{foreach $krajeid as $kraj}
<option value="{$kraj->id}">
{$kraj->nazov}
</option>
{/foreach}
{/if}
</select>
{/snippet}
?>
<script>
$(document).ready(function() {
$(‚#reg_stat‘).live(‚change‘,function(e) {
$.get({link SelectedKraj!, ‚id‘ ⇒ 1});
e.preventDefault();
alert({$krajeid})
} );
} );
</script>
22 napsal(a):
mám pocit, že jí jde spíš o snippety:
... $("#blabla").live("change", function(e) { $.get({link insert!}; e.preventDefault(); }); ...
... public function handleInsert() { $this->value = 'new value'; $this->invalidateConotrol('div'); } ... public function renderDefault() { $this->template->value = $this->value; }
... {snippet div} {$value} {/snippet} ...
edit: nezapomeň si nalinkovat
jquery.nette.js
s doplňků…
- 22
- Člen | 1478
protože sendPayload() ukončí presenter.. ale takhle bych to asi neřešil a navíc už je na to tu komponenta https://componette.org/search/?…
- maria288
- Člen | 38
no jop ale aj tak hlasi chybu :
Fatal error: Uncaught exception ‚DibiDriverException‘ with message ‚Unknown column 'preklad_insert!‘ in ‚field list'' in C:\xampp\htdocs\realvea_sk\libs\dibi\dibi.min.php:856 Stack trace: #0 C:\xampp\htdocs\realvea_sk\libs\dibi\dibi.min.php(214): DibiMySqlDriver->query(‘?? …‚) #1 C:\xampp\htdocs\realvea_sk\libs\dibi\dibi.min.php(200): DibiConnection->nativeQuery(‘?? …‚) #2 C:\xampp\htdocs\realvea_sk\libs\dibi\dibi.min.php(754): DibiConnection->query(Array) #3 C:\xampp\htdocs\realvea_sk\app\models\BaseModel.php(189): dibi::fetchPairs(‘?? …‚) #4 C:\xampp\htdocs\realvea_sk\app\presenters\BasePresenter.php(118): BaseModel::getTranslations('insert!‘) #5 C:\xampp\htdocs\realvea_sk\libs\Nette\nette.min.php(1646): BasePresenter->startup() #6 C:\xampp\htdocs\realvea_sk\libs\Nette\nette.min.php(802): NPresenter->run(Object(NPresenterRequest)) #7 C:\xampp\htdocs\realvea_sk\app\bootstrap.php(53): NApplication->run() #8 C:\xampp\htdocs\realvea_sk\index.php(31): require(‚C:\xampp\htdocs…‘) #9 in C:\xampp\htdocs\realvea_sk\libs\dibi\dibi.min.php on line 856
- 22
- Člen | 1478
no ale ta chyba je z MySQL (neexistující sloupec
preklad_insert!
), takže buď máš chbu v nějakém MySQL dotazu,
napřed prosím ověř funkci bez AJAXu a až pak přidej AJAX.
Edit: tak ze všeho nejdřív ti to ale musí fungovat aspoň první načtení presenter+šablona :-)
Editoval 22 (11. 6. 2011 21:16)
- maria288
- Člen | 38
no ten poziadavok je
GET
500
Internal Server Error
22 napsal(a):
no ale ta chyba je z MySQL (neexistující sloupec
preklad_insert!
), takže buď máš chbu v nějakém MySQL dotazu, napřed prosím ověř funkci bez AJAXu a až pak přidej AJAX.Edit: tak ze všeho nejdřív ti to ale musí fungovat aspoň první načtení presenter+šablona :-)
- maria288
- Člen | 38
layout
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="description" content="Nette Framework web application skeleton">
<meta name="robots" content="{$robots}" n:ifset="$robots">
<title>Nette Application Skeleton</title>
<link rel="stylesheet" media="screen,projection,tv" href="{$basePath}/css/screen.css" type="text/css">
<link rel="stylesheet" media="print" href="{$basePath}/css/print.css" type="text/css">
<link rel="shortcut icon" href="{$basePath}/favicon.ico" type="image/x-icon">
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
<script type="text/javascript" src="{$basePath}/js/jquery.nette.js"></script>
<script type="text/javascript">
$("a.ajax").live("click", function (event) {
event.preventDefault();
$.get(this.href);
});
</script>
</head>
<body>
{foreach $flashes as $flash}<div class="flash {$flash->type}">{$flash->message}</div>{/foreach}
@{include #content}
</body>
</html>
homePage.phtml
@{block content}
<a class="ajax" href="{link Insert!}">aaaaaaaaa</a>
{snippet div}
{$value}
{/snippet}
<div id="wrapper">
</div>
presenter Homepage
<?php
/**
* My Application
*
* @copyright Copyright (c) 2010 John Doe
* @package MyApplication
*/
class HomepagePresenter extends BasePresenter
{
public $value = "any value";
public function handleInsert()
{
$this->value = 'new value';
$this->invalidateConotrol('div');
}
public function renderDefault()
{
$this->template->value = $this->value;
}
public function handleLoadItems($id)
{
static $items = array(
'fruits' => array(
'Pear',
'Apple',
'Melon',
'Banana',
),
'vegetables' => array(
'Salad',
'Garlic',
'Onion',
'Carrot',
),
);
if(isset($items[$id]))
$this->template->items = $items[$id];
// else: Don't fill in anything
$this->invalidateControl('ajaxDemo');
}
}
a vypisuje GET http://localhost:8080/…cument_root/?… 500 (Internal Server Error)
Editoval maria288 (11. 6. 2011 21:33)