/** * Generates the fields list of an SQL query. * * @param Model $model * @param string $alias Alias tablename * @param mixed $fields * @param boolean $quote If false, returns fields array unquoted * @return array */ function fields(&$model, $alias = null, $fields = array(), $quote = true) { if (empty($alias)) { $alias = $model->name; } if (!is_array($fields)) { if (!empty($fields)) { $depth = 0; $offset = 0; $buffer = ''; $results = array(); $length = strlen($fields); while ($offset <= $length) { $tmpOffset = -1; $offsets = array(strpos($fields, ',', $offset), strpos($fields, '(', $offset), strpos($fields, ')', $offset)); for ($i = 0; $i < 3; $i++) { if ($offsets[$i] !== false && ($offsets[$i] < $tmpOffset || $tmpOffset == -1)) { $tmpOffset = $offsets[$i]; } } if ($tmpOffset !== -1) { $buffer .= substr($fields, $offset, $tmpOffset - $offset); if ($fields[$tmpOffset] == ',' && $depth == 0) { $results[] = $buffer; $buffer = ''; } else { $buffer .= $fields[$tmpOffset]; } if ($fields[$tmpOffset] == '(') { $depth++; } if ($fields[$tmpOffset] == ')') { $depth--; } $offset = ++$tmpOffset; } else { $results[] = $buffer . substr($fields, $offset); $offset = $length + 1; } } if (empty($results) && !empty($buffer)) { $results[] = $buffer; } if (!empty($results)) { $fields = array_map('trim', $results); } else { $fields = array(); } } } if (empty($fields)) { $fieldData = $model->loadInfo(); $fields = $fieldData->extract('{n}.name'); } else { $fields = array_filter($fields); } if (!$quote) { return $fields; } $count = count($fields); if ($count >= 1 && !in_array($fields[0], array('*', 'COUNT(*)'))) { for ($i = 0; $i < $count; $i++) { if (!preg_match('/^.+\\(.*\\)/', $fields[$i])) { $prepend = ''; if (strpos($fields[$i], 'DISTINCT') !== false) { $prepend = 'DISTINCT '; $fields[$i] = trim(r('DISTINCT', '', $fields[$i])); } $dot = strpos($fields[$i], '.'); if ($dot === false) { $fields[$i] = $prepend . $this->name($alias) . '.' . $this->name($fields[$i]); } else { $comma = strpos($fields[$i], ','); if ($comma === false) { $build = explode('.', $fields[$i]); if (!Set::numeric($build)) { $fields[$i] = $prepend . $this->name($build[0]) . '.' . $this->name($build[1]); } } else { $comma = explode(',', $fields[$i]); foreach ($comma as $string) { $build = explode('.', $string); if (!Set::numeric($build)) { $value[] = $prepend . $this->name(trim($build[0])) . '.' . $this->name(trim($build[1])); } } $fields[$i] = implode(', ', $value); } } } elseif (preg_match('/\\(([\\.\\w]+)\\)/', $fields[$i], $field)) { if (isset($field[1])) { if (strpos($field[1], '.') === false) { $field[1] = $this->name($alias) . '.' . $this->name($field[1]); } else { $field[0] = explode('.', $field[1]); if (!Set::numeric($field[0])) { $field[0] = join('.', array_map(array($this, 'name'), $field[0])); $fields[$i] = preg_replace('/\\(' . $field[1] . '\\)/', '(' . $field[0] . ')', $fields[$i], 1); } } } } } } return $fields; }