Esempio n. 1
0
 /**
  * Verify that the passed field is correct
  * @param SugarQuery $q
  * @param string $field
  * @return bool
  * @throws SugarApiExceptionInvalidParameter
  */
 protected static function verifyField(SugarQuery $q, $field)
 {
     $ret = array();
     if (strpos($field, '.')) {
         // It looks like it's a related field that it's searching by
         list($linkName, $field) = explode('.', $field);
         $q->from->load_relationship($linkName);
         if (empty($q->from->{$linkName})) {
             throw new SugarApiExceptionInvalidParameter("Invalid link {$relatedTable} for field {$field}");
         }
         if ($q->from->{$linkName}->getType() == "many") {
             // FIXME: we have a problem here: we should allow 'many' links for related to match against parent object
             // but allowing 'many' in  other links may lead to duplicates. So for now we allow 'many'
             // but we should figure out how to find if 'many' is permittable or not.
             // throw new SugarApiExceptionInvalidParameter("Cannot use condition against multi-link $relatedTable");
         }
         $join = $q->join($linkName, array('joinType' => 'LEFT'));
         $table = $join->joinName();
         $ret['field'] = "{$table}.{$field}";
         $bean = $q->getTableBean($table);
         if (empty($bean)) {
             $bean = $q->getTableBean($linkName);
         }
         if (empty($bean) && $q->getFromBean() && $q->getFromBean()->{$linkName}) {
             $bean = BeanFactory::getBean($q->getFromBean()->{$linkName}->getRelatedModuleName());
         }
         if (empty($bean)) {
             throw new SugarApiExceptionInvalidParameter("Cannot use condition against {$linkName} - unknown module");
         }
     } else {
         $bean = $q->from;
     }
     $defs = $bean->field_defs;
     if (empty($defs[$field])) {
         throw new SugarApiExceptionInvalidParameter("Unknown field {$field}");
     }
     if (!$bean->ACLFieldAccess($field)) {
         throw new SugarApiExceptionNotAuthorized("Access for field {$field} is not allowed");
     }
     $field_def = $defs[$field];
     if (!empty($field_def['source']) && $field_def['source'] == 'relate') {
         if (empty($field_def['rname']) || empty($field_def['link'])) {
             throw new SugarApiExceptionInvalidParameter("Field {$field} has invalid metadata, has source of relate but is missing rname or link");
         }
         $relfield = $field_def['rname'];
         $link = $field_def['link'];
         return self::verifyField($q, "{$link}.{$relfield}");
     }
     $ret['bean'] = $bean;
     $ret['def'] = $field_def;
     return $ret;
 }
Esempio n. 2
0
 /**
  * Add a Favorites block to the SugarQuery Object to fetch favorites for a specific [default to current] user
  * @param SugarQuery $sugar_query
  * @param bool $joinTo
  * @param string $join_type
  * @param bool|guid $user_id
  * @return string
  */
 public function addToSugarQuery(SugarQuery $sugar_query, $options = array())
 {
     $alias = '';
     $user_id = !isset($options['current_user_id']) ? $GLOBALS['current_user']->id : $options['current_user_id'];
     $joinTo = !isset($options['joinTo']) ? false : $options['joinTo'];
     $joinType = !isset($options['joinType']) ? 'INNER' : $options['joinType'];
     if (!$joinTo) {
         if (is_array($sugar_query->from)) {
             list($bean, $alias) = $sugar_query->from;
         } else {
             $bean = $sugar_query->from;
             $alias = $bean->getTableName();
         }
     } else {
         $alias = $joinTo->joinName();
         $bean = $sugar_query->getTableBean($alias);
     }
     if (empty($bean)) {
         return false;
     }
     $sfAlias = "sf_" . $bean->getTableName();
     $sugar_query->joinTable(self::getTableName(), array('alias' => $sfAlias, 'joinType' => $joinType, 'linkingTable' => true))->on()->equals("{$sfAlias}.module", $bean->module_name, $this)->equalsField("{$sfAlias}.record_id", "{$alias}.id", $this)->equals("{$sfAlias}.assigned_user_id", $user_id, $this)->equals("{$sfAlias}.deleted", 0, $this);
     return $sfAlias;
 }