Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ. (επεξεργασμένο)

Καλησπερα παιδια,

Εκανα προσφατα ενα μικρο προτζεκτ γεματο ατελειες και λαθακια, στο οποιο ηθελα να προσομοιασω καπως αυτην τη διαδικασια που γινεται στα εκλογικα τμηματα, οταν πας να ψηφισεις και ο δικαστικος αντιπροσωπος με το στυλο και με το χαρακα σβηνει καποια στοιχεια σου απο εναν καταλογο και γραφει καποια αλλα στοιχεια σου σε εναν αλλο καταλογο.

Δλδ, ηθελα να το φτιαξω ετσι ωστε αυτη η διαδικασια να γινεται αυτοματα και να χρησιμοποιησω το AJAX (χρησιμοποιησα το XHR Object) για αυτον το σκοπο.

Ουσιαστικα το εκανα για να δω 1) πώς δουλευουν καποιες τεχνολογιες (AJAX, PHP) στις οποιες δεν εχω μεγαλη εμπειρια και 2) πώς θα μπορουσα να χρησιμοποιησω αλλες τεχνολογιες οι οποιες πιθανως να ειναι πιο αποδοτικες.

Το προτζεκτ μπορειτε να το βρειτε εδω: https://github.com/Giordanidis/Voting-System.

Και οι λειτουργιες του ειναι:

1) Προσθηκη νεου χρηστη (ψηφοφορου) στη βαση

2) Προβολη ολων των ψηφοφορων απο τη βαση

3) Προβολη ολων των ψηφοφορων που εχουν ψηφισει

4) Αναζητηση αναμεσα στους ψηφοφορους (αυτο δεν εχει καποια σχεση με τη βαση γιατι γινεται μονο με JS)

Καθως το προχωρουσα μου γεννηθηκαν καποιες αποριες, οποτε σκεφτηκα να ποσταρω εδω, ωστε να διαβασω και πιθανες παρατηρησεις κλπ.

1) Οταν παω να διαβασω τους ψηφοφορους απο τη βαση ωστε να τους εμφανισω, κανω ενα XHR (για να διαβασω τους ψηφοφορους), αλλα στη συνεχεια, μεσα σε αυτο το XHR κανω ακομα ενα XHR. Αυτο το κανω γιατι θελω διπλα σε καθε ψηφοφορο να υπαρχει ενα κουμπι που να λεει "Vote" και οταν το πατας να γινεται αιτημα στη βαση και η βαση να ενημερωνεται και να επιστρεφεται το αποτελεσμα, ωστε να ενημερωνεται και η σελιδα. Κατι τετοιο ειναι επιτρεπτο/σωστο; Το να γινεται ενα XHR μεσα σε ενα αλλο;

2) Θα ηθελα να κανω το ιδιο προτζεκτ χρησιμοποιωντας μονο τεχνολογιες της JS. Αυτο, πώς ακριβως μπορω να το κανω; Τωρα χρησιμοποιω για το Server την PHP και για τη βαση τη MySQL. Θα μπορουσα να χρησιμοποιησω Node.js και MongoDB, ή κανω λαθος; Αν δεν κανω λαθος, τί αλλο θα χρειαζομουν;

Επεξ/σία από Jordan95
  • 2 εβδομάδες αργότερα...
Δημοσ.

Για το 1) θα χρειαστεί να βάλεις έναν event listener πάνω σε κάθε κουμπί vote για να τρέχεις το vote action. Οπότε τρέχει ένα ajax για να σου φέρει όλες τις γραμμές με τους voters, κάθε γραμμή έχει το vote button τις μορφής 

<td>
  <span>Voters Name</span>
  ...
  ...
  ...
  <button data-voters-id="12345">Vote</button>
</td>

Στο data attribute θα μπορούσες να βάλεις το id του voter. Ο event listener θα είναι της μορφής ( με jquery )

$('body').on('click', '.voting-button', function() {
	
	let votersId = $(this).data('voters-id');

	$.ajax({...})

});

Δεν κατάλαβα ακριβώς την ερώτησή σου βέβαια οπότε αν δεν σε κάλυψα δώσε μου ένα παράδειγμα 

Θα μπορούσες να κάνεις το ίδιο πράγμα σε Nodejs με expressjs. Για την βάση θα μπορούσες να χρησιμοποιήσεις mongodb ή mysql.  

Δημοσ. (επεξεργασμένο)

Ευχαριστω πολυ για την απαντηση!

Ουσιαστικα το κανω οπως το ειπες, υπαρχει ενα XHR το οποιο χρησιμοποιω για να φερω ολες τις γραμμες με τους ψηφοφορους, και μετα υπαρχει μια λουπα, οπου για καθε ψηφοφορο βαζω εναν Event Listener στο κουμπι Vote.

Χρησιμοποιω το XHR και οχι jQuery, η απορια μου ηταν αν γενικοτερα το παρακατω κομματι κωδικα ειναι σωστο (ολοκληρο εδω), ή καλυτερα, αν ειναι περισσοτερο πολυπλοκο αποτι θα επρεπε.

            let xhr1 = new XMLHttpRequest();

            xhr1.open("GET", "registered_voters.php", true);

            xhr1.onload = function(){
                if(this.status == 200){
                    // console.log(this.responseText);
                    // If DB is empty
                    if(this.responseText == "0"){
                        // console.log("Empty DB!");
                        let output = "<tr><td colspan='11' class='alert alert-danger text-center'>No Registered Users Found.</td></tr>";
                        document.getElementById("registered_voters").innerHTML = output;
                    
                    }
                    else{
                        // Fetch Voters
                        let registered_voters = JSON.parse(this.responseText);
                        // console.log(registered_voters);

                        // Voters Number
                        let votersNum = registered_voters.length;
                        // console.log(votersNum);

                        // Output = Table Body
                        let output = "";
                        
                        // Product Output
                        for(let i=0; i<votersNum; i++){
                            output += "<tr>" +
                                "<td id='id-" + (i+1) + "'>" + (i+1) + "</td>" +
                                "<td id='sid-" + registered_voters[i].sid + "'>" + registered_voters[i].sid + "</td>" +
                                "<td>" + registered_voters[i].surname + "</td>" +
                                "<td>" + registered_voters[i].name + "</td>" +
                                "<td>" + registered_voters[i].fname + "</td>" +
                                "<td>" + registered_voters[i].mname + "</td>" +
                                "<td>" + registered_voters[i].city + "</td>" +
                                "<td>" + registered_voters[i].address + "</td>" +
                                "<td>" + registered_voters[i].mrn + "</td>";

                                // If they have voted, produce a disabled checkbox
                                if(registered_voters[i].voted == "true"){
                                    output += "<td>" +
                                    "<input type='checkbox' id='checkbox-" + (i+1) + "' checked disabled>" + 
                                    "</td>" + 
                                    "<td>" + 
                                    "<form action='add_vote.php' id='addVote-" + (i+1) + "' method='POST'>" +
                                    "<input type='submit' value='VOTED' disabled>" +
                                    "</form>" +
                                    "</td>";
                                }
                                // Else, product a clickable checkbox
                                else{
                                    output += "<td>" +
                                    "<input type='checkbox' id='checkbox-" + (i+1) + "'>" + 
                                    "</td>" +
                                    "<td>" + 
                                    "<form action='add_vote.php' id='addVote-" + (i+1) + "' method='POST'>" +
                                    "<input type='submit' value='VOTE'>" +
                                    "</form>" +
                                    "</td>";
                                }
                        }
                        
                        // Assign the output to the registered voters table body
                        document.getElementById("registered_voters").innerHTML = output;
                        // Add submit event listeners for each voter
                        for(let i=0; i<votersNum; i++){
                            document.getElementById("addVote-"+(i+1)).addEventListener("submit", (e) => {
                                e.preventDefault();
                                
                                let theyAreSure = confirm("Are You Sure?");
                                
                                if(theyAreSure){
                                    let sid = document.getElementById("sid-" + registered_voters[i].sid).innerText;
                                    let voted = document.getElementById("checkbox-" + (i+1)).checked;

                                    let params =
                                        "sid=" + sid +
                                        "&voted=" + voted;
                                
                                    let xhr2 = new XMLHttpRequest();

                                    xhr2.open("POST", "add_vote.php", false);

                                    xhr2.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

                                    xhr2.onload = function(){
                                        console.log(this.responseText);
                                    }
                                    xhr2.send(params);

                                    window.location.reload();
                                }
                            })    
                        }
                    }
                }
            }
            xhr1.send();

Ευχαριστω πολυ και παλι.

EDIT: Link σε περιπτωση που καποιος ενδιαφερθει να το τσεκαρει: http://elections-voting-system.000webhostapp.com/index.html

Επεξ/σία από Jordan95
Δημοσ.

Μπορείς να βγάλεις τους event listeneres έξω από το callback και να γράψεις μόνο έναν όπως σου έδειξα παραπάνω.

Επίσης μπορείς να χρεισημοποιήσεις fetch για το request σου, template literals για να τυπώσεις το markup σου, και να σπάσει λίγο ακόμη τον κώδικά σου

Δες ένα μικρό παράδειγμα ( το πιθανότερο είναι να μην τρέχει το έγραψα εδώ στο πόδι αλλά ελπίζω να σου δώσει ένα hint για τον τρόπο που θέλω να σου δείξω )

 

    fetch('http://localhost/registered_voters.php')
    .then(function(response) {
        return response.json()
    })
    .then(function(registeredVoters) {
        if(data) {
            printRegisteredVotersMarkup(registeredVoters)
        }
    })
    
    function printRegisteredVotersMarkup(registeredVoters) {
        //Print markup...

        //Add the event listener
        document.addEventListener('click', function(event) {
            if (event.target.id == 'addVote') {
                //Get sid
                let sid = event.target // get sid from data-sid
                vote(sid)
            }
        });
    }

    fucntion vote(sid) {
        fetch('http://localhost/add_vote.php', 
            method: 'POST',
            headers: {
            'Accept': 'application/json',
            'Content-Type': 'application/json'
            },
            body: JSON.stringify({sid: sid})
        ).then(function(response) {
            //Handle response here...
        });
    }

 

Δες μερικά links για αυτά που σου είπα

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals

https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API

https://stackoverflow.com/questions/29775797/fetch-post-json-data

https://stackoverflow.com/questions/30880757/javascript-equivalent-to-on

 

 

  • Thanks 1

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...