bernhard Posted May 29 Share Posted May 29 I'm having some troubles with using the renderReady method of inputfields. The first problem that came up was discussed with @adrian here: https://github.com/baumrock/RockAdminTweaks/commit/1c327039f22138725c2dfdc9e659525f2f59011b#commitcomment-142442415 It looks like the renderReady() method is never called for InputfieldCheckboxes. Another problem came up today when developing RockGrid. That inputfield needs some JS+CSS assets to be loaded whenever an inputfield of this type is rendered in the backend. I thought loading the assets in renderReady would be the right thing to do. But it does not work if the field is inside a repeater. I used this hook to fix this: <?php public function init(): void { wire()->addHookAfter('Inputfield::render', $this, 'preloadRockGrid'); } protected function preloadRockGrid(HookEvent $event): void { // if it's not the repeater field exit $f = $event->object; if ($f->name !== self::field_variations) return; // loop through all fields of the repeater and load their assets foreach ($f->hasField->fields as $fname) { $field = wire()->fields->get($fname); $inputfield = $field->getInputfield($event->process->getPage()); $inputfield->renderReady(); } } This works but it is really hacky and I'd like to have a proper solution for the problem and try to understand better what's going on and why things do not work as expected. Can anybody shed some light on this? Link to comment Share on other sites More sharing options...
adrian Posted May 29 Share Posted May 29 Does it work as expected with renderReadyHook() as per the docs? 1 Link to comment Share on other sites More sharing options...
bernhard Posted May 29 Author Share Posted May 29 Thx @adrian I have to clarify this: 8 hours ago, bernhard said: Another problem came up today when developing RockGrid. That inputfield needs some JS+CSS assets to be loaded whenever an inputfield of this type is rendered in the backend. I thought loading the assets in renderReady would be the right thing to do. But it does not work if the field is inside a repeater. In my inputfield (InputfieldRockGrid, but could be any inputfield) I have added a method "renderReady" like so: <?php public function renderReady(Inputfield $parent = null, $renderValueMode = false) { $grid = rockgrid()->getGrid($this); if (!$grid) return; wire()->modules->get('JqueryUI')->use('modal'); // load all dependencies // this can safely be called multiple times // it will only load the assets once $this->wire->config->scripts->add( rockgrid()->url(__DIR__ . '/lib/tabulator.min.js', true) ); // some more assets here return parent::renderReady($parent, $renderValueMode); } I always thought this would be the way to go when creating inputfields/fieldtypes, but renderReady is never triggered. That's why I created the hook shown in the first post, which is executed on the parent's "render". Link to comment Share on other sites More sharing options...
ryan Posted June 6 Share Posted June 6 @bernhardTwo things I can spot here: 1. You are calling renderReady() from a hook after Inputfield::render. That is too late. What @adrian mentioned about hooking Inputfield::renderReadyHook() instead would likely enable you to do what you want to do. 2. Your renderReady() method has if(!$grid) return; and you would need to change that to if(!$grid) return parent::renderReady($parent, $renderValueMode); 1 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