コード例 #1
0
ファイル: Koken.php プロジェクト: Atomox/benhelmerphotography
 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);
 }