/** * @return array */ public function get_row(&$counter = 0, $method = null) { if (!empty($this->row) && 0 < (int) $this->id && 'table' != $method) { return $this->row; } if (is_object($this->pod) && ('Pods' == get_class($this->pod) || 'Pod' == get_class($this->pod))) { $this->row = $this->pod->fetch(); } else { $this->row = false; if (!empty($this->data)) { if (empty($this->data_keys) || count($this->data) != count($this->data_keys)) { $this->data_keys = array_keys($this->data); } if (count($this->data) == $this->total && isset($this->data_keys[$counter]) && isset($this->data[$this->data_keys[$counter]])) { $this->row = $this->data[$this->data_keys[$counter]]; $counter++; } } if (false === $this->row && 0 < (int) $this->id && !empty($this->sql['table'])) { $this->pods_data->select(array('table' => $this->sql['table'], 'where' => '`' . $this->sql['field_id'] . '` = ' . (int) $this->id, 'limit' => 1)); $this->row = $this->pods_data->fetch(); } } return $this->row; }
/** * Find items of a pod, much like WP_Query, but with advanced table handling. * * @param array $params An associative array of parameters * @param int $limit (optional) (deprecated) Limit the number of items to find, use -1 to return all items with no limit * @param string $where (optional) (deprecated) SQL WHERE declaration to use * @param string $sql (optional) (deprecated) For advanced use, a custom SQL query to run * * @return \Pods The pod object * @since 2.0 * @link http://pods.io/docs/find/ */ public function find($params = null, $limit = 15, $where = null, $sql = null) { $tableless_field_types = PodsForm::tableless_field_types(); $simple_tableless_objects = PodsForm::field_method('pick', 'simple_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 = $this->do_hook('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; }