protected function buildViewTemplate($template_config)
 {
     $tab_list = new TabList();
     foreach ($template_config['tabs'] as $tab_name => $tab_config) {
         $panel_list = new PanelList();
         foreach ($tab_config['panels'] as $panel_config) {
             $row_list = new RowList();
             foreach ($panel_config['rows'] as $row_config) {
                 $cell_list = new CellList();
                 foreach ($row_config['cells'] as $cell_config) {
                     $group_list = new GroupList();
                     foreach ($cell_config['groups'] as $group_name => $group_config) {
                         $field_list = new FieldList();
                         foreach ($group_config['fields'] as $field_name => $field_data) {
                             $field = new Field($field_name, new ArrayConfig($field_data));
                             $field_list->addItem($field);
                         }
                         $group_css = $group_config['css'] ?: '';
                         $group_list->addItem(new Group($group_name, $field_list, $group_css));
                     }
                     $cell_css = $cell_config['css'] ?: '';
                     $cell_list->addItem(new Cell($group_list, $cell_css));
                 }
                 $row_css = $row_config['css'] ?: '';
                 $row_list->addItem(new Row($cell_list, $row_css));
             }
             $panel_css = $panel_config['css'] ?: '';
             $panel_list->addItem(new Panel($panel_config['name'], $row_list, $panel_css));
         }
         $tab_css = $tab_config['css'] ?: '';
         $tab_list->addItem(new Tab($tab_name, $panel_list, $tab_css));
     }
     return new ViewTemplate($template_config['name'], $tab_list, $template_config['css']);
 }
 /**
  * Creates a ViewTemplate instance with one tab, one panel, one row, one list, one group and as many
  * fields as the resource type has attributes. To only include specific attributes as fields set
  * them in the attribute_names method argument.
  *
  * @param string $view_template_name name of the created view template
  * @param ProjectionTypeInterface $resource_type
  * @param array $attribute_names list of attributes to include as view template fields; if empty all
  *                               attributes will be included as fields
  *
  * @return ViewTemplateInterface instance with all or specified attributes as fields
  *
  * @throws RuntimeError in case of an empty view template name
  */
 public function createViewTemplate($view_template_name, ProjectionTypeInterface $resource_type, array $attribute_names = [])
 {
     if (empty($view_template_name)) {
         throw new RuntimeError('A view template name must be specified.');
     }
     $field_list = new FieldList();
     foreach ($resource_type->getAttributes() as $attribute_name => $attribute) {
         if (empty($attribute_names)) {
             $field_list->addItem(new Field($attribute_name));
         } elseif (in_array($attribute_name, $attribute_names)) {
             $field_list->addItem(new Field($attribute_name));
         }
     }
     $group_list = new GroupList();
     $group_list->addItem(new Group('group-content', $field_list));
     $cell_list = new CellList();
     $cell_list->addItem(new Cell($group_list));
     $row_list = new RowList();
     $row_list->addItem(new Row($cell_list));
     $panel_list = new PanelList();
     $panel_list->addItem(new Panel('panel-content', $row_list));
     $tab_list = new TabList();
     $tab_list->addItem(new Tab('tab-content', $panel_list));
     $view_template = new ViewTemplate($view_template_name, $tab_list);
     return $view_template;
 }