patrick Posted May 15, 2019 Share 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"; Link to comment Share on other sites More sharing options...
Robin S Posted May 15, 2019 Share Posted May 15, 2019 See Ryan's post here: 1 Link to comment Share on other sites More sharing options...
patrick Posted May 15, 2019 Author Share 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 Link to comment Share on other sites More sharing options...
patrick Posted June 10, 2019 Author Share Posted June 10, 2019 Does anybody know how to write such a selector, which also works with Repeaters too? Link to comment Share on other sites More sharing options...
Robin S Posted June 10, 2019 Share 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 Link to comment Share on other sites More sharing options...
patrick Posted June 11, 2019 Author Share 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. Link to comment Share on other sites More sharing options...
Robin S Posted June 11, 2019 Share 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 Link to comment Share on other sites More sharing options...
patrick Posted June 12, 2019 Author Share 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 Link to comment Share on other sites More sharing options...
patrick Posted October 18, 2019 Author Share 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. Link to comment Share on other sites More sharing options...
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