Completed
Push — master ( ef3bca...8ad209 )
by Jonathan
02:53 queued 01:19
created

Drupal6::startCollectingMail()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 4
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 0
1
<?php
2
3
namespace Drupal\Driver\Cores;
4
5
use Drupal\Driver\Exception\BootstrapException;
6
7
/**
8
 * Drupal 6 core.
9
 */
10
class Drupal6 extends AbstractCore {
11
12
  /**
13
   * The available permissions.
14
   *
15
   * @var array
16
   */
17
  protected $availablePermissons;
18
19
  /**
20
   * {@inheritdoc}
21
   */
22
  public function bootstrap() {
23
    // Validate, and prepare environment for Drupal bootstrap.
24 View Code Duplication
    if (!defined('DRUPAL_ROOT')) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
25
      define('DRUPAL_ROOT', $this->drupalRoot);
26
      require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
27
      $this->validateDrupalSite();
28
    }
29
30
    // Bootstrap Drupal.
31
    $current_path = getcwd();
32
    chdir(DRUPAL_ROOT);
33
    drupal_bootstrap(DRUPAL_BOOTSTRAP_CONFIGURATION);
34
    if (empty($GLOBALS['db_url'])) {
35
      throw new BootstrapException('Missing database setting, verify the database configuration in settings.php.');
36
    }
37
    drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
38
    chdir($current_path);
39
  }
40
41
  /**
42
   * {@inheritdoc}
43
   */
44
  public function clearCache() {
45
    // Need to change into the Drupal root directory or the registry explodes.
46
    $current_path = getcwd();
47
    chdir(DRUPAL_ROOT);
48
    drupal_flush_all_caches();
49
    chdir($current_path);
50
  }
51
52
  /**
53
   * {@inheritdoc}
54
   */
55
  public function nodeCreate($node) {
56
    $current_path = getcwd();
57
    chdir(DRUPAL_ROOT);
58
59
    // Set original if not set.
60
    if (!isset($node->original)) {
61
      $node->original = clone $node;
62
    }
63
64
    // Assign authorship if none exists and `author` is passed.
65 View Code Duplication
    if (!isset($node->uid) && !empty($node->author) && ($user = user_load(array('name' => $node->author)))) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
66
      $node->uid = $user->uid;
67
    }
68
69
    // Convert properties to expected structure.
70
    $this->expandEntityProperties($node);
71
72
    // Attempt to decipher any fields that may be specified.
73
    $this->expandEntityFields('node', $node);
74
75
    // Set defaults that haven't already been set.
76
    $defaults = clone $node;
77
    module_load_include('inc', 'node', 'node.pages');
78
    node_object_prepare($defaults);
79
    $node = (object) array_merge((array) $defaults, (array) $node);
80
81
    node_save($node);
82
83
    chdir($current_path);
84
    return $node;
85
86
  }
87
88
  /**
89
   * {@inheritdoc}
90
   */
91
  public function nodeDelete($node) {
92
    node_delete($node->nid);
93
  }
94
95
  /**
96
   * Implements CoreInterface::runCron().
97
   */
98
  public function runCron() {
99
    return drupal_cron_run();
100
  }
101
102
  /**
103
   * {@inheritdoc}
104
   */
105
  public function userCreate(\stdClass $user) {
106
    // Default status to TRUE if not explicitly creating a blocked user.
107
    if (!isset($user->status)) {
108
      $user->status = 1;
109
    }
110
111
    // Clone user object, otherwise user_save() changes the password to the
112
    // hashed password.
113
    $account = clone $user;
114
    // Convert role array to a keyed array.
115
    if (isset($user->roles)) {
116
      $roles = array();
117
      foreach ($user->roles as $rid) {
118
        $roles[$rid] = $rid;
119
      }
120
      $user->roles = $roles;
121
    }
122
    $account = user_save((array) $account, (array) $account);
123
    // Store the UID.
124
    $user->uid = $account->uid;
125
    return $user;
126
  }
127
128
  /**
129
   * {@inheritdoc}
130
   */
131
  public function userDelete(\stdClass $user) {
132
    $current_path = getcwd();
133
    chdir(DRUPAL_ROOT);
134
    user_delete((array) $user, $user->uid);
135
    chdir($current_path);
136
  }
137
138
  /**
139
   * {@inheritdoc}
140
   */
141
  public function processBatch() {
142
  }
143
144
  /**
145
   * {@inheritdoc}
146
   */
147
  public function userAddRole(\stdClass $user, $role_name) {
148
    $roles = array_flip(user_roles());
149
    $role = $roles[$role_name];
150
    if (!$role) {
151
      throw new \RuntimeException(sprintf('No role "%s" exists.', $role_name));
152
    }
153
    user_multiple_role_edit(array($user->uid), 'add_role', $role);
154
  }
155
156
  /**
157
   * Fetches a user role by role name.
158
   *
159
   * @param string $role_name
160
   *   A string representing the role name.
161
   *
162
   * @return object
163
   *   A fully-loaded role object if a role with the given name exists, or FALSE
164
   *   otherwise.
165
   *
166
   * @see user_role_load()
167
   */
168
  protected function userRoleLoadByName($role_name) {
169
    $result = db_query('SELECT * FROM {role} WHERE name = "%s"', $role_name);
170
    return db_fetch_object($result);
171
  }
172
173
  /**
174
   * Check to make sure that the array of permissions are valid.
175
   *
176
   * @param array $permissions
177
   *   Permissions to check.
178
   * @param bool $reset
179
   *   Reset cached available permissions.
180
   *
181
   * @return bool
182
   *   TRUE or FALSE depending on whether the permissions are valid.
183
   */
184
  protected function checkPermissions(array $permissions, $reset = FALSE) {
185
186
    if (!isset($this->availablePermissons) || $reset) {
187
      $this->availablePermissons = array_keys(module_invoke_all('permission'));
188
    }
189
190
    $valid = TRUE;
191
    foreach ($permissions as $permission) {
192
      if (!in_array($permission, $this->availablePermissons)) {
193
        $valid = FALSE;
194
      }
195
    }
196
    return $valid;
197
  }
198
199
  /**
200
   * {@inheritdoc}
201
   */
202
  public function roleCreate(array $permissions) {
203
    // Verify permissions exist.
204
    $all_permissions = module_invoke_all('perm');
205
    foreach ($permissions as $name) {
206
      $search = array_search($name, $all_permissions);
207
      if (!$search) {
208
        throw new \RuntimeException(sprintf("No permission '%s' exists.", $name));
209
      }
210
    }
211
    // Create new role.
212
    $name = $this->random->name(8);
213
    db_query("INSERT INTO {role} SET name = '%s'", $name);
214
    // Add permissions to role.
215
    $rid = db_last_insert_id('role', 'rid');
216
    db_query("INSERT INTO {permission} (rid, perm) VALUES (%d, '%s')", $rid, implode(', ', $permissions));
217
    return $name;
218
  }
219
220
  /**
221
   * {@inheritdoc}
222
   */
223
  public function roleDelete($role_name) {
224
    $roles = array_flip(user_roles());
225
    $rid = $roles[$role_name];
226
    db_query('DELETE FROM {role} WHERE rid = %d', $rid);
227
    if (!db_affected_rows()) {
228
      throw new \RuntimeException(sprintf('No role "%s" exists.', $rid));
229
    }
230
  }
231
232
  /**
233
   * {@inheritdoc}
234
   */
235 View Code Duplication
  public function validateDrupalSite() {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
236
    if ('default' !== $this->uri) {
237
      // Fake the necessary HTTP headers that Drupal needs:
238
      $drupal_base_url = parse_url($this->uri);
239
      // If there's no url scheme set, add http:// and re-parse the url
240
      // so the host and path values are set accurately.
241
      if (!array_key_exists('scheme', $drupal_base_url)) {
242
        $drupal_base_url = parse_url($this->uri);
243
      }
244
      // Fill in defaults.
245
      $drupal_base_url += array(
246
        'path' => NULL,
247
        'host' => NULL,
248
        'port' => NULL,
249
      );
250
      $_SERVER['HTTP_HOST'] = $drupal_base_url['host'];
251
252
      if ($drupal_base_url['port']) {
253
        $_SERVER['HTTP_HOST'] .= ':' . $drupal_base_url['port'];
254
      }
255
      $_SERVER['SERVER_PORT'] = $drupal_base_url['port'];
256
257
      if (array_key_exists('path', $drupal_base_url)) {
258
        $_SERVER['PHP_SELF'] = $drupal_base_url['path'] . '/index.php';
259
      }
260
      else {
261
        $_SERVER['PHP_SELF'] = '/index.php';
262
      }
263
    }
264
    else {
265
      $_SERVER['HTTP_HOST'] = 'default';
266
      $_SERVER['PHP_SELF'] = '/index.php';
267
    }
268
269
    $_SERVER['REQUEST_URI'] = $_SERVER['SCRIPT_NAME'] = $_SERVER['PHP_SELF'];
270
    $_SERVER['REMOTE_ADDR'] = '127.0.0.1';
271
    $_SERVER['REQUEST_METHOD'] = NULL;
272
273
    $_SERVER['SERVER_SOFTWARE'] = NULL;
274
    $_SERVER['HTTP_USER_AGENT'] = NULL;
275
276
    $conf_path = conf_path(TRUE, TRUE);
277
    $conf_file = $this->drupalRoot . "/$conf_path/settings.php";
278
    if (!file_exists($conf_file)) {
279
      throw new BootstrapException(sprintf('Could not find a Drupal settings.php file at "%s"', $conf_file));
280
    }
281
    $drushrc_file = $this->drupalRoot . "/$conf_path/drushrc.php";
282
    if (file_exists($drushrc_file)) {
283
      require_once $drushrc_file;
284
    }
285
  }
286
287
  /**
288
   * Expands properties on the given entity object to the expected structure.
289
   *
290
   * @param \stdClass $entity
291
   *   The entity object.
292
   */
293 View Code Duplication
  protected function expandEntityProperties(\stdClass $entity) {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
294
    // The created field may come in as a readable date, rather than a
295
    // timestamp.
296
    if (isset($entity->created) && !is_numeric($entity->created)) {
297
      $entity->created = strtotime($entity->created);
298
    }
299
300
    // Map human-readable node types to machine node types.
301
    $types = node_get_types();
302
    foreach ($types as $type) {
303
      if ($entity->type == $type->name) {
304
        $entity->type = $type->type;
305
        continue;
306
      }
307
    }
308
  }
309
310
  /**
311
   * Load vocabularies, optional by VIDs.
312
   *
313
   * @param array $vids
314
   *   The vids to load.
315
   *
316
   * @return array
317
   *   An array of vocabulary objects
318
   */
319
  protected function taxonomyVocabularyLoadMultiple(array $vids = array()) {
320
    $vocabularies = taxonomy_get_vocabularies();
321
    if ($vids) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $vids of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
322
      return array_intersect_key($vocabularies, array_flip($vids));
323
    }
324
    return $vocabularies;
325
  }
326
327
  /**
328
   * {@inheritdoc}
329
   */
330
  public function termCreate(\stdClass $term) {
331
    // Map vocabulary names to vid, these take precedence over machine names.
332 View Code Duplication
    if (!isset($term->vid)) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
333
      $vocabularies = \taxonomy_get_vocabularies();
334
      foreach ($vocabularies as $vid => $vocabulary) {
335
        if ($vocabulary->name == $term->vocabulary_machine_name) {
336
          $term->vid = $vocabulary->vid;
337
        }
338
      }
339
    }
340
341
    if (!isset($term->vid)) {
342
343
      // Try to load vocabulary by machine name.
344
      $vocabularies = $this->taxonomyVocabularyLoadMultiple(array($term->vid));
345
      if (!empty($vocabularies)) {
346
        $vids = array_keys($vocabularies);
347
        $term->vid = reset($vids);
348
      }
349
    }
350
351
    // If `parent` is set, look up a term in this vocab with that name.
352 View Code Duplication
    if (isset($term->parent)) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
353
      $parent = \taxonomy_get_term_by_name($term->parent);
354
      if (!empty($parent)) {
355
        $parent = reset($parent);
356
        $term->parent = $parent->tid;
357
      }
358
    }
359
360
    if (empty($term->vid)) {
361
      throw new \Exception(sprintf('No "%s" vocabulary found.'));
362
    }
363
364
    // Attempt to decipher any fields that may be specified.
365
    $this->expandEntityFields('taxonomy_term', $term);
366
367
    // Protect against a failure from hook_taxonomy_term_insert() in pathauto.
368
    $current_path = getcwd();
369
    chdir(DRUPAL_ROOT);
370
    $term_array = (array) $term;
371
    \taxonomy_save_term($term_array);
372
    chdir($current_path);
373
374
    // Loading a term by name returns an array of term objects, but there should
375
    // only be one matching term in a testing context, so take the first match
376
    // by reset()'ing $matches.
377
    $matches = \taxonomy_get_term_by_name($term->name);
378
    $saved_term = reset($matches);
379
380
    return $saved_term;
381
  }
382
383
  /**
384
   * {@inheritdoc}
385
   */
386
  public function termDelete(\stdClass $term) {
387
    $status = 0;
388
    if (isset($term->tid)) {
389
      $status = \taxonomy_del_term($term->tid);
390
    }
391
    // Will be SAVED_DELETED (3) on success.
392
    return $status;
393
  }
394
395
  /**
396
   * Helper function to get all permissions.
397
   *
398
   * @return array
399
   *   Array keyed by permission name, with the human-readable title as the
400
   *   value.
401
   */
402 View Code Duplication
  protected function getAllPermissions() {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
403
    $permissions = array();
404
    foreach (module_invoke_all('permission') as $name => $permission) {
405
      $permissions[$name] = $permission['title'];
406
    }
407
    return $permissions;
408
  }
409
410
  /**
411
   * {@inheritdoc}
412
   */
413
  public function getModuleList() {
414
    return module_list();
415
  }
416
417
  /**
418
   * {@inheritdoc}
419
   */
420 View Code Duplication
  public function getExtensionPathList() {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
421
    $paths = array();
422
423
    // Get enabled modules.
424
    $modules = $this->getModuleList();
425
    foreach ($modules as $module) {
426
      $paths[] = $this->drupalRoot . DIRECTORY_SEPARATOR . \drupal_get_path('module', $module);
427
    }
428
429
    return $paths;
430
  }
431
432
  /**
433
   * {@inheritdoc}
434
   */
435
  protected function expandEntityFields($entity_type, \stdClass $entity, array $base_fields = array()) {
436
    return parent::expandEntityFields($entity_type, $entity);
437
  }
438
439
  /**
440
   * {@inheritdoc}
441
   */
442
  public function getEntityFieldTypes($entity_type, array $base_fields = array()) {
443
    $taxonomy_fields = array('taxonomy' => 'taxonomy');
444
    if (!module_exists('content')) {
445
      return $taxonomy_fields;
446
    }
447
    $return = array();
448
    $fields = content_fields();
449
    foreach ($fields as $field_name => $field) {
450
      if ($this->isField($entity_type, $field_name)) {
451
        $return[$field_name] = $field['type'];
452
      }
453
    }
454
455
    $return += $taxonomy_fields;
456
457
    return $return;
458
  }
459
460
  /**
461
   * {@inheritdoc}
462
   */
463
  public function isField($entity_type, $field_name) {
464
    if ($field_name === 'taxonomy') {
465
      return TRUE;
466
    }
467
    if (!module_exists('content')) {
468
      return FALSE;
469
    }
470
    $map = content_fields();
471
    return isset($map[$field_name]);
472
  }
473
474
  /**
475
   * {@inheritdoc}
476
   */
477
  public function languageCreate(\stdClass $language) {
478
    throw new \Exception('Creating languages is not yet implemented for Drupal 6.');
479
  }
480
481
  /**
482
   * {@inheritdoc}
483
   */
484
  public function languageDelete(\stdClass $language) {
485
    throw new \Exception('Deleting languages is not yet implemented for Drupal 6.');
486
  }
487
488
  /**
489
   * {@inheritdoc}
490
   */
491
  public function configGet($name, $key = '') {
492
    throw new \Exception('Getting config is not yet implemented for Drupal 6.');
493
  }
494
495
  /**
496
   * {@inheritdoc}
497
   */
498
  public function configSet($name, $key, $value) {
499
    throw new \Exception('Setting config is not yet implemented for Drupal 6.');
500
  }
501
502
  /**
503
   * {@inheritdoc}
504
   */
505
  public function clearStaticCaches() {
506
    // Drupal 6 doesn't have a way of clearing all static caches.
507
  }
508
509
  /**
510
   * {@inheritdoc}
511
   */
512
  public function entityCreate($entity_type, $entity) {
513
    throw new \Exception('Drupal 6 does not have a generic Entity API, so creation of entities is not possible in this way.');
514
  }
515
516
  /**
517
   * {@inheritdoc}
518
   */
519
  public function entityDelete($entity_type, $entity) {
520
    throw new \Exception('Drupal 6 does not have a generic Entity API, so deletion of entities is not possible in this way.');
521
  }
522
523
  /**
524
   * {@inheritdoc}
525
   */
526
  public function startCollectingMail() {
527
    // @todo: create a D6 version of this function
528
    throw new \Exception('Mail testing is not yet implemented for Drupal 6.');
529
  }
530
531
  /**
532
   * {@inheritdoc}
533
   */
534
  public function stopCollectingMail() {
535
    // @todo: create a D6 version of this function
536
    throw new \Exception('Mail testing is not yet implemented for Drupal 6.');
537
  }
538
539
  /**
540
   * {@inheritdoc}
541
   */
542
  public function getMail() {
543
    // @todo: create a D6 version of this function
544
    throw new \Exception('Mail testing is not yet implemented for Drupal 6.');
545
  }
546
547
  /**
548
   * {@inheritdoc}
549
   */
550
  public function clearMail() {
551
    // @todo: create a D6 version of this function
552
    throw new \Exception('Mail testing is not yet implemented for Drupal 6.');
553
  }
554
555
  /**
556
   * {@inheritdoc}
557
   */
558
  public function sendMail($body, $subject = '', $to = '', $langcode = '') {
559
    // @todo: create a D6 version of this function
560
    throw new \Exception('Mail testing is not yet implemented for Drupal 6.');
561
  }
562
563
}
564