public static function PathChecker::uniquePaths in Optimizely 8.3
Compare target path against the project paths to confirm they're unique.
Parameters
array $target_paths: The paths entered for a new project entry, OR the paths of an existing project entry that has been enabled.
int|null $target_oid: The oid of the project entry that has been enabled, or NULL.
Return value
bool| $target_path: the path that is a duplicate that must be addressed to enable or create the new project entry, or TRUE if unique paths.
2 calls to PathChecker::uniquePaths()
- AddUpdateForm::validateForm in src/Form/ AddUpdateForm.php 
- Check to make sure the project code is unique except for the default entry which uses the account ID but should support an additional entry to allow for custom settings.
- AjaxEnable::enableDisable in src/Controller/ AjaxEnable.php 
- Enable or disable the project.
File
- src/Util/ PathChecker.php, line 106 
Class
- PathChecker
- Provides static methods to check path validity, etc.
Namespace
Drupal\optimizely\UtilCode
public static function uniquePaths(array $target_paths, $target_oid = NULL) {
  // Look up alternative paths.
  $target_paths = self::collectAlias($target_paths);
  // Look for duplicate paths in submitted $target_paths.
  $duplicate_target_path = self::duplicateCheck($target_paths);
  // Look for duplicate paths within target paths.
  if (!$duplicate_target_path) {
    // Collect all of the existing project paths that are enabled.
    $query = \Drupal::database()
      ->select('optimizely', 'o', [
      'target' => 'slave',
    ])
      ->fields('o', [
      'oid',
      'project_title',
      'path',
    ])
      ->condition('o.enabled', 1, '=');
    // Add target_oid to query when it's an update, $target_oid is defined.
    if ($target_oid != NULL) {
      $query = $query
        ->condition('o.oid', $target_oid, '<>');
    }
    $projects = $query
      ->execute();
    // No other enabled projects.
    if ($query
      ->countQuery()
      ->execute()
      ->fetchField() == 0) {
      return [
        TRUE,
        NULL,
      ];
    }
    $all_project_paths = [];
    // Build array of all the project entry paths.
    foreach ($projects as $project) {
      // Collect all of the path values and merge into collective array.
      $project_paths = unserialize($project->path);
      $all_project_paths = array_merge($all_project_paths, $project_paths);
    }
    // Add any additional aliases to catch all match possiblities.
    $all_project_paths = self::collectAlias($all_project_paths);
    // Convert array into string for drupal_match_path().
    $all_project_paths_string = implode("\n", $all_project_paths);
    // Check all of the paths for all of the active project entries
    // to make sure the paths are unique.
    foreach ($target_paths as $target_path) {
      // "*" found in path.
      if (strpos($target_path, '*') !== FALSE) {
        // Look for wild card match if not sitewide.
        if (strpos($target_path, '*') !== 0) {
          $target_path = substr($target_path, 0, -2);
          // Look for duplicate path due to wild card.
          foreach ($all_project_paths as $all_project_path) {
            if (strpos($all_project_path, $target_path) === 0 && $all_project_path != $target_path) {
              return [
                $project->project_title,
                $target_path,
              ];
            }
          }
        }
        elseif (strpos($target_path, '*') === 0 && (count($target_paths) > 1 || count($all_project_paths) > 0)) {
          return [
            $project->project_title,
            $target_path,
          ];
        }
        // Look for sitewide wild card in target project paths.
        if (in_array('*', $all_project_paths)) {
          return [
            $project->project_title,
            $target_path,
          ];
        }
      }
      elseif (strpos($target_path, '?') !== FALSE) {
        $target_path = substr($target_path, 0, strpos($target_path, '?'));
      }
      // Look for duplicates.
      if (\Drupal::service('path.matcher')
        ->matchPath($target_path, $all_project_paths_string)) {
        return [
          $project->project_title,
          $target_path,
        ];
      }
    }
    return [
      TRUE,
      NULL,
    ];
  }
  else {
    return [
      NULL,
      $duplicate_target_path,
    ];
  }
}