jploch Posted July 30, 2020 Share Posted July 30, 2020 Hey there, Iam working on a module (that extends FieldtypePageTable) that needs some fields to work. I want to create those fields and add them to a template automatically via api. To create and add the fields I use the "Pages::added" hook. I only want to add the field if the page that is created also has a "FieldtypePageTableExtendedGrid" field. I have a working example that uses a hard coded template name to check for the right template, but this approach would need the user to stick to the naming, wich I would like to avoid. Here is my code so far: $this->addHookAfter('Pages::added', function(HookEvent $event) { $page = $event->arguments(0); $fields = wire('fields'); if($page->template == 'main_grid') { // would like to avoid hard coded template name if(!$fields->get('pgrid_settings_style_large')) { $field = new Field; $field->type = $this->modules->get("FieldtypeTextarea"); $field->name = "pgrid_settings_style_large"; $field->label = $this->_("Style Large"); $field->tags = 'pgrid'; $field->save(); } if(!$page->hasField('pgrid_settings_style_large')) { $field = $fields->get('pgrid_settings_style_large'); $template = $page->template; $template->fieldgroup->add($field); $template->fieldgroup->save(); } } }); Maybe I need another hook? I tried a before "InputfieldPageTable::render" hook with no success. Any help would be appreciated! Link to comment Share on other sites More sharing options...
jploch Posted July 30, 2020 Author Share Posted July 30, 2020 I found a post on how to check if a field type is present. Now it seems to work great: // add style fields $this->addHookAfter('Pages::added', function(HookEvent $event) { $page = $event->arguments(0); $fields = wire('fields'); // add fields only if FieldtypePageTableExtendedGrid is inside template foreach ( $page->fields as $field ) { if ( $field->type instanceof FieldtypePageTableExtendedGrid ) { if(!$fields->get('pgrid_settings_style_large')) { $field = new Field; $field->type = $this->modules->get("FieldtypeTextarea"); $field->name = "pgrid_settings_style_large"; $field->label = $this->_("Style Large"); $field->tags = 'pgrid'; $field->save(); } if(!$page->hasField('pgrid_settings_style_large')) { $field = $fields->get('pgrid_settings_style_large'); $template = $page->template; $template->fieldgroup->add($field); $template->fieldgroup->save(); } } } }); 2 Link to comment Share on other sites More sharing options...
kixe Posted July 30, 2020 Share Posted July 30, 2020 Small remarks. You should break the loop when work is done: foreach ($page->fields as $field) { if ( $field->type instanceof FieldtypePageTableExtendedGrid ) { // ... break; } } Another approach without loop. Fields is an instance of WireSaveableItems providing a find($selector) function: $selector = implode('|',$fields->find('type=FieldtypePageTableExtendedGrid')->each('name')); if ($page->hasField($selector)) { // ... do something } 2 Link to comment Share on other sites More sharing options...
kongondo Posted July 31, 2020 Share Posted July 31, 2020 13 hours ago, kixe said: You should break the loop when work is done: foreach ($page->fields as $field) { if ( $field->type instanceof FieldtypePageTableExtendedGrid ) { // ... break; } } This assumes only one field of type FieltypePageTableExtendedGrid is present on the page, no? ? 1 Link to comment Share on other sites More sharing options...
kixe Posted July 31, 2020 Share Posted July 31, 2020 2 hours ago, kongondo said: This assumes only one field of type FieltypePageTableExtendedGrid is present on the page, no? ? If minimum one field is present in the template the other field should be created/ added. No need to go on with the loop. 1 Link to comment Share on other sites More sharing options...
kongondo Posted July 31, 2020 Share Posted July 31, 2020 45 minutes ago, kixe said: If minimum one field is present in the template the other field should be created/ added. No need to go on with the loop. Of course, you are right. I should have read the requirements more carefully :-). 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