"Επιλεκτικό" refresh

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

alou
Script Master
Δημοσιεύσεις: 1374
Εγγραφή: 24 Αύγ 2007 19:52
Επικοινωνία:

"Επιλεκτικό" refresh

Δημοσίευση από alou » 31 Μάιος 2014 21:41

Τότε φαντάζομαι έχεις ρίξει μια ματιά και στο meteor
https://www.meteor.com/
Εξίσου καλή εναλλακτική για live ενημερώσεις /εφαρμογές με παρόμοιες ανάγκες.

@jpk, θυμάμαι ότι είχες ασχοληθεί και πειραματιζόσουν παλιότερα με websockets και γενικά το ανέφερες τακτικά... σε κάποια φάση που προσπάθησα να πειραματιστώ και εγώ, έπεσα σε εναλλακτικές που ήταν σαφώς πιο εύκολες στην υλοποίηση οπότε δεν επέμεινα και πολύ να σου πω την αλήθεια... αν έχεις να κάνεις κάποια σύγκριση με τα διάφορα παρακλάδια που βασίζονται σε nodejs θα με ενδιέφερε πολύ να την ακούσω :D

Άβαταρ μέλους
Kainourios
Ruby Moderator
Δημοσιεύσεις: 504
Εγγραφή: 18 Μάιος 2005 16:20
Τοποθεσία: Κορυδαλλός
Επικοινωνία:

"Επιλεκτικό" refresh

Δημοσίευση από Kainourios » 31 Μάιος 2014 23:43

Το meteor το είχα δει λίγο πριν 2 χρόνια. Για heavy sync apps φαίνεται να είναι πολύ καλό. Δε μ'αρέσει ότι χρησιμοποιεί υποχρεωτικά mongodb και ότι (απ'ότι είχα δει) όταν φορτώνει την πρώτη φορά πρέπει να μεταφέρει όλη την database σε client side. Οπότε θέλει προσοχή σε permissions και είχα παρατηρήσει ότι είχε μεγαλούτσικο initialize time. Ίσως να έχουν αλλάξει αυτά ή να υπάρχουν τρόποι να τα διορθώνεις πλέον.

Προσωπικά δε θα το εμπιστευόμουν ακόμα σε production, δεν είναι καν version 1.0 (καλά θα μου πεις και το node.js δεν είναι version 1.0 αλλά είναι production ready).

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

"Επιλεκτικό" refresh

Δημοσίευση από Apostolis_38 » 02 Ιουν 2014 14:32

Τις λύσεις που προτείνετε σε στυλ Firebase, Meteor κ.λ.π. μάλλον θα τις απορίψω γιατί είναι αρκετά πολύπλοκες για αυτό που θέλω.

Τείνω περισσότερο στη λύση του geomaga αλλά έχω δυσκολία στο να κάνω instantiate μια class με Ajax request

Το script είναι αυτό:

Κώδικας: Επιλογή όλων

function setLock()	{
	clearTimeout(updTimer);
	lock=1;
}
	
function clearLock()	{
	lock=0;
	updTimer=setTimeout(updateRoom,5);
}
	
function updateRoom()	{

	if(lock) 
		setTimeout(updateRoom,1);
	else	{
		setLock();
		intantiateClass();
	}

}

$.ajax(url, data, function(intantiateClass)	{

	var url = 'path/to/class/file';
	var data =	{
		str_className: 'MyClass',
		str_methodName: 'function/in/class'
	};
});

Μάλλον όμως πρέπει να διευκρινήσω καλύτερα τι θέλω να κάνω γιατί, νομίζω, είναι πολύ πιο απλό.

Στην αρχική σελίδα της εφαρμογής υπάρχει menu στο οποίο μέσα σε ένα div γίνεται require ένα php αρχείο.
Με το require αυτό γίνεται instantiate μια class η οποία μετράει απλώς πόσα καινούργια μηνύματα έχει ο user και εμφανίζει έναν αριθμό.
Αυτό που θέλω είναι να γίνεται refresh μόνο το συγκεκριμένο require ( η class δηλαδή) και όχι ολόκληρη η σελίδα η οποία προφανώς περιέχει κι άλλες λειτουργίες.


Υ.Γ.1 geomaga μην αγχώνεσαι. Δεν θα το κάνω εντελώς clopy right το script σου. :D

Υ.Γ. 2 Οι τιμές στα time είναι εντελώς πειραματικές. Για να μην περιμένω 10 χρόνια.

geomagas
Δημοσιεύσεις: 667
Εγγραφή: 06 Απρ 2013 13:36
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

"Επιλεκτικό" refresh

Δημοσίευση από geomagas » 02 Ιουν 2014 15:31

Apostolis_38 έγραψε:Υ.Γ.1 geomaga μην αγχώνεσαι. Δεν θα το κάνω εντελώς clopy right το script σου. :D
Και να το έκανες, δεν θα με πείραζε καθόλου (είναι και στους όρους χρήσης).

Τώρα τρέχω, μόλις προλάβω βλέπουμε τα υπόλοιπα.

alou
Script Master
Δημοσιεύσεις: 1374
Εγγραφή: 24 Αύγ 2007 19:52
Επικοινωνία:

"Επιλεκτικό" refresh

Δημοσίευση από alou » 02 Ιουν 2014 15:36

Υποθέτω ότι
-με κάποιον τρόπο (έστω ένα hidden input που φτιάχνεις στην html server side) μπορείς να έχεις διαθέσιμο στη javascript το user id
-υπάρχει κάποιο url που θα απαντήσει με json string σε ένα ajax request με ένα update για τα μηνύματα του user id, πιθανώς και με ένα csrf check αν χρησιμοποιείς.
-ότι τα καινούργια μηνύματα, χαρακτηρίζονται από κάτι που θα μου απαντήσει το παραπάνω url (πχ unread => 0 ή 1)

Εκείνο που πρέπει να καταλάβεις είναι ότι δεν θα γίνει refresh κάποιο php class, θα στείλεις ένα request σε κάποιο url στην php, θα κάνει ένα query για να δει τα νέα μηνύματα του τάδε χρήστη και θα κάνει echo ένα json array (ή ένα string αν δε χρειάζεται κάτι παραπάνω). Η javascript μετά θα το πάρει σαν απάντηση και θα το χρησιμοποιήσει, για να κάνει ότι αλλαγές στο DOM πρέπει να γίνουν (πχ να βάλει το νέο αριθμό μηνυμάτων, να κάνει το φόντο κόκινο όταν υπάρχουν νέα μηνύματα κλπ).

Κώδικας: Επιλογή όλων


var uid = $('input[name="userId"]').val();
var checkMsgsTimeout = setTimeout(checkForMessages(uid),5000); 

function checkForMessages (user_id) {
  if (!user_id || user_id = '') { clearTimeout(checkMsgsTimeout); return false; }
  $.ajax({
      url: "http://path/to/request",
      data: { 
         user_id: user_id,
          csrf : csrf //an iparxei kapou, se hidden input i se meta to tsimpas apo ekei
      } 
  })
    .success(function( data ) { //data edw einai i apantisi pou steleneis apo tin php
      if (parseInt(data.messages) > 0) {
        $('#mymessages').text('Έχεις ' + data.messages + ' νέα μηνύματα.').addClass('alert');
      }
      
    });
}
Στο uid παίρνεις με κάποιο τρόπο το user id, υπέθεσα ότι υπάρχει στο input name=userID. Το συμπεριλαμβάνεις σαν παράμετρο στην checkForMessages, που έχει οριστεί να τρέχει κάθε 5 δευτερόλεπτα μέσα από το setTimeout.

Στέλνει ένα request και παίρνει μια απάντηση, αναλόγως με την οποία κάνει ή δεν κάνει κάποια πράγματα. Όλα τα έχω γράψει με υποθέσεις οπότε προφανώς στη λογική δίνεις σημασία, όχι στην υλοποίηση.

Επισης, καλό θα ήταν να υπάρχει το συγκεκριμένο κομμάτι js μόνο σε logged in χρήστες, αν μη τι άλλο να μη γίνονται τσάμπα request.

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

"Επιλεκτικό" refresh

Δημοσίευση από Apostolis_38 » 02 Ιουν 2014 16:15

Το πρόβλημα ακριβώς είναι οτι το id κρατιέται σε SESSION γιατί δεν θέλω να αναγκάζω τον user να "στέλνει" με κάποιον άλλο τρόπο το request.
Αν γίνει οποιαδήποτε κίνηση στη σελίδα (κλικ - refresh κ.λ.π.) τότε αυτομάτως η class τρέχει και δεν χρειάζομαι το αυτόματο refresh.

Οπότε αν δεν γίνει instantiate η class δεν μπορώ να έχω το id διαθέσιμο.
Το μόνο που θέλω είναι απλώς να ξανατρέξει το require_once κ.λ.π. κ.λ.π.

Μπέρδεμα;

edit Ναι μιλάμε για loged in users ούτως ή άλλως.

alou
Script Master
Δημοσιεύσεις: 1374
Εγγραφή: 24 Αύγ 2007 19:52
Επικοινωνία:

"Επιλεκτικό" refresh

Δημοσίευση από alou » 02 Ιουν 2014 16:21

Ζητάς να τρέξει ένα κομμάτι του server στον client? απλά δε γίνεται. Δεν είναι δύσκολο να φτιάξεις στην php ένα hidden input και να βάλεις σαν value το user id... τι σε προβληματίζει? προσπάθησε να καταλάβεις την διαδικασία που σημαίνει αυτό που επέλεξες σαν λύση... σου το γράφω αρκετά αναλυτικά.

geomagas
Δημοσιεύσεις: 667
Εγγραφή: 06 Απρ 2013 13:36
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

"Επιλεκτικό" refresh

Δημοσίευση από geomagas » 02 Ιουν 2014 16:44

Νομίζω ότι γενικά με κάλυψε ο alou.

Ελπίζω να έχεις καταλάβει ότι, στο παράδειγμά του, το /path/to/request αφορά:
- είτε το ίδιο php, στο οποίο ελέγχεις αν γίνεται το ajax request ή όχι, και πράττεις αναλόγως, οπότε δεν μπορώ να καταλάβω γιατί δεν γίνεται instantiate το class που αναφέρεσαι
- είτε κάποιο ξεχωριστό, στο οποίο όμως μπορείς να κάνεις require_once κλπ όπως και στο πρώτο. Οπότε ισχύουν τα ίδια.

Υπάρχει βέβαια και η περίπτωση να μην έχω καταλάβει σωστά που είναι το κωλυμα, γι αυτό γίνε πιο αναλυτικός και το βλέπουμε.

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

"Επιλεκτικό" refresh

Δημοσίευση από Apostolis_38 » 02 Ιουν 2014 17:19

Μισό λεπτό παιδιά γιατί με τον Αίαντα δεν το πολυέχω.

Εδώ θέλω να εμφανίσω το νούμερο:

Κώδικας: Επιλογή όλων

<div class="emfanisouRe">

Εστω οτι βάζω το user id σε input

Κώδικας: Επιλογή όλων

<input type="hidden" name="userId" value="1" />
οπότε έχουμε:

Κώδικας: Επιλογή όλων

var uid = $&#40;'input&#91;name="userId"&#93;'&#41;.val&#40;&#41;;
var checkMsgsTimeout = setTimeout&#40;checkForMessages&#40;uid&#41;,1&#41;;

function checkForMessages &#40;userId&#41; &#123;

	if &#40; &#40;!userId&#41; || &#40;userId= ''&#41; &#41;	&#123;
		clearTimeout&#40;checkMsgsTimeout&#41;;
		return false;
	&#125;

	$.ajax&#40;	&#123;
		url&#58; "trava_vres_to_php",
		data&#58;	&#123;
         userId&#58; userId,
      &#125;
  &#125;&#41;;

	success&#58; function&#40;data&#41;	&#123; //data edw einai i apantisi pou steleneis apo tin php
			$&#40;'#vrikaTosesEggrafes'&#41;.text&#40;'Έχεις ' + data.messages + ' νέα μηνύματα.'&#41;.addClass&#40;'alert'&#41;;
	&#125;;
&#125;
Και το php αρχείο:

Κώδικας: Επιλογή όλων

$result = $Queries->query&#40;"SELECT COUNT&#40;id&#41; AS vrikaTosesEggrafes
							FROM bourou bourou"&#41;;
while&#40;$row = $Queries->fetch_assoc&#40;$result&#41; &#41; &#123;
	$vrikaTosesEggrafes= trim &#40;stripslashes &#40;$row&#91;'newEmployeeRequestsNumber'&#93;&#41; &#41;;
	if&#40;$vrikaTosesEggrafes> 0&#41;	&#123;
		$vrikaTosesEggrafes;
	&#125;

Κάτι δεν παίζει σωστά.



edit Για χάρη το υπαραδείγματος μετέφερα το query σε νέο αρχείο.
Μετά θα την βρω την άκρη.

alou
Script Master
Δημοσιεύσεις: 1374
Εγγραφή: 24 Αύγ 2007 19:52
Επικοινωνία:

"Επιλεκτικό" refresh

Δημοσίευση από alou » 02 Ιουν 2014 17:27

Καταρχάς την απάντηση θες να την περάσεις εδώ:

Κώδικας: Επιλογή όλων

$&#40;'.emfanisouRe'&#41;.text&#40;'Έχεις ' + data.messages + ' νέα μηνύματα.'&#41;.addClass&#40;'alert'&#41;; 
Μετά, παίζει ρόλο και τι έχεις κάνει echo στην php. Αν αυτό που επιστρέφεις (που βάλαμε σαν data στο success της ajax) είναι απλά ένα string, θα το βάλεις σαν

Κώδικας: Επιλογή όλων

$&#40;'.emfanisouRe'&#41;.text&#40;'Έχεις ' + data + ' νέα μηνύματα.'&#41;.addClass&#40;'alert'&#41;; 
Αν είναι {'name':'mitsos', 'totalMessages': '44', 'unreadMessages': '2' }

θα πάρεις το data.unreadMessages

Αν θες να δεις πως έρχεται αυτό που έστειλες, κάνε στο success πρώτο πρώτο ένα console.log(data); και δες βέβαια την κονσόλα :)

Edit και εγώ: Δεν έχεις κάνει echo τίποτα, άρα δεν επιστρέφεις τίποτα στην ajax function.

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

"Επιλεκτικό" refresh

Δημοσίευση από Apostolis_38 » 02 Ιουν 2014 17:40

Και echo το έχω κάνει και απ' όλα.
Βασικά ένα απλό number επιστρέφω. Αυτό

Κώδικας: Επιλογή όλων

$&#40;'#emfanisouRe'&#41;.text&#40;data.vrikaTosesEggrafes&#41;;
αρκεί.

Και όταν το τρέχω από το url (trava_vres_to_php?userId=1) τρέχει μια χαρά.

Κάπου αλλού κολλάει.

alou
Script Master
Δημοσιεύσεις: 1374
Εγγραφή: 24 Αύγ 2007 19:52
Επικοινωνία:

"Επιλεκτικό" refresh

Δημοσίευση από alou » 02 Ιουν 2014 17:57

Εδώ:

$('#emfanisouRe').text(data.vrikaTosesEggrafes);

έχεις 2 λάθη: το emfanisouRe (από ότι είπες) είναι class, άρα .emfanisouRe και αφού δεν κάνεις echo array αλλά ένα string, θα βάλεις σκέτο το data

Κώδικας: Επιλογή όλων

$&#40;'.emfanisouRe'&#41;.text&#40;data&#41;;
Το promise του ajax έχει και fail οπότε μπορείς να βάλεις και αυτό και να δεις αν το url απαντάει σωστά.

Έχεις κάνει και κάποια συντακτικά λάθη, σου ξαναβάζω όλο μαζί το function

Κώδικας: Επιλογή όλων

function checkForMessages &#40;userId&#41; &#123;

   if &#40; &#40;!userId&#41; || &#40;userId= ''&#41; &#41;   &#123;
      clearTimeout&#40;checkMsgsTimeout&#41;;
      return false;
   &#125;

   $.ajax&#40;&#123;
      url&#58; "trava_vres_to_php",
      data&#58;   &#123;
         userId&#58; userId,
      &#125;
  &#125;&#41;
  .success&#40;function&#40;data&#41;   &#123; 
         $&#40;'.emfanisouRe'&#41;.text&#40;data&#41;.addClass&#40;'alert'&#41;;
   &#125;&#41;
  .fail&#40;function&#40; jqXHR &#41; &#123;
    console.log&#40;jqXHR&#41;;
  &#125;&#41;;
&#125;
Αν συνεχίσεις να ζορίζεσαι στείλε ένα url που απαντάει στο ajax να το βάλουμε σε ένα jsfiddle. Επίσης, το addClass('alert') είναι για να προσθέσει ένα class στο στοιχείο που θα δώσει κάτι που θα ξεχωρίζει, αν πχ έχεις στο css σου .alert {background:orange;color:white}
Τελευταία επεξεργασία από το μέλος alou την 02 Ιουν 2014 18:01, έχει επεξεργασθεί 1 φορά συνολικά.

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

"Επιλεκτικό" refresh

Δημοσίευση από Apostolis_38 » 02 Ιουν 2014 18:01

Οχι.

Ξέχνα το class τελείως. το έχω βάλει σε ξεχωριστό αρχείο που έχει μόνο τη σύνδεση με τη βάση, το query και το result.


Το emfanisouRe είναι το div που εμφανίζω το αποτέλεσμα. Στη σελίδα που έχει το μενού με λίγα λόγια.


EditΩπα σόρρυ. Τώρα κατάλαβα τι εννοείς.
Δεν πειράζει, το γύρισα σε id.
Ασήμαντο αυτό

alou
Script Master
Δημοσιεύσεις: 1374
Εγγραφή: 24 Αύγ 2007 19:52
Επικοινωνία:

"Επιλεκτικό" refresh

Δημοσίευση από alou » 02 Ιουν 2014 18:03

xaxa μίλαγα για CSS class όχι php object, σε css selectors, αυτό: .alou σημαίνει <div class="alou" και αυτό #alou σημαίνει div id="alou"


κάντο όπως το έχω και μου λες.

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

"Επιλεκτικό" refresh

Δημοσίευση από Apostolis_38 » 02 Ιουν 2014 18:12

Timestamp: 2/6/2014 05:58:10 μμ
Error: SyntaxError: function statement requires a name
Line: 26, Column: 18
Source Code:
success: function(data) { //data edw einai i apantisi pou steleneis apo tin p

Χτυπάει στο data :evil:

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες