/**
  * Filter the Movie Metadata submitted when saving a post to
  * avoid storing unexpected data to the database.
  * 
  * The Metabox array makes a distinction between pure metadata
  * and crew data, so we filter them separately. If the data slug
  * is valid, the value is escaped and added to the return array.
  * 
  * @since    1.0
  * 
  * @param    array    $data The Movie Metadata to filter
  * 
  * @return   array    The filtered Metadata
  */
 private static function validate_meta($data)
 {
     if (!is_array($data) || empty($data) || !isset($data['tmdb_id'])) {
         return $data;
     }
     $data = wpmoly_filter_empty_array($data);
     $data = wpmoly_filter_undimension_array($data);
     $supported = WPMOLY_Settings::get_supported_movie_meta();
     $keys = array_keys($supported);
     $movie_tmdb_id = esc_attr($data['tmdb_id']);
     $movie_post_id = isset($data['post_id']) && '' != $data['post_id'] ? esc_attr($data['post_id']) : null;
     $movie_poster = isset($data['poster']) && '' != $data['poster'] ? esc_attr($data['poster']) : null;
     $movie_meta = array();
     foreach ($data as $slug => $_meta) {
         if (in_array($slug, $keys)) {
             $filter = isset($supported[$slug]['filter']) && function_exists($supported[$slug]['filter']) ? $supported[$slug]['filter'] : 'esc_html';
             $args = isset($supported[$slug]['filter_args']) && !is_null($supported[$slug]['filter_args']) ? $supported[$slug]['filter_args'] : null;
             $movie_meta[$slug] = call_user_func($filter, $_meta, $args);
         }
     }
     $_data = array_merge(array('tmdb_id' => $movie_tmdb_id, 'post_id' => $movie_post_id, 'poster' => $movie_poster), $movie_meta);
     return $_data;
 }
 /**
  * Render Allocine styled Headbox 'Details' Tab.
  *
  * @since    2.1.4
  * 
  * @return   string    Headbox Tab HTML content
  */
 private function render_details_tab()
 {
     $id = get_the_ID();
     $overview = self::get_movie_meta($id, 'overview');
     $tagline = self::get_movie_meta($id, 'tagline');
     $details = wpmoly_get_movie_details();
     $default_fields = WPMOLY_Settings::get_supported_movie_details();
     foreach ($details as $slug => $detail) {
         if (!is_array($detail)) {
             $detail = array($detail);
         }
         if (isset($default_fields[$slug]['panel']) && 'custom' == $default_fields[$slug]['panel']) {
             unset($details[$slug]);
         } else {
             foreach ($detail as $i => $d) {
                 if (!empty($d)) {
                     if (isset($default_fields[$slug]['options'])) {
                         $value = $default_fields[$slug]['options'][$d];
                     } else {
                         $value = $d;
                     }
                     if ('rating' == $slug) {
                         $d = apply_filters("wpmoly_movie_meta_link", array('key' => 'rating', 'value' => array_search($value, $default_fields[$slug]['options']), 'type' => 'detail', 'text' => $value));
                     } else {
                         $d = apply_filters("wpmoly_movie_meta_link", array('key' => $slug, 'value' => $value, 'meta' => 'detail', 'text' => $value));
                     }
                     $detail[$i] = apply_filters("wpmoly_format_movie_field", $d);
                 }
             }
             $detail = implode(', ', $detail);
             if (empty($detail)) {
                 $detail = apply_filters("wpmoly_format_movie_field", '');
             }
             $title = '';
             if (isset($default_fields[$slug])) {
                 $title = __($default_fields[$slug]['title'], 'wpmovielibrary');
             }
             $details[$slug] = array('slug' => $slug, 'title' => $title, 'value' => $detail);
         }
     }
     $metas = wpmoly_get_movie_meta();
     $metas = wpmoly_filter_undimension_array($metas);
     $default_fields = WPMOLY_Settings::get_supported_movie_meta();
     if (!empty($metas)) {
         unset($metas['title'], $metas['cast'], $metas['overview'], $metas['tagline']);
         foreach ($metas as $slug => $field) {
             if (isset($default_fields[$slug])) {
                 // Custom filter if available
                 if (has_filter("wpmoly_format_movie_{$slug}")) {
                     $field = apply_filters("wpmoly_format_movie_{$slug}", $field);
                 }
                 // Filter empty field
                 $field = apply_filters("wpmoly_format_movie_field", $field);
                 $metas[$slug] = array('slug' => $slug, 'title' => __($default_fields[$slug]['title'], 'wpmovielibrary'), 'value' => $field);
             } else {
                 unset($metas[$slug]);
             }
         }
     }
     $attributes = compact('id', 'overview', 'tagline', 'details', 'metas');
     $content = self::render_template('movies/headbox-allocine/tabs/details.php', $attributes, $require = 'always');
     return $content;
 }
 /**
  * Generate current movie's metadata list.
  *
  * @since    1.0
  *
  * @return   null|string    The current movie's metadata list
  */
 public static function movie_metadata()
 {
     if ('nowhere' == wpmoly_o('show-meta') || 'posts_only' == wpmoly_o('show-meta') && !is_singular()) {
         return null;
     }
     $metadata = wpmoly_get_movie_meta();
     $metadata = wpmoly_filter_undimension_array($metadata);
     $fields = wpmoly_o('sort-meta');
     $default_fields = WPMOLY_Settings::get_supported_movie_meta();
     if ('' == $metadata || empty($fields) || !isset($fields['used'])) {
         return null;
     }
     $fields = $fields['used'];
     if (isset($fields['placebo'])) {
         unset($fields['placebo']);
     }
     $items = array();
     foreach ($fields as $slug => $field) {
         $_field = $metadata[$slug];
         // Custom filter if available
         if (has_filter("wpmoly_format_movie_{$slug}")) {
             $_field = apply_filters("wpmoly_format_movie_{$slug}", $_field);
         }
         // Filter empty field
         $_field = apply_filters("wpmoly_format_movie_field", $_field);
         $fields[$slug] = $_field;
         $items[] = array('slug' => $slug, 'title' => __($default_fields[$slug]['title'], 'wpmovielibrary'), 'value' => $_field);
     }
     $html = WPMovieLibrary::render_template('movies/movie-metadata.php', array('items' => $items), $require = 'always');
     return $html;
 }
 /**
  * Modern headbox meta tab content callback.
  * 
  * @since    2.0
  * 
  * @return   string    Tab content HTML markup
  */
 public function get_wpmoly_headbox_meta_tab()
 {
     // TODO: better filtering/formatting
     $metadata = wpmoly_get_movie_meta();
     $metadata = wpmoly_filter_undimension_array($metadata);
     $fields = wpmoly_o('sort-meta');
     $default_fields = WPMOLY_Settings::get_supported_movie_meta();
     if ('' == $metadata || empty($fields) || !isset($fields['used'])) {
         return null;
     }
     $fields = $fields['used'];
     if (isset($fields['placebo'])) {
         unset($fields['placebo']);
     }
     unset($fields['cast'], $fields['overview'], $fields['genres']);
     $items = array();
     foreach ($fields as $slug => $field) {
         $_field = $metadata[$slug];
         // Custom filter if available
         if (has_filter("wpmoly_format_movie_{$slug}")) {
             $_field = apply_filters("wpmoly_format_movie_{$slug}", $_field);
         }
         // Filter empty field
         $_field = apply_filters("wpmoly_format_movie_field", $_field);
         $fields[$slug] = $_field;
         $items[] = array('slug' => $slug, 'title' => __($default_fields[$slug]['title'], 'wpmovielibrary'), 'value' => $_field);
     }
     $attributes = array('meta' => $items);
     $content = WPMovieLibrary::render_template('movies/headbox/tabs/meta.php', $attributes, $require = 'always');
     return $content;
 }
 /**
  * Prepare movies for Movies and Movie shortcodes.
  *
  * @since    1.1
  * 
  * @param    object    WP_Query object
  * @param    acrray    Shortcode attributes
  * 
  * @return   array    Usable data for Shortcodes
  */
 private static function prepare_movies($query, $atts)
 {
     if (!$query->have_posts()) {
         return array();
     }
     extract($atts);
     $movies = array();
     $default_fields = WPMOLY_Settings::get_supported_movie_meta();
     while ($query->have_posts()) {
         $query->the_post();
         $movies[$query->current_post] = array('id' => get_the_ID(), 'title' => get_the_title(), 'url' => get_permalink(), 'poster' => null, 'meta' => null, 'details' => null);
         if (!is_null($poster) && has_post_thumbnail(get_the_ID())) {
             $movies[$query->current_post]['poster'] = get_the_post_thumbnail(get_the_ID(), $poster);
         }
         /* 
          * Meta are passed to the template as an array of values and titles
          * This gives more freedom to adapt the template
          */
         if (!is_null($meta)) {
             if (!is_array($meta)) {
                 $meta = array($meta);
             }
             $_meta = wpmoly_get_movie_meta(get_the_ID(), 'data');
             $_meta = wpmoly_filter_undimension_array($_meta);
             $metadata = array();
             foreach ($_meta as $slug => $m) {
                 if (in_array($slug, $meta)) {
                     $title = __($default_fields[$slug]['title'], 'wpmovielibrary');
                     $value = $_meta[$slug];
                     if (has_filter("wpmoly_format_movie_{$slug}")) {
                         $value = apply_filters("wpmoly_format_movie_{$slug}", $value);
                     }
                     $value = apply_filters('wpmoly_format_movie_field', $value);
                     $metadata[array_search($slug, $meta)] = array('title' => $title, 'value' => $value);
                 }
             }
             ksort($metadata);
             $movies[$query->current_post]['meta'] = $metadata;
         }
         /* 
          * Details are passed to the template as a string
          * This is simpler because formatting is already
          * done via filters
          */
         if (!is_null($details)) {
             $movies[$query->current_post]['details'] = '';
             if (!is_array($details)) {
                 $details = array($details);
             }
             foreach ($details as $detail) {
                 $value = call_user_func("wpmoly_get_movie_{$detail}", get_the_ID());
                 $movies[$query->current_post]['details'] .= apply_filters("wpmoly_format_movie_{$detail}", $value);
             }
         }
     }
     wp_reset_postdata();
     return $movies;
 }
/**
 * Filter an array to remove any sub-array, reducing multidimensionnal
 * arrays.
 * 
 * @since    1.0
 * 
 * @param    array    $array Array to check
 * 
 * @return   array    Reduced array
 */
function wpmoly_filter_undimension_array($array)
{
    if (!is_array($array) || empty($array)) {
        return $array;
    }
    $_array = array();
    foreach ($array as $key => $row) {
        if (is_array($row)) {
            $_array = array_merge($_array, wpmoly_filter_undimension_array($row));
        } else {
            $_array[$key] = $row;
        }
    }
    return $_array;
}