public static function load($params) { $defaults = array('model' => 'content', 'list' => false, 'filters' => array(), 'id_from_url' => false, 'paginate_from_url' => false, 'api' => array(), 'load_content' => false, 'id' => false, 'id_prefix' => '', 'tree' => false, 'type' => false, 'source' => false, 'archive' => false); $featured = false; $params['filters'] = array(); foreach ($params as $key => $val) { if (strpos($key, 'filter:') === 0) { $left = str_replace('filter:', '', $key); if (strpos($left, ':not') === false) { $right = ''; } else { $right = '!'; $left = str_replace(':not', '', $left); } $params['filters'][] = $left . '=' . $right . $val; } else { if (!isset($defaults[$key])) { $defaults['api'][$key] = $val; } } } $custom = false; if (isset($params['source'])) { $params['source'] = self::parse_source_aliases($params['source']); $source = array('type' => $params['source']); $defaults['list'] = substr(strrev($params['source']), 0, 1) === 's'; $defaults['model'] = rtrim($params['source'], 's') . 's'; $defaults['filters'] = isset($params['filters']) ? $params['filters'] : array(); $custom = true; if (isset($params['tree'])) { $defaults['tree'] = true; } } else { if (Koken::$source) { Koken::$source['type'] = self::parse_source_aliases(Koken::$source['type']); $source = Koken::$source; $defaults['list'] = substr(strrev(Koken::$source['type']), 0, 1) === 's'; $defaults['model'] = rtrim(Koken::$source['type'], 's') . 's'; $defaults['filters'] = is_array(Koken::$source['filters']) ? Koken::$source['filters'] : array(); } } if ($defaults['model'] === 'events' && $defaults['list']) { $defaults['api']['load_items'] = 1; } if ($defaults['model'] === 'sets' && $defaults['list']) { $defaults['model'] = 'albums'; $defaults['api']['types'] = 'set'; } if (strpos($defaults['model'], 'featured_') === 0) { $bits = explode('_', $defaults['model']); $defaults['model'] = 'features'; $defaults['id'] = rtrim($bits[1], 's'); if ($defaults['id'] === 'essay') { $defaults['id'] = 'text'; } else { if ($defaults['id'] === 'album') { $defaults['api']['include_empty'] = 0; } } $defaults['list'] = true; } if ($defaults['model'] === 'contents') { $defaults['model'] = 'content'; } else { if ($defaults['model'] === 'essays' || $defaults['model'] === 'pages') { $defaults['api']['type'] = trim($defaults['model'], 's'); $defaults['model'] = 'text'; } else { if ($defaults['model'] === 'categorys') { $defaults['model'] = 'categories'; } else { if ($defaults['model'] === 'sets') { $defaults['model'] = 'albums'; } } } } if (is_array($defaults['filters'])) { $customs = array(); $defaults['filters'] = array_filter($defaults['filters'], function ($filter) use(&$customs) { if (isset(Shutter::$custom_sources[$filter])) { $customs = array_merge($customs, Shutter::$custom_sources[$filter]['filters']); return false; } return true; }); $defaults['filters'] = array_merge($defaults['filters'], $customs); foreach ($defaults['filters'] as $filter) { if (strpos($filter, '=') !== false) { $bits = explode('=', $filter); if ($bits[0] === 'id' && $bits[1][0] !== '!') { $__id = substr($bits[1], 0, 1) === '"' ? $bits[1] : urlencode($bits[1]); } else { if ($bits[0] === 'members') { $params['type'] = $bits[1]; } else { if (strpos($bits[1], '!') === 0 || strpos($bits[0], '!') !== false) { $bits[1] = str_replace('!', '', $bits[1]); $bits[0] = str_replace('!', '', $bits[0]) . '_not'; } if (strpos($bits[0], 'category') === 0 && (!is_numeric($bits[1]) && strpos($bits[1], '" . Koken') !== 0)) { $bits[1] = Koken::$categories[strtolower($bits[1])]; } $defaults['api'][$bits[0]] = $bits[1]; } } } else { if (substr($filter, 0, 1) === '!') { $filter = str_replace('!', '', $filter); $val = 0; } else { $val = 1; } if ($filter === 'featured' && $val === 1) { $featured = true; } else { $defaults['api'][$filter] = $val; } } } } if ($source['type'] === 'tags' && isset($__id)) { $defaults['id'] = $__id; } else { if ($source['type'] === 'event' && isset(Koken::$routed_variables['year'])) { $__id = join('-', array(Koken::$routed_variables['year'], Koken::$routed_variables['month'], Koken::$routed_variables['day'])); } else { if ($source['type'] === 'tag' && isset($defaults['api']['tag'])) { $__id = $defaults['api']['tag']; unset($defaults['api']['tag']); } } } if ($source['type'] === 'events' && !$custom) { if (isset(Koken::$routed_variables['month'])) { $defaults['api']['month'] = Koken::$routed_variables['month']; } else { if (isset($defaults['api']['month'])) { Koken::$routed_variables['month'] = $defaults['api']['month']; } } if (isset(Koken::$routed_variables['year'])) { $defaults['api']['year'] = Koken::$routed_variables['year']; } else { if (isset($defaults['api']['year'])) { Koken::$routed_variables['year'] = $defaults['api']['year']; } } if (isset(Koken::$routed_variables['day'])) { $defaults['api']['day'] = Koken::$routed_variables['day']; } else { if (isset($defaults['api']['day'])) { Koken::$routed_variables['day'] = $defaults['api']['day']; } } } if ($source['type'] === 'archive' && !$custom) { if ($params['type'] === 'essays') { $defaults['api']['type'] = 'essay'; $defaults['model'] = 'text'; } else { $defaults['model'] = $params['type'] === 'contents' ? 'content' : $params['type']; } $defaults['list'] = true; if (isset(Koken::$routed_variables['month'])) { $defaults['api']['month'] = Koken::$routed_variables['month']; } else { if (isset($defaults['api']['month'])) { Koken::$routed_variables['month'] = $defaults['api']['month']; } } if (isset(Koken::$routed_variables['year'])) { $defaults['api']['year'] = Koken::$routed_variables['year']; } else { if (isset($defaults['api']['year'])) { Koken::$routed_variables['year'] = $defaults['api']['year']; } } if (isset(Koken::$routed_variables['day'])) { $defaults['api']['day'] = Koken::$routed_variables['day']; } else { if (isset($defaults['api']['day'])) { Koken::$routed_variables['day'] = $defaults['api']['day']; } } $defaults['archive'] = 'date'; } if (!$defaults['list']) { if ($source['type'] === 'tag' && !$custom && isset($params['type'])) { if ($params['type'] === 'essays') { $defaults['api']['type'] = 'essay'; $defaults['model'] = 'text'; $defaults['api'] = array_merge(array('order_by' => 'published_on', 'state' => 'published'), $defaults['api']); } else { $defaults['model'] = $params['type'] === 'contents' ? 'content' : $params['type']; } $defaults['list'] = true; $defaults['id_prefix'] = 'tags:'; $defaults['paginate_from_url'] = true; $defaults['archive'] = 'tag'; } if (isset($__id)) { $defaults['id'] = $__id; if (!$custom) { Koken::$routed_variables['id'] = $__id; } if ($source['type'] === 'tag') { $defaults['id_prefix'] = 'slug:'; } } else { $defaults['id_from_url'] = true; } if (in_array($defaults['model'], array('albums', 'events', 'tags', 'categories'))) { $defaults['list'] = true; $defaults['paginate_from_url'] = true; } } if ($defaults['list']) { if ($defaults['model'] === 'albums' || $defaults['model'] === 'categories') { $defaults['api'] = array_merge(array('include_empty' => '0'), $defaults['api']); } else { if ($defaults['model'] === 'text') { $defaults['api'] = array_merge(array('order_by' => 'published_on', 'state' => 'published'), $defaults['api']); } } $defaults['paginate_from_url'] = true; } $options = $defaults; $paginate = $options['paginate_from_url'] && $options['list'] && !$custom; $url = '/' . $options['model'] . ($featured ? '/featured' : ''); if ($options['tree'] && $options['model'] === 'albums') { $url .= '/tree'; } if ($options['model'] === 'text' && isset($_GET['preview_draft'])) { $options['id'] = $_GET['preview_draft']; $options['id_from_url'] = false; } if ($options['list'] && isset($__id) && !$options['id']) { $url .= '/' . urldecode($__id); if (strpos(urldecode($__id), ',') === false) { $options['list'] = false; } } if ($options['id_from_url'] || $options['id']) { if (!isset($defaults['api']['custom'])) { if ($options['id_from_url']) { if (empty($options['id_prefix'])) { $slug_prefix = 'slug:'; } else { $slug_prefix = ''; } if (($options['id_prefix'] === 'tags:' || $options['model'] === 'tags') && preg_match('/tag\\-\\d+/', self::$routed_variables['slug'])) { self::$routed_variables['slug'] = str_replace('tag-', '', self::$routed_variables['slug']); } $url .= "/{$options['id_prefix']}" . (isset(self::$routed_variables['id']) ? urlencode(self::$routed_variables['id']) : $slug_prefix . urlencode(self::$routed_variables['slug'])); } else { if ($options['id']) { $url .= "/{$options['id_prefix']}" . urlencode($options['id']); } } if (!isset($defaults['api']['context'])) { if ($options['model'] === 'content') { $url .= self::context_parameters(); } else { if ($options['model'] === 'text') { $url .= self::context_parameters('essay'); } else { if ($options['model'] === 'albums' && $options['list']) { $url .= '/content' . Koken::context_parameters('album'); } } } } } } if (isset($params['type']) && $options['model'] === 'categories') { $url .= '/' . ($params['type'] === 'contents' ? 'content' : $params['type']); $options['list'] = true; $paginate = !$custom; $options['archive'] = 'category'; if ($params['type'] === 'essays') { $options['api'] = array_merge(array('order_by' => 'published_on', 'state' => 'published'), $defaults['api']); } } if (in_array($options['model'], array('content', 'text', 'albums'))) { if (!isset($options['api']['neighbors'])) { $options['api']['neighbors'] = 2; } $max_n = 2; foreach (self::$max_neighbors as $max) { if (!is_numeric($max)) { preg_match('/settings\\.([a-z_]+)/', $max, $match); if ($match) { $max = self::$settings[$match[1]]; } } $max_n = max($max_n, $max); } $options['api']['neighbors'] = max($options['api']['neighbors'], $max_n); } if (!$custom) { $overrides = Koken::$location['parameters']['__overrides']; if (isset($overrides['order_by']) && strpos($overrides['order_by'], '_on') !== false && !isset($overrides['order_direction'])) { $overrides['order_direction'] = 'desc'; } $options['api'] = array_merge($options['api'], $overrides); } foreach ($options['api'] as $key => $value) { if (!is_numeric($value) && $value == 'true') { $value = 1; } else { if (!is_numeric($value) && $value == 'false') { $value = 0; } else { $value = urlencode($value); } } $url .= "/{$key}:{$value}"; } $collection_name = $options['model'] === 'contents' || $options['model'] === 'albums' && ($options['id_from_url'] || $options['id']) && $options['list'] ? 'content' : $options['model']; return array($url, $options, $collection_name, $paginate); }