patrick Posted May 15, 2019 Posted May 15, 2019 Currently working on a search function for a multi language website (DE, FR, IT). If I'm on the FR (or IT) version of the website and start a search with a DE term, I also get FR (or IT) pages in the search result (because the default language field has this DE term). How can I achieve that the find() function searches only in the field of the current user language? The current selector looks like this: $selector = "title|body~=$q, limit=50";
patrick Posted May 15, 2019 Author Posted May 15, 2019 Hi Robin S Thanks a lot for your reply. I tried the example in your linked post and it works: $field = $user->language->isDefault() ? "body" : "body.data" . $user->language; But in case of Repeaters it seems not to work. The following code throws an Error Exception: Multi-dot 'a.b.c' type selectors may not be used with OR '|' fields. $field = $user->language->isDefault() ? "repeater_element.body" : "repeater_element.body.data" . $user->language; I tried with sub-selectors, but couldn't get it to work fo far: 1
patrick Posted June 10, 2019 Author Posted June 10, 2019 Does anybody know how to write such a selector, which also works with Repeaters too?
Robin S Posted June 10, 2019 Posted June 10, 2019 I don't have a multi-language installation to test on but it should be possible. You'll have to work out the best way to use conditionals to construct your selector but the default language selector would look like... $result = $pages->find("repeater_element.body%=foo"); ...and the non-default language selector would look like... $result = $pages->find("repeater_element=[body.data{$user->language}%=foo]"); 1
patrick Posted June 11, 2019 Author Posted June 11, 2019 Hi Robin Thanks a lot for your answer. Your example is working perfect with a single field, but there are no matches (with the same query) if I search in multiple fields: $result = $pages->find("repeater_element=[title.data{$user->language}%=foo], repeater_element=[body.data{$user->language}%=foo]"); I also tried this (which is not working too): $title = "title.data{$user->language}"; $body = "body.data{$user->language}"; $titleRepeater = "content_element_matrix=[content_element_title.data{$user->language}]"; $bodyRepeater = "content_element_matrix=[body.data{$user->language}]"; $result = $pages->find($title|$body|$titleRepeater|$bodyRepeater%=$q"); Every hint is much appreciated. Thank you.
Robin S Posted June 11, 2019 Posted June 11, 2019 7 hours ago, patrick said: but there are no matches (with the same query) if I search in multiple fields: $result = $pages->find("repeater_element=[title.data{$user->language}%=foo], repeater_element=[body.data{$user->language}%=foo]"); Every comma separated clause in the selector string constitutes an AND condition. So in this selector you are saying "find pages where foo is in the title AND foo is in the body of a repeater_element". I think you probably meant to say "find pages where foo is in the title OR foo is in the body of a repeater_element". So you can do this with OR-groups... $result = $pages->find("(repeater_element=[title.data{$user->language}%=foo]), (repeater_element=[body.data{$user->language}%=foo])"); ...or perhaps with an OR condition in the field portion of the selector (try it and see if it works).... $result = $pages->find("repeater_element=[title.data{$user->language}|body.data{$user->language}%=foo]"); 7 hours ago, patrick said: I also tried this (which is not working too): $title = "title.data{$user->language}"; $body = "body.data{$user->language}"; $titleRepeater = "content_element_matrix=[content_element_title.data{$user->language}]"; $bodyRepeater = "content_element_matrix=[body.data{$user->language}]"; $result = $pages->find($title|$body|$titleRepeater|$bodyRepeater%=$q"); This won't work because the search term has to be within the square brackets of the sub-selector. 1
patrick Posted June 12, 2019 Author Posted June 12, 2019 Perfect. Thanks a lot Robin, for your answer and explanation! I tried both and both are working. In the end I decided to go with the OR groups: $title = "title.data{$user->language}%=$q"; $body = "body.data{$user->language}%=$q"; $titleRepeater = "content_element_matrix=[content_element_title.data{$user->language}%=$q]"; $bodyRepeater = "content_element_matrix=[body.data{$user->language}%=$q]"; $result = $pages->find("($title), ($body), ($titleRepeater), ($bodyRepeater), limit=50"); Thanks again. Have a good day. Patrick
patrick Posted October 18, 2019 Author Posted October 18, 2019 If I do a search, I get more results if I'm logged in than if I'm not logged in. The default language (DE) is not the problem, this only happens with the 2 additional languages (FR, IT). The pages have "view access" for guests and the checkboxes for additional languages are checked. Any idea, why this is? Every hint is much appreciated. Thank you.
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now