civicrm_entity-8.x-3.0-beta1/src/Hook/QueryHooks.php

src/Hook/QueryHooks.php
<?php

namespace Drupal\civicrm_entity\Hook;

use Drupal\Core\Database\Database;
use Drupal\Core\Database\Query\AlterableInterface;
use Drupal\Core\Hook\Attribute\Hook;
use Drupal\views\Plugin\views\query\QueryPluginBase;
use Drupal\views\ViewExecutable;

/**
 * Hook implementations for queries.
 */
class QueryHooks {

  /**
   * Implements hook_views_query_alter().
   */
  #[Hook('views_query_alter')]
  public function viewsQueryAlter(ViewExecutable $view, QueryPluginBase $query) {
    // Provide fully qualified table name in all Views queries.
    // If CiviCRM tables in a separate database.
    $civicrm_connection_name = drupal_valid_test_ua() ? 'civicrm_test' : 'civicrm';
    $civicrm_database_info = Database::getConnectionInfo($civicrm_connection_name);
    if (isset($civicrm_database_info['default']) && method_exists($query, "getTableQueue")) {
      $civicrm_connection = Database::getConnection('default', $civicrm_connection_name);
      $table_queue =& $query->getTableQueue();
      foreach ($table_queue as $alias => &$table_info) {
        if (!empty($table_info['table']) && ((strpos($table_info['table'], 'civicrm_') === 0 && strpos($table_info['table'], '.') === FALSE && strpos($table_info['table'], '__') === FALSE) || strpos($table_info['table'], 'civicrm_value_') === 0)) {
          $table_info['table'] = $civicrm_connection->getFullQualifiedTableName($table_info['table']);
        }
        if (!empty($table_info['join']->table) && ((strpos($table_info['join']->table, 'civicrm_') === 0 && strpos($table_info['join']->table, '.') === FALSE && strpos($table_info['join']->table, '__') === FALSE) || strpos($table_info['join']->table, 'civicrm_value_') === 0)) {
          $table_info['join']->table = $civicrm_connection->getFullQualifiedTableName($table_info['join']->table);
        }
      }
    }

    \Drupal::service('civicrm')->initialize();
    $multilingual = \CRM_Core_I18n::isMultilingual();

    if ($multilingual) {
      // @codingStandardsIgnoreStart
      global $dbLocale;
      // @codingStandardsIgnoreEnd
      $columns = \CRM_Core_I18n_SchemaStructure::columns();
      $affectedColumns = [];
      foreach ($columns as $table => $hash) {
        foreach (array_keys($hash) as $column) {
          $affectedColumns[] = "{$table}.{$column}";
        }
      }
      $class = get_class($query);
      if ($class == 'Drupal\search_api\Plugin\views\query\SearchApiQuery' && method_exists($query, "getWhere")) {
        $where = $query->getWhere();
      }
      elseif (isset($query->where)) {
        $where = $query->where;
      }
      if (!empty($where)) {
        foreach ($where as &$condition_group) {
          foreach ($condition_group['conditions'] as &$condition) {
            if (!is_object($condition['field'])) {
              foreach ($affectedColumns as $aff_column) {
                if (strpos($aff_column, $condition['field']) !== FALSE) {
                  $condition['field'] = str_replace($aff_column, $aff_column . $dbLocale, $condition['field']);
                }
              }
            }
          }
        }
      }

      if (!empty($query->fields)) {
        foreach ($query->fields as &$field) {
          if (array_key_exists($field['table'], $columns) && array_key_exists($field['field'], $columns[$field['table']])) {
            $field['field'] .= $dbLocale;
          }
        }
      }
    }
  }

  /**
   * Implements hook_query_TAG_alter().
   */
  #[Hook('query_pathauto_bulk_update_alter')]
  public function queryPathautoBulkUpdateAlter(AlterableInterface $query): void {
    $tables = &$query->getTables();

    if (strpos($tables['base_table']['table'], 'civicrm_') !== FALSE) {
      $civicrm_connection_name = drupal_valid_test_ua() ? 'civicrm_test' : 'civicrm';
      $civicrm_database_info = Database::getConnectionInfo($civicrm_connection_name);
      if (isset($civicrm_database_info['default'])) {
        $connection = Database::getConnection('default', $civicrm_connection_name);
        $tables['base_table']['table'] = $connection->getFullQualifiedTableName($tables['base_table']['table']);
      }
    }
  }

  /**
   * Implements hook_query_TAG_alter().
   */
  #[Hook('query_pathauto_bulk_delete_alter')]
  public function queryPathautoBulkDeleteAlter(AlterableInterface $query): void {
    $tables = &$query->getTables();

    if (strpos($tables['base_table']['table'], 'civicrm_') !== FALSE) {
      $civicrm_connection_name = drupal_valid_test_ua() ? 'civicrm_test' : 'civicrm';
      $civicrm_database_info = Database::getConnectionInfo($civicrm_connection_name);
      if (isset($civicrm_database_info['default'])) {
        $connection = Database::getConnection('default', $civicrm_connection_name);
        $tables['base_table']['table'] = $connection->getFullQualifiedTableName($tables['base_table']['table']);
      }
    }
  }

}

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

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