소스 검색

Step 8: expose a list of the user blogs from a tab on their profile.

Frederic G. MARAND 7 년 전
부모
커밋
3b006374ee
5개의 변경된 파일391개의 추가작업 그리고 1개의 파일을 삭제
  1. 1 0
      README.md
  2. 315 0
      config/optional/views.view.dr8_zth_user_blogs.yml
  3. 17 0
      dr8_zth.links.task.yml
  4. 56 0
      src/BlogViewsData.php
  5. 2 1
      src/Entity/Blog.php

+ 1 - 0
README.md

@@ -31,3 +31,4 @@ the following:
 6. Complete the implementation of the `Blog` collection route to show id, title,
   author, and operations.
 7. Complete the `Blog` CRUD by implementing the `BlogForm`.
+8. Expose a view of the user blogs on their profile as a tab.

+ 315 - 0
config/optional/views.view.dr8_zth_user_blogs.yml

@@ -0,0 +1,315 @@
+uuid: d8bb6411-5f3a-4dd5-a76c-0628e11969bf
+langcode: en
+status: true
+dependencies:
+  module:
+    - dr8_zth
+    - user
+id: dr8_zth_user_blogs
+label: 'User blogs'
+module: views
+description: 'Blogs authored by a user'
+tag: ''
+base_table: blog_field_data
+base_field: blog_id
+core: 8.x
+display:
+  default:
+    display_plugin: default
+    id: default
+    display_title: Master
+    position: 0
+    display_options:
+      access:
+        type: perm
+        options:
+          perm: 'access content'
+      cache:
+        type: tag
+        options: {  }
+      query:
+        type: views_query
+        options:
+          disable_sql_rewrite: false
+          distinct: false
+          replica: false
+          query_comment: ''
+          query_tags: {  }
+      exposed_form:
+        type: basic
+        options:
+          submit_button: Apply
+          reset_button: false
+          reset_button_label: Reset
+          exposed_sorts_label: 'Sort by'
+          expose_sort_order: true
+          sort_asc_label: Asc
+          sort_desc_label: Desc
+      pager:
+        type: mini
+        options:
+          items_per_page: 10
+          offset: 0
+          id: 0
+          total_pages: null
+          expose:
+            items_per_page: false
+            items_per_page_label: 'Items per page'
+            items_per_page_options: '5, 10, 25, 50'
+            items_per_page_options_all: false
+            items_per_page_options_all_label: '- All -'
+            offset: false
+            offset_label: Offset
+          tags:
+            previous: ‹‹
+            next: ››
+      style:
+        type: table
+        options:
+          grouping: {  }
+          row_class: ''
+          default_row_class: true
+          override: true
+          sticky: false
+          caption: ''
+          summary: ''
+          description: ''
+          columns:
+            title: title
+            type: type
+          info:
+            title:
+              sortable: true
+              default_sort_order: asc
+              align: ''
+              separator: ''
+              empty_column: false
+              responsive: ''
+            type:
+              sortable: true
+              default_sort_order: asc
+              align: ''
+              separator: ''
+              empty_column: false
+              responsive: ''
+          default: title
+          empty_table: false
+      row:
+        type: fields
+        options:
+          default_field_elements: true
+          inline: {  }
+          separator: ''
+          hide_empty: false
+      fields:
+        title:
+          id: title
+          table: blog_field_data
+          field: title
+          relationship: none
+          group_type: group
+          admin_label: ''
+          label: Title
+          exclude: false
+          alter:
+            alter_text: false
+            text: ''
+            make_link: false
+            path: ''
+            absolute: false
+            external: false
+            replace_spaces: false
+            path_case: none
+            trim_whitespace: false
+            alt: ''
+            rel: ''
+            link_class: ''
+            prefix: ''
+            suffix: ''
+            target: ''
+            nl2br: false
+            max_length: 0
+            word_boundary: true
+            ellipsis: true
+            more_link: false
+            more_link_text: ''
+            more_link_path: ''
+            strip_tags: false
+            trim: false
+            preserve_tags: ''
+            html: false
+          element_type: ''
+          element_class: ''
+          element_label_type: ''
+          element_label_class: ''
+          element_label_colon: true
+          element_wrapper_type: ''
+          element_wrapper_class: ''
+          element_default_classes: true
+          empty: ''
+          hide_empty: false
+          empty_zero: false
+          hide_alter_empty: true
+          click_sort_column: value
+          type: string
+          settings:
+            link_to_entity: true
+          group_column: value
+          group_columns: {  }
+          group_rows: true
+          delta_limit: 0
+          delta_offset: 0
+          delta_reversed: false
+          delta_first_last: false
+          multi_type: separator
+          separator: ', '
+          field_api_classes: false
+          entity_type: null
+          entity_field: title
+          plugin_id: field
+        type:
+          id: type
+          table: blog_field_data
+          field: type
+          relationship: none
+          group_type: group
+          admin_label: ''
+          label: 'Blog type'
+          exclude: false
+          alter:
+            alter_text: false
+            text: ''
+            make_link: false
+            path: ''
+            absolute: false
+            external: false
+            replace_spaces: false
+            path_case: none
+            trim_whitespace: false
+            alt: ''
+            rel: ''
+            link_class: ''
+            prefix: ''
+            suffix: ''
+            target: ''
+            nl2br: false
+            max_length: 0
+            word_boundary: true
+            ellipsis: true
+            more_link: false
+            more_link_text: ''
+            more_link_path: ''
+            strip_tags: false
+            trim: false
+            preserve_tags: ''
+            html: false
+          element_type: ''
+          element_class: ''
+          element_label_type: ''
+          element_label_class: ''
+          element_label_colon: true
+          element_wrapper_type: ''
+          element_wrapper_class: ''
+          element_default_classes: true
+          empty: ''
+          hide_empty: false
+          empty_zero: false
+          hide_alter_empty: true
+          click_sort_column: target_id
+          type: entity_reference_label
+          settings:
+            link: true
+          group_column: target_id
+          group_columns: {  }
+          group_rows: true
+          delta_limit: 0
+          delta_offset: 0
+          delta_reversed: false
+          delta_first_last: false
+          multi_type: separator
+          separator: ', '
+          field_api_classes: false
+          entity_type: blog
+          entity_field: type
+          plugin_id: field
+      filters: {  }
+      sorts: {  }
+      title: Blog
+      header: {  }
+      footer: {  }
+      empty: {  }
+      relationships: {  }
+      arguments:
+        uid:
+          id: uid
+          table: blog_field_data
+          field: uid
+          relationship: none
+          group_type: group
+          admin_label: ''
+          default_action: default
+          exception:
+            value: all
+            title_enable: false
+            title: All
+          title_enable: false
+          title: ''
+          default_argument_type: user
+          default_argument_options:
+            user: false
+          default_argument_skip_url: false
+          summary_options:
+            base_path: ''
+            count: true
+            items_per_page: 25
+            override: false
+          summary:
+            sort_order: asc
+            number_of_records: 0
+            format: default_summary
+          specify_validation: false
+          validate:
+            type: none
+            fail: 'not found'
+          validate_options: {  }
+          break_phrase: false
+          not: false
+          entity_type: blog
+          entity_field: uid
+          plugin_id: user_uid
+      display_extenders: {  }
+    cache_metadata:
+      max-age: 0
+      contexts:
+        - 'languages:language_content'
+        - 'languages:language_interface'
+        - url
+        - url.query_args
+        - user.permissions
+      tags: {  }
+  page_1:
+    display_plugin: page
+    id: page_1
+    display_title: Page
+    position: 1
+    display_options:
+      display_extenders: {  }
+      path: user/blog/%user
+      menu:
+        type: tab
+        title: Blog
+        description: 'Blog items by this user'
+        expanded: false
+        parent: ''
+        weight: 0
+        context: '1'
+        menu_name: account
+    cache_metadata:
+      max-age: 0
+      contexts:
+        - 'languages:language_content'
+        - 'languages:language_interface'
+        - url
+        - url.query_args
+        - user.permissions
+      tags: {  }

+ 17 - 0
dr8_zth.links.task.yml

@@ -2,3 +2,20 @@ entity.blog.collection:
   title: Blogs
   route_name: entity.blog.collection
   base_route: system.admin_content
+
+entity.blog.canonical:
+  route_name: entity.blog.canonical
+  base_route: entity.blog.canonical
+  title: View
+  weight: 0
+entity.blog.edit_form:
+  route_name: entity.blog.edit_form
+  base_route: entity.blog.canonical
+  title: Edit
+  weight: 1
+entity.blog.delete_form:
+  route_name: entity.blog.delete_form
+  base_route: entity.blog.canonical
+  title: Delete
+  # @see DevelLocalTask
+  weight: 101

+ 56 - 0
src/BlogViewsData.php

@@ -0,0 +1,56 @@
+<?php
+
+namespace Drupal\dr8_zth;
+
+use Drupal\views\EntityViewsData;
+
+/**
+ * Provides the views data for the blog entity type.
+ */
+class BlogViewsData extends EntityViewsData {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getViewsData() {
+    $data = parent::getViewsData();
+
+    $data['blog_field_data']['table']['base']['help'] = $this->t('Blog items.');
+    $data['blog_field_data']['table']['base']['access query tag'] = 'blog_access';
+
+    $data['blog_field_data']['uid']['argument']['id'] = 'user_uid';
+    $data['blog_field_data']['uid']['argument'] += [
+      'name table' => 'blog_field_data',
+      'name field' => 'name',
+      'empty field name' => \Drupal::config('user.settings')->get('anonymous'),
+    ];
+    $data['blog_field_data']['uid']['filter']['id'] = 'user_name';
+    $data['blog_field_data']['uid']['filter']['title'] = $this->t('Author name (autocomplete)');
+    $data['blog_field_data']['uid']['filter']['help'] = $this->t('The name of the blog author name. Uses an autocomplete widget to find a user name, the actual filter uses the resulting user ID.');
+
+    $data['blog_field_data']['blog_id_raw'] = array(
+      'help' => $this->t('The raw numeric blog ID.'),
+      'real field' => 'blog_id',
+      'filter' => array(
+        'title' => $this->t('The blog ID'),
+        'id' => 'numeric',
+      ),
+    );
+
+    $data['users']['uid_current'] = array(
+      'real field' => 'uid',
+      'title' => $this->t('Current'),
+      'help' => $this->t('Filter the view to the currently logged in user.'),
+      'filter' => array(
+        'id' => 'user_current',
+        'type' => 'yes-no',
+      ),
+    );
+
+    $data['blog_field_data']['langcode']['help'] = $this->t('Original language of the blog entity');
+    $data['blog_field_data']['langcode']['help'] = $this->t('Language of the translation of the blog entity');
+
+    return $data;
+  }
+
+}

+ 2 - 1
src/Entity/Blog.php

@@ -44,7 +44,8 @@ use Drupal\Core\Entity\ContentEntityBase;
  *     "list_builder" = "Drupal\dr8_zth\BlogListBuilder",
  *     "route_provider" = {
  *       "html" = "Drupal\Core\Entity\Routing\DefaultHtmlRouteProvider",
- *     }
+ *     },
+ *     "views_data" = "Drupal\dr8_zth\BlogViewsData"
  *   },
  *   bundle_entity_type = "blog_type",
  *   field_ui_base_route = "entity.blog_type.edit_form",