mgiota Δημοσ. 17 Δεκεμβρίου 2009 Δημοσ. 17 Δεκεμβρίου 2009 Καλησπέρα παιδιά, κάνω μία δυναμική ιστοσελίδα με εκθέσεις(πίνακες ζωγραφικής) και θέλω να δώσω τη δυνατότητα στο διαχειριστή του site να ταξινομεί τις εγγραφές κατά θέση και όχι ημερολογιακά. Καταρχήν έχω προσθέσει ένα πεδίο position στη βάση για το σκοπό αυτό και στο cms έχω κάνει μία φόρμα που εμφανίζει τους τίτλους των εκθέσεων και δίπλα ένα textfield που αναγράφει τη θέση. Αν έχω π.χ. 5 εγγραφές και βάλω manual σε κάθε textfield την τιμή που θέλω Ok κανένα πρόβλημα. Τι κάνω όμως στην περίπτωση που έχω πολλές εγγραφές (που στην πραγματικότητα αυτό ισχύει). Τότε ένα τέτοιο cms θα ήταν πολύ δύσχρηστο. Αυτό που θέλω να κάνω λοιπόν είναι το εξής: Να αλλάζω τιμή σε ένα μόνο πεδίο, στο πεδίο που θέλω, και αυτόματα όλες οι υπόλοιπες τιμές να προσαρμόζονται. Έχει κανείς κάποια ιδέα πως μπορώ να το πετύχω αυτό; Με javascript θα το κάνω αυτό; Συγκεκριμένα χρησιμοποιώ jquery.
yourse.gr Δημοσ. 17 Δεκεμβρίου 2009 Δημοσ. 17 Δεκεμβρίου 2009 Έστω $position εκεί που θες να το πάς και $old_postion εκεί που ήτανε >UPDATE `table` SET `position`=$position WHERE `id`= ... UPDATE `table` SET `position`=`position`+1 WHERE `position`>=$position && `position`<$old_position && `id`!= ... Έτσι πρόχειρα. Ίσως μπορείς να το κάνεις και με ένα query ...
macabre_sunsets Δημοσ. 17 Δεκεμβρίου 2009 Δημοσ. 17 Δεκεμβρίου 2009 Ρίξε μια ματιά σε αυτό το Plugin. Έστω ότι εμφανίζεις σε έναν table τις εικόνες που έχεις, αυτό σου δίνει την δυνατότητα να αλλάζεις την σειρά των rows. Όταν πραγματοποιήσεις την μεταφορά ενός row σε άλλη θέση έχει μια function που μπορείς να κάνεις ότι θέλεις. Ίσως μπορείς να ορίσεις την τιμή του κάθε row να αντιστοιχεί στην τιμή της θέσης που θέλεις να έχει η εικόνα. Έτσι όταν κάνεις την αλλαγή που θέλεις, καλείς μια function που να αλλάζει αυτόματα την τιμή της θέσης στην βάση σου, με βάση την τιμή του row. (το μπέρδεψα κάπως?)
mgiota Δημοσ. 17 Δεκεμβρίου 2009 Μέλος Δημοσ. 17 Δεκεμβρίου 2009 ---------- Το μήνυμα προστέθηκε στις 12:56 ---------- Ρίξε μια ματιά σε αυτό το Plugin. Έστω ότι εμφανίζεις σε έναν table τις εικόνες που έχεις, αυτό σου δίνει την δυνατότητα να αλλάζεις την σειρά των rows. Όταν πραγματοποιήσεις την μεταφορά ενός row σε άλλη θέση έχει μια function που μπορείς να κάνεις ότι θέλεις. Ίσως μπορείς να ορίσεις την τιμή του κάθε row να αντιστοιχεί στην τιμή της θέσης που θέλεις να έχει η εικόνα. Έτσι όταν κάνεις την αλλαγή που θέλεις, καλείς μια function που να αλλάζει αυτόματα την τιμή της θέσης στην βάση σου, με βάση την τιμή του row. (το μπέρδεψα κάπως?) θα το κοιτάξω και ελπίζω να μην μπερδευτώ. Καλό μου φάνηκε. ---------- Το μήνυμα προστέθηκε στις 12:59 ---------- Έστω $position εκεί που θες να το πάς και $old_postion εκεί που ήτανε >UPDATE `table` SET `position`=$position WHERE `id`= ... UPDATE `table` SET `position`=`position`+1 WHERE `position`>=$position && `position`<$old_position && `id`!= ... Έτσι πρόχειρα. Ίσως μπορείς να το κάνεις και με ένα query ... Με μια πρώτη ματιά μου ακούγεται λογικό. Θα το εφαρμόσω σε παράδειγμα με νουμεράκια για να δω ότι όλα παίζουν καλά. Εσύ το έχεις εφαρμόσει στην πράξη; Α το δεύτρο query είναι σε ένα Loop σωστά;
yourse.gr Δημοσ. 17 Δεκεμβρίου 2009 Δημοσ. 17 Δεκεμβρίου 2009 Όχι δεν είναι σε loop. Ας πούμε ... ----------------- id | position | ----------------- 1| 1| ----------------- 2| 2| ----------------- 3| 3| ----------------- και θές να πάς το 2 στο 1 μετά το πρώτο query ----------------- id | position | ----------------- 1| 1| ----------------- 2| 1| ----------------- 3| 3| ----------------- και τώρα το δεύτερο θα προσθέσει 1 στην τιμή position όσων έχουν position μεγαλύτερο ή ίσο με 1 και μικρότερο του 2 και δεν έχουν id=2 και ο πίνακας θα γίνει έτσι ( ORDER BY `id` ASC ) ----------------- id | position | ----------------- 1| 2| ----------------- 2| 1| ----------------- 3| 3| ----------------- Με μια πρώτη ματιά μου ακούγεται λογικό. Θα το εφαρμόσω σε παράδειγμα με νουμεράκια για να δω ότι όλα παίζουν καλά. Εσύ το έχεις εφαρμόσει στην πράξη; Α το δεύτρο query είναι σε ένα Loop σωστά; (αυτό πηγαίνει στον yourse.gr) ---------- Το μήνυμα προστέθηκε στις 12:56 ---------- θα το κοιτάξω και ελπίζω να μην μπερδευτώ. Καλό μου φάνηκε.
mgiota Δημοσ. 17 Δεκεμβρίου 2009 Μέλος Δημοσ. 17 Δεκεμβρίου 2009 Όχι δεν είναι σε loop. Ας πούμε ... ----------------- id | position | ----------------- 1| 1| ----------------- 2| 2| ----------------- 3| 3| ----------------- και θές να πάς το 2 στο 1 μετά το πρώτο query ----------------- id | position | ----------------- 1| 1| ----------------- 2| 1| ----------------- 3| 3| ----------------- και τώρα το δεύτερο θα προσθέσει 1 στην τιμή position όσων έχουν position μεγαλύτερο ή ίσο με 1 και μικρότερο του 2 και δεν έχουν id=2 και ο πίνακας θα γίνει έτσι ( ORDER BY `id` ASC ) ----------------- id | position | ----------------- 1| 2| ----------------- 2| 1| ----------------- 3| 3| ----------------- οκ ευχαριστώ το αντιλήφθηκα μετά. Το "loop" στην ουσία το κάνει η mysql για τις τιμές που είναι στο between. ---------- Το μήνυμα προστέθηκε στις 13:46 ---------- Βασικά δεν έκατσα να το σκεφτώ και πολύ αλλά μου δημιουργήθηκε τώρα το εξής ερώτημα. Αν αλλάξει τιμή για μία μόνο εγγραφή όπως είπες, ο κώδικάς σου λειτουργεί πολύ σωστά, και κάνει τις σωστές προσαρμογές, όταν όμως εμφανίζονται όλες οι εγγραφές μαζεμένες και πάει να κάνει αλλαγή σε περισσότερα του ενός πεδία τότε ο κώδικας θα πρέπει να είναι σε ένα Loop για να πάρει με post τις τιμές και μετά να κάνει τη σωστή αποθήκευση των τιμών. Πρέπει οπότε να κάνω κάποιον έλεγχο για να δω αν έγιναν post περισσότερα του ενός πεδία οπότε να πηγαίνει στον κώδικα που είχα εγώ πριν και αν κάνει post μία μόνο τιμή τότε να πηγαίνει στον δικό σου κώδικα;
Uberalles_gr Δημοσ. 17 Δεκεμβρίου 2009 Δημοσ. 17 Δεκεμβρίου 2009 macabre_sunsets Πολύ καλό το link που έδωσες !! Όσον αφορά τον κώδικα του yourse.gr θα πρέπει φίλε μου κάποιες εγγραφές αντίστοιχα να μειώνεις το position
yourse.gr Δημοσ. 17 Δεκεμβρίου 2009 Δημοσ. 17 Δεκεμβρίου 2009 Το πρόβλημα που υπάρχει όταν θές να αλλάξεις πολλά στοιχεία είναι όταν ένα από τα στοιχεία του οποίου το position θες να αλλάξεις πάει ένα position ( η και παραπάνω ) πίσω. Στη συγκεκριμένη περίπτωση κρατιέσαι από τα ids που δεν αλλάζουν οπότε η κατάσταση μεταφράζεται όχι το 2ο να πάει 1ο και το 20ο να πάει 4ο αλλά το id=x1 να πάει 2ο και το id=x2 να πάει 4ο δηλαδή κάθε φορά με βάση τα ids αλλάζεις τα $position και $old_position σε php > foreach ($item as $id=>$n_position) { $c_position = get_position($id); // SELECT `position` WHERE `id`=$id // // εδω τα 2 query που είπαμε με $position = $n_position και $old_position = $c_position // }
mgiota Δημοσ. 17 Δεκεμβρίου 2009 Μέλος Δημοσ. 17 Δεκεμβρίου 2009 και θές να πάς το 2 στο 1 Αν θέλω να πάω το 3 στο 1 τότε με τον παραπάνω κώδικα θα γίνει το 3 -> 1 όμως το 2 και το 3 θα γίνουν 2. Γιατί το position θα γίνει position+1 δηλαδή 2 για όλες τις τιμές που είναι στα όρια που βάζεις. Ή μήπως κάνω λάθος γιατί ψιλομπερδεύτηκα.
yourse.gr Δημοσ. 17 Δεκεμβρίου 2009 Δημοσ. 17 Δεκεμβρίου 2009 Το position του καθενός είναι διαφορετικό. Το 3->1 σημαινει 1->1+1, 2->2+1 Sorry αν σε μπέρδεψα κανε ένα test table και τρέξτα κατευθείαν εκεί και θα το καταλάβεις
mgiota Δημοσ. 17 Δεκεμβρίου 2009 Μέλος Δημοσ. 17 Δεκεμβρίου 2009 Αν θέλω να πάω το 3 στο 1 τότε με τον παραπάνω κώδικα θα γίνει το 3 -> 1όμως το 2 και το 3 θα γίνουν 2. Γιατί το position θα γίνει position+1 δηλαδή 2 για όλες τις τιμές που είναι στα όρια που βάζεις. Ή μήπως κάνω λάθος γιατί ψιλομπερδεύτηκα. Τελικά εγώ είχα κάνει λάθος στον κώδικα που μου έδωσες. Εκεί που έθετες position=position+1 εγώ έβαζα position='$position'+1. ---------- Το μήνυμα προστέθηκε στις 15:19 ---------- Ταυτόχρονα απαντάμε yourse.gr. Τελικά το έκανα με τον κώδικα που μου έδωσες σε συνδυασμό με τον κώδικα που είχα εγώ, κάνοντας έναν έλεγχο πόσες τιμές έγιναν Post για να πάει αντίστοιχα στο σωστό query. ---------- Το μήνυμα προστέθηκε στις 15:26 ---------- Όσον αφορά τον κώδικα του yourse.gr θα πρέπει φίλε μου κάποιες εγγραφές αντίστοιχα να μειώνεις το position Όντως το παρατήρησα και γω πριν. Αφού έλυσα το πρόβλημα της αύξησης πρέπει να κάνω κάτι σε περίπτωση που ρίχνω τη θέση ταξινόμησης.
yourse.gr Δημοσ. 17 Δεκεμβρίου 2009 Δημοσ. 17 Δεκεμβρίου 2009 macabre_sunsets Πολύ καλό το link που έδωσες !! Όσον αφορά τον κώδικα του yourse.gr θα πρέπει φίλε μου κάποιες εγγραφές αντίστοιχα να μειώνεις το position Όντως όσα έχω γράψει είναι για να μετακινεις κάτι σε μικρότερο position αν θες το ανάποδο η πρόσθεση γίνεται αφαίρεση και τα μεγαλύτερα μικρότερα και αντίστοιχα. Βέβαια αν το καλοσκεφτείς θα μπορούσες να τα κάνεις και όλα χωρίς αφαίρεση μετακινώντας τα πάντα μπροστά από αυτό που θες να πάει πίσω :-P Αλλά αυτό είναι σκέτη δικαιολογία ...
mgiota Δημοσ. 17 Δεκεμβρίου 2009 Μέλος Δημοσ. 17 Δεκεμβρίου 2009 Όντως όσα έχω γράψει είναι για να μετακινεις κάτι σε μικρότερο position αν θες το ανάποδο η πρόσθεση γίνεται αφαίρεση και τα μεγαλύτερα μικρότερα και αντίστοιχα. Βέβαια αν το καλοσκεφτείς θα μπορούσες να τα κάνεις και όλα χωρίς αφαίρεση μετακινώντας τα πάντα μπροστά από αυτό που θες να πάει πίσω :-P Αλλά αυτό είναι σκέτη δικαιολογία ... Και γω αρχικά έτσι το είχα σκεφτεί να αλλάζω σειρά ταξινόμησης μόνο προς τα πάνω. Στην περίπτωση της μείωσης έκανα αυτό που είπες και λειτούργησε μια χαρά.Thanks! Απλά μία γενική ερώτηση. Επειδή έχω 'χίλια' if else είναι πρόβλημα μεγάλο όσον αφορά το χρόνο απόκρισης της mysql;
mgiota Δημοσ. 17 Δεκεμβρίου 2009 Μέλος Δημοσ. 17 Δεκεμβρίου 2009 Για πόσταρε τον κώδικα σου Λοιπόν ο κώδικας που προέκυψε για τη σελίδα sort_results είναι ο εξής: $result = $mysqli->query("SELECT * FROM articles WHERE category_id='$id' ORDER BY position"); $num=0; //edw ayto to kanw gia na dw an o xristis allaxe mia mono timi opote oi ypoloipes prosarmozontai aytomata i an ekane enallagi anamesa se perissotera text fields while($myrow = $result->fetch_object()){ $idp=$myrow->id; $old_position=$myrow->position; $state="position$idp"; $position=$_GET["$state"]; if($old_position!=$position){ $num++; } } //ean ekane enallagi metaksi perissoterwn textfields if($num>1){ $result = $mysqli->query("SELECT * FROM articles WHERE category_id='$id' ORDER BY position"); while($myrow = $result->fetch_object()){ $idp=$myrow->id; $state="position$idp"; $position=$_GET["$state"]; $sqlr = "UPDATE articles SET position='$position' WHERE id='$idp'"; $resultr = $mysqli->query($sqlr); } } else { //ean allaxe mono mia timi tote prosarmozontai oi ypoloipes analoga $result = $mysqli->query("SELECT * FROM articles WHERE category_id='$id' ORDER BY position"); while($myrow = $result->fetch_object()){ $idp=$myrow->id; $old_position=$myrow->position; $state="position$idp"; $position=$_GET["$state"]; if($old_position!=$position){ $theidp=$myrow->id; $theold_position=$myrow->position; $state="position$theidp"; $theposition=$_GET["$state"]; if($old_position<$position){ $act="down"; } else { $act="up"; } } } $sqlr = "UPDATE articles SET position='$theposition' WHERE id='$theidp'"; $resultr = $mysqli->query($sqlr); if($act=="up"){ $sql2="UPDATE articles SET position=position+1 WHERE category_id='$id' && position>=$theposition && position<$theold_position && id!='$theidp'"; $result2=$mysqli->query($sql2); } else { $sql2="UPDATE articles SET position=position-1 WHERE category_id='$id' && position<=$theposition && position>$theold_position && id!='$theidp'"; $result2=$mysqli->query($sql2); } } Έχω και κάποια σχόλια που εξηγώ τη λογική μου. Απ' ότι έχω ελέγξει μέχρι στιγμής λειτουργεί σωστά (θα κάνω βέβαια και άλλους ελέγχους). Απλά δεν πρέπει να είναι και η πιο σωστή υλοποίηση. Κάνει πολλά ερωτήματα στο server. Για παράδειγμα εκεί που ελέγχω στην αρχή πόσες τιμές άλλαξαν, πώς θα μπορούσα να το κάνω καλύτερα;
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.