예제 #1
0
 /**
  * Test that the overridden serializer is called.
  *
  * @covers ::getSerializer
  * @runInSeparateProcess
  */
 public function testGetSeralization()
 {
     new Settings(['yaml_parser_class' => YamlParserProxy::class]);
     $this->assertEquals(YamlParserProxy::class, Settings::get('yaml_parser_class'));
     $mock = $this->getMockBuilder('\\stdClass')->setMethods(['encode', 'decode', 'getFileExtension'])->getMock();
     $mock->expects($this->once())->method('decode');
     YamlParserProxy::setMock($mock);
     Yaml::decode('---');
     new Settings([]);
 }
예제 #2
0
 /**
  * Tests export of configuration.
  */
 function testExport()
 {
     // Verify the export page with export submit button is available.
     $this->drupalGet('admin/config/development/configuration/full/export');
     $this->assertFieldById('edit-submit', t('Export'));
     // Submit the export form and verify response.
     $this->drupalPostForm('admin/config/development/configuration/full/export', array(), t('Export'));
     $this->assertResponse(200, 'User can access the download callback.');
     // Test if header contains file name with hostname and timestamp.
     $request = \Drupal::request();
     $hostname = str_replace('.', '-', $request->getHttpHost());
     $header_content_disposition = $this->drupalGetHeader('content-disposition');
     $header_match = (bool) preg_match('/attachment; filename="config-' . preg_quote($hostname) . '-\\d{4}-\\d{2}-\\d{2}-\\d{2}-\\d{2}\\.tar\\.gz"/', $header_content_disposition);
     $this->assertTrue($header_match, "Header with filename matches the expected format.");
     // Get the archived binary file provided to user for download.
     $archive_data = $this->getRawContent();
     // Temporarily save the archive file.
     $uri = file_unmanaged_save_data($archive_data, 'temporary://config.tar.gz');
     // Extract the archive and verify it's not empty.
     $file_path = file_directory_temp() . '/' . file_uri_target($uri);
     $archiver = new Tar($file_path);
     $archive_contents = $archiver->listContents();
     $this->assert(!empty($archive_contents), 'Downloaded archive file is not empty.');
     // Prepare the list of config files from active storage, see
     // \Drupal\config\Controller\ConfigController::downloadExport().
     $storage_active = $this->container->get('config.storage');
     $config_files = array();
     foreach ($storage_active->listAll() as $config_name) {
         $config_files[] = $config_name . '.yml';
     }
     // Assert that the downloaded archive file contents are the same as the test
     // site active store.
     $this->assertIdentical($archive_contents, $config_files);
     // Ensure the test configuration override is in effect but was not exported.
     $this->assertIdentical(\Drupal::config('system.maintenance')->get('message'), 'Foo');
     $archiver->extract(file_directory_temp(), array('system.maintenance.yml'));
     $file_contents = file_get_contents(file_directory_temp() . '/' . 'system.maintenance.yml');
     $exported = Yaml::decode($file_contents);
     $this->assertNotIdentical($exported['message'], 'Foo');
     // Check the single export form doesn't have "form-required" elements.
     $this->drupalGet('admin/config/development/configuration/single/export');
     $this->assertNoRaw('js-form-required form-required', 'No form required fields are found.');
     // Ensure the temporary file is not available to users without the
     // permission.
     $this->drupalLogout();
     $this->drupalGet('system/temporary', ['query' => ['file' => 'config.tar.gz']]);
     $this->assertResponse(403);
 }
예제 #3
0
 /**
  * {@inheritdoc}
  */
 public function parse($filename)
 {
     if (!file_exists($filename)) {
         $parsed_info = array();
     } else {
         try {
             $parsed_info = Yaml::decode(file_get_contents($filename));
         } catch (InvalidDataTypeException $e) {
             throw new InfoParserException("Unable to parse {$filename} " . $e->getMessage());
         }
         $missing_keys = array_diff($this->getRequiredKeys(), array_keys($parsed_info));
         if (!empty($missing_keys)) {
             throw new InfoParserException('Missing required keys (' . implode(', ', $missing_keys) . ') in ' . $filename);
         }
         if (isset($parsed_info['version']) && $parsed_info['version'] === 'VERSION') {
             $parsed_info['version'] = \Drupal::VERSION;
         }
     }
     return $parsed_info;
 }
 /**
  * Tests post-update responsive_image_post_update_dependency().
  *
  * @see responsive_image_post_update_dependency()
  */
 public function testPostUpdateDependency()
 {
     // Installing the 'wide' responsive image style.
     $wide_image_style = Yaml::decode(file_get_contents(__DIR__ . '/../../../../../profiles/standard/config/optional/responsive_image.styles.wide.yml'));
     $this->config('responsive_image.styles.wide')->setData($wide_image_style)->save(TRUE);
     // Change 'field_image' formatter to a responsive image formatter.
     $options = ['type' => 'responsive_image', 'label' => 'hidden', 'settings' => ['responsive_image_style' => 'wide', 'image_link' => ''], 'third_party_settings' => []];
     $display = $this->config('core.entity_view_display.node.article.default');
     $display->set('content.field_image', $options)->save(TRUE);
     // Check that there's no dependency to 'responsive_image.styles.wide'.
     $dependencies = $display->get('dependencies.config') ?: [];
     $this->assertFalse(in_array('responsive_image.styles.wide', $dependencies));
     // Run updates.
     $this->runUpdates();
     /** @var \Drupal\Core\Entity\Display\EntityViewDisplayInterface $view_display */
     $view_display = EntityViewDisplay::load('node.article.default');
     $dependencies = $view_display->getDependencies() + ['config' => []];
     // Check that post-update added a 'responsive_image.styles.wide' dependency.
     $this->assertTrue(in_array('responsive_image.styles.wide', $dependencies['config']));
 }
 protected function setUp()
 {
     // Copy the testing_config_overrides install profile so we can change the
     // configuration to include a dependency that can not be met. File API
     // functions are not available yet.
     $dest = $this->siteDirectory . '/profiles/testing_config_overrides';
     mkdir($dest, 0777, TRUE);
     $source = DRUPAL_ROOT . '/core/profiles/testing_config_overrides';
     $iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($source, \RecursiveDirectoryIterator::SKIP_DOTS), \RecursiveIteratorIterator::SELF_FIRST);
     foreach ($iterator as $item) {
         if ($item->isDir()) {
             mkdir($dest . DIRECTORY_SEPARATOR . $iterator->getSubPathName());
         } else {
             copy($item, $dest . DIRECTORY_SEPARATOR . $iterator->getSubPathName());
         }
     }
     // Add a dependency that can not be met because User is installed before
     // Action.
     $config_file = $dest . DIRECTORY_SEPARATOR . InstallStorage::CONFIG_INSTALL_DIRECTORY . DIRECTORY_SEPARATOR . 'system.action.user_block_user_action.yml';
     $action = Yaml::decode(file_get_contents($config_file));
     $action['dependencies']['module'][] = 'action';
     file_put_contents($config_file, Yaml::encode($action));
     parent::setUp();
 }
<?php

/**
 * @file
 * Contains database additions to drupal-8.bare.standard.php.gz for testing the
 * upgrade path of https://www.drupal.org/node/2455125.
 */
use Drupal\Core\Database\Database;
use Drupal\Core\Serialization\Yaml;
$connection = Database::getConnection();
// Structure of a view with timestamp fields.
$views_configs = [];
$views_configs[] = Yaml::decode(file_get_contents(__DIR__ . '/drupal-8.views-entity-views-data-2455125.yml'));
foreach ($views_configs as $views_config) {
    $connection->insert('config')->fields(array('collection', 'name', 'data'))->values(array('collection' => '', 'name' => 'views.view.' . $views_config['id'], 'data' => serialize($views_config)))->execute();
}
/**
 * @file
 * Contains database additions to drupal-8.bare.standard.php.gz for testing the
 * upgrade path of https://www.drupal.org/node/2429191.
 */
use Drupal\Core\Database\Database;
use Drupal\Core\Serialization\Yaml;
use Drupal\field\Entity\FieldStorageConfig;
$connection = Database::getConnection();
// Configuration for a View with an "entity_reference selection" display.
$config = Yaml::decode(file_get_contents(__DIR__ . '/views.view.entity_reference_plugins_2429191.yml'));
$connection->insert('config')->fields(['collection', 'name', 'data'])->values(['collection' => '', 'name' => 'views.view.' . $config['id'], 'data' => serialize($config)])->execute();
// Configuration for an entity_reference field storage using the View for
// selection.
$field_ref_views_select_2429191 = Yaml::decode(file_get_contents(__DIR__ . '/field.storage.node.field_ref_views_select_2429191.yml'));
// Configuration for an entity_reference field storage using the auto-create
// feature.
$field_ref_autocreate_2412569 = Yaml::decode(file_get_contents(__DIR__ . '/field.storage.node.field_ref_autocreate_2412569.yml'));
$connection->insert('config')->fields(['collection', 'name', 'data'])->values(['collection' => '', 'name' => 'field.storage.' . $field_ref_views_select_2429191['id'], 'data' => serialize($field_ref_views_select_2429191)])->values(['collection' => '', 'name' => 'field.storage.' . $field_ref_autocreate_2412569['id'], 'data' => serialize($field_ref_autocreate_2412569)])->execute();
// We need to Update the registry of "last installed" field definitions.
$installed = $connection->select('key_value')->fields('key_value', ['value'])->condition('collection', 'entity.definitions.installed')->condition('name', 'node.field_storage_definitions')->execute()->fetchField();
$installed = unserialize($installed);
$installed['field_ref_views_select_2429191'] = new FieldStorageConfig($field_ref_views_select_2429191);
$installed['field_ref_autocreate_2412569'] = new FieldStorageConfig($field_ref_autocreate_2412569);
$connection->update('key_value')->condition('collection', 'entity.definitions.installed')->condition('name', 'node.field_storage_definitions')->fields(['value' => serialize($installed)])->execute();
// Configuration for an entity_reference field using the View for selection.
$field_ref_views_select_2429191 = Yaml::decode(file_get_contents(__DIR__ . '/field.field.node.article.field_ref_views_select_2429191.yml'));
// Configuration for an entity_reference field using the auto-create feature.
$field_ref_autocreate_2412569 = Yaml::decode(file_get_contents(__DIR__ . '/field.field.node.article.field_ref_autocreate_2412569.yml'));
$connection->insert('config')->fields(['collection', 'name', 'data'])->values(['collection' => '', 'name' => 'field.field.' . $field_ref_views_select_2429191['id'], 'data' => serialize($field_ref_views_select_2429191)])->values(['collection' => '', 'name' => 'field.field.' . $field_ref_autocreate_2412569['id'], 'data' => serialize($field_ref_autocreate_2412569)])->execute();
예제 #8
0
 protected function read($name)
 {
     $data = file_get_contents($this->storage->getFilePath($name));
     return Yaml::decode($data);
 }
예제 #9
0
<?php

/**
 * @file
 * Test fixture.
 */
use Drupal\Core\Database\Database;
use Drupal\Core\Serialization\Yaml;
$connection = Database::getConnection();
$connection->insert('config')->fields(array('collection' => '', 'name' => 'views.view.test_boolean_filter_values', 'data' => serialize(Yaml::decode(file_get_contents('core/modules/views/tests/fixtures/update/views.view.test_boolean_filter_values.yml')))))->execute();
예제 #10
0
 /**
  * {@inheritdoc}
  */
 protected function decode($file)
 {
     return Yaml::decode(file_get_contents($file)) ?: [];
 }
예제 #11
0
 /**
  * Helper method for removing all cache bins registered by a given module.
  *
  * @param string $module
  *   The name of the module for which to remove all registered cache bins.
  */
 protected function removeCacheBins($module)
 {
     // Remove any cache bins defined by a module.
     $service_yaml_file = drupal_get_path('module', $module) . "/{$module}.services.yml";
     if (file_exists($service_yaml_file)) {
         $definitions = Yaml::decode(file_get_contents($service_yaml_file));
         if (isset($definitions['services'])) {
             foreach ($definitions['services'] as $id => $definition) {
                 if (isset($definition['tags'])) {
                     foreach ($definition['tags'] as $tag) {
                         // This works for the default cache registration and even in some
                         // cases when a non-default "super" factory is used. That should
                         // be extremely rare.
                         if ($tag['name'] == 'cache.bin' && isset($definition['factory_service']) && isset($definition['factory_method']) && !empty($definition['arguments'])) {
                             try {
                                 $factory = \Drupal::service($definition['factory_service']);
                                 if (method_exists($factory, $definition['factory_method'])) {
                                     $backend = call_user_func_array(array($factory, $definition['factory_method']), $definition['arguments']);
                                     if ($backend instanceof CacheBackendInterface) {
                                         $backend->removeBin();
                                     }
                                 }
                             } catch (\Exception $e) {
                                 watchdog_exception('system', $e, 'Failed to remove cache bin defined by the service %id.', array('%id' => $id));
                             }
                         }
                     }
                 }
             }
         }
     }
 }
<?php

/**
 * @file
 * Test fixture for \Drupal\rest\Tests\Update\RestExportAuthUpdateTest.
 */
use Drupal\Core\Database\Database;
use Drupal\Core\Serialization\Yaml;
$connection = Database::getConnection();
$config = $connection;
// Set the schema version.
$connection->insert('key_value')->fields(['collection' => 'system.schema', 'name' => 'rest', 'value' => 'i:8000;'])->fields(['collection' => 'system.schema', 'name' => 'serialization', 'value' => 'i:8000;'])->fields(['collection' => 'system.schema', 'name' => 'basic_auth', 'value' => 'i:8000;'])->execute();
// Update core.extension.
$extensions = $connection->select('config')->fields('config', ['data'])->condition('collection', '')->condition('name', 'core.extension')->execute()->fetchField();
$extensions = unserialize($extensions);
$extensions['module']['rest'] = 0;
$extensions['module']['serialization'] = 0;
$extensions['module']['basic_auth'] = 0;
$connection->update('config')->fields(['data' => serialize($extensions)])->condition('collection', '')->condition('name', 'core.extension')->execute();
$config = ['link_domain' => '~'];
$data = $connection->insert('config')->fields(['name' => 'rest.settings', 'data' => serialize($config), 'collection' => ''])->execute();
$connection->insert('config')->fields(['name' => 'views.view.rest_export_with_authorization'])->execute();
$connection->merge('config')->condition('name', 'views.view.rest_export_with_authorization')->condition('collection', '')->fields(['data' => serialize(Yaml::decode(file_get_contents('core/modules/views/tests/modules/views_test_config/test_views/views.view.rest_export_with_authorization.yml')))])->execute();
예제 #13
0
 /**
  * {@inheritdoc}
  */
 public function validateForm(array &$form, FormStateInterface $form_state)
 {
     // The confirmation step needs no additional validation.
     if ($this->data) {
         return;
     }
     try {
         // Decode the submitted import.
         $data = Yaml::decode($form_state->getValue('import'));
     } catch (InvalidDataTypeException $e) {
         $form_state->setErrorByName('import', $this->t('The import failed with the following message: %message', ['%message' => $e->getMessage()]));
     }
     // Validate for config entities.
     if ($form_state->getValue('config_type') !== 'system.simple') {
         $definition = $this->entityManager->getDefinition($form_state->getValue('config_type'));
         $id_key = $definition->getKey('id');
         // If a custom entity ID is specified, override the value in the
         // configuration data being imported.
         if (!$form_state->isValueEmpty('custom_entity_id')) {
             $data[$id_key] = $form_state->getValue('custom_entity_id');
         }
         $entity_storage = $this->entityManager->getStorage($form_state->getValue('config_type'));
         // If an entity ID was not specified, set an error.
         if (!isset($data[$id_key])) {
             $form_state->setErrorByName('import', $this->t('Missing ID key "@id_key" for this @entity_type import.', array('@id_key' => $id_key, '@entity_type' => $definition->getLabel())));
             return;
         }
         $config_name = $definition->getConfigPrefix() . '.' . $data[$id_key];
         // If there is an existing entity, ensure matching ID and UUID.
         if ($entity = $entity_storage->load($data[$id_key])) {
             $this->configExists = $entity;
             if (!isset($data['uuid'])) {
                 $form_state->setErrorByName('import', $this->t('An entity with this machine name already exists but the import did not specify a UUID.'));
                 return;
             }
             if ($data['uuid'] !== $entity->uuid()) {
                 $form_state->setErrorByName('import', $this->t('An entity with this machine name already exists but the UUID does not match.'));
                 return;
             }
         } elseif (isset($data['uuid']) && $entity_storage->loadByProperties(array('uuid' => $data['uuid']))) {
             $form_state->setErrorByName('import', $this->t('An entity with this UUID already exists but the machine name does not match.'));
         }
     } else {
         $config_name = $form_state->getValue('config_name');
         $config = $this->config($config_name);
         $this->configExists = !$config->isNew() ? $config : FALSE;
     }
     // Use ConfigImporter validation.
     if (!$form_state->getErrors()) {
         $source_storage = new StorageReplaceDataWrapper($this->configStorage);
         $source_storage->replaceData($config_name, $data);
         $storage_comparer = new StorageComparer($source_storage, $this->configStorage, $this->configManager);
         if (!$storage_comparer->createChangelist()->hasChanges()) {
             $form_state->setErrorByName('import', $this->t('There are no changes to import.'));
         } else {
             $config_importer = new ConfigImporter($storage_comparer, $this->eventDispatcher, $this->configManager, $this->lock, $this->typedConfigManager, $this->moduleHandler, $this->moduleInstaller, $this->themeHandler, $this->getStringTranslation());
             try {
                 $config_importer->validate();
                 $form_state->set('config_importer', $config_importer);
             } catch (ConfigImporterException $e) {
                 // There are validation errors.
                 $item_list = ['#theme' => 'item_list', '#items' => $config_importer->getErrors(), '#title' => $this->t('The configuration cannot be imported because it failed validation for the following reasons:')];
                 $form_state->setErrorByName('import', $this->renderer->render($item_list));
             }
         }
     }
     // Store the decoded version of the submitted import.
     $form_state->setValueForElement($form['import'], $data);
 }
<?php

/**
 * @file
 * Contains database additions to drupal-8.bare.standard.php.gz for testing the
 * upgrade path of https://www.drupal.org/node/507488.
 */
use Drupal\Core\Database\Database;
use Drupal\Core\Serialization\Yaml;
$connection = Database::getConnection();
// Structure of a custom block with visibility settings.
$block_configs[] = Yaml::decode(file_get_contents(__DIR__ . '/block.block.testfor2569529.yml'));
foreach ($block_configs as $block_config) {
    $connection->insert('config')->fields(['collection', 'name', 'data'])->values(['collection' => '', 'name' => 'block.block.' . $block_config['id'], 'data' => serialize($block_config)])->execute();
}
// Update the config entity query "index".
$existing_blocks = $connection->select('key_value')->fields('key_value', ['value'])->condition('collection', 'config.entity.key_store.block')->condition('name', 'theme:seven')->execute()->fetchField();
$existing_blocks = unserialize($existing_blocks);
$connection->update('key_value')->fields(['value' => serialize(array_merge($existing_blocks, ['block.block.seven_secondary_local_tasks']))])->condition('collection', 'config.entity.key_store.block')->condition('name', 'theme:seven')->execute();
예제 #15
0
 /**
  * Parses a given library file and allows modules and themes to alter it.
  *
  * This method sets the parsed information onto the library property.
  *
  * Library information is parsed from *.libraries.yml files; see
  * editor.library.yml for an example. Every library must have at least one js
  * or css entry. Each entry starts with a machine name and defines the
  * following elements:
  * - js: A list of JavaScript files to include. Each file is keyed by the file
  *   path. An item can have several attributes (like HTML
  *   attributes). For example:
  *   @code
  *   js:
  *     path/js/file.js: { attributes: { defer: true } }
  *   @endcode
  *   If the file has no special attributes, just use an empty object:
  *   @code
  *   js:
  *     path/js/file.js: {}
  *   @endcode
  *   The path of the file is relative to the module or theme directory, unless
  *   it starts with a /, in which case it is relative to the Drupal root. If
  *   the file path starts with //, it will be treated as a protocol-free,
  *   external resource (e.g., //cdn.com/library.js). Full URLs
  *   (e.g., http://cdn.com/library.js) as well as URLs that use a valid
  *   stream wrapper (e.g., public://path/to/file.js) are also supported.
  * - css: A list of categories for which the library provides CSS files. The
  *   available categories are:
  *   - base
  *   - layout
  *   - component
  *   - state
  *   - theme
  *   Each category is itself a key for a sub-list of CSS files to include:
  *   @code
  *   css:
  *     component:
  *       css/file.css: {}
  *   @endcode
  *   Just like with JavaScript files, each CSS file is the key of an object
  *   that can define specific attributes. The format of the file path is the
  *   same as for the JavaScript files.
  * - dependencies: A list of libraries this library depends on.
  * - version: The library version. The string "VERSION" can be used to mean
  *   the current Drupal core version.
  * - header: By default, JavaScript files are included in the footer. If the
  *   script must be included in the header (along with all its dependencies),
  *   set this to true. Defaults to false.
  * - minified: If the file is already minified, set this to true to avoid
  *   minifying it again. Defaults to false.
  * - remote: If the library is a third-party script, this provides the
  *   repository URL for reference.
  * - license: If the remote property is set, the license information is
  *   required. It has 3 properties:
  *   - name: The human-readable name of the license.
  *   - url: The URL of the license file/information for the version of the
  *     library used.
  *   - gpl-compatible: A Boolean for whether this library is GPL compatible.
  *
  * See https://www.drupal.org/node/2274843#define-library for more
  * information.
  *
  * @param string $extension
  *   The name of the extension that registered a library.
  * @param string $path
  *   The relative path to the extension.
  *
  * @return array
  *   An array of parsed library data.
  *
  * @throws \Drupal\Core\Asset\Exception\InvalidLibraryFileException
  *   Thrown when a parser exception got thrown.
  */
 protected function parseLibraryInfo($extension, $path)
 {
     $libraries = [];
     $library_file = $path . '/' . $extension . '.libraries.yml';
     if (file_exists($this->root . '/' . $library_file)) {
         try {
             $libraries = Yaml::decode(file_get_contents($this->root . '/' . $library_file));
         } catch (InvalidDataTypeException $e) {
             // Rethrow a more helpful exception to provide context.
             throw new InvalidLibraryFileException(sprintf('Invalid library definition in %s: %s', $library_file, $e->getMessage()), 0, $e);
         }
     }
     // Allow modules to add dynamic library definitions.
     $hook = 'library_info_build';
     if ($this->moduleHandler->implementsHook($extension, $hook)) {
         $libraries = NestedArray::mergeDeep($libraries, $this->moduleHandler->invoke($extension, $hook));
     }
     // Allow modules to alter the module's registered libraries.
     $this->moduleHandler->alter('library_info', $libraries, $extension);
     $this->themeManager->alter('library_info', $libraries, $extension);
     return $libraries;
 }
 /**
  * Tests exporting a single configuration file.
  */
 public function testExport()
 {
     $this->drupalLogin($this->drupalCreateUser(array('export configuration')));
     $this->drupalGet('admin/config/development/configuration/single/export/system.simple');
     $this->assertFieldByXPath('//select[@name="config_type"]//option[@selected="selected"]', t('Simple configuration'), 'The simple configuration option is selected when specified in the URL.');
     // Spot check several known simple configuration files.
     $element = $this->xpath('//select[@name="config_name"]');
     $options = $this->getAllOptions($element[0]);
     $expected_options = array('system.site', 'user.settings');
     foreach ($options as &$option) {
         $option = (string) $option;
     }
     $this->assertIdentical($expected_options, array_intersect($expected_options, $options), 'The expected configuration files are listed.');
     $this->drupalGet('admin/config/development/configuration/single/export/system.simple/system.image');
     $this->assertFieldByXPath('//textarea[@name="export"]', "toolkit: gd\n_core:\n  default_config_hash: durWHaKeBaq4d9Wpi4RqwADj1OufDepcnJuhVLmKN24\n", 'The expected system configuration is displayed.');
     $this->drupalGet('admin/config/development/configuration/single/export/date_format');
     $this->assertFieldByXPath('//select[@name="config_type"]//option[@selected="selected"]', t('Date format'), 'The date format entity type is selected when specified in the URL.');
     $this->drupalGet('admin/config/development/configuration/single/export/date_format/fallback');
     $this->assertFieldByXPath('//select[@name="config_name"]//option[@selected="selected"]', t('Fallback date format (fallback)'), 'The fallback date format config entity is selected when specified in the URL.');
     $fallback_date = \Drupal::entityManager()->getStorage('date_format')->load('fallback');
     $yaml_text = (string) $this->xpath('//textarea[@name="export"]')[0];
     $this->assertEqual(Yaml::decode($yaml_text), $fallback_date->toArray(), 'The fallback date format config entity export code is displayed.');
 }
예제 #17
0
 /**
  * Loads a YAML file.
  *
  * @param string $file
  *
  * @return array The file content
  *
  * @throws InvalidArgumentException
  *   When the given file is not a local file or when it does not exist.
  */
 protected function loadFile($file)
 {
     if (!stream_is_local($file)) {
         throw new InvalidArgumentException(sprintf('This is not a local file "%s".', $file));
     }
     if (!file_exists($file)) {
         throw new InvalidArgumentException(sprintf('The service file "%s" is not valid.', $file));
     }
     return $this->validate(Yaml::decode(file_get_contents($file)), $file);
 }
예제 #18
0
<?php

/**
 * @file
 * Test fixture.
 */
use Drupal\Core\Database\Database;
use Drupal\Core\Serialization\Yaml;
$connection = Database::getConnection();
$connection->insert('config')->fields(array('collection' => '', 'name' => 'views.view.test_duplicate_field_handlers', 'data' => serialize(Yaml::decode(file_get_contents('core/modules/views/tests/modules/views_test_config/test_views/views.view.test_duplicate_field_handlers.yml')))))->execute();
<?php

/**
 * @file
 * Contains database additions to drupal-8.bare.standard.php.gz for testing the
 * upgrade path of rest_post_update_resource_granularity().
 */
use Drupal\Core\Database\Database;
use Drupal\Core\Serialization\Yaml;
$connection = Database::getConnection();
// Set the schema version.
$connection->insert('key_value')->fields(['collection' => 'system.schema', 'name' => 'rest', 'value' => 'i:8201;'])->fields(['collection' => 'system.schema', 'name' => 'serialization', 'value' => 'i:8201;'])->execute();
// Update core.extension.
$extensions = $connection->select('config')->fields('config', ['data'])->condition('collection', '')->condition('name', 'core.extension')->execute()->fetchField();
$extensions = unserialize($extensions);
$extensions['module']['rest'] = 8201;
$extensions['module']['serialization'] = 8201;
$connection->update('config')->fields(['data' => serialize($extensions)])->condition('collection', '')->condition('name', 'core.extension')->execute();
$connection->merge('key_value')->condition('collection', 'entity.definitions.installed')->condition('name', 'rest_resource_config.entity_type')->fields(['value' => 'O:42:"Drupal\\Core\\Config\\Entity\\ConfigEntityType":39:{s:16:"*config_prefix";s:8:"resource";s:15:"*static_cache";b:0;s:14:"*lookup_keys";a:1:{i:0;s:4:"uuid";}s:16:"*config_export";a:4:{i:0;s:2:"id";i:1;s:9:"plugin_id";i:2;s:11:"granularity";i:3;s:13:"configuration";}s:21:"*mergedConfigExport";a:0:{}s:15:"*render_cache";b:1;s:19:"*persistent_cache";b:1;s:14:"*entity_keys";a:6:{s:2:"id";s:2:"id";s:8:"revision";s:0:"";s:6:"bundle";s:0:"";s:8:"langcode";s:8:"langcode";s:16:"default_langcode";s:16:"default_langcode";s:4:"uuid";s:4:"uuid";}s:5:"*id";s:20:"rest_resource_config";s:11:"*provider";s:4:"rest";s:8:"*class";s:37:"Drupal\\rest\\Entity\\RestResourceConfig";s:16:"*originalClass";N;s:11:"*handlers";a:2:{s:6:"access";s:45:"Drupal\\Core\\Entity\\EntityAccessControlHandler";s:7:"storage";s:45:"Drupal\\Core\\Config\\Entity\\ConfigEntityStorage";}s:19:"*admin_permission";s:25:"administer rest resources";s:25:"*permission_granularity";s:11:"entity_type";s:8:"*links";a:0:{}s:17:"*label_callback";s:18:"getLabelFromPlugin";s:21:"*bundle_entity_type";N;s:12:"*bundle_of";N;s:15:"*bundle_label";N;s:13:"*base_table";N;s:22:"*revision_data_table";N;s:17:"*revision_table";N;s:13:"*data_table";N;s:15:"*translatable";b:0;s:8:"*label";O:48:"Drupal\\Core\\StringTranslation\\TranslatableMarkup":3:{s:9:"*string";s:20:"REST resource config";s:12:"*arguments";a:0:{}s:10:"*options";a:0:{}}s:17:"*label_singular";s:0:"";s:15:"*label_plural";s:0:"";s:14:"*label_count";a:0:{}s:15:"*uri_callback";N;s:8:"*group";s:13:"configuration";s:14:"*group_label";O:48:"Drupal\\Core\\StringTranslation\\TranslatableMarkup":3:{s:9:"*string";s:13:"Configuration";s:12:"*arguments";a:0:{}s:10:"*options";a:1:{s:7:"context";s:17:"Entity type group";}}s:22:"*field_ui_base_route";N;s:26:"*common_reference_target";b:0;s:22:"*list_cache_contexts";a:0:{}s:18:"*list_cache_tags";a:1:{i:0;s:32:"config:rest_resource_config_list";}s:14:"*constraints";a:0:{}s:13:"*additional";a:0:{}s:20:"*stringTranslation";N;}', 'name' => 'rest_resource_config.entity_type', 'collection' => 'entity.definitions.installed'])->execute();
$connection->merge('key_value')->condition('collection', 'post_update')->condition('name', 'existing_updates')->fields(['value' => 'a:13:{i:0;s:64:"system_post_update_recalculate_configuration_entity_dependencies";i:1;s:50:"field_post_update_entity_reference_handler_setting";i:2;s:46:"field_post_update_save_custom_storage_property";i:3;s:54:"block_post_update_disable_blocks_with_missing_contexts";i:4;s:46:"views_post_update_cleanup_duplicate_views_data";i:5;s:46:"views_post_update_update_cacheability_metadata";i:6;s:43:"field_post_update_email_widget_size_setting";i:7;s:42:"image_post_update_image_style_dependencies";i:8;s:42:"views_post_update_image_style_dependencies";i:9;s:46:"views_post_update_field_formatter_dependencies";i:10;s:41:"views_post_update_serializer_dependencies";i:11;s:36:"views_post_update_taxonomy_index_tid";i:12;s:53:"rest_post_update_create_rest_resource_config_entities";}', 'name' => 'existing_updates', 'collection' => 'post_update'])->execute();
$connection->insert('config')->fields(['collection', 'name', 'data'])->values(['collection' => '', 'name' => 'rest.resource.entity.node', 'data' => serialize(Yaml::decode(file_get_contents(__DIR__ . '/rest.resource.entity.node_2721595.yml')))])->values(['collection' => '', 'name' => 'rest.resource.entity.comment', 'data' => serialize(Yaml::decode(file_get_contents(__DIR__ . '/rest.resource.entity.comment_2721595.yml')))])->values(['collection' => '', 'name' => 'rest.resource.entity.user', 'data' => serialize(Yaml::decode(file_get_contents(__DIR__ . '/rest.resource.entity.user_2721595.yml')))])->execute();
<?php

/**
 * @file
 * Contains database additions to drupal-8.bare.standard.php.gz for testing the
 * upgrade path of https://www.drupal.org/node/2354889.
 */
use Drupal\Core\Database\Database;
use Drupal\Core\Serialization\Yaml;
$connection = Database::getConnection();
// A custom block with visibility settings.
$block_configs[] = Yaml::decode(file_get_contents(__DIR__ . '/block.block.testfor2354889.yml'));
// A custom block without any visibility settings.
$block_configs[] = Yaml::decode(file_get_contents(__DIR__ . '/block.block.secondtestfor2354889.yml'));
// A custom block with visibility settings that contain a non-existing context
// mapping.
$block_configs[] = Yaml::decode(file_get_contents(__DIR__ . '/block.block.thirdtestfor2354889.yml'));
foreach ($block_configs as $block_config) {
    $connection->insert('config')->fields(array('collection', 'name', 'data'))->values(array('collection' => '', 'name' => 'block.block.' . $block_config['id'], 'data' => serialize($block_config)))->execute();
}
// Update the config entity query "index".
$existing_blocks = $connection->select('key_value')->fields('key_value', ['value'])->condition('collection', 'config.entity.key_store.block')->condition('name', 'theme:bartik')->execute()->fetchField();
$existing_blocks = unserialize($existing_blocks);
$connection->update('key_value')->fields(['value' => serialize(array_merge($existing_blocks, ['block.block.testfor2354889', 'block.block.secondtestfor2354889', 'block.block.thirdtestfor2354889']))])->condition('collection', 'config.entity.key_store.block')->condition('name', 'theme:bartik')->execute();
<?php

/**
 * @file
 * Contains database additions to drupal-8-rc1.bare.standard.php.gz for testing
 * the upgrade path of https://www.drupal.org/node/2649914.
 */
use Drupal\Core\Database\Database;
use Drupal\Core\Serialization\Yaml;
$connection = Database::getConnection();
$views_config = Yaml::decode(file_get_contents(__DIR__ . '/drupal8.views-image-style-dependency-2649914.yml'));
$connection->insert('config')->fields(['collection', 'name', 'data'])->values(['collection' => '', 'name' => 'views.view.' . $views_config['id'], 'data' => serialize($views_config)])->execute();
예제 #22
0
 /**
  * Changes parameters in the services.yml file.
  *
  * @param string $name
  *   The name of the parameter.
  * @param mixed $value
  *   The value of the parameter.
  */
 protected function setContainerParameter($name, $value)
 {
     $filename = $this->siteDirectory . '/services.yml';
     chmod($filename, 0666);
     $services = Yaml::decode(file_get_contents($filename));
     $services['parameters'][$name] = $value;
     file_put_contents($filename, Yaml::encode($services));
     // Ensure that the cache is deleted for the yaml file loader.
     $file_cache = FileCacheFactory::get('container_yaml_loader');
     $file_cache->delete($filename);
 }
예제 #23
0
 /**
  * {@inheritdoc}
  */
 public function decode($raw)
 {
     $data = Yaml::decode($raw);
     // A simple string is valid YAML for any reason.
     if (!is_array($data)) {
         return FALSE;
     }
     return $data;
 }