'',
'#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"
*/