| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 | 
							
- /**
 
-  *  API documentation for the Media module.
 
-  */
 
- The Media module provides a robust API for developers to extend functionality
 
- in useful and novel ways.
 
- CAUTION: This is pretty old!
 
- Architecture
 
- ------------
 
- To understand the API, it is first important to understand the underlying
 
- architecture and the decisions behind its current implementation.
 
- Stream Wrappers
 
- ---------------
 
- First, the Media module makes heavy use of the core Stream Wrappers now
 
- provided with Drupal 7. Streams are classes that encapsulate PHP file
 
- functions, allowing an automatic override when calling the basic function.
 
- For instance, a wrapper implementing an Amazon S3 Stream might override the
 
- file_get_contents() using ->stream_open(), or a Flickr Stream Wrapper might
 
- implement its own ->getExternalUrl to return the HTML URI for a specific
 
- Flickr image.
 
- See http://api.drupal.org/file/includes/stream_wrappers.inc/7 for more
 
- information about Stream Wrappers in Drupal.
 
- Schemes
 
- -------
 
- All Stream Wrappers will be registered to handle a specific scheme, which is
 
- the part of a URI before ://, such as core Drupal's public:// and private://
 
- schemes. (Technically, a scheme only requires :, but a bug in PHP 5.2
 
- requires ://, so Drupal currently keeps the same requirement.)
 
- The target after the scheme:// will be a unique identifier that the
 
- implementing Stream Wrapper will use to determine the file resource being
 
- accessed. For instance, public://my-document.txt might refer to a local file
 
- stored in the server at /sites/example.com/files/my-document.txt, while a URI
 
- of youtube://fe3fg8u34i might be the video stored at
 
- http://youtube.com/v/fe3fg8u34i, and flickr://photoset/224 might use a lookup
 
- table to determine this is a photoset accessed at
 
- http://flickr.com/user/markam/photoset/325hsd89.
 
- All files in Drupal are stored in the database with this unique URI, in
 
- addition to its unique serial FID. In general, file objects are accessed
 
- and loaded by the URI, which will automatically use the correct stream wrapper
 
- implementation for its scheme.
 
- File Field Widget
 
- -----------------
 
- The Media module extends the core File field to make use of its browser for
 
- editors, which is in turn exposed for other modules to extend. It does this
 
- by create a new widget definition, defining a File (media) 'generic' file
 
- widget, and suppressing the original File widget definition to avoid
 
- confusion. All existing file fields will be converted to this new widget on
 
- installation of the module, and if uninstalled, any defined media_generic file
 
- fields will be reverted to their original definition to avoid loss of data.
 
- Media Formatters
 
- ----------------
 
- By default, the File (media) widget will use the original display behavior,
 
- which is to display a generic icon followed by a link to the file. However, in
 
- many (if not most) cases, a site administrator will want to display media in
 
- very specific ways. For instance, they might want an image uploaded to be
 
- displayed as a cropped thumbnail, as with any Flickr images attached to that
 
- field, while a YouTube video might be displayed as a thumbnail that pops up
 
- in a Shadowbox, and finally a PDF might be displayed in an iFrame. And that's
 
- only when it's displayed in a node teaser...
 
- To manage the various display formatting needs of an editor, the Media module
 
- offers a Media Style API for other modules to implement and extend. Media
 
- Styles of various mimetypes are grouped together and made available as new
 
- formatters for field display, whether for a node, a comment, in a view, or
 
- elsewhere.
 
- To implement a new Media Style, a module needs to register itself for a
 
- specific mimetype, with the following hook. Note that Media styles will be
 
- properly namespaced by the module, to avoid conflicts.
 
- function hook_media_styles($mimetype = NULL) {
 
-   switch ($mimetype) {
 
-     case 'video/x-youtube':
 
-       return array(
 
-         'youtube_video' => t('YouTube Video'),
 
-         'youtube_thumbnail' => t('YouTube Thumbnail'),
 
-         'youtube_shadowbox' => t('YouTube Shadowbox'),
 
-         'youtube_link' => t('Youtube (link to original)'),
 
-     case 'image/x-flickr':
 
-       $styles = array(
 
-         'flickr__original' => t('Flickr (Original size)'),
 
-       );
 
-       foreach (image_styles() as $style_name => $style) {
 
-         $styles[$style_name] = t('Flickr (@style)', array('@style' => $style->name));
 
-       }
 
-       return $styles;
 
-   }
 
- }
 
- These styles will be available from the Media Styles configuration page, where
 
- multiple formatters can be grouped together to create new formatter Style
 
- bundles, available and intelligently applied to files of the appropriate
 
- mimetypes.
 
- For instance, a new Media Style might be created, named 'Small image', which
 
- will bundle an Image style for the various image mimetypes, another for Flickr
 
- images, a shadowbox for YouTube thumbnails, and a fallback to a size styled
 
- File icon. Then this style would be made available as a display formatter, and
 
- the Media module will apply the correct style for the mimetype of the
 
- particular instance.
 
- A module may also define default Media styles to be made available, by
 
- implementing hook_media_default_style_bundles(). Unlike the individual Media Styles,
 
- Media Style bundles are not namespaced by module. If two or more modules use
 
- the same Style bundle names, the behavior is undefined. Also note that the
 
- administrator may override a specific Style bundle, for instance by replacing
 
- the Style for a specific mimetype.
 
- function hook_media_default_style_bundles() {
 
-   return array(
 
-     'shadowbox_images' => array(
 
-       'label' => t('Shadowbox images'),
 
-       'mimetypes' => array(
 
-         'image/*' => 'mymodule_image_shadowbox',
 
-         'video/*' => 'mymodule_video_shadowbox',
 
-         '*' => 'mymodule_default_shadowbox',
 
-       ),
 
-     ),
 
-   );
 
- }
 
- @TODO
 
- convert existing file fields to media_generic on hook_install
 
- convert existing media_generic to file fields on hook_uninstall
 
- allow theme_file_icon file directory override in widget display settings
 
-   (Requires http://drupal.org/node/650732)
 
- create new default file icons and set its folder as the new default
 
- maybe instead/in addition have fallbacks if icon not present?
 
- rename image style square_thumbnail to use the media_ namespace
 
- review Media Styles for feasibility, usability, and architecture
 
- create Media Styles UI .inc file
 
- look at hook_field_info_alter to see if we can affect file widget that way
 
- CLEAN CRUFT (lots of functions that no longer apply or need to be rethought)
 
- why do we want to override the file field widget again?
 
- should we also move 'media_styles' to its own module, perhaps file_styles?
 
- in media_field_formatter_info(),
 
-   should 'field types' => array('media_generic', 'file'), be only one or other?
 
 
  |