AJAXowy pomysł :)

0

Witam. Właśnie wpadłem na taki pomysł jak jednocześnie:

  • aktualizować przez tzw. AJAX tylko wybrane części strony
  • ograniczyć rozmiar przesyłanych danych z serwera
  • zachować kompatybilność z przeglądarkami z wyłączonym JS
  • a przy tym nie męczyć zbytnio klawiatury

Rozwiązanie opiera się na frameworkach jQuery i CodeIgniter. Do hiperłącz na stronie wystarczy dodać atrybut onclick z wywołaniem funkcji CiAl. Jej drugi argument to tablica zawierająca id elementów do odświeżenia. Po stronie serwera trzeba dodać jeden mały hook.

Client

/show/index.html

<script>
  function CiAl(url, ids) {
    $.post(url, { 'CiAl_ids' : ids.join(',') }, function(res) {
      for (var v in ids) $('#' + ids[v]).html(res[ids[v]]);
    }, 'json');
    return false;
  }
</script>
<h1 id="title">Tytuł</h1>
<a href="http://adres.pl/show/news.html" 
  onclick="return CiAl(this.href, ['title', 'content'])">Aktualności</a>
<div id="content">Treść</div>

Server

config/hooks.php

$hook['display_override'][] = array(
  'class' => '',
  'function' => 'main',
  'filename' => 'CiAl.php',
  'filepath' => 'hooks'
);

hooks/CiAl.php

function CiAl($content, $ids) {
  $res = array();
  $dom = new DomDocument;
  $dom->validateOnParse = true;
  @$dom->loadHTML($content);
  foreach($ids as $id) {
    if (($elm = $dom->getElementById($id)) === null) continue;
    $tmp = new DOMDocument();
    $children = $elm->childNodes;
    foreach ($children as $child) 
      $tmp->appendChild($tmp->importNode($child, true));
    $res[$id] = $tmp->saveHTML();
  }
  return json_encode($res);
}
function main() {
  $CI = &get_instance();
  echo isset($_POST['CiAl_ids']) ?
    CiAl($CI->output->get_output(), split(',', $_POST['CiAl_ids'])) :
    $CI->output->get_output();
}

Hook przy zapytaniu przez Ajax zwraca jedynie wybrane elementy ze strony w formacie JSON. Bez obsługi JavaScriptu zwróci cały dokument ze wszystkimi elementami.

No i teraz mam takie pytanie.
Czy ktoś już to wymyślił przede mną? Czy istnieje już w sieci takie rozwiązanie w formie pluginu czy biblioteki?

0

Kiedyś już coś takiego widziałem, może niekoniecznie do CI, ale pomysł ten sam :)

Widziałem też kiedyś gotową bibliotekę w php do czegoś takiego, teraz nie mogę sobie przypomnieć jej nazwy. Poniżej znalezione co nieco:
http://weichhold.com/2009/07/20/updating-multiple-page-fragments-with-grails-and-ajax/

0

Szkoda ;( przez chwilę czułem się jak Krzysztof Kolumb :D
no nic... hmm ...jak na mój nowy home page (który przygotowuje już od dwóch lat) będzie świetne, tylko dodam obsługę formularzy, jakiś helper i nadpiszę klasę Pagination...

0

w ruby on rails jest to dziecinie prosto rozwiazane. Nietrzeba samemu nawet zadnego javascript'u pisac.

// zapodaj jakiś link, bo nie mogę nic znaleźć (no poza ActionView::JavaScriptHelper) - m.p

1 użytkowników online, w tym zalogowanych: 0, gości: 1