Ajax – ako zavolat metodu handleNieco cez javascript?

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

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

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

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)

uestla
Backer | 796
+
0
-

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

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

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

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

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

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
+
0
-
<?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">
      &nbsp;
      </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ů…

maria288
Člen | 38
+
0
-

nefunguje mi to ani s tymto .. netusim preco sa combo neprerenderuje

22
Člen | 1478
+
0
-

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/?…

nanuqcz
Člen | 822
+
0
-

Zakomentuj (odstraň) řádek

$this->sendPayload();

Tím ho odesíláš, ještě než se do $this->payload stačí uložit obsahy invalidovaných snippetů. Neboj se, Nette pak ten payload odešle za tebe automaticky.

maria288
Člen | 38
+
0
-

myslela som toto nejak nefunguje neprekresli sa mi snippet .. asi tam bude niekde chyba

<?php
	public function handleSelectedKraj($id)
	{
		$this->krajeid =(object)$this->baseModel->getKraje($id);
		$this->invalidateConotrol(‚selectKraj‘);
	}

?>
maria288
Člen | 38
+
0
-

viete mi dat jednoduchy priklad na snippet … mne tu nic v tom nette nefunguje uz som zufala dik

22
Člen | 1478
+
0
-

tohle nestačí? akorat si v šabloně udělej nějaký odkaz místo toho slectboxu a uprav jQuery volání a mělo by to fungovat..

Editoval 22 (11. 6. 2011 20:12)

maria288
Člen | 38
+
0
-

skusam nejde .. tak netusim kde je chyba .. :(

22 napsal(a):

tohle nestačí? akorat si v šabloně udělej nějaký odkaz místo toho slectboxu a uprav jQuery volání a mělo by to fungovat..

22
Člen | 1478
+
0
-

podívej se ve Firebugu, jestli probíha nějaký XHR požadavek.., pošli sem presenter a šablonu. nette.jquery.js máš zalinkované?

maria288
Člen | 38
+
0
-

musi to byt v bloku ?

{block content}
<a id=„blabla“ >aaaaaaaaa</a>
{snippet div}
{$value}
{/snippet}
{/block}

maria288
Člen | 38
+
0
-

mam nalinkovane, ziadna chyba nie je

22 napsal(a):

podívej se ve Firebugu, jestli probíha nějaký XHR požadavek.., pošli sem presenter a šablonu. nette.jquery.js máš zalinkované?

22
Člen | 1478
+
0
-

no jistě, že to musí být v bloku a co ten požadavek?

Editoval 22 (11. 6. 2011 21:00)

maria288
Člen | 38
+
0
-

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

maria288
Člen | 38
+
0
-

ja ani neviem co ti poslat, je to komplet projekt a .. mam pocit ze v nom niekde je chyba a asi si to treba vysusat na cistom projekte

22 napsal(a):

no jistě, že to musí být v bloku a co ten požadavek?

maria288
Člen | 38
+
0
-

a ano je tam poziadavok get

maria288
Člen | 38
+
0
-

aj na cistom projekte to padne na
Nette\Application\BadRequestException #404

22
Člen | 1478
+
0
-

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

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 :-)

22
Člen | 1478
+
0
-

těžko říct, už jsem psal, aby jsi poslala presenter a šablonu, z tohodle se nic nepozná. Napřed musíš zajistit fungovaní toho MySQL dotazu nebo ho vyhoď, ať ti nekomplikuje život prozatím..

Editoval 22 (11. 6. 2011 21:24)

maria288
Člen | 38
+
0
-

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)

22
Člen | 1478
+
0
-

kterou verzi Nette používáš? Jestli 2, tak zavináče už tam nepatří.
Handler se volá s malým písmenem {link insert!}