presto-8.x-2.2/presto.install

presto.install
<?php

/**
 * @file
 * Install, update and uninstall functions for the presto installation profile.
 */

use Drupal\Core\Database\Database;
use Drupal\Core\Language\LanguageInterface;
use Drupal\menu_link_content\Entity\MenuLinkContent;
use Drupal\node\Entity\Node;
use Drupal\presto\Form\PrestoConfigureForm;
use Drupal\presto\Installer\Ecommerce\EcommerceInstaller;
use Drupal\shortcut\Entity\Shortcut;
use Drupal\user\Entity\User;
use Drupal\user\RoleInterface;

/**
 * Implements hook_install_tasks().
 */
function presto_install_tasks(&$install_state) {
  $tasks = [];

  $tasks['presto_configure_presto'] = [
    'display_name' => t('Configure Presto'),
    'type' => 'form',
    'function' => PrestoConfigureForm::class,
  ];

  $tasks['presto_apply_configuration'] = [
    'display_name' => t('Apply Presto configuration'),
    'type' => 'batch',
  ];

  return $tasks;
}

/**
 * Implements hook_install_tasks_alter().
 */
function presto_install_tasks_alter(array &$tasks, array $install_state) {
  $tasks['install_finished']['function'] = 'presto_post_install_redirect';
}

/**
 * Implements hook_form_FORM_ID_alter().
 */
function presto_form_install_configure_form_alter(
  &$form,
  &$form_state,
  $form_id
) {
  // Clear any module install success messages.
  drupal_get_messages('status');
}

/**
 * Implements hook_install().
 *
 * Perform actions to set up the site for this profile.
 *
 * @see system_install()
 */
function presto_install() {
  // Set front page to "node".
  Drupal::configFactory()->getEditable('system.site')->set('page.front', '/node')->save(TRUE);

  // Allow visitor account creation with administrative approval.
  $user_settings = Drupal::configFactory()->getEditable('user.settings');
  $user_settings->set('register', USER_REGISTER_VISITORS_ADMINISTRATIVE_APPROVAL)->save(TRUE);

  // Enable default permissions for system roles.
  user_role_grant_permissions(RoleInterface::ANONYMOUS_ID, ['access comments']);
  user_role_grant_permissions(RoleInterface::AUTHENTICATED_ID, ['access comments', 'post comments', 'skip comment approval']);

  // Assign user 1 the "administrator" role.
  $user = User::load(1);
  $user->roles[] = 'administrator';
  $user->save();

  // We install some menu links, so we have to rebuild the router, to ensure the
  // menu links are valid.
  Drupal::service('router.builder')->rebuildIfNeeded();

  // Enable the Contact link in the footer menu.
  /** @var \Drupal\Core\Menu\MenuLinkManagerInterface $menu_link_manager */
  $menu_link_manager = Drupal::service('plugin.manager.menu.link');
  $menu_link_manager->updateDefinition('contact.site_page', ['enabled' => TRUE]);

  user_role_grant_permissions(RoleInterface::ANONYMOUS_ID, ['access site-wide contact form']);
  user_role_grant_permissions(RoleInterface::AUTHENTICATED_ID, ['access site-wide contact form']);

  // Allow authenticated users to use shortcuts.
  user_role_grant_permissions(RoleInterface::AUTHENTICATED_ID, ['access shortcuts']);

  // Populate the default shortcut set.
  $shortcut = Shortcut::create([
    'shortcut_set' => 'default',
    'title' => t('Add content'),
    'weight' => -20,
    'link' => ['uri' => 'internal:/node/add'],
  ]);
  $shortcut->save();

  $shortcut = Shortcut::create([
    'shortcut_set' => 'default',
    'title' => t('All content'),
    'weight' => -19,
    'link' => ['uri' => 'internal:/admin/content'],
  ]);
  $shortcut->save();

  // Allow all users to use search.
  user_role_grant_permissions(RoleInterface::ANONYMOUS_ID, ['search content']);
  user_role_grant_permissions(RoleInterface::AUTHENTICATED_ID, ['search content']);

  // Enable the admin theme.
  Drupal::configFactory()->getEditable('node.settings')->set('use_admin_theme', TRUE)->save(TRUE);

  // Create the articles page.
  presto_create_articles_page();
}

/**
 * Applies any Presto configuration, including installing modules.
 *
 * @param array $install_state
 *   Current install state.
 *
 * @return array
 *   Batch definition
 * @throws \Drupal\Component\Plugin\Exception\PluginException
 */
function presto_apply_configuration(array &$install_state) {
  $batch = [
    'title' => t('Configuring Presto'),
    'error_message' => t('The installer has encountered an error.'),
    'operations' => [],
  ];

  // Install modules and create demo content if eCommerce is enabled.
  /** @var Drupal\presto\Installer\InstallerInterface $ecommerceInstaller */
  $ecommerceInstaller = Drupal::service('presto.installer.ecommerce');
  $ecommerceInstaller->setInstallState((array) $install_state);
  $batch['operations'] = array_merge(
    $batch['operations'],
    $ecommerceInstaller->installIfEnabled()
  );

  // Install optional dependencies if they're enabled.
  /** @var \Drupal\presto\Installer\InstallerInterface $optionalDepsInstaller */
  $optionalDepsInstaller = Drupal::service('presto.install.optional_dependencies');
  $optionalDepsInstaller->setInstallState((array) $install_state);
  $batch['operations'] = array_merge(
    $batch['operations'],
    $optionalDepsInstaller->installIfEnabled()
  );


  return $batch;
}

/**
 * Push the user off to the installed site with messaging.
 *
 * @param array $install_state
 *   Current installer state.
 *
 * @return array
 *   Drupal render array.
 */
function presto_post_install_redirect(array &$install_state) {
  install_finished($install_state);

  // Clear any messages set by installed modules.
  drupal_get_messages('status');

  drupal_set_message(t('Hey Presto! Welcome to your new Drupal site!'));

  $output = [
    '#title' => t('All done and ready to go!'),
    'description' => [
      '#markup' => t(
        'Your new Drupal site is installed and ready to go! If you are not redirected in 5 seconds, <a href=":url">click here</a> to continue.',
        [
          ':url' => '/',
        ]
      )
    ],
    '#attached' => [
      'http_header' => [
        [
          'Cache-Control',
          'no-cache',
        ]
      ],
    ],
  ];

  // Redirect via a meta tag since the installer doesn't support header-based
  // redirects.
  $meta_redirect = [
    '#tag' => 'meta',
    '#attributes' => [
      'http-equiv' => 'refresh',
      'content' => '0;url=/',
    ],
  ];
  $output['#attached']['html_head'][] = [
    $meta_redirect,
    'meta_redirect',
  ];

  return $output;
}

/**
 * Creates the `/articles` page.
 */
function presto_create_articles_page() {
  // Create node.
  $node = Node::create([
    'type' => 'page',
    'title' => 'Articles',
    'langcode' => LanguageInterface::LANGCODE_NOT_SPECIFIED,
    'uid' => 1,
    'status' => 1,
    'promote' => 0,
    'field_fields' => [],
    'path' => [
      'alias' => '/articles'
    ],
  ]);
  $node->save();

  // Create menu link.
  $menuLink = MenuLinkContent::create([
    'title' => 'Articles',
    'link' => [
      'uri' => "internal:/node/{$node->id()}",
    ],
    'menu_name' => 'main',
    'weight' => 10,
    'expanded' => true,
  ]);
  $menuLink->save();
}

/**
 * Update table media_revision to finalize migration of media module.
 */
function presto_update_8101() {
  $connection = Database::getConnection();
  $schema = $connection->schema();
  
  $query = $connection->query('select * from media_revision');
  
  $row = $query->fetchAssoc();
  
  // Test if revision_default exist?
  if (!array_key_exists('revision_default', $row)) {
    $revisionDefault = [
      'description' => '',
      'type' => 'int',
      'length' => 4,
      'unsigned' => FALSE,
      'not null' => TRUE,
    ];
    $schema->addField('media_revision', 'revision_default', $revisionDefault);
    
    $queries[] = $connection->query('UPDATE media_revision SET revision_default = 1');
  }
  
  // Test if the fields to swap exist?
  if (!array_key_exists('revision_uid', $row)) {
    // Create new columns.
    $revisionUser = [
      'description' => 'The ID of the target entity.',
      'type' => 'int',
      'length' => 10,
      'unsigned' => TRUE,
      'not null' => FALSE,
    ];
    $schema->addField('media_revision', 'revision_user', $revisionUser);
    
    $revisionCreated = [
      'type' => 'int',
      'length' => 11,
      'description' => '',
      'unsigned' => TRUE,
      'not null' => FALSE,
    ];
    $schema->addField('media_revision', 'revision_created', $revisionCreated);
    
    $revisionLogMessage = [
      'type' => 'text',
      'size' => 'big',
      'description' => '',
      'unsigned' => FALSE,
      'not null' => FALSE,
    ];
    $schema->addField('media_revision', 'revision_log_message', $revisionLogMessage);
    
    // Copy the content from the old columns to the new columns.
    $queries[] = $connection->query('UPDATE media_revision SET revision_user = revision_uid');
    $queries[] = $connection->query('UPDATE media_revision SET revision_created = revision_timestamp');
    $queries[] = $connection->query('UPDATE media_revision SET revision_log_message = revision_log');
    // Remove the old columns.
    $queries[] = $connection->query('ALTER TABLE media_revision DROP revision_uid');
    $queries[] = $connection->query('ALTER TABLE media_revision DROP revision_timestamp');
    $queries[] = $connection->query('ALTER TABLE media_revision DROP revision_log');
    
    foreach ($queries as $q) {
      $q->execute();
    }
  }
}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc