Rekha
Rekha

Reputation: 51

How to create a Drupal 8 view programmatically

I am trying to create a view programmatically in Drupal 8. Something similar to the crud log module in Drupal 7. I couldn't find any references on the internet either.

Upvotes: 3

Views: 9108

Answers (4)

develCuy
develCuy

Reputation: 625

Based on Tim's 2020, this works for Drupal 10:

/**
 * Add my_view as default view.
 */
function my_module_update_8001() {
  $dir = \Drupal::service('extension.path.resolver')->getPath('module', 'my_module') . '/config/install/';
  $fileStorage = new \Drupal\Core\Config\FileStorage($dir);
  $config = $fileStorage->read('views.view.my_view');

  /** @var \Drupal\Core\Config\Entity\ConfigEntityStorage $storage */
  $storage = \Drupal::entityTypeManager()
    ->getStorage('view');

  /** @var \Drupal\views\Entity\View $view */
  $view = $storage->create($config);

  $view->save();
}

Upvotes: 0

Tim
Tim

Reputation: 6441

You can create a new View through the ConfigEntityStorage.

Create the View in the UI. Export the View's YAML config file to a path in your module, removing the UUID.

// view config is in `my_module/config/install/views.view.my_view.yml`
// (uuid removed!)

$dir = drupal_get_path('module', 'my_module');
$fileStorage = new FileStorage($dir);
$config = $fileStorage->read('views.view.my_view');

/** @var \Drupal\Core\Config\Entity\ConfigEntityStorage $storage */
$storage = \Drupal::entityTypeManager()
  ->getStorage('view');

/** @var \Drupal\views\Entity\View $view */
$view = $storage->create($config);

$view->save();

Upvotes: 2

Matoeil
Matoeil

Reputation: 7289

Although it is not created from scratch programatically, here is a simple method:

  • create a view using the back office
  • export that single view using the configuration manager module
  • copy that yml file and place it in a basic custom module /config/install folder
  • remove the first line containing the uuid
  • (optional )modify the file manually if needed and if understood how it work
  • activating your custom module will import the view

Upvotes: 3

Rekha
Rekha

Reputation: 51

I was successful in creating a view programatically----I did the following-- 1. Create a folder--C:\xampp\htdocs\Drupal Instance\modules 2. Create a YML info file --first_view.info and add the following code to it---- name: First View type: module description: My First Drupal 8 View package: Custom core: 8.x 3. Create an install file---first_view.install And add the following code to it

    <?php

/**
 * @file
 * Install, schema, and uninstall functions for the First View module.
 */

use Drupal\field\Entity\FieldStorageConfig;
use Drupal\taxonomy\Entity\Term;

/**
 * Implements hook_install().
 */
function first_view_install() {

}

/**
 * Implements hook_uninstall().
 */
function first_view_uninstall() {

}

/**
 * Implements hook_schema().
 */
function first_view_schema() {
 $schema['first_view_table'] = [
    // Example (partial) specification for table "node".
    'description' => 'The base table for first_view.',
    'fields' => [
      'id' => [
        'description' => 'The primary identifier for a node.',
        'type' => 'serial',
        'unsigned' => TRUE,
        'not null' => TRUE,
      ],
      'name' => [
        'description' => 'The name of Employee.',
        'type' => 'varchar',
        'length' => 32,
        'not null' => TRUE,
        'default' => '',
      ],
      'age' => [
        'description' => 'The age of employee.',
        'type' => 'int',
        'unsigned' => TRUE,
        'not null' => TRUE,
        'default' => 0,
      ],
      'is_active' => [
        'description' => 'The activity of employee.',
        'type' => 'int',
        'not null' => TRUE,
        'default' => 0,
      ],
      'timestamp' => [
        'description' => 'The timestamp of employee.',
        'type' => 'int',
        'unsigned' => TRUE,
        'not null' => TRUE,
        'default' => 0,
      ],
      'project_code' => [
        'description' => 'The project code of employee.',
        'type' => 'varchar',
        'length' => 32,
        'not null' => TRUE,
        'default' => 0,
      ],
    ],

    'unique keys' => [
      'id' => ['id'],
    ],
    // For documentation purposes only; foreign keys are not created in the
    // database.

    'primary key' => ['id'],
  ];
  return $schema;
}

4. Create a file---first_view.views.inc And add the following code to it--

  <?php

/**
 * Implements hook_views_data().
 */
function first_view_views_data() {




  $data = [];


  $data['first_view_table'] = []; 
  $data['first_view_table']['table'] = []; 
  $data['first_view_table']['table']['group'] = t('First View table');
  $data['first_view_table']['table']['provider'] = 'first_view_module';

  $data['first_view_table']['table']['base'] = [

    'field' => 'id',
    'title' => t('First View table'),
    'help' => t('First View table contains example content and can be related to nodes.'),
    'weight' => -10,
  ];


  $data['first_view']['table']['join'] = [

    'node_field_data' => [
      'left_field' => 'id',
      'field' => 'id',
      'extra' => [
        0 => [
          'field' => 'published',
          'value' => TRUE,
        ],
        1 => [
          'left_field' => 'age',
          'value' => 1,
          'numeric' => TRUE,
        ],
        2 => [
          'field' => 'published',
          'left_field' => 'is_active',
          'operator' => '!=',
        ],
      ],
    ],
  ];


  $data['first_view_table']['table']['join']['node_field_data'] = [

    'left_table' => 'foo',
    'left_field' => 'id',
    'field' => 'id',
    'extra' => [
      ['left_field' => 'project_code', 'field' => 'project_code'],
      ['field' => 'age', 'value' => 0, 'numeric' => TRUE, 'operator' => '>'],
    ],
  ];


  $data['first_view_table']['id'] = [
    'title' => t('Example content'),
    'help' => t('Relate example content to the node content'),

    'relationship' => [
      'base' => 'node_field_data',
      'base field' => 'id',
      'id' => 'standard',
      'label' => t('Example node'),
    ],
  ];


  $data['first_view_table']['name'] = [
    'title' => t('Name'),
    'help' => t('Just a Name field.'),
    'field' => [
      'id' => 'standard',
    ],

    'sort' => [
      'id' => 'standard',
    ],

    'filter' => [
      'id' => 'string',
    ],

    'argument' => [
      'id' => 'string',
    ],
  ];


  $data['first_view_table']['project_code'] = [
    'title' => t('Project Code'),
    'help' => t('Just a Project code field.'),
    'field' => [
      'id' => 'standard',
    ],

    'sort' => [
      'id' => 'standard',
    ],

    'filter' => [
      'id' => 'string',
    ],

    'argument' => [
      'id' => 'string',
    ],
  ];

  $data['first_view_table']['age'] = [
    'title' => t('Age'),
    'help' => t('Just a numeric field.'),

    'field' => [
      'id' => 'numeric',
    ],

    'sort' => [
      'id' => 'standard',
    ],

    'filter' => [
      'id' => 'numeric',
    ],

    'argument' => [
      'id' => 'numeric',
    ],
  ];


  $data['first_view_table']['is_active'] = [
    'title' => t('Is Active'),
    'help' => t('Just an on/off field.'),

    'field' => [
      'id' => 'boolean',
    ],

    'sort' => [
      'id' => 'standard',
    ],

    'filter' => [
      'id' => 'boolean',
      'label' => t('Published'),
      'type' => 'yes-no',
      'use_equal' => TRUE,
    ],
  ];


  $data['first_view_table']['timestamp'] = [
    'title' => t('Timestamp'),
    'help' => t('Just a timestamp field.'),

    'field' => [
      'id' => 'date',
    ],

    'sort' => [
      'id' => 'date',
    ],

    'filter' => [
      'id' => 'date',
    ],
  ];


  $data['views']['area'] = [
    'title' => t('Text area'),
    'help' => t('Provide markup text for the area.'),
    'area' => [
      'id' => 'text',
    ],
  ];

  return $data;
}

By following the above steps....when we install and enable the module a table gets created in the database...You will have to populate it in order to see some data in the view...don't forget to add dummy data in the table.....After that go to Structure/views--- And click on "Add View"----Give a name to your View---and then you will be able to see the table name in "Show" Drop Down box---In this case the table name is "First View Table"...I hope this article would be helpful....

Upvotes: 2

Related Questions