antonisid Δημοσ. 30 Δεκεμβρίου 2011 Δημοσ. 30 Δεκεμβρίου 2011 Καλησπέρα Έχω φτιάξει ένα περιβάλλον όπου ο χρήστης μπορεί να προσθέσει κάποιο άρθρο στο site και οι δυνατότητες που έχει είναι:Να βάζει τον τίτλο,το κείμενο και να επιλέγει την κατηγορία που θ'ανήκει. Σκέφτηκα βάλω και δυνατότητα για tags.Έτσι λοιπόν θα υπάρχει ένα πεδίο μ'ένα κουμπί "add tag" ,και κάθε φορά που θα πατιέται θα προσθέτει το tag αυτό σ'έναν πίνακα.Και γιατί σε πίνακα?Μπορεί πχ να θέλει να βάλει 4 tags. Όταν ολοκληρώσει την συμπλήρωση των στοιχείων (γενικά του άρθρου) και πατήσει Submit , με την εντολή foreach θα διατρέχω τα πεδία του πίνακα των tags και θα καταχωρώ καθένα ξεχωριστά στο αντίστοιχο table της βάσης.Αυτό είναι το σκεπτικό μου και το πρόβλημα είναι ότι δεν ξέρω πως θα αποθηκεύω πατώντας το κουμπί "add tag" όσες φορές θέλω tags στον πίνακα. Δοκίμασα κάπως έτσι αλλά αποθηκεύεται και πολύ λογικά κάθε νέο tag στο πρώτο στοιχείο του πίνακα. > <?php $x = array(); if (isset($_POST['submit'])) { $tag = $_POST['tags']; array_push($x ,$tag); } print_r($x); // ο σκοπός της print_r είναι μόνο για να βλέπω πως γεμίζει ο πίνακας. } ?> <form action="tags.php" method="post"> <input type="text" name="tags"> <input type="submit" name="submit" value="Add Tag"> </form> Καμμιά ιδέα?
spartakoscs Δημοσ. 31 Δεκεμβρίου 2011 Δημοσ. 31 Δεκεμβρίου 2011 Με session μπορείς να το κάνεις , δεν ξέρω εάν είναι ο ποιο ιδανικός τρόπος αλλά λογικά θα κάνεις αυτό που θες !! > <?php if (isset($_POST['submit'])) { session_start(); $_SESSION['tags'][]= $_POST['tags']; } print_r($_SESSION['tags']); // ο σκοπός της print_r είναι μόνο για να βλέπω πως γεμίζει ο πίνακας. //και αφου τελειώσεις και κανεις αποθήκευση τα δεδομένα σου κανε και ένα session_destroy(); ?> <form action="tags.php" method="post"> <input type="text" name="tags"> <input type="submit" name="submit" value="Add Tag"> </form>
Uberalles_gr Δημοσ. 31 Δεκεμβρίου 2011 Δημοσ. 31 Δεκεμβρίου 2011 Με SESSION ούτε που να το σκέφτεσαι.... Το έχεις κάνει σωστά με το array_push αλλά αυτό που σου λείπει είναι οι προηγούμενες τιμές του πίνακα. Έτσι μπορείς σε ένα hidden πεδίο να κρατάς τις τιμές του πίνακα σου. Δηλαδή > <?php $x = array(); if (isset($_POST['submit'])) { $tag = $_POST['tags']; $x = $_POST['hidden_array']; array_push($x ,$tag); } print_r($x); // ο σκοπός της print_r είναι μόνο για να βλέπω πως γεμίζει ο πίνακας. } ?> <form action="tags.php" method="post"> <input type="text" name="tags"> <input type="submit" name="submit" value="Add Tag"> <input type="hidden" name="hidden_array" value="<?php echo $x; ?>" /> </form> Βέβαια εγώ θα έκανα αυτό που θες με javascript, δηλαδή εάν θέλει να βάλει και άλλο tag να υπάρχει ένα κουμπί Προσθήκη Tag και πατώντας το να δημιουργείται ένα νέο πεδίο για το Tag. Εάν σε ενδιαφέρει κάτι τέτοιο πες μου να σου στείλω κώδικα
antonisid Δημοσ. 31 Δεκεμβρίου 2011 Μέλος Δημοσ. 31 Δεκεμβρίου 2011 (επεξεργασμένο) Αρχικά γιατί να ξεχάσω τα SESSIONS?Για λόγους ασφαλείας? Δοκίμασα τον κώδικά σου Uberalles_gr αλλά μου εμφανίζει το εξής μήνυμα Warning: array_push() expects parameter 1 to be array, string given in C:\xampp\htdocs\official\skills\tags.php on line 7 Θα μπορούσες να το διορθώσεις??? γιατί δεν βρίσκω τι φταίει και στείλε μου και τον κώδικα με Javascript όποτε ευκαιρήσεις. Επεξ/σία 2 Ιανουαρίου 2012 από antonisid
Uberalles_gr Δημοσ. 2 Ιανουαρίου 2012 Δημοσ. 2 Ιανουαρίου 2012 Καλή Χρονιά και Χρόνια Πολλά! Το είδα το μήνυμά σου απλώς δεν είχα χρόνο να σου απαντήσω. Λοιπόν, έχεις δίκιο για το warning είναι λάθος ο κώδικας. Παρακάτω είναι ο κώδικας που θες > <?php $my_array = array(); if (isset($_POST['submit'])) { $tag = $_POST['tags']; if (isset($_POST['my_array'])) { $my_array = $_POST['my_array']; array_push($my_array, $tag); } else { $my_array[0] = $tag; } } print_r($my_array); // ο σκοπός της print_r είναι μόνο για να βλέπω πως γεμίζει ο πίνακας. ?> <form action="tags.php" method="post"> <input type="text" name="tags"> <input type="submit" name="submit" value="Add Tag"> <?php if (count($my_array) > 0) { foreach ($my_array as $key => $value) { echo '<input type="hidden" name="my_array[]" value="'.htmlspecialchars($value).'">'; } } ?> </form> Για ότι δεν καταλαβαίνεις μου λες. Παρακάτω είναι ο κώδικας με jquery. Λίγο πιο περίπλοκος αλλά πιο εύχρηστος για τον χρήστη αφού μπορεί να προσθέτει πολλά tags και να φτιάξεις τον κώδικα έτσι ώστε να μπορεί να τα επεξεργάζεται και να τα διαγράφει. H tags.php > <script type="text/javascript" language="javascript" src="js/jquery-1.7.1.js"></script> <script type="text/javascript" language="javascript"> $(document).ready(function() { $("img#expand").click(function() { $.post("ajax.php",{ type:"add_tag" } ,function(data) { if(data != "PROBLEM") { $("#extra_tags").append(data); } }); }); }); function func_delete_extra_tag(id) { var olddiv = document.getElementById(id); document.getElementById("extra_tags").removeChild(olddiv); } </script> <?php if (isset($_POST['submit'])) { $tags = $_POST['tags']; } ?> <form action="test.php" method="post"> <table> <tr> <td align="right">Tag:</td> <td align="left"> <input type="text" name="tags[]" id="tags[]" value="" /> <span style="padding-left:5px;"><img src="images/expand.gif" border="0" alt="Προσθήκη Tag" title="Προσθήκη Tag" onmouseover="this.style.cursor='pointer'" id="expand" /></span> <div id="extra_tags"></div> </td> </tr> </table> <input type="submit" name="submit" value="Add Tag"> </form> Και η ajax.php Που χρησιμοποιώ: > <?php if (isset($_POST['type'])) { $type = htmlspecialchars($_POST['type']); if ($type == "add_tag") { $id = rand(0, 999999); echo '<div id="'.$id.'" style="padding-top:10px;"> <input type="text" name="tags[]" id="tags[]" value="" /> <span style="padding-left:5px;"><img src="images/collapse.gif" border="0" alt="Διαγραφή Tag" title="Διαγραφή Tag" onmouseover="this.style.cursor=\'pointer\'" onclick="func_delete_extra_tag(\''.$id.'\')" /></span> </div>'; } else { echo "PROBLEM"; } } ?>
antonisid Δημοσ. 2 Ιανουαρίου 2012 Μέλος Δημοσ. 2 Ιανουαρίου 2012 Χίλια ευχαριστώ.Το πρώτο το είδα και δουλεύει μια χαρά και μου φαίνεται κατανοητό προς το παρών.Θα κοιτάξω και με Ajax κι αν κάτι χρειαστώ θα επανέλθω. Σ'ευχαριστώ και πάλι για τον χρόνο σου , θα με βοηθήσει αρκετά καθώς φτιάχνω εμπειρικά ένα δυναμικό site.
defacer Δημοσ. 2 Ιανουαρίου 2012 Δημοσ. 2 Ιανουαρίου 2012 Πρώτον: τζάμπα κούραση με array_push κλπ. Μπορείς να κάνεις κάτι σαν αυτό που λέει ο Uberalles αλλά πολύ πιο απλά: ><?php $tags = array(); if (isset($_POST['submit'])) { // Αν πατήθηκε submit αλλά το πεδίο με το "νέο tag" είναι κενό, αγνόησέ το $tags = array_filter($_POST['tags']); } print_r($tags); // ο σκοπός της print_r είναι μόνο για να βλέπω πως γεμίζει ο πίνακας. ?> <form action="tags.php" method="post"> <input type="text" name="tags[]"> <input type="submit" name="submit" value="Add Tag"> <?php if ($tags) { foreach ($tags as $value) { echo '<input type="hidden" name="tags[]" value="'.htmlspecialchars($value).'">'; } } ?> </form> Δεν υπάρχει κανένας απολύτως λόγος να μπερδεύεσαι με πολλούς πίνακες κλπ. Υπόψιν ότι η array_filter ως έχει δε θα σου επιτρέψει να προσθέσεις σαν tag το "0" (σου θυμίζει κάτι αυτό έτσι?) -- διάβασε το documentation. Πέρα απ' αυτό, το "submit μια φόρμα για κάθε tag" είναι που λένε so 90s και οποιαδήποτε άλλη λύση θα ήταν προτιμότερη. Προσωπικά δε βλέπω το λόγο να θέλει κάθε tag δικό του πεδίο. Βάλτα όλα μέσα σε ένα text πεδίο και κάνε ένα "έξυπνο" διαχωρισμό με κενά και κόμματα. Δεν είναι και τόσο δύσκολο δα να καταλάβεις τι εννοεί ο χρήστης όταν έχει γράψει tag, php, sample-appplication tag "php" "sample application" ή ο,τιδήποτε άλλο παρόμοιο. Κάνε τη ζωή εύκολη για τους χρήστες σου.
antonisid Δημοσ. 2 Ιανουαρίου 2012 Μέλος Δημοσ. 2 Ιανουαρίου 2012 Σ'ευχαριστώ καταρχάς,όντως είναι πιο απλός ο δικό σου τρόπος , αλλά μιας και βρίσκομαι σε πειραματικά στάδια και λίγο πολυπλοκότητα να υπάρχει "καλό" μου κάνει.Μια διευκρίνηση μόνο. Πέρα απ' αυτό, το "submit μια φόρμα για κάθε tag" είναι που λένε so 90s και οποιαδήποτε άλλη λύση θα ήταν προτιμότερη. Προσωπικά δε βλέπω το λόγο να θέλει κάθε tag δικό του πεδίο. Βάλτα όλα μέσα σε ένα text πεδίο και κάνε ένα "έξυπνο" διαχωρισμό με κενά και κόμματα. Δεν είναι και τόσο δύσκολο δα να καταλάβεις τι εννοεί ο χρήστης όταν έχει γράψει tag, php, sample-appplication tag "php" "sample application" Μαζί σου δε διαφωνώ,απλά δε ξέρω αν έχεις υπόψιν ότι κάθε tag θα το αποθηκεύω στην βάση με διαφορετικό id , ώστε να μπορεί να γίνει αναζήτηση και μέσω tags.Αν ο χρήστης μ'ένα submit αποθηκεύσει στην βάση πχ το tag, php, sample-appplication αυτό βολεύει μόνο για να εμφανίσει τα tags του άρθρου και δε θα μπορεί κάνοντας κλικ στον λίνκ sample application να του εμφανίσει τα αντίστοιχα άρθρα. (αν κάνω λάθος διόρθωσε με) Για να καταλάβεις πιο πολύ τι εννοώ , κάθε tag στην βάση θα έχει id,name,article_id (σε πιο άρθρο ανήκει) και κλικάροντας πχ στο tag "php" , με left join Θα εμφανίζω όλα τα άρθρα που το article.id = tag.article_id .
dewn735 Δημοσ. 2 Ιανουαρίου 2012 Δημοσ. 2 Ιανουαρίου 2012 Για να καταλάβεις πιο πολύ τι εννοώ , κάθε tag στην βάση θα έχει id,name,article_id (σε πιο άρθρο ανήκει) και κλικάροντας πχ στο tag "php" , με left join Θα εμφανίζω όλα τα άρθρα που το article.id = tag.article_id . Αυτό σου λέει ο defacer - δεν έχει νόημα να φτιάξεις διαφορετικό πίνακα για τα tags. Απλά, τα αποθηκεύεις σε ένα πεδίο στον πίνακα με τα άρθρα (πχ "tags") με τέτοιο τρόπο ώστε να μπορείς να τα ξεχωρίζεις μεταξύ τους (πχ "tag1" "tag2" ή @tag1@ @tag2@). Στη συνέχεια, και όταν θέλεις να φιλτράρεις ανάλογα με το tag, κάνεις μια αναζήτηση του τύπου SELECT * FROM articles WHERE tag LIKE '%@$tag@%'
antonisid Δημοσ. 3 Ιανουαρίου 2012 Μέλος Δημοσ. 3 Ιανουαρίου 2012 Δε διαφωνώ σ'αυτό , εγώ αναφέρθηκα στο submit που χρειάζεται κάθε Tag (βασικά ως ερώτηση το έθεσα) ώστε αν κάποιος βάλει "web design,html,css" , και αποθηκευτεί στην βάση στον έναν και μοναδικό πίνακα των articles όπως είπες...πέρα απο την εμφάνιση τους ως text πάνω απ'το άρθρο,δε θα χουν την λειτουργικότητα που θέλω,δηλαδή κάθε Tag-λέξη να "λειτουργεί" ξεχωριστά και δεν έχω άλλον τρόπο πέραν της καταχώρησης σ έναν array με κάθε πάτημα στο κουμπί "add tag" , και αφού γράψει το άρθρο και ο τίτλος του και πατηθεί submit , με την χρήση της foreach κάθε στοιχείο του array tags ν'αποθηκεύεται στην βάση. Edit: Με SELECT * FROM articles WHERE tag LIKE '%@$tag@%' θα κάνω την δουλειά μου όπως είπες,απλά όπως ανέφερα θέλω κάθε tag να έχει και σύνδεσμο προς μια λίστα με όλα τ'αντίστοιχα άρθρα.
dewn735 Δημοσ. 3 Ιανουαρίου 2012 Δημοσ. 3 Ιανουαρίου 2012 φυσικά και θα έχουν τη λειτουργικότητα που θες: έστω ότι έχουμε τα tags html, php και developing. Στη βάση τα αποθηκεύεις ως html&php&developing&. Όταν θες να τα εμφανίσεις, χρησιμοποιείς την explode: >$data = explode("&", $tags); foreach ($data as $tag) { if !(empty($tag)) echo "<a href='search_articles.php?tag=".$tag."'>".$tag."</a>"; }
defacer Δημοσ. 3 Ιανουαρίου 2012 Δημοσ. 3 Ιανουαρίου 2012 Αυτό σου λέει ο defacer - δεν έχει νόημα να φτιάξεις διαφορετικό πίνακα για τα tags. Απλά, τα αποθηκεύεις σε ένα πεδίο στον πίνακα με τα άρθρα (πχ "tags") με τέτοιο τρόπο ώστε να μπορείς να τα ξεχωρίζεις μεταξύ τους (πχ "tag1" "tag2" ή @tag1@ @tag2@). Στη συνέχεια, και όταν θέλεις να φιλτράρεις ανάλογα με το tag, κάνεις μια αναζήτηση του τύπου SELECT * FROM articles WHERE tag LIKE '%@$tag@%' Βασικά δεν λέω αυτό... Για την αποθήκευση συμφωνώ με ακριβώς αυτό που είχε στο μυαλό του από την αρχή: ξεχωριστό πίνακα και join. Αλλά η εισαγωγή των tags μπορεί (και πρέπει, if you ask me) να γίνει όλη σε ένα πεδίο. Απο κει και πέρα μπορείς με ένα regular expression (ή τέλος πάντων με ένα απλό explode για αρχή) να χωρίσεις αυτόματα το πεδίο σε tags και να τα αποθηκεύσεις ξεχωριστά χωρίς να κουράζεις το χρήστη βάζοντάς τον να υποδηλώνει πού ακριβώς διαχωρίζονται τα tags "με υπερβολική βία". Αυτό μπορεί να συνδυαστεί και με την ιδέα της Javascript για να καταλήξεις σε κάτι πραγματικά καλό (π.χ. όπως στο StackOverflow -- δες και τις οδηγίες στα δεξιά όταν έχεις focus το πεδίο των tags).
dewn735 Δημοσ. 3 Ιανουαρίου 2012 Δημοσ. 3 Ιανουαρίου 2012 My mistake . Το να αποθηκεύει όμως σε πίνακα, δε προϋποθέτει ότι τα tags θα είναι πάνω-κάτω γνωστά; Άμα ο κάθε χρήστης αρχίσει και βάζει και δικά του tags πως θα δουλέψει το σύστημα;
Uberalles_gr Δημοσ. 3 Ιανουαρίου 2012 Δημοσ. 3 Ιανουαρίου 2012 Εγώ προτείνω στην φόρμα σου να χρησιμοποιήσεις τον τρόπο που σου είπα, με την javascript και την προσθήκη/αφαίρεση tags εάν θέλει ο χρήστης, το οποίο βολεύει και στην επεξεργασία/διαγραφή, και στην βάση σου αφού θες μόνο τα tags για κάθε άρθρο, τότε να τα βάλεις στον ίδιο πίνακα με τα articles σε ένα πεδίο όπως είπαν τα παιδιά με ένα διαχωριστικό π.χ. ##tag1##tag2##tag3##
antonisid Δημοσ. 3 Ιανουαρίου 2012 Μέλος Δημοσ. 3 Ιανουαρίου 2012 My mistake . Το να αποθηκεύει όμως σε πίνακα, δε προϋποθέτει ότι τα tags θα είναι πάνω-κάτω γνωστά; Άμα ο κάθε χρήστης αρχίσει και βάζει και δικά του tags πως θα δουλέψει το σύστημα; Μα και στο wordpress ο κάθε χρήστης δε μπορεί να βάλει ότι θέλει? Κι εντάξει μιλάμε για χρήστες που θα χουν την ιδιότητα του διαχειριστή το οποίο το φτιάχνω τώρα,οπότε πάνω κάτω θα υπάρχει μια "κοινή γραμμή" για την προσθήκη των tags. Εγώ προτείνω στην φόρμα σου να χρησιμοποιήσεις τον τρόπο που σου είπα, με την javascript και την προσθήκη/αφαίρεση tags εάν θέλει ο χρήστης, το οποίο βολεύει και στην επεξεργασία/διαγραφή, και στην βάση σου αφού θες μόνο τα tags για κάθε άρθρο, τότε να τα βάλεις στον ίδιο πίνακα με τα articles σε ένα πεδίο όπως είπαν τα παιδιά με ένα διαχωριστικόπ.χ. ##tag1##tag2##tag3## Uberalles_gr με τον τρόπο τον δικό σου το υλοποιώ τελικά,σίγουρα αυτό που λέει και ο Defacer έχει μια λογική απλά ξαναλέω είμαι σε στάδια εκμάθησης και πειραματισμού.Αυτός είναι και ο λόγος που ενώ γίνεται να βάλω τα tags στον ίδιο τον πίνακα με τα άρθρα όπως λες,θα επιλέξω ξεχωριστό πίνακα για καθαρά για πειραματισμούς με την left join.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα