/** * 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; }
/** * 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; }