public function find($params = null, $limit = 15, $where = null, $sql = null)
{
$tableless_field_types = PodsForm::tableless_field_types();
$simple_tableless_objects = PodsForm::simple_tableless_objects();
$this->params = $params;
$select = '`t`.*';
if (!in_array($this->pod_data['type'], array('pod', 'table')) && 'table' == $this->pod_data['storage']) {
$select .= ', `d`.*';
}
if (empty($this->data->table)) {
return $this;
}
$defaults = array('table' => $this->data->table, 'select' => $select, 'join' => null, 'where' => $where, 'groupby' => null, 'having' => null, 'orderby' => null, 'limit' => (int) $limit, 'offset' => null, 'page' => (int) $this->page, 'page_var' => $this->page_var, 'pagination' => (bool) $this->pagination, 'search' => (bool) $this->search, 'search_var' => $this->search_var, 'search_query' => null, 'search_mode' => $this->search_mode, 'search_across' => false, 'search_across_picks' => false, 'search_across_files' => false, 'filters' => $this->filters, 'sql' => $sql, 'expires' => null, 'cache_mode' => 'cache');
if (is_array($params)) {
$params = (object) array_merge($defaults, $params);
}
if (is_object($params)) {
$params = (object) array_merge($defaults, get_object_vars($params));
} else {
$defaults['orderby'] = $params;
$params = (object) $defaults;
}
$params = apply_filters('pods_pods_find', $params);
$params->limit = (int) $params->limit;
if (0 == $params->limit) {
$params->limit = -1;
}
$this->limit = (int) $params->limit;
$this->offset = (int) $params->offset;
$this->page = (int) $params->page;
$this->page_var = $params->page_var;
$this->pagination = (bool) $params->pagination;
$this->search = (bool) $params->search;
$this->search_var = $params->search_var;
$params->join = (array) $params->join;
if (empty($params->search_query)) {
$params->search_query = pods_var($this->search_var, 'get', '');
}
// Allow orderby array ( 'field' => 'asc|desc' )
if (!empty($params->orderby) && is_array($params->orderby)) {
foreach ($params->orderby as $k => &$orderby) {
if (!is_numeric($k)) {
$key = '';
$order = 'ASC';
if ('DESC' == strtoupper($orderby)) {
$order = 'DESC';
}
if (isset($this->fields[$k]) && in_array($this->fields[$k]['type'], $tableless_field_types)) {
if (in_array($this->fields[$k]['pick_object'], $simple_tableless_objects)) {
if ('table' == $this->pod_data['storage']) {
if (!in_array($this->pod_data['type'], array('pod', 'table'))) {
$key = "`d`.`{$k}`";
} else {
$key = "`t`.`{$k}`";
}
} else {
$key = "`{$k}`.`meta_value`";
}
} else {
$pick_val = $this->fields[$k]['pick_val'];
if ('__current__' == $pick_val) {
$pick_val = $this->pod;
}
$table = $this->api->get_table_info($this->fields[$k]['pick_object'], $pick_val);
if (!empty($table)) {
$key = "`{$k}`.`" . $table['field_index'] . '`';
}
}
}
if (empty($key)) {
if (!in_array($this->pod_data['type'], array('pod', 'table'))) {
if (isset($this->pod_data['object_fields'][$k])) {
$key = "`t`.`{$k}`";
} elseif (isset($this->fields[$k])) {
if ('table' == $this->pod_data['storage']) {
$key = "`d`.`{$k}`";
} else {
$key = "`{$k}`.`meta_value`";
}
} else {
foreach ($this->pod_data['object_fields'] as $object_field => $object_field_opt) {
if ($object_field == $k || in_array($k, $object_field_opt['alias'])) {
$key = "`t`.`{$object_field}`";
}
}
}
} elseif (isset($this->fields[$k])) {
if ('table' == $this->pod_data['storage']) {
$key = "`t`.`{$k}`";
} else {
$key = "`{$k}`.`meta_value`";
}
}
if (empty($key)) {
$key = $k;
if (false === strpos($key, ' ') && false === strpos($key, '`')) {
$key = '`' . str_replace('.', '`.`', $key) . '`';
}
}
}
$orderby = $key;
if (false === strpos($orderby, ' ')) {
$orderby .= ' ' . $order;
}
}
}
}
// Add prefix to $params->orderby if needed
if (!empty($params->orderby)) {
if (!is_array($params->orderby)) {
$params->orderby = array($params->orderby);
}
foreach ($params->orderby as &$prefix_orderby) {
if (false === strpos($prefix_orderby, ',') && false === strpos($prefix_orderby, '(') && false === stripos($prefix_orderby, ' AS ') && false === strpos($prefix_orderby, '`') && false === strpos($prefix_orderby, '.')) {
if (false !== stripos($prefix_orderby, ' DESC')) {
$k = trim(str_ireplace(array('`', ' DESC'), '', $prefix_orderby));
$dir = 'DESC';
} else {
$k = trim(str_ireplace(array('`', ' ASC'), '', $prefix_orderby));
$dir = 'ASC';
}
$key = $k;
if (!in_array($this->pod_data['type'], array('pod', 'table'))) {
if (isset($this->pod_data['object_fields'][$k])) {
$key = "`t`.`{$k}`";
} elseif (isset($this->fields[$k])) {
if ('table' == $this->pod_data['storage']) {
$key = "`d`.`{$k}`";
} else {
$key = "`{$k}`.`meta_value`";
}
} else {
foreach ($this->pod_data['object_fields'] as $object_field => $object_field_opt) {
if ($object_field == $k || in_array($k, $object_field_opt['alias'])) {
$key = "`t`.`{$object_field}`";
}
}
}
} elseif (isset($this->fields[$k])) {
if ('table' == $this->pod_data['storage']) {
$key = "`t`.`{$k}`";
} else {
$key = "`{$k}`.`meta_value`";
}
}
$prefix_orderby = "{$key} {$dir}";
}
}
}
$this->data->select($params);
return $this;
}