Καλημέρα, μια βοήθεια θα ήταν πολύτιμη αν κάποιος ...
# chat
p
Καλημέρα, μια βοήθεια θα ήταν πολύτιμη αν κάποιος έχει έρθει αντιμέτωπος με το εξής: Σε commerce, βρίσκομαι στο default view Products (με path /admin/commerce/products) όπου εμφανίζονται όλα τα products που έχουμε στο site. Το site είναι δίγλωσσο (Ελληνικά & Αγγλικά). Βάζω στο view ένα Relationship το Product Variation. Μου πετάει διπλά-τριπλά-τετραπλά αποτελέσματα. Ωραία λέω, κάτι παίζει με το Join. Όντως ενώ οι πίνακες έχουν κύρια κλειδιά το product_id και το langcode, το JOIN γίνεται μόνο με το product_id. Δε βλέπω να μπορώ να επέμβω στο JOIN. Σας έτυχε;
v
Έχω καιρό να ασχοληθώ αλλά αν θυμάμαι καλά μπορείς να δώσεις και το language σαν contextual filter.
p
Contextual; Δε νομίζω να έχουν εφαρμογή εδώ τα contextual filters. Δε μιλάμε για path τύπου /admin/commerce/products/%
d
δεν εχει να βαλεις relationship για γλωσσα?
p
όχι 😞
😱 1
f
χωρις να ειμαι σιγουρος, στα filters εχει "Content: Translation language" > Content language selected for page
p
Έχει ναι και ιδανικά αυτό είναι και exposed φίλτρο για να διαλέγει ο διαχειριστής τα προϊόντα στη γλώσσα που θέλει να δει. Τα filters όμως στο query, μπαίνουν στο WHERE. Το query έχει φέρει 4 αποτελέσματα. 2 με langcode ‘el’ 2 με langcode ‘en’ Οπότε με το filter στο where απλά πετυχαίνω να εμφανίζονται τα 2 από τα 4 αποτελέσματα. Για να φέρει σωστά αποτελέσματα (1 για κάθε γλώσσα) θα πρέπει να λαμβάνεται υπόψιν στο JOIN το langcode. Ψάξε - ψάξε, βρήκα ένα issue που νομίζω ότι είναι αυτό που εντόπισα κι εγώ, αλλά δε βλέπω να λειτουργεί το patch τουλάχιστον σε commerce οντότητες. https://www.drupal.org/project/drupal/issues/2737619#comment-14886329
👍 1
v
@Pericles Arg., το θέμα είναι να έχεις το condition. Το αν θα το έχεις στο INNER JOIN ή στο WHERE είναι ίδιο και το αυτό (πχ. δεν ισχύει το ίδιο για τα LEFT JOIN). Άρα αν βάζοντας φίλτρο δεν καταλήγεις σε 1 αποτέλεσμα, σημαίνει πως υπάρχει κάποιο ακόμη JOIN που χρειάζεται να διαχειριστείς στο query σου.
p
Κάτι “κακό” συμβαίνει που δε μπορώ να αντιληφθώ. Μιλάμε για ένα προϊόν με id 168. Όπως φαίνεται με ένα απλό query με INNER JOIN των πινάκων product και variation, φέρνει 4 αποτελέσματα κάνοντας συνδιασμό των γλωσσών. Γι' αυτό έλεγα ότι αν στο JOIN είχε ένα ON product.langcode = variation.langcode θα καθάριζε η μπουγάδα.
v
Οοοοκ! Άρα όρισε και language του variation στο where. Αφού έχεις και product & variation translations, θες να περιορίσεις και τα δύο.
👍 1
p
Ναι σωστά. Απλά πρέπει να δω αν μπορώ να κάνω expose το ένα από τα δύο languages, ώστε ο χρήστης να επιλέγει μία γλώσσα (που θα έχει εφαρμογή και στο άλλο filter)
v
Εναλλακτικά θα μπορούσε να αλλάζει τη γλώσσα όλης της σελίδας κι εσύ να παίρνεις πάντα την τρέχουσα γλώσσα της σελίδας και να εμφανίζεις αποτελέσματα.
p
Χμ.. αυτό μόνο βλέπω να γίνεται. Δε μπορώ να ορίσω φίλτρο που θα τραβάει τιμή από άλλο φίλτρο για να κάνω αυτό που είπα παραπάνω
f
ή λιγο js να αλλαζει το 2ο dropdown στο change του πρώτου (και κανεις hide το 2ο)
p
Ως γνωστός ξεροκέφαλος, το έφτιαξα με το hook_views_query_alter που πρότεινε πιο πάνω ο @dimitriskri (ευχαριστώ πολύ!) ώστε να προσθέσω “με το χέρι” μία επιπλέον συνθήκη στο ON του join για να λαμβάνει υποψιν του και το langcode. @vensires ευχαριστώ για τη βοήθεια 🙂
🙌 1
😂 1
v
Ό,τι σε βολεύει εσένα @Pericles Arg. 🙂 Χαρά μας όλων τέτοια ερωτήματα όπως βλέπεις 😉 Άλλη εναλλακτική που θα μπορούσε να σου παίξει θα ήταν να βάλεις τα πεδία της γλώσσας ως Fields (ακόμη κι αν δεν τα τυπώσεις) ώστε να τα βάλεις στα filters ως combination ως fields. Και λογικά θα χρειαζόσουν ένα
hook_form_views_exposed_form_alter()
για να αλλάξεις το textfield που σου βγάζει αυτό σε
<select>
με τα
#options
που θέλεις (enabled languages).
p
Μέσα στις δοκιμές μου τα έβαλα ως fields χωρίς να τα εμφανίζω, αλλά το παρακάτω δεν το σκέφτηκα. Όντως πολύ καλό! 🙂
👍🏻 1