AJAX – nefunkčnost některých odkazů

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

Zdravím,

zkouším rozchodit ajax a nějak mi blbnou odkazy. Používám nette.ajax.js a mám komponentu menu, kde jsem odkazům přiřadil class=„ajax“. Pokud kliknu v menu na odkaz první úrovně <ul><li> tak se mi požadavek provede a v network mám zobrazen typ application/json, pokud kliknu na odkaz druhé úrovně <ul><li><ul><li> tak se mi nic neprovede a v network je typ text/html. Nevíte v čem by mohl být problém?

iguana007
Člen | 970
+
0
-

Tipoval bych to spíše na CSS problém (z-index apod.) – tj. že ti ten link něco překrývá a event click se nezavolá.
Začal bych tím, že bych si zkusil vypnout komplet CSSka (třeba takto: http://stackoverflow.com/…ing-purposes ) a vyzkoušel, jestli ten odkaz funguje.

EDIT: beru zpět … tvůj popis „tak se mi nic neprovede a v network je typ text/html“ jsem pochopil tak, že se ti tam neprovede vůbec žádné volání směrem na server – pochopil jsem to až po přečtení komentářů níže, takže v css problém nebude

Editoval iguana007 (20. 8. 2014 15:55)

CZechBoY
Člen | 3608
+
0
-

No a co to teda vrátí s tim text/html? Že by error?

dex11
Člen | 11
+
0
-

Tak jsem to zkusil a nefunguje to ani s vypnutyma stylama :(

dex11
Člen | 11
+
0
-

prave 200 ok

jiri.pudil
Nette Blogger | 1032
+
0
-

Ukaž nějaký kód: kde a jak vytváříš ty odkazy + zpracování v presenteru.

iguana007
Člen | 970
+
0
-

@dex11 a co je v té odpovědi?

dex11
Člen | 11
+
0
-

vrátí to celou stránku v html
hlavička:
`Remote Address:::1:80
Request URL:http://…
Request Method:GET
Status Code:200 OK
Request Headersview source
Accept:/
Accept-Encoding:gzip,deflate,sdch
Accept-Language:cs-CZ,cs;q=0.8,en;q=0.6
Connection:keep-alive
Cookie:PHPSESSID=5kq9um1ikvt3ukrgksqkop3oi1; nette-browser=icmtyq4wh4
Host:localhost
Referer:http://…
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36
X-Requested-With:XMLHttpRequest
Response Headersview source
Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection:Keep-Alive
Content-Length:5220
Content-Type:text/html; charset=utf-8
Date:Thu, 21 Aug 2014 05:29:06 GMT
Expires:Thu, 19 Nov 1981 08:52:00 GMT
Keep-Alive:timeout=5, max=100
Pragma:no-cache
Server:Apache/2.4.9 (Win32) OpenSSL/1.0.1f PHP/5.5.14
Set-Cookie:PHPSESSID=5kq9um1ikvt3ukrgksqkop3oi1; path=/; httponly
Set-Cookie:nette-browser=icmtyq4wh4; path=/; httponly
Vary:X-Requested-With
X-Frame-Options:SAMEORIGIN
X-Powered-By:Nette Framework
`

dex11
Člen | 11
+
0
-

šablona menu:

  <script src="{$basePath}/js/menu-left.js"></script>

   <div class="menu-left">
    <div id="left">

    <ul>

      {foreach $config['left'] as $level1}

        {if $level1['target'] == '#'}
            <li><h3><span class="glyphicon glyphicon-{$level1['icon']}"></span>{$level1['text']}</h3>
        {else}
            {ifset $level1['action']}
                {var $action=$level1['action']}
            {else}
                {var $action='Default'}
            {/ifset}
            {if $user->isAllowed($level1['target'],$action)}
                <li><h3><a href="{$presenter->link($level1['target'].':'.$action)}" class="ajax"><span class="glyphicon glyphicon-{$level1['icon']}"></span>{$level1['text']}</a></h3>
            {/if}
        {/if}

        {ifset $level1['items']}
            <ul>
                {foreach $level1['items'] as $level2}
                    {ifset $level2['action']}
                        {var $action=$level2['action']}
                    {else}
                        {var $action='Default'}
                    {/ifset}
                    {if $user->isAllowed($level2['target'],$action)}
                        <li><a href="{$presenter->link($level2['target'].':'.$action)}" class="ajax">{$level2['text']}</a></li>
                    {/if}
                {/foreach}
            </ul>
        {/ifset}
            </li>

      {/foreach}
    </ul>
  </div>
</div>

presenter menu:

<?php

  use Nette\Application\UI\Control,
   Nette\Object;

  class Menu extends Control
  {
    public $presenter;
    public $config;
    public $type;

    public function initialize($menu, $presenter, $type)
    {
      $this->presenter=$presenter;
      $this->type=$type;
      $this->config=$menu;

    }

    public function render()
    {
      $template = $this->template;
      $template->setFile(dirname(__FILE__).'/menu.'.$this->type.'.latte');

      $template->presenter=$this->presenter;
      $template->config=$this->config;

      $template->render();
    }
  }

  class MenuGroup extends Object
  {
    public $target;
    public $text;
    public $items;

    public function __construct($target, $text="New link")
    {
      $this->target = $target;
      $this->text = $text;
      $this->items = array();
    }

    public function addItem($item)
    {
      $this->items[]=$item;
    }
  }

  class MenuItem extends Object
  {
    public $target;
    public $text;

    public function __construct($target, $text="New link")
    {
      $this->target = $target;
      $this->text = $text;
    }
  }

@layout

{**
 * Layout of Nette Framework example CD collection
 *
 * @param string   $robots   tell robots how to index the content of a page (optional)
 * @param string   $basePath web base path
 * @param array    $flashes  flash messages
 * @param Nette\Web\User $user  current user
 *}

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="utf-8">
	<meta n:ifset="$robots" name="robots" content="{$robots}">

	<title>{block title|striptags|trim}{/block} | CIRC</title>

        <link href="{$basePath}/css/bootstrap.min.css" rel="stylesheet">
        <script src="{$basePath}/js/bootstrap.min.js"></script>
        <script src="{$basePath}/lib/jquery-2.1.1.min.js"></script>
        <script src="{$basePath}/lib/jquery-ui.min.js"></script>
        <link rel="stylesheet" media="screen" href="{$basePath}/lib/jquery-ui.min.css" />

        <script src="{$basePath}/lib/nette.ajax.js"></script>
        <script src="{$basePath}/js/ajax.js"></script>

	<link rel="stylesheet" media="screen" href="{$basePath}/css/site.css" />
</head>

<body>

        <img id="logo" src="{$basePath}/img/logo.png">
        {control menu-top}

        {control menu-left}

        <div id="view">
            <div n:foreach="$flashes as $flash" class="flash {$flash->type}">{$flash->message}</div>

            <div id="view-content">
                {snippet a}
                    {include content}
                {/snippet}
            </div>

	</div>


        <script src="http://nette.github.com/resources/js/netteForms.js"></script>
</body>
</html>
jiri.pudil
Nette Blogger | 1032
+
0
-

Myslel jsem hlavně to zpracování v cílovém presenteru. Protože jestli ti to vrátí celou stránku (což je výchozí chování), pak tam asi nikde neděláš nic pro to, aby se poslal JSON.

dex11
Člen | 11
+
0
-

Díky, to mě nakoplo. Chyběly mi tam metody render k jednotlivým akcím a v nich

	if ($this->isAjax())
	$this->invalidateControl('a');
CZechBoY
Člen | 3608
+
0
-

Tak a ještě to html. Uf.