Έχω 2 πίνακες όπου ένα χαρακτηριστικό του πρώτου αποτελεί ξένο κλειδί για τον δεύτερο. Θέλω κατά την εισαγωγή νέας εγγραφής ή κατά την ενημέρωση του δεύτερου πίνακα να εμφανίζω (σε dropdownlist) όλες τις τιμές του χαρακτηριστικού που αποτελεί ξένο κλειδί ώστε να μπορεί να επιλέγει ο χρήστης κάποια ήδη υπάρχουσα τιμή που έχει εισαχθεί σε προγενέστερη φάση στον πρώτο πίνακα.
Έχω ήδη κάνει μια dropdown list στην οποία πραγματοποιώ μια αντιστοίχιση ακεραίων με ένα string. Ο τρόπος πρόσβασης σε δεδομένα της βάσης προφανώς απέχει από τον τρόπο που προσέγγισα την πρώτη dropdown list. Υπάρχει κάποια built in συνάρτηση (στην οποία να ορίζω το μοντέλο και το χαρακτηριστικό που θέλω και να τη περνάω ως όρισμα στη μέθοδο dropDownList) και να γίνεται η δουλειά, ή πρέπει να γράψω συνάρτηση που τραβάει δεδομένα από τη βάση??
Ναι, απλό είναι (κλασική περίπτωση αυτό που θέλεις).
Με Active Record το κάνεις εύκολα. Έχεις την κλάση-μοντέλο για τον δεύτερο πίνακά σου. Στην κλάση-μοντέλο του πρώτου πίνακα (εκεί που μπαίνει το id για το δεύτερο), εννοείται ότι έχεις φτιάξει το relation για την άλλη κλάση (μέσω της συνάρτησης relations()). Μετά, στη φόρμα του πρώτου μοντέλου έχεις κάτι σε:
Συγνώμη που άργησα να απαντήσω αλλά έτρεχα από χθες…Για να γίνω πιο σαφής γιατί κάτι από τα λεγόμενά σου μάλλον δεν κατάλαβα!!
Έχω την κλάση artworks στην οποία ένα χαρακτηριστικό της (το Volume_Id) είναι ξένο κλειδί που αναφέρεται στο id του πίνακα volumes. Στη κλάση artworks και μέσα στη μέθοδο relations και σύμφωνα με το guide του Yii έχω γράψει:
Στην πρώτη γραμμή, το όρισμα τύπου array στην findAll λέει να επιλέξει τις στήλες id και name (υποθέτοντας ότι υπάρχει τέτοια στήλη). Στην listData ναι μεν του λες από ποιο μοντέλο να φτιάξει τα δεδομένα ($model), αλλά επίσης πρέπει να του πεις από αυτό το μοντέλο ποιο θα χρησιμοποιήσει ως value και ως κείμενο που θα φαίνεται σε κάθε επιλογή. Παράδειγμα, για id=1 να έχεις τιμή πχ. Τηλεόραση. Δηλαδή να βγει σε html κάτι σε:
<option value="1">Τηλεόραση</option>
Δηλαδή το id είναι το 1 και το text που θα φαίνεται το Τηλεόραση. Έτσι φαντάσου ότι για όσα αντικείμενα τύπου Volumes θα δημιουργηθούν αντίστοιχα τόσα <option> tags. Δοκίμασέ το και πες μας.
Επίσης, το ότι είσαι νέος στο Yii, δε σημαίνει ότι δεν πρέπει να ρωτάς. Απορίες έχεις, μην αγχώνεσαι. Όλοι ήμασταν κάποια στιγμή στη θέση σου (και πολλές φορές νιώθουμε ακόμη νέοι).
Εν τέλει έγραψα αυτό με τη βοήθεια του guide και αφού πρώτα με έβαλες εσύ στο κλίμα Βασίλη!!Όταν τελειώσω τη διπλωματική, (πλέον είμαι κοντά), κερνάω καφέ στην Αριστοτέλους μια που είσαι και δίπλα!!
//Ήμουν μέσα στο $model οπότε δεν χρειαζότανε η γραμμή: model2 = Artworks::model()->findAll('Volume_Id');
$model2 = Volumes::model()->findAll();
$list= CHtml::listData($model2,'id','id');
echo $form->dropDownList($model,'Volume_Id', $list);