'', '#suffix' => '', ); // Wrap $embed_markup with prefix and suffix (e.g. to add accessible controls) $embed_markup = $data['othervars']['#prefix'] . $embed_markup . $data['othervars']['#suffix']; // Return completed markup return '
' . $embed_markup . '
'; } /** * Themes multiple value CCK content in to a playlist. * * @param array $element * The element to render. * @param array $profile * (optional) Array of profile data for the profile that is being used. * * @return string * Markup to produce the flash content, or nothing if the element was empty. * * @ingroup themeable */ function theme_swftools_formatter_playlist($element, $profile = array()) { // Initialise an array for results $files = array(); // Get the children $children = element_children($element); // If there is only one child then maybe we don't want a playlist if (count($children) == 1) { // Pop the first value of the children array $_children = $children; $child = array_pop($_children); // Get the name of the alternate formatter for this content type $formatter_name = variable_get('swftools_' . $element['#type_name'] . '_' . $element['#field_name'], 'swftools_playlist'); // What happens next depends on the formatter name switch ($formatter_name) { case 'hidden': // If the format is set to hidden then return nothing if ($formatter_name == 'hidden') { return; } case 'swftools_playlist': // If swftools_playlist don't do anything different break; default: // Find out what the alternate formatter should be if ($formatter = _content_get_formatter($formatter_name, 'filefield')) { // We can work out the theme name from the formatter information $theme = $formatter['module'] .'_formatter_'. $formatter_name; // Construct a modified element that mimics a single element $element['#formatter'] = $formatter_name; $element['#theme'] = $theme; $element += $element[$child]; $element['#item']['#delta'] = 0; unset($element[$child]); // Theme this new element according to the alternate formatter return theme($theme, $element); } } } // Retrieve images $images = theme_swftools_formatter_thumbnail('', TRUE); // Cycle through the file elements foreach ($children as $key) { // Is this a filefield? if (isset($element[$key]['#item']['filepath'])) { $files[$key] = array( 'filepath' => $element[$key]['#item']['filepath'], 'title' => $element[$key]['#item']['data']['description'], ); } // Is this a link field? if (isset($element[$key]['#item']['url'])) { $files[$key] = array( 'filepath' => $element[$key]['#item']['url'], 'title' => $element[$key]['#item']['title'], ); } // Is this a text field? // TODO: How to handle streams in a playlist if (isset($element[$key]['#item']['value'])) { $files[$key] = array( 'filepath' => $element[$key]['#item']['value'], 'title' => '', ); } // Is there an image? if (isset($images[$key]) && $images[$key]) { // Get the path to the image $source = swftools_get_url_and_path($images[$key]); // If $source returned a result then use it if ($source) { $files[$key]['image'] = $source['fileurl']; } } } // If files array is empty then there is nothing to be rendered if (empty($files)) { return; } // Pass element to the swf tools processor by attaching it in othervars $data['othervars']['cck'] = $element; // Assign the profile $data['othervars']['profile'] = $profile ? $profile['profile'] : ''; // But if we got something then we can call swf() now to render it return swf($files, $data); } /** * Theme function to store and retrieve thumbnail images. * * If called as a regular theme function it stores the path of the image, * but if the retrieve flag is set it returns that path. * * In effect this function is a local store to hold the most recently "seen" * image on behalf of the swf themer. In order for this code to work the * thumbnail theme function must come before the swf theme function, so it * is necessary to order the fields appropriately on the content configuration * page. * * When caching thumbnails then if the element delta is zero the cache is * flushed first to start a new collection of images. * * @param array $element * The CCK element to store. * @param bool $retrieve * When TRUE will return the currently stored path. * @param int $delta * If set then attempt to retrieve just the image at the specified delta, otherwise return * the whole array of stored thumbnails. * * @return mixed * A string, or an array, holding the thumbnail filepaths. * * @ingroup themeable */ function theme_swftools_formatter_thumbnail($element, $retrieve = FALSE, $delta = NULL) { // Create a static variable to hold the image path static $image_path = array(); // It retrieving a previous thumbnail then return its path and reset the stored value // We may want to retrieve all cached thumbnails ($delta = NULL), or a specific thumbnail // in which case $delta is the one we want if ($retrieve) { if ($delta !== NULL) { if (isset($image_path[$delta])) { return $image_path[$delta]; } else { return ''; } } else { return $image_path ? $image_path : ''; } } // If the delta is zero we are starting a new collection so reset in case // a retrieval call wasn't made by the theme function if ($element['#item']['#delta'] == 0) { $image_path = array(); } // If the element is empty set the stored path to an empty string if (empty($element['#item']['fid']) && empty($element['#item']['value']) && empty($element['#item']['url'])) { $image_path[] = ''; return; } // Initialise an empty string $image_url = ''; // See if we're processing a filefield and get the appropriate value if (isset($element['#item']['filepath'])) { $image_url = $element['#item']['filepath']; } // See if we're processing a link field and get the appropriate value elseif (isset($element['#item']['url'])) { $image_url = $element['#item']['url']; // add the query to the base url, if necessary if (isset($element['#item']['query']) && strlen($element['#item']['query']) > 0) { $image_url .= '?' . ($element['#item']['query']); } // add the fragment to the url, if necessary if (isset($element['#item']['fragment']) && strlen($element['#item']['fragment']) > 0) { $image_url .= '#' . ($element['#item']['fragment']); } } // We're processing a text field so get the appropriate value else { $image_url = $element['#item']['value']; // Check this is a valid url $image_url = check_url($image_path); } // Store the result $image_path[] = $image_url; // Return nothing at this point return; } /** * Themes a CCK element in to flash content. * * @param array $element * The CCK element to render. * * @return string * A string of markup to produce the flash content, or nothing if the element was empty. * * @ingroup themeable */ function theme_swftools_formatter_swftools($element, $profile = array()) { // If the element is empty return if (empty($element['#item']['fid']) && empty($element['#item']['value']) && empty($element['#item']['url'])) { return ''; } // See if a thumbnail image has been stored with this content $image = theme_swftools_formatter_thumbnail('', TRUE, $element['#item']['#delta']); // If an image was stored then set the thumbnail if ($image) { $data['othervars']['image'] = $image; } else { $data = array(); } // Assign the profile $data['othervars']['profile'] = $profile ? $profile['profile'] : ''; // See if we're processing a filefield and get the path and description if (isset($element['#item']['filepath'])) { $swf = $element['#item']['filepath']; $data['othervars']['title'] = $element['#item']['data']['description']; $source = 'filefield'; } // See if we're processing a link field and get the path and title elseif (isset($element['#item']['url'])) { $swf = $element['#item']['url']; $data['othervars']['title'] = $element['#item']['title']; $source = 'link'; // add the query to the base url, if necessary if (isset($element['#item']['query']) && strlen($element['#item']['query']) > 0) { $swf .= '?' . ($element['#item']['query']); } // add the fragment to the url, if necessary if (isset($element['#item']['fragment']) && strlen($element['#item']['fragment']) > 0) { $swf .= '#' . ($element['#item']['fragment']); } } // We're processing a text field so get the path else { $swf = $element['#item']['value']; $data['othervars']['title'] = ''; $source = 'text'; // We need to run $swf through check_url to make sure it is safe, but rtmp isn't in the allowed protocols // This is configurable (see filter.module line 1182) but not sure if the variable is exposed // $swf = check_url($swf); // See if we have been given a stream by trying to explode the string $stream = explode(' ', $swf); // If the explode return 2 elements assume we have a stream, element[0] contains the source, element[1] the file if (count($stream) == 2) { $data['othervars']['stream'] = $stream[0]; $swf = $stream[1]; } } // Pass element to the swf tools processor by attaching it in othervars $data['othervars']['cck'] = $element; // Get the markup for the flash content from swf() $return = swf($swf, $data); // Add the download link if required (we are either using swftools formatter, or a profile with this option enabled) if ($element['#formatter'] == 'swftools' || !empty($profile['download_link'])) { switch ($source) { case 'filefield': $return .= "\n" . theme('filefield_formatter_default', $element); break; case 'link': $return .= "\n" . theme('link_formatter_default', $element); break; } } // Return the resulting markup return $return; } /** * Returns a path to a default image. * * This is generally called by playlist functions that are rendering images as * part of the playlist. In some instances it is necessary to use a placeholder * image when none is given in order for the playlist to render correctly. * * By over-riding this theme function alternate images can be used. The data * array is provided so if this theme function is over-ridden custom * alternatives can be used depending on the context. By default SWF Tools * returns a single pixel gif. * * @param array $data * The SWF Tools data array. * * @return string * Path to the default image. * * @ingroup themeable */ function theme_swftools_empty_image($data) { return base_path() . drupal_get_path('module', 'swftools') . '/includes/empty.gif'; } /** * @} End of "addtogroup swftools" */