Jump to content

Robin S

  • Content Count

  • Joined

  • Last visited

  • Days Won


Everything posted by Robin S

  1. 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.
  2. Thanks for the update @ryan! Could you please take a look at what might be causing the main download button for the dev version to be stuck on 3.0.153? It's been this way for several weeks. I know that the button always links to the current state of the dev branch but it's potentially confusing to users having the version number out of sync like this. Thanks 🙂
  3. I couldn't confidently say "impossible" but the front-end is a totally different context to the back-end so it would require substantial changes to the module, and I expect there would need to be changes to PageFrontEdit to allow modules to inject CSS and JS into the frontend. I'm not that motivated to spend a lot of time on it because I never use front-end editing and if I did and needed Hanna Code Dialog I would just use Option D because in my opinion it's no great loss to switch to a modal editor for such cases. So sorry to disappoint but the response for now is "if you need Hanna Code Dialog on the front-end bad enough then use Option D". Of course the module is open-source so you are welcome to experiment with it and modify it as needed.
  4. Only if you use Option D for front-end editing in a dialog. Hanna Code Dialog works by hooking ProcessPageEdit::execute and this method isn't called when using inline front-end editing. PageFrontEdit doesn't even have any hookable methods so there's really no scope for the kind of customisation done by Hanna Code Dialog.
  5. A FieldsetPage field is a kind of Repeater, and conditionally setting the required status of inputfields within a Repeater is difficult. AFAIK you can't do this from a ProcessPageEdit::buildForm hook. And what's worse is that you'd need to hook one method to conditionally show the required asterisk in Page Edit and a different method to actually enforce the required status when the input is processed for each inputfield type within the FieldsetPage. So you'd end up needing to apply your logic in three different places. Long story short, you'll make things much simpler if you have Profields and can change your FieldsetPage to a FieldsetGroup, or failing that a standard Fieldset.
  6. You can also configure your CKEditor field to insert <br> tags instead of <p> tags on Enter. https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.html#property-ENTER_BR
  7. Not sure if it will make a big difference but you can avoid loading the categories PageArray (which happens when you do $existing->categories->count) on pages that you don't need to update. $existing = wire('pages')->get("template=supplier, unique_id={$record['Unique ID']}, categories.count=0", ['cache' => false]); if($existing->id) { // ...
  8. 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/
  9. 1. Set the columns to 0 in the Page Reference field settings. 2. Use AdminOnSteroids to add some custom admin CSS that applies columns to the list of checkboxes: #wrap_Inputfield_your_field_name .InputfieldCheckboxesStacked { column-count:2; }
  10. Similar topic: So I guess it's not supported by the core. But it's not difficult to write your own custom JS to show/hide the field: $(document).ready(function() { // Show/hide a field if another field's value is zero function showHideField() { $('#wrap_Inputfield_my_textarea_field').toggle($('input[name="my_integer_field"]').val() === '0'); } // Show/hide on DOM ready showHideField(); // Show/hide on input change $(document).on('change', 'input[name="my_integer_field"]', showHideField); }); You'll need to get clever with the jQuery selectors if you are using fields inside a Repeater.
  11. Sorry, I should have read the thread more carefully. In my world if a live site broke like this it would be a pretty big deal and the imperative would be to get it functioning again as quickly as possible. But it sounds like there's no pressure in this case.
  12. To give another perspective on this topic... This is something that is much easier fixed by changing host than changing the website itself. A statement like that is a clear message that it's time to find a different host. I think it's outrageous for a host to change the PHP version on a live site without warning and then tell their customers that it's their problem to solve. If a host did that to me I would drop them just on principle. Almost all shared cPanel hosting lets you pick the PHP version. So my suggestion would be to open a new account at a shared cPanel host of your choosing. This kind of hosting is as cheap as chips. Hopefully you made a backup of the site files and database before you started changing things. Set the PHP version to 5.4, create/import the database and upload the files and chances are everything will work as it did before. The host might even do the migration for you as a sweetener for new customers. You can use a subdomain (test.vivesport.co.uk) for testing the new hosting and later change the primary domain if everything is working.
  13. Adding some code to expand on my post above. In /site/ready.php: // Forgot password: add verification code as a URL parameter $wire->addHookBefore('ProcessForgotPassword::renderEmailBody', function(HookEvent $event) { $url = $event->arguments(0); $verification_code = urlencode($event->arguments(1)); $url .= "&code=$verification_code"; $event->arguments(0, $url); }); // Forgot password: pre-fill verify field from URL parameter $wire->addHookBefore('ProcessForgotPassword::renderForm', function(HookEvent $event) { $form = $event->arguments(0); $form_name = $event->arguments(1); if($form_name !== 'step3') return; $verify_field = $form->getChildByName('verify'); if(!$verify_field) return; $code = $event->wire('input')->get('code'); if(!$code) return; $verify_field->description = 'Please type or paste in the code you received in your email if it is not already shown below.'; $verify_field->value = urldecode($code); }); I just set this up on a site and it seems to be working well.
  14. A sanitizer is a good idea, but not $sanitizer->selectorValue() because as you say you are not supplying a selector to the method but are supplying a path (you can also supply an ID which is different again). So you'd want $sanitizer->pagePathName(). Yes, in fact you can see in the error message that PW builds a selector using "path=" when you supply a path to $pages->get(). See here: https://github.com/processwire/processwire/blob/88e04129c72c1702926543c8bef555a9f0d1043f/wire/core/PagesLoader.php#L131-L133 else if($selector[0] === '/') { // if selector begins with a slash, it is referring to a path $selector = "path=$selector";
  15. Robin S

    Hanna Code

    @MarkE, if you prefer to edit your Hanna code in your IDE you might find this useful:
  16. You can also use $sanitizer->entitiesMarkdown(), either for basic markdown or full markdown by setting the options argument to true.
  17. I've added support for an "integer" inputfield type in v0.3.3. Technically it was already supported via a HannaCodeDialog::buildForm hook which is the approach I would generally recommend to power users. Once you start going beyond the basics I think it's easier and more powerful to build your dialog forms via that hook.
  18. There is a difference between selectors used with PageFinder... $pages->find($selector), $page->children($selector), etc ...and selectors used in memory... $some_pagearray->find($selector) Any string that strtotime() understands can be used with a PageFinder selector, but with an in-memory selector you can only use timestamps. This is because when FieldtypeDatetime prepares the database query it actually passes the value through strtotime() if it isn't recognised as being an integer (timestamp) or a DateTime object. See here and here. But FieldtypeDatetime isn't involved with in-memory selectors so in such cases if you are working with a time string you'll need to convert it to a timestamp yourself.
  19. Here is the GitHub issue relating to the expanded file and image field properties feature: https://github.com/processwire/processwire-issues/issues/1171 This may or may not be related to what you experienced.
  20. @Peter Knight, I have experienced what I think is the same issue and discovered the same quick fix as you did. I think it's caused by errors relating to the expanded file and image field properties feature and I'm trying to narrow down the exact cause so I can open a GitHub issue. To check if what you're experiencing is the same as my issue... 1. Are you running one of the latest dev versions - 3.0.154 or 3.0.155? 2. Did you create everything from scratch inside the PW version you are running now, or did you update a site that was running an older PW version, or perhaps install using a site profile that was created under an older PW version? 3. Have you seen any error messages relating to image fields when you create a new page? E.g. something about a column not found such as modified_users_id 4. Do you have the PagePaths core module installed?
  21. When using the selector string option to define selectable pages, "page" is a special keyword that is dynamically replaced with the edited page. This only applies to the selector string option - if you are using the custom PHP code option you need to get the edited page in a different way. See the note at the bottom of your screenshot. If you want to get Repeater pages in a selector by template you'll need to include "check_access=0" because the pages themselves are not directly accessible to non-superusers. But I actually think it's better in your case to get the Repeater pages the "normal" way, which is via the Repeater fields they belong to. So you would use the custom PHP code option to define the selectable pages, and the code would be something like this: $wire->addHookAfter('InputfieldPage::getSelectablePages', function($event) { if($event->object->hasField == 'dependencies') { // Get the page being edited $page = $event->arguments('page'); // Create a new PageArray to hold the selectable pages $selectable = new PageArray(); // Get all the visible section pages under $page where configurable_field is not empty $sections = $page->find("template=section, configurable_field.count>0"); foreach($sections as $section) { // Add the Repeater pages for each section to $selectable $selectable->add($section->configurable_field); } // Return the PageArray $event->return = $selectable; } });
  22. Assuming the "city" Page Reference field is in the "country" or "state" template, the selector string for selectable pages would be: template=city, has_parent=page.rootParent "page" in this context means the page that is being edited.
  23. Thanks for reporting and testing - v0.3.2 has a fix for when CKEditor fields have settings overrides per Repeater Matrix type.
  24. Welcome to the forums @Pip! Technically you might be able to use hooks and custom CSS to modify a core Page Reference inputfield such as AsmSelect to include a thumbnail image but it would be quite advanced/challenging. Instead I suggest you use a third-party inputfield that supports images - see @Macrura's InputfieldSelectize: https://modules.processwire.com/modules/inputfield-selectize/
  25. You'll need to use a HannaCodeDialog::buildForm hook for that - there are way too many potential form and inputfield options to support with dedicated syntax in this module. See this section of the readme for an example hook: https://github.com/Toutouwai/HannaCodeDialog#build-entire-dialog-form-in-a-hook The PageListSelect property you want to set is parent_id. Sing out if you get stuck.
  • Create New...