Erik Richter Posted May 29, 2020 Share Posted May 29, 2020 Hi everyone, I am trying to establish a one-to-one relationship (Modules like ConnectPageFields won't work due to circular errors). My idea is, just having a page select field (single) on the user template, where I can select a page with a specific template. When doing this for the next user, I want to make sure, that only those pages are availabe, which are not referenced from another user. Each page should only be selected once. This might be possible with a custom selector in Page Reference Field configuration, tho I don't know how. I am aware of the page->references() method, but how to I get "pages with a specific template, that have references=0" as options? Or do I have to build a hook? Thanks for help in advance!! Link to comment Share on other sites More sharing options...
Robin S Posted May 29, 2020 Share Posted May 29, 2020 (edited) For a field named "colour" allowing pages using a template named "colour": $wire->addHookAfter('InputfieldPage::getSelectablePages', function($event) { $page = $event->arguments(0); $pages = $event->wire('pages'); if($event->object->hasField == 'colour') { // Find pages that are already selected on another user page $already_selected = $pages->find("template=colour, colour.owner.template=user, colour.owner.id!=$page->id"); // Selectable pages are those that are not already selected $event->return = $pages->find("template=colour, id!=$already_selected"); } }); Owner selectors: https://processwire.com/blog/posts/processwire-3.0.95-core-updates/ Edited May 29, 2020 by Robin S Forum glitch caused post duplication Link to comment Share on other sites More sharing options...
Erik Richter Posted June 6, 2020 Author Share Posted June 6, 2020 (edited) Hey Robin! Just saw the answer - thank you! Just what I needed - perfect! Can you also point me to the right hook - after save or after field select-change of user, that fills a reference page on the "color" page with the user? Or just puts a checkbox ("linked to a user") to checked? Edit: Just noticed that this is not working with autocomplete, only with the regular select option. Also found the github thread regarding this issue - someone knows of any progress regarding "custom php code and autocomplete page reference"? Have a great weekend! Edited June 7, 2020 by Erik Richter Link to comment Share on other sites More sharing options...
Robin S Posted June 9, 2020 Share Posted June 9, 2020 On 6/7/2020 at 10:41 AM, Erik Richter said: Can you also point me to the right hook - after save or after field select-change of user, that fills a reference page on the "color" page with the user? That's the thing that isn't possible due to the circular reference issue with "single" Page Reference fields. My suggestion: make one of your Page Reference fields a "multiple" field, even if you are only going to store a single page in it. That way you can use Connect Page Fields and your job will be a lot simpler. You won't need to use PHP to define the selectable pages so you'll be able to use the Page Autocomplete inputfield. Instead you can use a selector string to define the selectable pages and identify pages that not selected by another user with a string like "selected_by_user.count=0" where selected_by_user is a Page Reference field. If your user pages are only managed by superuser then you don't need to do anything special with the inputfield - it won't matter if it technically allows multiple pages to be selected because you'll know to only select a single page. Or if others need to manage the users and you think they'll be confused if the inputfield allows multiple selections then you can limit the number of selectable pages with a hook: $wire->addHookAfter('InputfieldPageAutocomplete::renderReadyHook', function(HookEvent $event) { /** @var InputfieldPageAutocomplete $inputfield */ $inputfield = $event->object; $field = $inputfield->hasField; if($field && $field->name === 'colour') { $inputfield->maxSelectedItems = 1; } }); And of course the value of this field will be a PageArray but you can get the selected page by using the first() method. 1 Link to comment Share on other sites More sharing options...
Erik Richter Posted June 11, 2020 Author Share Posted June 11, 2020 Works perfectly! Thank you very much. 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