Fixes dev/core#2984 - Give clear error message when entity's component is disabled
[civicrm-core.git] / Civi / API / SelectQuery.php
index a089ef869fbde71e8a2c8ba57ff2260d1c5ff860..76ae48e06489fc2d230ca3d487d82a11d2229952 100644 (file)
@@ -11,6 +11,7 @@
 namespace Civi\API;
 
 use Civi\API\Exception\UnauthorizedException;
+use CRM_Core_Exception;
 
 /**
  * Query builder for civicrm_api_basic_get.
@@ -63,7 +64,7 @@ abstract class SelectQuery {
   /**
    * @var array
    */
-  protected $entityFieldNames;
+  protected $entityFieldNames = [];
   /**
    * @var array
    */
@@ -78,11 +79,16 @@ abstract class SelectQuery {
   /**
    * @param string $entity
    * @param bool $checkPermissions
+   *
+   * @throws \CRM_Core_Exception
    */
   public function __construct($entity, $checkPermissions) {
     $this->entity = $entity;
     require_once 'api/v3/utils.php';
     $baoName = _civicrm_api3_get_BAO($entity);
+    if (!$baoName) {
+      throw new CRM_Core_Exception('Invalid entity: ' . \CRM_Utils_Type::validate($entity, 'Alphanumeric'));
+    }
     $bao = new $baoName();
 
     $this->entityFieldNames = array_column($baoName::fields(), 'name');
@@ -210,7 +216,7 @@ abstract class SelectQuery {
       if (!isset($fkField['FKApiSpec'])) {
         $fkField['FKApiSpec'] = \_civicrm_api_get_fields($fkField['FKApiName']);
       }
-      $fieldInfo = \CRM_Utils_Array::value($fieldName, $fkField['FKApiSpec']);
+      $fieldInfo = $fkField['FKApiSpec'][$fieldName] ?? NULL;
 
       $keyColumn = \CRM_Utils_Array::value('FKKeyColumn', $fkField, 'id');
       if (!$fieldInfo || !isset($fkField['FKApiSpec'][$keyColumn])) {
@@ -239,7 +245,7 @@ abstract class SelectQuery {
       $this->join($side, $fkTable, $tableAlias, $joinCondition);
 
       if (strpos($fieldName, 'custom_') === 0) {
-        list($tableAlias, $fieldName) = $this->addCustomField($fieldInfo, $side, $tableAlias);
+        [$tableAlias, $fieldName] = $this->addCustomField($fieldInfo, $side, $tableAlias);
       }
 
       // Get ready to recurse to the next level
@@ -259,7 +265,7 @@ abstract class SelectQuery {
   protected function getJoinInfo(&$fkField, $stack) {
     if ($fkField['name'] == 'entity_id') {
       $entityTableParam = substr(implode('.', $stack), 0, -2) . 'table';
-      $entityTable = \CRM_Utils_Array::value($entityTableParam, $this->where);
+      $entityTable = $this->where[$entityTableParam] ?? NULL;
       if ($entityTable && is_string($entityTable) && \CRM_Core_DAO_AllCoreTables::getClassForTable($entityTable)) {
         $fkField['FKClassName'] = \CRM_Core_DAO_AllCoreTables::getClassForTable($entityTable);
         $fkField['FKApiName'] = \CRM_Core_DAO_AllCoreTables::getBriefName($fkField['FKClassName']);
@@ -361,11 +367,11 @@ abstract class SelectQuery {
    * Get acl clause for an entity
    *
    * @param string $tableAlias
-   * @param string $baoName
+   * @param \CRM_Core_DAO|string $baoName
    * @param array $stack
    * @return array
    */
-  protected function getAclClause($tableAlias, $baoName, $stack = []) {
+  public function getAclClause($tableAlias, $baoName, $stack = []) {
     if (!$this->checkPermissions) {
       return [];
     }
@@ -473,7 +479,7 @@ abstract class SelectQuery {
         }
       }
       elseif ($field && strpos($fieldName, 'custom_') === 0) {
-        list($table_name, $column_name) = $this->addCustomField($field, 'LEFT');
+        [$table_name, $column_name] = $this->addCustomField($field, 'LEFT');
 
         if ($field['data_type'] != 'ContactReference') {
           // 'ordinary' custom field. We will select the value as custom_XX.