JS SQL adatfrissítés

makgab képe

Üdv!

Van egy db_select() lekérdezés és ennek az eredményét szépen formázom majd.
Pl. egy kép elé teszem... stb.
Hogy ne kelljen az egész oldalt újra betölteni, kellene valami js-es megoldás a db_select() lefuttatására, a friss adatok lekérdezésére.
Tehát csak az adatbázis lekérdezést kellene adott időközönként frissíteni, az egész oldalt nem.

Ilyesmire gondoltam, csak itt az onchange JS eseményre fut le a DB query.

Ha jól gondolom, akkor pl. a Js-nek a setInterval()-al csak a Drupal-os útvonalat kell meghívnia? Pl. query/keresem/%

A query/keresem/% a mymodule.module menü definíciója szerint pl. csak az értéket adja vissza.

Más (szebb, jobb) lehetőség is van?

Drupal verzió: 
botalaszlo képe

Szia.
Igen, egyelőre Drupal7-ben ez a legjobb megoldás, amit én is találtam. Bár én nem vagyok Drupal7 fejlesztő, hanem .NET-es és Symfony2-vel foglalkoztam, ezért érdekel a Drupal8.

Én is rákerestem erre a témára, és nincs is modul, ami eszembe volt az a "WebSocket", de az is dev-es verzióban éred el.

Ami lehetne csinálni, nem tudom, hogy kivetelezhető-e. Az egy fajta "cache technika másolása". Ezt a technikát AngularJS performencia növelésnél láttam.
Ahelyett, hogy Ajax kérést küldenél a szerver felé, már előre lekéred azokat az adatokat a db_select-tel, és amikor kirendeled az oldalt, akkor ezek az adatok is lemennek, (nem cask a néhány darab, ami a kezdetekor kell neked, és aztán ajax hívással hozod be a többit, hanem már az elején az összes) és ezt az adat listát elmented egy javascript változóba, egy listába. És bizonyos időközönként nem setInterval-lal, hanem setTimeOut-tal megjeleníted őket.
Például 10 másodpercenként a lista első 3 elemét, aztán újra 10 másodperc múlva a lista 4-6. elemét, aztán 6-9 és így tovább.
Ennek előnye, hogy nincs hálozat terhelés / elérési kísérlet. Ez főleg kis teljesítményű mobiloknál lehet hasznos.

Persze ez attól is függ, hogy miért kell pontosan ajax kérés, mert ha tényleg csak megjeleníteni akarsz adatokat, amiket nem kell feldolgoztatni a szerverrel. És az oldal kirendelésnél ez nem jelent jelentősebb több adatot, akkor én ezt a megközelítést választanám.

0
0
makgab képe

Az időintervallumot dinamikusan is szeretném állítani majd valahogy.
Tehát pl. valaki 3mp-re, valaki 10mp-re tudja állítani.
Egy adatbázis táblából csak adatokat szeretnék megjeleníteni.
Kb. ilyesmi adatok (value,timestamp):
12.0059 2015-06-30 15:20:45

0
0
makgab képe

Addig jutottam, hogy ezt a menüt, funkciót kellene frissíteni:

//
// url-je a mymodule_menu()-ben: mymodule/query/tree
//
function mymodule_query_tree_form($form, &$form_state) {
 
  // SQL ***
  $query = db_query('SELECT ...');
  // $main_items ...
  // ******
 
 
  // html string for display
  $html = "<ul>";
 
  // recursive node tree
  foreach ( $main_items as $item ) {
     $html.= "<li>" . $main_names[$item];
     $html.= display_tree_node( $item );
     $html.= "</li>";
  }	// foreach
 
  $html.= "</ul>";
 
 
  // form for display
  $form = array();
 
  $form['decoration'] = array(
    '#type' => 'fieldset',
    '#collapsible' => TRUE,
    '#title' => t('Tree')
  );
 
  $form['#attached']['js'] = array(
    drupal_get_path('module', 'mymodule') . '/js/tree.js',
  );
 
  $form['decoration']['htmlstr'] = array(
    '#type' => 'item',
    '#markup' => $html,
  );
 
 
  return $form;
}
 
function display_tree_node($id) {
  // fastruktúra bejárása és html kód a fa struktúra megjelenítésére ul, li elemekkel
}

A tree.js fájl:

(function($) {
Drupal.behaviors.myBehavior = {
  attach: function (context, settings) {
 
    //code starts
    $( document ).ready(function() {
      // Handler for .ready() called.
      setInterval(function(){refresh();}, 10000);
    });
 
 
    function refresh(){
    var logstr = "Log interval!";
    console.log( logstr );
    var feedback = $.ajax({//Ajax
                        type: "GET",
                        url: "mymodule/query/treerefresh",
                        async: false
                        }).responseText;//end of ajax
 
 
    $('edit-htmlstr').html(feedback).delay(10000).queue(function() {
            new refresh();
        });
    }
    //code ends
 
  }
};
})(jQuery);

A böngészőben a konzol naplóban látszódik a "Log interval!" szöveg 10mp-kénti megjelenése (ez csak tesztnek van bent), tehát az időzítés működik.
Az edit-htmlstr elemet ( $form['decoration']['htmlstr'] ) kellene frissítenem a js-el, ami nem frissül. Egyébként a fában csak stringek vannak, pl.: 23, 2015-05-12 12:08:11

A mymodule.module fájlba tettem egy callback-et ez alapján:

  $items['mymodule/query/treerefresh'] = array(
    'page callback' => 'mymodule_query_tree_refresh',
    'access callback' => '...',
    'access arguments' => array( array( ... ) ),
    'file' => 'mymodule.inc',
    'type' => MENU_CALLBACK,
  );

function mymodule_query_tree_refresh() {
 
  $main_items = array();
  $main_names = array();
 
  // SQL ***
  $query = db_query('SELECT ...');
 
  foreach ($query as $record) {
      $main_items[] = $record->id;
      $main_names[$record->id] = $record->name;
    } // foreach
  // ******
 
 
  // html string for display
  $html = "<ul>";
 
  // recursive node tree
  foreach ( $main_items as $item ) {
     $html.= "<li>" . $main_names[$item];
     $html.= display_tree_node( $item );
     $html.= "</li>";
  }	// foreach
 
  $html.= "</ul>";
 
  print ( $html );
  return NULL;
}

Az apache webszerver logjában látszódik, hogy meghívódik az url 10mp-enként. Ha kézzel meghívom a böngészőben az url-t: /mymodule/query/treerefresh
akkor szépen meg is jelenik az eredmény a drupal render nélkül, pontosan azzal a tartalommal, amivel frissülnie kellene a form elemnek.
A js-ben lehet a hiba, hogy nem frissül az tree a Drupal form-on?

0
0
makgab képe

Megvan:
Lemaradt a '#' karakter a form id-ben:

    $('#edit-htmlstr').html(feedback).delay(10000).queue(function() {
            new refresh();
        });
    }

De ez a js kód is működik:

(function($) {
Drupal.behaviors.myBehavior = {
  attach: function (context, settings) {
 
    //code starts
    $( document ).ready(function() {
      // Handler for .ready() called.
      setInterval(function(){refresh();}, 10000);
    });
 
 
    function refresh(){
 
    $.get('/mymodule/query/treerefresh', { },
    function(data){
        //request completed
        //now update the div with the new data
        $('#edit-htmlstr').html(data);
        }
    );
 
    }
    //code ends
 
  }
};
})(jQuery);
0
0