diff --git a/! b/! new file mode 100644 index 00000000..617a052d --- /dev/null +++ b/! @@ -0,0 +1,14 @@ + + DocumentRoot /mnt/Data/bach/Sites/clameurs.org + ServerName dev.clameurs.org + ServerAdmin bachir@g-u-i.me + ErrorLog "/var/log/httpd/clameurs-error_log" + CustomLog "/var/log/httpd/clameurs-access_log" common + + Require all granted + Options -FollowSymlinks +Indexes -MultiViews + AllowOverride All + + + + diff --git a/fix-perms b/fix-perms new file mode 100755 index 00000000..afa292df --- /dev/null +++ b/fix-perms @@ -0,0 +1,4 @@ +#! /bin/bash + +sudo chown -R $USER:http sites/all/modules/features/ +sudo chmod -R g+w sites/all/modules/features/ diff --git a/sites/all/modules/contrib/admin/nodeformcols/LICENSE.txt b/sites/all/modules/contrib/admin/nodeformcols/LICENSE.txt old mode 100755 new mode 100644 diff --git a/sites/all/modules/contrib/fields/video_embed_field/LICENSE.txt b/sites/all/modules/contrib/fields/video_embed_field/LICENSE.txt new file mode 100644 index 00000000..d159169d --- /dev/null +++ b/sites/all/modules/contrib/fields/video_embed_field/LICENSE.txt @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/sites/all/modules/contrib/fields/video_embed_field/img/vimeo.jpg b/sites/all/modules/contrib/fields/video_embed_field/img/vimeo.jpg new file mode 100644 index 00000000..dd705658 Binary files /dev/null and b/sites/all/modules/contrib/fields/video_embed_field/img/vimeo.jpg differ diff --git a/sites/all/modules/contrib/fields/video_embed_field/img/youtube.jpg b/sites/all/modules/contrib/fields/video_embed_field/img/youtube.jpg new file mode 100644 index 00000000..20123904 Binary files /dev/null and b/sites/all/modules/contrib/fields/video_embed_field/img/youtube.jpg differ diff --git a/sites/all/modules/contrib/fields/video_embed_field/plugins/export_ui/video_embed_field_export_ui.inc b/sites/all/modules/contrib/fields/video_embed_field/plugins/export_ui/video_embed_field_export_ui.inc new file mode 100644 index 00000000..a43ca661 --- /dev/null +++ b/sites/all/modules/contrib/fields/video_embed_field/plugins/export_ui/video_embed_field_export_ui.inc @@ -0,0 +1,34 @@ + 'vef_video_styles', + 'access' => 'administer video styles', + // Define the menu item. + 'menu' => array( + 'menu prefix' => 'admin/config/media/vef', + 'menu item' => 'vef_video_styles', + 'menu title' => 'Video Embed Styles', + 'menu description' => 'Administer Video Embed Field\'s video styles.', + ), + // Define user interface texts. + 'title singular' => t('video style'), + 'title plural' => t('video styles'), + 'title singular proper' => t('Video Styles'), + 'title plural proper' => t('Video Styles'), + // Define the names of the functions that provide the add/edit forms. + 'form' => array( + 'settings' => 'video_embed_field_video_style_form', + // 'submit' and 'validate' are also valid callbacks. + ), + 'export' => array( + 'admin_title' => 'title', + ), +); diff --git a/sites/all/modules/contrib/fields/video_embed_field/video-embed-field-embed-code.tpl.php b/sites/all/modules/contrib/fields/video_embed_field/video-embed-field-embed-code.tpl.php new file mode 100644 index 00000000..c06ddef3 --- /dev/null +++ b/sites/all/modules/contrib/fields/video_embed_field/video-embed-field-embed-code.tpl.php @@ -0,0 +1,22 @@ + + +
+
+ +
+
diff --git a/sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/README.txt b/sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/README.txt new file mode 100644 index 00000000..2deae7f3 --- /dev/null +++ b/sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/README.txt @@ -0,0 +1,5 @@ +Brightcove Video Embed Field +---------------------------- +This module parses a Brightcove URL via the Video Embed Field + +Example URL: http://link.brightcove.com/services/player/bcpid3303744435001?bckey=AQ~~,AAAAAGL7jok~,vslbwQw3pdWM_Ya9IsUVNvJJIhV9YG1S&bctid=3118695475001 diff --git a/sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/img/brightcove.jpg b/sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/img/brightcove.jpg new file mode 100644 index 00000000..d72cdca7 Binary files /dev/null and b/sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/img/brightcove.jpg differ diff --git a/sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/video_embed_brightcove.info b/sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/video_embed_brightcove.info new file mode 100644 index 00000000..8ca93ff1 --- /dev/null +++ b/sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/video_embed_brightcove.info @@ -0,0 +1,14 @@ +name = "Video Embed Brightcove" +description = "Provides Brightcove handler for Video Embed Fields." +core = 7.x +package = Media +configure = admin/config/media/vef_video_styles + +dependencies[] = "video_embed_field" + +; Information added by Drupal.org packaging script on 2015-09-07 +version = "7.x-2.0-beta11" +core = "7.x" +project = "video_embed_field" +datestamp = "1441639440" + diff --git a/sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/video_embed_brightcove.module b/sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/video_embed_brightcove.module new file mode 100644 index 00000000..f48f6c19 --- /dev/null +++ b/sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/video_embed_brightcove.module @@ -0,0 +1,168 @@ + 'Brightcove Video', + 'function' => 'video_embed_brightcove_handle_video', + 'thumbnail_default' => drupal_get_path('module', 'video_embed_brightcove') . '/img/brightcove.jpg', + 'form' => 'video_embed_brightcove_form', + 'form_validate' => 'video_embed_field_handler_brightcove_form_validate', + 'domains' => array( + 'brightcove.com', + 'link.brightcove.com', + ), + 'defaults' => array( + 'width' => 640, + 'height' => 360, + 'class' => '', + ), + ); + + return $handlers; +} + +/** + * Form to configure out video settings. + * + * @param array $defaults + * Values for your provider. + * + * @return array + * A form as defined by form API. + */ +function video_embed_brightcove_form($defaults) { + $form = array(); + // Element for the width of the player. + $form['width'] = array( + '#type' => 'textfield', + '#title' => t('Player Width'), + '#description' => t('The width of the player.'), + '#default_value' => $defaults['width'], + ); + + // Element for the height of the player. + $form['height'] = array( + '#type' => 'textfield', + '#title' => t('Player Height'), + '#description' => t('The height of the player.'), + '#default_value' => $defaults['height'], + ); + + $form['class'] = array( + '#type' => 'textfield', + '#title' => t('Player CSS class'), + '#description' => t('CSS class to add to the player'), + '#default_value' => $defaults['class'], + ); + + return $form; +} + +/** + * Validates the form elements for the Brightcove configuration form. + */ +function video_embed_field_handler_brightcove_form_validate($element, &$form_state, $form) { + video_embed_field_validate_dimensions($element); +} + +/** + * The video handler. + * + * @param string $url + * The full video url. + * @param array $settings + * Handlers settings from the settings form. + * + * @return array|string + * The embed code for the video. + */ +function video_embed_brightcove_handle_video($url, $settings) { + $parameters = _video_embed_brightcove_get_video_properties($url); + + if (isset($parameters['id']) && isset($parameters['key'])) { + // Embed code. + $embed = ' + + + + + + + + + + '; + // Replace our placeholders with the values from the settings. + $embed = format_string($embed, array( + '!id' => $parameters['id'], + '!key' => $parameters['key'], + '@width' => $settings['width'], + '@height' => $settings['height'], + '@class' => $settings['class'], + '!videoplayer' => $parameters['player'], + )); + + $video = array( + '#markup' => $embed, + '#suffix' => '', + '#attached' => array( + 'js' => array( + '//admin.brightcove.com/js/BrightcoveExperiences.js' => array( + 'type' => 'external', + ), + ), + ), + ); + + return $video; + } + return ''; +} + +/** + * Helper function to take a brightcove video url and return its id. + * + * @param string $url + * The full brightcove video url. + * + * @return array + * The video properties. + */ +function _video_embed_brightcove_get_video_properties($url) { + // Easy way to break a url into its components. + $components = array( + 'id' => array( + 'start' => 'bcpid', + 'finish' => '\?bckey', + ), + 'key' => array( + 'start' => 'bckey=', + 'finish' => '&bctid', + ), + 'player' => array( + 'start' => 'bctid=', + 'finish' => '', + ), + ); + + $matches = array(); + $return = array(); + foreach ($components as $key => $component) { + $string = "/(.*){$component['start']}(.*){$component['finish']}/"; + preg_match($string, $url, $matches); + if ($matches && !empty($matches[2])) { + $return[$key] = check_plain($matches[2]); + } + } + return $return; +} diff --git a/sites/all/modules/contrib/fields/video_embed_field/video_embed_facebook/img/facebook.jpg b/sites/all/modules/contrib/fields/video_embed_field/video_embed_facebook/img/facebook.jpg new file mode 100644 index 00000000..79a1a133 Binary files /dev/null and b/sites/all/modules/contrib/fields/video_embed_field/video_embed_facebook/img/facebook.jpg differ diff --git a/sites/all/modules/contrib/fields/video_embed_field/video_embed_facebook/video_embed_facebook.info b/sites/all/modules/contrib/fields/video_embed_field/video_embed_facebook/video_embed_facebook.info new file mode 100644 index 00000000..618c2d7c --- /dev/null +++ b/sites/all/modules/contrib/fields/video_embed_field/video_embed_facebook/video_embed_facebook.info @@ -0,0 +1,13 @@ +name = "Video Embed Facebook" +description = "Provides Facebook handler for Video Embed Fields. This module also serves as an example of how to add handlers to video embed field." +core = 7.x +package = Media +configure = admin/config/media/vef_video_styles + +dependencies[] = "video_embed_field" +; Information added by Drupal.org packaging script on 2015-09-07 +version = "7.x-2.0-beta11" +core = "7.x" +project = "video_embed_field" +datestamp = "1441639440" + diff --git a/sites/all/modules/contrib/fields/video_embed_field/video_embed_facebook/video_embed_facebook.module b/sites/all/modules/contrib/fields/video_embed_field/video_embed_facebook/video_embed_facebook.module new file mode 100644 index 00000000..bca02972 --- /dev/null +++ b/sites/all/modules/contrib/fields/video_embed_field/video_embed_facebook/video_embed_facebook.module @@ -0,0 +1,156 @@ + 'Facebook Video', + 'function' => 'video_embed_facebook_handle_video', + 'thumbnail_function' => 'video_embed_facebook_handle_thumbnail', + 'thumbnail_default' => drupal_get_path('module', 'video_embed_facebook') . '/img/facebook.jpg', + 'form' => 'video_embed_facebook_form', + 'form_validate' => 'video_embed_field_handler_youtube_form_validate', + 'domains' => array( + 'facebook.com', + ), + 'defaults' => array( + 'width' => 640, + 'height' => 360, + 'class' => '', + ), + ); + + return $handlers; +} + +/** + * Defines the form elements for the Facebook videos configuration form. + * + * @param array $defaults + * The form default values. + * + * @return array + * The provider settings form array. + */ +function video_embed_facebook_form($defaults) { + $form = array(); + + $form['width'] = array( + '#type' => 'textfield', + '#title' => t('Player Width'), + '#description' => t('The width of the player.'), + '#default_value' => $defaults['width'], + ); + + $form['height'] = array( + '#type' => 'textfield', + '#title' => t('Player Height'), + '#description' => t('The height of the player.'), + '#default_value' => $defaults['height'], + ); + + $form['class'] = array( + '#type' => 'textfield', + '#title' => t('Player CSS class'), + '#description' => t('CSS class to add to the player'), + '#default_value' => $defaults['class'], + ); + + return $form; +} + +/** + * Validates the form elements for the Facebook video configuration form. + * + * @param array $element + * The form element to validate. + * @param array $form_state + * The form to validate state. + * @param array $form + * The form to validate structure. + */ +function video_embed_field_handler_facebook_form_validate($element, &$form_state, $form) { + video_embed_field_validate_dimensions($element); +} + +/** + * Handler for Facebook videos. + * + * @param string $url + * The video URL. + * @param array $settings + * The settings array. + * + * @return string|bool + * The video iframe, or FALSE in case the ID can't be retrieved from the URL. + */ +function video_embed_facebook_handle_video($url, $settings) { + $id = _video_embed_facebook_get_video_id($url); + + if ($id) { + // Our embed code. + $embed=' '; + // Use format_string to replace our placeholders with the settings values. + $embed = format_string($embed, array( + '!id' => $id, + '@width' => $settings['width'], + '@height' => $settings['height'], + '@class' => $settings['class'], + )); + + $video = array( + '#markup' => $embed, + ); + return $video; + } + + return FALSE; +} + +/** + * Gets the thumbnail url for Facebook videos. + * + * @param string $url + * The video URL. + * + * @return array + * The video thumbnail information. + */ +function video_embed_facebook_handle_thumbnail($url) { + $id = _video_embed_facebook_get_video_id($url); + + return array( + 'id' => $id, + 'url' => 'https://graph.facebook.com/' . $id . '/picture', + ); +} + +/** + * Helper function to get the Facebook video's id. + * + * @param string $url + * The video URL. + * + * @return string|bool + * The video ID, or FALSE in case the ID can't be retrieved from the URL. + */ +function _video_embed_facebook_get_video_id($url) { + // Parse_url is an easy way to break a url into its components. + $matches = array(); + preg_match('/(?:.*)(?:v=|video_id=|videos\/|videos\/v.\.\d+\/)(\d+).*/', $url, $matches); + // If the v or video_id get parameters are set, return it. + if ($matches && !empty($matches[1])) { + return check_plain($matches[1]); + } + // Otherwise return false. + return FALSE; +} diff --git a/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.admin.inc b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.admin.inc new file mode 100644 index 00000000..861fc64b --- /dev/null +++ b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.admin.inc @@ -0,0 +1,46 @@ + 'vertical_tabs', + '#title' => t('Playback settings'), + '#tree' => TRUE, + ) + $parser_form; + + return $form; +} + +/** + * VEF settings page form callback. + */ +function video_embed_field_settings_form($form, &$form_state) { + $form['video_embed_field_youtube_v3_api_key'] = array( + '#type' => 'textfield', + '#title' => t('Youtube v3 API key'), + '#default_value' => variable_get('video_embed_field_youtube_v3_api_key', ''), + ); + return system_settings_form($form); +} diff --git a/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.api.php b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.api.php new file mode 100644 index 00000000..3a16016e --- /dev/null +++ b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.api.php @@ -0,0 +1,129 @@ + 'UStream', + 'function' => 'your_module_handle_ustream', + 'thumbnail_function' => 'your_module_handle_ustream_thumbnail', + 'thumbnail_default' => drupal_get_path('module', 'your_module') . '/img/ustream.jpg', + 'data_function' => 'your_module_handler_ustream_data', + 'form' => 'your_module_handler_ustream_form', + 'form_validate' => 'your_module_handler_ustream_form_validate', + 'domains' => array( + 'ustream.com', + ), + 'defaults' => array( + 'width' => 640, + 'height' => 360, + ), + ); + + return $handlers; +} + +/** + * Performs alterations on video_embed_field handlers. + * + * @param $info + * Array of information on video handlers exposed by + * hook_video_embed_handler_info() implementations. + */ +function hook_video_embed_handler_info_alter(&$info) { + // Change the thumbnail function for 'ustream' provider. + if (isset($info['ustream'])) { + $info['ustream']['thumbnail_function'] = 'your_module_handle_ustream_thumbnail_alter'; + } +} + +/** + * Example callbacks for a provider (in this case for ustream). + * Obviously, these functions are only for example purposes. + */ + +/** + * Generate the embed code for a video + * @param $url - the video url as entered by the user + * @param $settings - the settings for this provider as defined in the form function, + * defaulting to your provider's defaults + * @return the embed code as a renderable array + */ +function your_module_handle_ustream($url, $settings) { + return array( + //this should be the full embed code for your provider, including each of the settings + '#markup' => '', + ); +} + +/** + * Retrieve information about the thumbnail for a given url + * @param $url - the url of the video as entered by the user + * @return an array with the keys: + * 'id' => an id for the video which is unique to your provider, used for naming the cached thumbnail file + * 'url' => the url to retrieve the thumbnail from + */ +function your_module_handle_ustream_thumbnail($url) { + return array( + 'id' => '12332243242', //generally the id that the provider uses for the video + 'url' => 'http://something/thumbnail/somthing.jpg', //the url of the thumbnail + ); +} + +/** + * A forms api callback, returns the settings form for the provider + * @param $defaults - default/current values for your provider, the currently saved settings + * with empty values filled with the defaults provided in info hook + * @return a form as defined by forms api + * + * @see http://api.drupal.org/api/drupal/developer!topics!forms_api_reference.html/7 + */ +function your_module_handler_ustream_form($defaults) { + $form = array(); + + $form['width'] = array( + '#type' => 'textfield', + '#title' => t('Player Width'), + '#description' => t('The width of the player in pixels'), + '#default_value' => $defaults['width'], + ); + + return $form; +} + +/** + * Return an array of extra data to be stored with the video, this data will be available for theming + * @return an array + */ +function your_module_handler_ustream_data($url) { + return array(); +} diff --git a/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.devel_generate.inc b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.devel_generate.inc new file mode 100644 index 00000000..54288833 --- /dev/null +++ b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.devel_generate.inc @@ -0,0 +1,94 @@ +entry as $entry) { + $videos[] = array( + 'video_url' => $entry->children('media', TRUE)->group->player->attributes()->url, + 'description' => $entry->title, + ); + } + if (empty($videos)) { + video_embed_field_generate_videos(); + } + } + return $videos; +} diff --git a/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.feeds.inc b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.feeds.inc new file mode 100644 index 00000000..84bdb7a2 --- /dev/null +++ b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.feeds.inc @@ -0,0 +1,73 @@ + $instance) { + $info = field_info_field($name); + if ($info['type'] == 'video_embed_field') { + $targets[$name . ":video_url"] = array( + 'name' => t('@name: Embed URL', array('@name' => $instance['label'])), + 'callback' => 'video_embed_field_set_target', + 'description' => t('The URL for the @label field of the @entity_type.', array('@entity_type' => $entity_type, '@label' => $instance['label'])), + 'real_target' => $name, + ); + $targets[$name . ':description'] = array( + 'name' => t('@name: Embed description', array('@name' => $instance['label'])), + 'callback' => 'video_embed_field_set_target', + 'description' => t('The description for the @label field of the @entity_type.', array('@entity_type' => $entity_type, '@label' => $instance['label'])), + 'real_target' => $name, + ); + } + } +} + +/** + * Callback for mapping. Here is where the actual mapping happens. + * + * When the callback is invoked, $target contains the name of the field the + * user has decided to map to and $value contains the value of the feed item + * element the user has picked as a source. + */ +function video_embed_field_set_target($source, $entity, $target, $value) { + if (empty($value)) { + return; + } + + if (!is_array($value)) { + $value = array($value); + } + + list($field_name, $sub_field) = explode(':', $target, 2); + + $info = field_info_field($field_name); + + // Iterate over all values. + $field = isset($entity->$field_name) ? $entity->$field_name : array(LANGUAGE_NONE => array()); + + // Allow for multiple mappings to the same target. + $count = call_user_func_array('array_merge_recursive', $field[LANGUAGE_NONE]); + $delta = count($count[$sub_field]); + + foreach ($value as $v) { + + if ($info['cardinality'] != FIELD_CARDINALITY_UNLIMITED && $info['cardinality'] <= $delta) { + break; + } + + if (is_scalar($v)) { + $field[LANGUAGE_NONE][$delta][$sub_field] = $v; + + $delta++; + } + } + + $entity->{$field_name} = $field; +} diff --git a/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.field.inc b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.field.inc new file mode 100644 index 00000000..0c23804f --- /dev/null +++ b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.field.inc @@ -0,0 +1,560 @@ + array( + 'label' => 'Video Embed', + 'description' => 'Embed videos from youtube or vimeo', + 'settings' => array(), + 'instance_settings' => array( + 'description_field' => 0, + 'description_length' => 128, + 'allowed_providers' => array_keys(video_embed_get_handlers()), + ), + 'default_widget' => 'video_embed_field_video', + 'default_formatter' => 'video_embed_field', + 'property_type' => 'video_embed_field', + 'property_callbacks' => array('video_embed_field_property_info_callback'), + ), + ); +} + +/** + * Property callback for the Entity Metadata framework. + */ +function video_embed_field_property_info_callback(&$info, $entity_type, $field, $instance, $field_type) { + // Apply the default. + entity_metadata_field_default_property_callback($info, $entity_type, $field, $instance, $field_type); + + // Finally add in instance specific property info. + $name = $field['field_name']; + $property = &$info[$entity_type]['bundles'][$instance['bundle']]['properties'][$name]; + $property['type'] = ($field['cardinality'] != 1) ? 'list' : 'video_embed_field'; + $property['property info'] = video_embed_field_data_property_info('Video embed'); + $property['getter callback'] = 'entity_metadata_field_verbatim_get'; + $property['setter callback'] = 'entity_metadata_field_verbatim_set'; +} + +/** + * Defines info for the properties of the video_embed_field data structure. + */ +function video_embed_field_data_property_info($name = NULL) { + // Build an array of basic property information for video_embed_field. + $properties = array( + 'video_url' => array( + 'label' => 'Video URL', + 'type' => 'uri', + 'setter callback' => 'entity_property_verbatim_set', + ), + 'thumbnail_path' => array( + 'label' => 'Thumbnail path', + 'type' => 'uri', + 'getter callback' => 'entity_property_verbatim_get_url', + ), + 'description' => array( + 'label' => 'Description', + 'type' => 'text', + 'setter callback' => 'entity_property_verbatim_set', + ), + ); + + // Add the default values for each of the video_embed_field properties. + foreach ($properties as $key => &$value) { + $value += array( + 'description' => !empty($name) ? t('!label of field %name', array('!label' => $value['label'], '%name' => $name)) : '', + ); + } + + return $properties; +} + +/** + * Gets the property just as it is set in the data and converts to absolute url. + */ +function entity_property_verbatim_get_url($data, array $options, $name, $type, $info) { + $property = entity_property_verbatim_get($data, $options, $name, $type, $info); + return file_create_url($property); +} + +/** + * Implements hook_field_instance_settings_form(). + */ +function video_embed_field_field_instance_settings_form($field, $instance) { + $settings = $instance['settings']; + + $providers = video_embed_get_handlers(); + $allowed_providers = array(); + foreach ($providers as $provider_id => $definition) { + $allowed_providers[$provider_id] = $definition['title']; + } + + $form['allowed_providers'] = array( + '#type' => 'checkboxes', + '#title' => t('Select the allowed video providers'), + '#options' => $allowed_providers, + '#default_value' => isset($settings['allowed_providers']) ? $settings['allowed_providers'] : array(), + '#weight' => 10, + ); + + $form['description_field'] = array( + '#type' => 'checkbox', + '#title' => t('Enable Description field'), + '#default_value' => isset($settings['description_field']) ? $settings['description_field'] : '', + '#description' => t('The description field allows users to enter a description about the video.'), + '#weight' => 11, + ); + + $form['description_length'] = array( + '#type' => 'textfield', + '#title' => t('Max description length'), + '#default_value' => isset($settings['description_length']) ? $settings['description_length'] : 128, + '#weight' => 12, + '#size' => 5, + '#maxlength' => 5, + '#states' => array( + 'visible' => array( + ':input[id="edit-instance-settings-description-field"]' => array('checked' => TRUE), + ), + ), + ); + + return $form; +} + +/** + * Implements hook_field_widget_info(). + */ +function video_embed_field_field_widget_info() { + return array( + 'video_embed_field_video' => array( + 'label' => 'Video', + 'description' => 'Provides a video embed field', + 'field types' => array('video_embed_field'), + 'settings' => array(), + 'behaviors' => array( + 'multiple values' => FIELD_BEHAVIOR_DEFAULT, + 'default value' => FIELD_BEHAVIOR_DEFAULT, + ), + ), + ); +} + +/** + * Implements hook_field_widget_form(). + */ +function video_embed_field_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) { + // Don't need to check the type right now because we're only defining one. + $element += array( + '#type' => 'fieldset', + ); + + $element['video_url'] = array( + '#type' => 'textfield', + '#title' => t('Video URL'), + '#attributes' => array('class' => array('video_embed_url')), + '#attached' => array( + 'css' => array( + drupal_get_path('module', 'video_embed_field') . '/video_embed_field.form.css', + ), + ), + '#default_value' => isset($items[$delta]['video_url']) ? $items[$delta]['video_url'] : '', + '#required' => $element['#required'], + '#maxlength' => 255, + ); + + // Add the description field if enabled. + if (!empty($instance['settings']['description_field'])) { + $element['description'] = array( + '#type' => 'textfield', + '#title' => t('Description'), + '#default_value' => isset($items[$delta]['description']) ? $items[$delta]['description'] : '', + '#description' => t('The description which may be used as a label.'), + '#maxlength' => $instance['settings']['description_length'], + ); + } + + return $element; +} + +/** + * Validates video URL. + */ +function video_embed_field_field_validate($entity_type, $entity, $field, $instance, $langcode, $items, &$errors) { + foreach ($items as $delta => $item) { + if (!empty($item['video_url'])) { + $item['video_url'] = trim($item['video_url']); + if (stristr($item['video_url'], '.') && !stristr($item['video_url'], 'http://') && !stristr($item['video_url'], 'https://')) { + $item['video_url'] = 'http://' . $item['video_url']; + } + + $parts = parse_url($item['video_url']); + if (!$parts || !isset($parts['host'])) { + $errors[$field['field_name']][$langcode][$delta][] = array( + 'error' => t('Invalid Url'), + 'message' => t('Video: Invalid Video URL.', array('%name' => $instance['label'])), + ); + } + else { + $host = $parts['host']; + if (stripos($host, 'www.') > -1) { + $host = substr($host, 4); + } + $domains = _video_embed_field_get_instance_provider_domains($instance); + if (!array_key_exists($host, $domains)) { + $errors[$field['field_name']][$langcode][$delta][] = array( + 'error' => t('Unsupported Video Provider'), + 'message' => t('%name: This video provider is not currently supported.', array('%name' => $instance['label'])), + ); + } + } + } + } +} + +/** + * Implements hook_field_presave(). + * + * Download and save the thumbnail if it hasn't already been stored. + * Get video data. + */ +function video_embed_field_field_presave($entity_type, $entity, $field, $instance, $langcode, &$items) { + foreach ($items as $delta => $item) { + // Trim whitespace from the video URL. + $items[$delta]['video_url'] = trim($item['video_url']); + + // Try to load thumbnail URL. + $info = video_embed_field_thumbnail_url($item['video_url']); + if (isset($info['url']) && $info['url']) { + $thumb_url = $info['url']; + $thumb_extension = pathinfo($thumb_url, PATHINFO_EXTENSION); + $local_path = "public://video_embed_field_thumbnails/{$info['handler']}/{$info['id']}.$thumb_extension"; + + $dirname = drupal_dirname($local_path); + file_prepare_directory($dirname, FILE_CREATE_DIRECTORY | FILE_MODIFY_PERMISSIONS); + + $response = drupal_http_request($thumb_url); + if (!isset($response->error)) { + file_save_data($response->data, $local_path, FILE_EXISTS_REPLACE); + } + else { + @copy($thumb_url, $local_path); + } + + $items[$delta]['thumbnail_path'] = $local_path; + // Delete any image derivatives at the original image path. + image_path_flush($local_path); + } + // Couldn't get the thumbnail for whatever reason. + else { + $items[$delta]['thumbnail_path'] = ''; + } + + // Try to load video data. + $data = video_embed_field_get_video_data($item['video_url']); + if (is_array($data) && !empty($data)) { + $items[$delta]['video_data'] = serialize($data); + } + else { + $items[$delta]['video_data'] = NULL; + } + + } +} + +/** + * Implements hook_field_is_empty(). + */ +function video_embed_field_field_is_empty($item, $field) { + return empty($item) || empty($item['video_url']) || $item['video_url'] === ''; +} + +/** + * Implements hook_field_formatter_info(). + */ +function video_embed_field_field_formatter_info() { + $info = array( + 'video_embed_field' => array( + 'label' => t('Video Player'), + 'field types' => array('video_embed_field'), + 'settings' => array( + 'video_style' => 'normal', + 'description' => 1, + 'description_position' => 'bottom', + ), + ), + 'video_embed_field_url' => array( + 'label' => t('URL to Video'), + 'field types' => array('video_embed_field'), + 'settings' => array(), + ), + 'video_embed_field_thumbnail' => array( + 'label' => t('Thumbnail Preview'), + 'field types' => array('video_embed_field'), + 'settings' => array( + 'image_style' => '', + 'description' => 1, + 'description_position' => 'bottom', + 'image_link' => 'none', + ), + ), + ); + if (module_exists('colorbox')) { + $info['video_embed_field_thumbnail_colorbox'] = array( + 'label' => t('Thumbnail Preview w/Colorbox'), + 'field types' => array('video_embed_field'), + 'settings' => array( + 'video_style' => 'normal', + 'image_style' => '', + 'description' => 1, + 'description_position' => 'bottom', + ), + ); + $info['video_embed_field_url_colorbox'] = array( + 'label' => t('URL to Video w/Colorbox'), + 'field types' => array('video_embed_field'), + 'settings' => array( + 'video_style' => 'normal', + ), + ); + } + return $info; +} + +/** + * Implements hook_field_formatter_settings_form(). + */ +function video_embed_field_field_formatter_settings_form($field, $instance, $view_mode, $form, &$form_state) { + $display = $instance['display'][$view_mode]; + $settings = $display['settings']; + $element = array(); + + if ($display['type'] == 'video_embed_field' || $display['type'] == 'video_embed_field_thumbnail_colorbox' || $display['type'] == 'video_embed_field_url_colorbox') { + $video_styles = video_embed_field_video_style_options(FALSE); + $element['video_style'] = array( + '#title' => t('Video style'), + '#type' => 'select', + '#default_value' => $settings['video_style'], + '#options' => $video_styles, + ); + } + if ($display['type'] == 'video_embed_field_thumbnail' || $display['type'] == 'video_embed_field_thumbnail_colorbox') { + $element['image_style'] = array( + '#title' => t('Image style'), + '#type' => 'select', + '#options' => image_style_options(FALSE), + '#default_value' => $settings['image_style'], + '#empty_option' => t('None (original image)'), + ); + } + + if ($display['type'] == 'video_embed_field_thumbnail') { + $link_types = array( + 'content' => t('Content'), + 'source' => t('Video Source'), + ); + $element['image_link'] = array( + '#title' => t('Link thumbnail to'), + '#type' => 'select', + '#default_value' => $settings['image_link'], + '#empty_option' => t('Nothing'), + '#options' => $link_types, + ); + } + + if ($instance['settings']['description_field'] && $display['type'] != 'video_embed_field_url' && $display['type'] != 'video_embed_field_url_colorbox') { + $element['description'] = array( + '#title' => t('Show description'), + '#type' => 'checkbox', + '#default_value' => $settings['description'], + ); + + $element['description_position'] = array( + '#title' => t('Description Position'), + '#type' => 'select', + '#options' => array( + 'top' => t('Top'), + 'bottom' => t('Bottom'), + ), + '#default_value' => $settings['description_position'], + '#states' => array( + 'visible' => array( + ':input[name="fields[' . $field['field_name'] . '][settings_edit_form][settings][description]"]' => array('checked' => TRUE), + ), + ), + ); + } + return $element; +} +/** + * Implements hook_field_formatter_settings_summary(). + */ +function video_embed_field_field_formatter_settings_summary($field, $instance, $view_mode) { + $display = $instance['display'][$view_mode]; + $settings = $display['settings']; + + $summary = array(); + if ($display['type'] == 'video_embed_field' || $display['type'] == 'video_embed_field_thumbnail_colorbox' || $display['type'] == 'video_embed_field_url_colorbox') { + $video_styles = video_embed_field_video_style_options(FALSE); + // Styles could be lost because of enabled/disabled modules that defines + // their styles in code. + if (isset($video_styles[$settings['video_style']])) { + $summary[] = t('Video style: @style', array('@style' => $video_styles[$settings['video_style']])); + } + } + if ($display['type'] == 'video_embed_field_thumbnail' || $display['type'] == 'video_embed_field_thumbnail_colorbox') { + $image_styles = image_style_options(FALSE); + if (isset($image_styles[$settings['image_style']])) { + $summary[] = t('Image style: @style', array('@style' => $image_styles[$settings['image_style']])); + } + // No Image style (original image). + else { + $summary[] = t('Original Image.'); + } + if (isset($settings['image_link'])) { + $summary[] = t('Image link: @image_link', array('@image_link' => $settings['image_link'])); + } + else { + $summary[] = t('Image link: none'); + } + } + + if (isset($settings['description'])) { + if ($settings['description'] && $instance['settings']['description_field']) { + $summary[] = t('Show description'); + } + elseif ($instance['settings']['description_field']) { + $summary[] = t('Hide description'); + } + } + + return implode('
', $summary); +} + +/** + * Implements hook_field_formatter_view(). + */ +function video_embed_field_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) { + $element = array(); + $settings = $display['settings']; + + if ($display['type'] == 'video_embed_field_thumbnail' && $display['settings']['image_link'] == 'content') { + $path = entity_uri($entity_type, $entity); + } + + foreach ($items as $delta => $item) { + // Create the render array for the description. + if (isset($item['description']) && $item['description'] && $settings['description'] && $instance['settings']['description_field']) { + $description = array( + '#prefix' => '
', + '#markup' => check_plain($item['description']), + '#suffix' => '
', + ); + $alt = $item['description']; + } + else { + $description = array(); + $alt = ''; + } + + // Render the field. + if ($display['type'] == 'video_embed_field') { + $element[$delta] = array( + array( + '#theme' => 'video_embed_field_embed_code', + '#url' => $item['video_url'], + '#style' => $settings['video_style'], + '#video_data' => !empty($item['video_data']) ? unserialize($item['video_data']) : array(), + ), + ); + } + elseif ($display['type'] == 'video_embed_field_url') { + $element[$delta] = array( + array( + '#markup' => url($item['video_url']), + ), + ); + } + elseif ($display['type'] == 'video_embed_field_thumbnail') { + if (isset($item['thumbnail_path'])) { + if ($display['settings']['image_link'] == 'source') { + if ($ret = parse_url($item['video_url'])) { + if (!isset($ret["scheme"])) { + $item['video_url'] = "http://{$item['video_url']}"; + } + } + $path = array( + 'path' => $item['video_url'], + 'options' => array(), + ); + } + + $element[$delta] = array( + '#theme' => 'image_formatter', + '#item' => array('uri' => $item['thumbnail_path'], 'alt' => $alt), + '#image_style' => $display['settings']['image_style'], + '#path' => isset($path) ? $path : '', + ); + } + // Incase no thumbnail was downloaded/provider doesn't support thumbnails. + else { + $element[$delta] = array(); + } + } + elseif ($display['type'] == 'video_embed_field_thumbnail_colorbox') { + if (isset($item['thumbnail_path'])) { + if ($ret = parse_url($item['video_url'])) { + if (!isset($ret["scheme"])) { + $item['video_url'] = "http://{$item['video_url']}"; + } + } + $element[$delta] = array( + array( + '#theme' => 'video_embed_field_colorbox_code', + '#image_url' => $item['thumbnail_path'], + '#image_style' => $display['settings']['image_style'], + '#image_alt' => $alt, + '#video_url' => $item['video_url'], + '#video_style' => $display['settings']['video_style'], + '#video_data' => unserialize($item['video_data']), + ), + ); + } + // Incase no thumbnail was downloaded/provider doesn't support thumbnails. + else { + $element[$delta] = array(); + } + } + elseif ($display['type'] == 'video_embed_field_url_colorbox') { + $path = video_embed_field_get_ajax_url($item['video_url'], $display['settings']['video_style']); + + $element[$delta] = array( + array( + '#markup' => url($path['path'], $path['options']), + ), + ); + } + // Get the HTML instead of the array, because we append it to the suffix. + // This way, the thumbnail link doesn't make the description a link as well. + $description_html = drupal_render($description); + + $pos = isset($settings['description_position']) ? $settings['description_position'] : 'bottom'; + if ($pos == 'top') { + $element[$delta]['#prefix'] = isset($element[$delta]['#prefix']) ? $element[$delta]['#prefix'] : ''; + $element[$delta]['#prefix'] = $description_html . $element[$delta]['#prefix']; + } + else { + $element[$delta]['#suffix'] = isset($element[$delta]['#suffix']) ? $element[$delta]['#suffix'] : ''; + $element[$delta]['#suffix'] .= $description_html; + } + } + + return $element; +} diff --git a/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.form.css b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.form.css new file mode 100644 index 00000000..e3db5854 --- /dev/null +++ b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.form.css @@ -0,0 +1,4 @@ +/* Style to make sure the fields are the right way */ +table input.fluid.video_embed_url { + width:100%; +} \ No newline at end of file diff --git a/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.handlers.inc b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.handlers.inc new file mode 100644 index 00000000..19620082 --- /dev/null +++ b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.handlers.inc @@ -0,0 +1,694 @@ + 'Youtube', + 'function' => 'video_embed_field_handle_youtube', + 'thumbnail_function' => 'video_embed_field_handle_youtube_thumbnail', + 'thumbnail_default' => drupal_get_path('module', 'video_embed_field') . '/img/youtube.jpg', + 'data_function' => 'video_embed_field_handle_youtube_data', + 'form' => 'video_embed_field_handler_youtube_form', + 'form_validate' => 'video_embed_field_handler_youtube_form_validate', + 'domains' => array( + 'youtube.com', + 'youtu.be', + ), + 'defaults' => array( + 'width' => 640, + 'height' => 360, + 'autoplay' => 0, + 'vq' => 'large', + 'rel' => 0, + 'controls' => 1, + 'autohide' => 2, + 'showinfo' => 1, + 'modestbranding' => 0, + 'theme' => 'dark', + 'iv_load_policy' => 1, + 'class' => '', + ), + ); + + $handlers['vimeo'] = array( + 'title' => 'Vimeo', + 'function' => 'video_embed_field_handle_vimeo', + 'thumbnail_function' => 'video_embed_field_handle_vimeo_thumbnail', + 'thumbnail_default' => drupal_get_path('module', 'video_embed_field') . '/img/vimeo.jpg', + 'data_function' => '_video_embed_field_get_vimeo_data', + 'form' => 'video_embed_field_handler_vimeo_form', + 'form_validate' => 'video_embed_field_handler_vimeo_form_validate', + 'domains' => array( + 'vimeo.com', + ), + 'defaults' => array( + 'width' => 640, + 'height' => 360, + 'color' => '00adef', + 'portrait' => 1, + 'title' => 1, + 'byline' => 1, + 'autoplay' => 0, + 'loop' => 0, + 'froogaloop' => 0, + 'class' => '' + ), + ); + + return $handlers; +} + +/** + * Helper function to get the youtube video's id. + * + * @param string $url + * The video URL. + * + * @return string|bool + * The video ID, or FALSE in case the ID can't be retrieved from the URL. + */ +function _video_embed_field_get_youtube_id($url) { + // Find the ID of the video they want to play from the url. + if (stristr($url, 'http://')) { + $url = substr($url, 7); + } + elseif (stristr($url, 'https://')) { + $url = substr($url, 8); + } + + if (stristr($url, 'playlist')) { + // Playlists need the appended ampersand to take the options properly. + $url = $url . '&'; + $pos = strripos($url, '?list='); + if ($pos !== FALSE) { + $pos2 = stripos($url, '&'); + $pos2++; + } + else { + return FALSE; + } + } + // Alternate playlist link. + elseif (stristr($url, 'view_play_list')) { + $url = $url . '&'; + // All playlist ID's are prepended with PL. + if (!stristr($url, '?p=PL')) { + $url = substr_replace($url, 'PL', strpos($url, '?p=') + 3, 0); + } + // Replace the links format with the embed format. + $url = str_ireplace('play_list?p=', 'videoseries?list=', $url); + $pos = strripos($url, 'videoseries?list='); + if ($pos !== FALSE) { + $pos2 = stripos($url, '&'); + $pos2++; + } + else { + return FALSE; + } + } + else { + $pos = strripos($url, 'v='); + if ($pos !== FALSE) { + $pos += 2; + $pos2 = stripos($url, '&', $pos); + $pos_hash = stripos($url, '#', $pos); + + $pos2 = _video_embed_get_min($pos2, $pos_hash); + } + else { + $pos = strripos($url, '/'); + if ($pos !== FALSE) { + $pos++; + $pos2 = stripos($url, '?', $pos); + $pos_hash = stripos($url, '#', $pos); + + $pos2 = _video_embed_get_min($pos2, $pos_hash); + } + } + } + if ($pos === FALSE) { + return FALSE; + } + else { + if ($pos2 > 0) { + $id = substr($url, $pos, $pos2 - $pos); + } + else { + $id = substr($url, $pos); + } + } + return check_plain($id); +} + +/** + * Handler for Youtube videos. + * + * @param string $url + * The video URL. + * @param array $settings + * The settings array. + * + * @return array + * The video iframe render array. + */ +function video_embed_field_handle_youtube($url, $settings) { + $output = array(); + + if(preg_match('/#t=((?P\d+)m)?((?P\d+)s)?((?P\d+))?/', $url, $matches)){ + if(isset($matches['tinsec'])){ + $settings['start'] = $matches['tinsec']; // url already in form #t=125 for 2 minutes and 5 seconds + } else { + // url in form #t=2m5s or with other useless data, this is why we still keep adding the default data.. + // give it some default data in case there is no #t=... + $matches += array( + "min" => 0, + "sec" => 0, + ); + if ($time = ($matches["min"] * 60) + $matches["sec"]) { + $settings['start'] = $time; + } + } + } + + $id = _video_embed_field_get_youtube_id($url); + if (!$id) { + // We can't decode the URL - just return the URL as a link. + $output['#markup'] = l($url, $url); + return $output; + } + + // Add class to variable to avoid adding it to URL param string. + $class = $settings['class']; + unset($settings['class']); + + // Construct the embed code. + $settings['wmode'] = 'opaque'; + $settings_str = urlencode(_video_embed_code_get_settings_str($settings)); + + $output['#markup'] = ''; + + return $output; +} + +/** + * Gets the thumbnail url for youtube videos. + * + * @param string $url + * The video URL. + * + * @return array + * The video thumbnail information. + */ +function video_embed_field_handle_youtube_thumbnail($url) { + $info = array(); + + $id = _video_embed_field_get_youtube_id($url); + + // Playlist. + if (stristr($id, '?list=')) { + // Strip out all but the ID, including the PL behind the ID. + $start = strpos($id, '?list=PL') + 8; + $length = strpos($id, '&') - $start; + $id = substr($id, $start, $length); + $info['id'] = $id; + // Playlist info is stored in XML. The thumbnail is in there. + $xml = drupal_http_request('http://gdata.youtube.com/feeds/api/playlists/' . $id); + if (!isset($xml->error)) { + $xml = new SimpleXMLElement($xml->data); + $media = $xml->children('http://search.yahoo.com/mrss/'); + if ($media->group->thumbnail && $media->group->thumbnail[0]->attributes()) { + $attrs = $media->group->thumbnail[0]->attributes(); + $info['url'] = (string) $attrs['url']; + } + } + } + // Regular video. + elseif ($id) { + $info['id'] = $id; + $info['url'] = 'http://img.youtube.com/vi/' . $id . '/0.jpg'; + } + return $info; +} + +/** + * Gets video data for a YouTube video URL. + * + * @param string $url + * A YouTube video URL to get data for + * + * @return array|bool + * An array of video data, or FALSE if unable to fetch data + */ +function video_embed_field_handle_youtube_data($url) { + // Get YouTube video ID from URL. + $id = _video_embed_field_get_youtube_id($url); + + if ($id) { + + $options['v'] = 3; + $options['key'] = variable_get('video_embed_field_youtube_v3_api_key', ''); + $options['part'] = 'snippet'; + $options['id'] = $id; + + $response = drupal_http_request(url('https://www.googleapis.com/youtube/v3/videos', array('query' => $options))); + + if (!isset($response->error)) { + $data = json_decode($response->data); + return _video_embed_field_clean_up_youtube_data($data->items); + } + } + + return FALSE; +} + +/** + * Flattens out some unnecessary nesting in the youtube data. + * + * @param array $data + * The unflattened data. + * + * @return array + * The flattened data. + */ +function _video_embed_field_clean_up_youtube_data($data) { + // Make things a bit nicer for people trying to use the data. + foreach ($data as $key => $value) { + if (is_object($value)) { + $temp = (array) $value; + if (isset($temp['$t'])) { + $data[$key] = $temp['$t']; + } + else { + $data[$key] = _video_embed_field_clean_up_youtube_data($temp); + } + } + elseif (is_array($value)) { + $data[$key] = _video_embed_field_clean_up_youtube_data($value); + } + + if ($key === 'category') { + $terms = array(); + foreach ($data[$key] as $value) { + if (isset($value['scheme']) && $value['scheme'] == 'http://schemas.google.com/g/2005#kind') { + continue; + } + + if (isset($value['term'])) { + $terms[] = $value['term']; + } + } + $data['terms'] = $terms; + } + } + return $data; +} + +/** + * Defines the form elements for the Youtube configuration form. + * + * @param array $defaults + * The form default values. + * + * @return array + * The provider settings form array. + */ +function video_embed_field_handler_youtube_form($defaults) { + $form = array(); + + $form['width'] = array( + '#type' => 'textfield', + '#size' => '5', + '#title' => t('Player Width'), + '#description' => t('The width of the youtube player.'), + '#default_value' => $defaults['width'], + ); + $form['height'] = array( + '#type' => 'textfield', + '#size' => '5', + '#title' => t('Player Height'), + '#description' => t('The height of the youtube player.'), + '#default_value' => $defaults['height'], + ); + $form['theme'] = array( + '#type' => 'select', + '#options' => array( + 'dark' => t('Dark'), + 'light' => t('Light'), + ), + '#title' => t('Player theme'), + '#default_value' => $defaults['theme'], + ); + $form['autoplay'] = array( + '#type' => 'checkbox', + '#title' => t('Autoplay'), + '#description' => t('Play the video immediately.'), + '#default_value' => $defaults['autoplay'], + ); + $form['vq'] = array( + '#type' => 'select', + '#title' => t('Video quality'), + '#options' => array( + 'small' => t('Small (240p)'), + 'medium' => t('Medium (360p)'), + 'large' => t('Large (480p)'), + 'hd720' => t('HD 720p'), + 'hd1080' => t('HD 10800p'), + ), + '#default_value' => $defaults['vq'], + '#description' => t('Attempt to play the video in certain quality if available.'), + ); + $form['rel'] = array( + '#type' => 'checkbox', + '#title' => t('Show related videos'), + '#description' => t('Show related videos after the video is finished playing.'), + '#default_value' => $defaults['rel'], + ); + $form['showinfo'] = array( + '#type' => 'checkbox', + '#title' => t('Show info'), + '#description' => t('Display information like the video title and rating before the video starts playing.'), + '#default_value' => $defaults['showinfo'], + ); + $form['modestbranding'] = array( + '#type' => 'checkbox', + '#title' => t('Hide Youtube logo'), + '#description' => t('Hide the Youtube logo button on the player'), + '#default_value' => $defaults['modestbranding'], + ); + $form['iv_load_policy'] = array( + '#type' => 'radios', + '#options' => array( + 1 => t('Show video annotations.'), + 3 => t('Hide video annotations.'), + ), + '#title' => t('Display annotations'), + '#description' => t('Controls the display of annotations over the video content. Only works when using the flash player.'), + '#default_value' => $defaults['iv_load_policy'], + ); + $form['controls'] = array( + '#type' => 'radios', + '#options' => array( + 0 => t('Hide video controls.'), + 1 => t('Show video controls. Youtube default.'), + 2 => t('Show video controls with performance improvement for iframe embeds.'), + ), + '#title' => t('Display Youtube player controls'), + '#description' => t('This parameter indicates whether the video player controls will display.'), + '#default_value' => $defaults['controls'], + ); + $form['autohide'] = array( + '#type' => 'radios', + '#options' => array( + 0 => t('The video progress bar and player controls will be visible throughout the video.'), + 1 => t('Automatically slide the video progress bar and the player controls out of view a couple of seconds after the video starts playing. They will only reappear if the user moves her mouse over the video player or presses a keyboard key.'), + 2 => t('The video progress bar will fade out but the player controls (play button, volume control, etc.) remain visible.'), + ), + '#title' => t('Autohide progress bar and the player controls'), + '#description' => t('Controls the autohide behavior of the youtube player controls.'), + '#default_value' => $defaults['autohide'], + ); + + $form['class'] = array( + '#type' => 'textfield', + '#title' => t('Player CSS class'), + '#description' => t('CSS class to add to the player'), + '#default_value' => $defaults['class'], + ); + + return $form; +} + +/** + * Validates the form elements for the Youtube configuration form. + * + * @param array $element + * The form element to validate. + * @param array $form_state + * The form to validate state. + * @param array $form + * The form to validate structure. + */ +function video_embed_field_handler_youtube_form_validate($element, &$form_state, $form) { + video_embed_field_validate_dimensions($element); +} + +/** + * Helper function to get the Vimeo video's data attributes. + * + * @param string $url + * A Vimeo video URL to get the data from. + * + * @return integer|false + * The video's data attributes, or FALSE if unable to get the video ID. + */ +function _video_embed_field_get_vimeo_data($url) { + // Set oembed endpoint + $oembed_endpoint = 'http://vimeo.com/api/oembed'; + // Fetch vimeo data + $response = drupal_http_request($oembed_endpoint . '.json?url=' . rawurlencode($url)); + + try { + return json_decode($response->data, TRUE); + } catch (Exception $e) { + return FALSE; + } +} + +/** + * Helper function to get the Vimeo video's data attributes. + * + * @param string $url + * A Vimeo video URL to get the ID of. + * + * @return integer|false + * The video ID, or FALSE if unable to get the video ID. + */ +function _video_embed_field_get_vimeo_id($vimeo_data) { + try { + $video_id = $vimeo_data['video_id']; + } catch (Exception $e) { + $video_id = FALSE; + } + + return $video_id; +} + +/** + * Handler for Vimeo videos. + * + * @param string $url + * The video URL. + * @param array $settings + * The settings array. + * + * @return string + * The video iframe. + */ +function video_embed_field_handle_vimeo($url, $settings) { + $vimeo_data = _video_embed_field_get_vimeo_data($url); + + // Get ID of video from URL. + $id = _video_embed_field_get_vimeo_id($vimeo_data); + + if (empty($id)) { + return array( + '#markup' => l($url, $url), + ); + } + + // Construct the embed code. + $settings['player_id'] = drupal_html_id('vimeo-' . $id); + if (!empty($settings['froogaloop'])) { + $settings['api'] = 1; + } + unset($settings['froogaloop']); + + // Add class to variable to avoid adding it to URL param string. + $class = $settings['class']; + unset($settings['class']); + + $settings_str = _video_embed_code_get_settings_str($settings); + + return array( + '#markup' => '', + ); +} + +/** + * Gets the thumbnail url for vimeo videos. + * + * @param string $url + * The video URL. + * + * @return array + * The video thumbnail information. + */ +function video_embed_field_handle_vimeo_thumbnail($url) { + $vimeo_data = _video_embed_field_get_vimeo_data($url); + + // Get ID of video from URL. + $id = _video_embed_field_get_vimeo_id($vimeo_data); + + $info = array( + 'id' => $id, + ); + + try { + $info['url'] = $vimeo_data['thumbnail_url']; + } catch (Exception $e) { + + } + + return $info; +} + +/** + * Defines the form elements for the Vimeo configuration form. + * + * @param array $defaults + * The form default values. + * + * @return array + * The provider settings form array. + */ +function video_embed_field_handler_vimeo_form($defaults) { + $form = array(); + + $form['width'] = array( + '#type' => 'textfield', + '#size' => '5', + '#title' => t('Player Width'), + '#description' => t('The width of the vimeo player.'), + '#default_value' => $defaults['width'], + ); + + $form['height'] = array( + '#type' => 'textfield', + '#size' => '5', + '#title' => t('Player Height'), + '#description' => t('The height of the vimeo player.'), + '#default_value' => $defaults['height'], + ); + + $form['color'] = array( + '#type' => 'select', + '#options' => array( + '00adef' => t('Blue'), + 'ff9933' => t('Orange'), + 'c9ff23' => t('Lime'), + 'ff0179' => t('Fuschia'), + 'ffffff' => t('White'), + ), + '#title' => t('Player Color'), + '#description' => t('The color to use on the vimeo player.'), + '#default_value' => $defaults['color'], + ); + + $form['portrait'] = array( + '#type' => 'checkbox', + '#title' => t('Overlay Author Thumbnail'), + '#description' => t("Overlay the author's thumbnail before the video is played."), + '#default_value' => $defaults['portrait'], + ); + + $form['title'] = array( + '#type' => 'checkbox', + '#title' => t("Overlay Video's Title"), + '#description' => t("Overlay the video's title before the video is played."), + '#default_value' => $defaults['title'], + ); + + $form['byline'] = array( + '#type' => 'checkbox', + '#title' => t("Overlay Video's Byline"), + '#description' => t("Overlay the video's description before the video is played."), + '#default_value' => $defaults['byline'], + ); + + $form['overridable'] = array( + '#prefix' => '

' . t('Note') . ': ', + '#markup' => t('Color, portrait, title and byline can be restricted by Vimeo Plus videos. + Such videos will ignore these settings.'), + '#suffix' => '

', + ); + + $form['autoplay'] = array( + '#type' => 'checkbox', + '#title' => t('Autoplay'), + '#description' => t('Play the video immediately.'), + '#default_value' => $defaults['autoplay'], + ); + + $form['loop'] = array( + '#type' => 'checkbox', + '#title' => t('Loop'), + '#description' => t("Loop the video's playback"), + '#default_value' => $defaults['loop'], + ); + + $form['froogaloop'] = array( + '#type' => 'checkbox', + '#title' => t('Enable froogaloop support'), + '#description' => t("Enables Froogallop Vimeo's library support"), + '#default_value' => $defaults['loop'], + ); + + $form['class'] = array( + '#type' => 'textfield', + '#title' => t('Player CSS class'), + '#description' => t('CSS class to add to the player'), + '#default_value' => $defaults['class'], + ); + + return $form; +} + +/** + * Validates the form elements for the Vimeo configuration form. + * + * @param array $element + * The form element to validate. + * @param array $form_state + * The form to validate state. + * @param array $form + * The form to validate structure. + */ +function video_embed_field_handler_vimeo_form_validate($element, &$form_state, $form) { + video_embed_field_validate_dimensions($element); +} + +/** + * Calculates the min index for use in finding the id of a youtube video. + * + * @param string $pos1 + * The first index. + * @param string $pos2 + * The second index. + * + * @return string + * The min index. + */ +function _video_embed_get_min($pos1, $pos2) { + if (!$pos1) { + return $pos2; + } + elseif (!$pos2) { + return $pos1; + } + else { + return min($pos1, $pos2); + } +} diff --git a/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.info b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.info new file mode 100644 index 00000000..ffb8d652 --- /dev/null +++ b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.info @@ -0,0 +1,18 @@ +name = "Video Embed Field" +description = "Expose a field type for embedding videos from youtube or vimeo." +core = 7.x +package = Media +configure = admin/config/media/vef + +files[] = video_embed_field.migrate.inc +files[] = views/handlers/views_embed_field_views_handler_field_thumbnail_path.inc + +dependencies[] = ctools +dependencies[] = image + +; Information added by Drupal.org packaging script on 2015-09-07 +version = "7.x-2.0-beta11" +core = "7.x" +project = "video_embed_field" +datestamp = "1441639440" + diff --git a/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.install b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.install new file mode 100644 index 00000000..2009b2a5 --- /dev/null +++ b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.install @@ -0,0 +1,391 @@ + array( + 'type' => 'varchar', + 'length' => 512, + 'default' => '', + ), + 'thumbnail_path' => array( + 'type' => 'varchar', + 'length' => 512, + 'default' => '', + ), + 'video_data' => array( + 'type' => 'blob', + 'not null' => FALSE, + 'size' => 'big', + 'serialize' => TRUE, + ), + 'embed_code' => array( + 'type' => 'varchar', + 'length' => 1024, + 'default' => '', + ), + 'description' => array( + 'type' => 'text', + 'not null' => FALSE, + ), + ); + $indexes = array(); + break; + } + + return array( + 'columns' => $columns, + 'indexes' => $indexes, + ); +} + +/** + * Implements hook_schema(). + */ +function video_embed_field_schema() { + $schema['vef_video_styles'] = array( + 'description' => 'Stores video embed styles.', + 'export' => array( + 'key' => 'name', + 'identifier' => 'video_embed_style', + 'default hook' => 'default_video_embed_styles', + 'api' => array( + 'owner' => 'video_embed_field', + 'api' => 'default_video_embed_styles', + 'minimum_version' => 1, + 'current_version' => 1, + ), + ), + 'fields' => array( + 'name' => array( + 'description' => 'The machine-readable option set name.', + 'type' => 'varchar', + 'length' => 255, + 'not null' => TRUE, + ), + 'title' => array( + 'description' => 'The human-readable title for this option set.', + 'type' => 'varchar', + 'length' => 255, + 'not null' => TRUE, + ), + 'data' => array( + 'description' => 'The configuration data for the style.', + 'type' => 'blob', + 'size' => 'big', + 'not null' => TRUE, + 'serialize' => TRUE, + ), + ), + 'primary key' => array('name'), + ); + return $schema; +} + +/** + * Implements hook_uninstall(). + */ +function video_embed_field_uninstall() { + variable_del('video_embed_field_youtube_api_key'); +} + +/** + * Adds an optional description form. + */ +function video_embed_field_update_7000() { + // Get the list of fields of type 'video_embed_field'. + $video_embed_fields = array(); + foreach (field_info_fields() as $field_name => $field_info) { + if ($field_info['type'] == 'video_embed_field') { + $video_embed_fields[$field_name] = field_read_field($field_name); + } + } + + foreach ($video_embed_fields as $field) { + if ($field['deleted']) { + $table = "field_deleted_data_{$field['id']}"; + $revision_table = "field_deleted_revision_{$field['id']}"; + } + else { + $table = "field_data_{$field['field_name']}"; + $revision_table = "field_revision_{$field['field_name']}"; + } + $column = $field['field_name'] . '_description'; + db_add_field($table, $column, array('type' => 'text', 'not null' => FALSE)); + db_add_field($revision_table, $column, array('type' => 'text', 'not null' => FALSE)); + } + + return t('Additional columns added.'); +} + +/** + * Adds video style storage table. + */ +function video_embed_field_update_7001() { + if (!db_table_exists('vef_video_styles')) { + $schema = video_embed_field_schema(); + db_create_table('vef_video_styles', $schema['vef_video_styles']); + } + + return t('Video styles storage table created.'); +} +/** + * Adds field for storing the path to the video thumbnail. + */ +function video_embed_field_update_7002() { + // Get the list of fields of type 'video_embed_field'. + $video_embed_fields = array(); + foreach (field_info_fields() as $field_name => $field_info) { + if ($field_info['type'] == 'video_embed_field') { + $video_embed_fields[$field_name] = field_read_field($field_name); + } + } + + foreach ($video_embed_fields as $field) { + if ($field['deleted']) { + $table = "field_deleted_data_{$field['id']}"; + $revision_table = "field_deleted_revision_{$field['id']}"; + } + else { + $table = "field_data_{$field['field_name']}"; + $revision_table = "field_revision_{$field['field_name']}"; + } + $column = $field['field_name'] . '_thumbnail_path'; + db_add_field($table, $column, array( + 'type' => 'varchar', + 'length' => 512, + 'default' => '', + )); + db_add_field($revision_table, $column, array( + 'type' => 'varchar', + 'length' => 512, + 'default' => '', + )); + } + + return t('Thumbnail column added.'); +} + +/** + * Enables inline colorbox support if colorbox is installed. + * + * [NO LONGER NEEDED - This update hook does nothing] + */ +function video_embed_field_update_7003() { +} + +/** + * Enables colorbox load support if colorbox is installed. + */ +function video_embed_field_update_7004() { + variable_set('colorbox_load', 1); +} + +/** + * Adds data column to field database. + */ +function video_embed_field_update_7005() { + // Get the list of fields of type 'video_embed_field'. + $video_embed_fields = array(); + foreach (field_info_fields() as $field_name => $field_info) { + if ($field_info['type'] == 'video_embed_field') { + $video_embed_fields[$field_name] = field_read_field($field_name); + } + } + + foreach ($video_embed_fields as $field) { + if ($field['deleted']) { + $table = "field_deleted_data_{$field['id']}"; + $revision_table = "field_deleted_revision_{$field['id']}"; + } + else { + $table = "field_data_{$field['field_name']}"; + $revision_table = "field_revision_{$field['field_name']}"; + } + $column = $field['field_name'] . '_video_data'; + db_add_field($table, $column, array( + 'type' => 'blob', + 'not null' => FALSE, + 'size' => 'big', + 'serialize' => TRUE, + )); + db_add_field($revision_table, $column, array( + 'type' => 'blob', + 'not null' => FALSE, + 'size' => 'big', + 'serialize' => TRUE, + )); + } + + return t('Data column added. Please clear cache.'); +} + +/** + * Updates vef_video_styles table structure. + */ +function video_embed_field_update_7006() { + // Convert the table structure. + db_drop_field('vef_video_styles', 'vsid'); + db_add_primary_key('vef_video_styles', array('name')); + db_drop_unique_key('vef_video_styles', 'name'); + + db_add_field('vef_video_styles', 'title', array( + 'type' => 'varchar', + 'length' => 255, + 'not null' => TRUE, + 'default' => '', + )); + // Update title and name values. + $result = db_select('vef_video_styles', 'vef') + ->fields('vef', array('name')) + ->execute(); + foreach ($result as $record) { + // Set current name as title. + db_update('vef_video_styles') + ->fields(array( + 'title' => $record->name, + )) + ->condition('name', $record->name) + ->execute(); + + // Update name to fit with machine_name constraints. + $new_name = preg_replace('/[^a-z0-9_]+/', '_', drupal_strtolower($record->name)); + if ($new_name != $record->name) { + // Check if new name already exists in the database. + $counter = 1; + $base_name = $new_name; + while (TRUE) { + $result = db_select('vef_video_styles', 'vef') + ->fields('vef', array('name')) + ->condition('name', $new_name) + ->execute(); + if ($result->rowCount()) { + $new_name = $base_name . '_' . $counter; + } + else { + db_update('vef_video_styles') + ->fields(array( + 'name' => $new_name, + )) + ->condition('name', $record->name) + ->execute(); + break; + } + } + } + } + + return t('Database schema updated successfully'); +} + +/** + * Update youtube "hd" URL deprecated parameter. + */ +function video_embed_field_update_7007() { + drupal_get_schema('vef_video_styles', TRUE); + ctools_include('export'); + $styles = ctools_export_load_object('vef_video_styles'); + foreach ($styles as $style) { + if (isset($style->data['youtube']['hd'])) { + if ($style->data['youtube']['hd']) { + $style->data['youtube']['vq'] = 'hd720'; + } + else { + $style->data['youtube']['vq'] = 'large'; + } + unset($style->data['youtube']['hd']); + ctools_export_crud_save('vef_video_styles', $style); + } + } + + return t('Parameter hd has been converted to vq.'); +} + +/** + * Updates naming of 'node' formatter setting to 'content'. + */ +function video_embed_field_update_7008() { + $instances = field_info_instances(); + foreach ($instances as $entity_type) { + foreach ($entity_type as $bundle) { + foreach ($bundle as $instance) { + $field_info = field_info_field($instance['field_name']); + if ($field_info['type'] == 'video_embed_field') { + $update = FALSE; + foreach ($instance['display'] as &$display) { + if ($display['type'] == 'video_embed_field_thumbnail') { + if ($display['settings']['image_link'] == 'node') { + $display['settings']['image_link'] = 'content'; + $update = TRUE; + } + if ($display['settings']['image_style'] == 'none') { + $display['settings']['image_style'] = ''; + $update = TRUE; + } + } + } + if ($update) { + field_update_instance($instance); + } + } + } + } + } + + return t("Updated 'node' setting to 'content'"); +} + +/** + * Adds new Allowed Providers setting to existing instances. + */ +function video_embed_field_update_7009() { + $allowed_providers = array_keys(video_embed_get_handlers()); + + $instances = field_info_instances(); + foreach ($instances as $entity_type) { + foreach ($entity_type as $bundle) { + foreach ($bundle as $instance) { + $field_info = field_info_field($instance['field_name']); + if ($field_info['type'] == 'video_embed_field') { + $instance['settings']['allowed_providers'] = $allowed_providers; + field_update_instance($instance); + } + } + } + } + + return t('Updated default instance settings'); +} + +/** + * Update styles with empty class parameter. + */ +function video_embed_field_update_7010() { + drupal_get_schema('vef_video_styles', TRUE); + ctools_include('export'); + $styles = ctools_export_load_object('vef_video_styles'); + foreach ($styles as $style) { + foreach ($style->data as &$provider) { + if (!isset($provider['class'])) { + $provider['class'] = ''; + } + } + ctools_export_crud_save('vef_video_styles', $style); + } + + return 'Parameter class added to existing styles'; +} diff --git a/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.migrate.inc b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.migrate.inc new file mode 100644 index 00000000..a714ca65 --- /dev/null +++ b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.migrate.inc @@ -0,0 +1,57 @@ + 2, + 'field handlers' => array('MigrateVideoEmbedFieldFieldHandler'), + ); + return $api; +} + +/** + * Custom extended MigrateFieldHandler class for Video Embed Field module. + */ +class MigrateVideoEmbedFieldFieldHandler extends MigrateFieldHandler { + + public function __construct() { + $this->registerTypes(array('video_embed_field')); + } + + /** + * {@inheritdoc} + */ + public function fields($type, $parent_field, $migration = NULL) { + $fields = array( + 'video_url' => t('Video: The video URL.'), + ); + return $fields; + } + + /** + * {@inheritdoc} + */ + public function prepare($entity, array $field_info, array $instance, array $values) { + $arguments = array(); + if (isset($values['arguments'])) { + $arguments = array_filter($values['arguments']); + unset($values['arguments']); + } + $language = $this->getFieldLanguage($entity, $field_info, $arguments); + + // Setup the standard Field API array for saving. + $delta = 0; + foreach ($values as $value) { + $return[$language][$delta] = array('video_url' => $value); + $delta++; + } + + return isset($return) ? $return : NULL; + } +} diff --git a/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.module b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.module new file mode 100644 index 00000000..8826eada --- /dev/null +++ b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.module @@ -0,0 +1,722 @@ + 1); + } +} + +/** + * Implements hook_default_video_styles(). + */ +function video_embed_field_default_video_embed_styles() { + $styles = array(); + + $handlers = video_embed_get_handlers(); + // Create the normal handler. + $normal = new stdClass(); + $normal->disabled = FALSE; /* Edit this to true to make a default video_embed_style disabled initially */ + $normal->api_version = 1; + $normal->name = 'normal'; + $normal->title = 'Normal'; + $normal->data = array(); + + $teaser = new stdClass(); + $teaser->disabled = FALSE; /* Edit this to true to make a default video_embed_style disabled initially */ + $teaser->api_version = 1; + $teaser->name = 'teaser'; + $teaser->title = 'Teaser'; + $teaser->data = array(); + + // Add in our settings for each of the handlers. + foreach ($handlers as $name => $handler) { + $normal->data[$name] = $handler['defaults']; + $teaser->data[$name] = $handler['defaults']; + $teaser->data[$name]['width'] = 480; + $teaser->data[$name]['height'] = 270; + } + + return array($normal, $teaser); +} + +/** + * Implements hook_menu(). + */ +function video_embed_field_menu() { + $items = array(); + + $items['vef/load/%'] = array( + 'title' => 'Video Embed Field - Load Video', + 'page callback' => '_video_embed_field_show_video', + 'page arguments' => array(2), + 'access callback' => TRUE, + 'type' => MENU_CALLBACK, + ); + + $items['admin/config/media/vef'] = array( + 'title' => 'Video Embed Field', + 'description' => 'Video Embed Field configuration', + 'page callback' => 'system_admin_menu_block_page', + 'access arguments' => array('administer video styles'), + 'file' => 'system.admin.inc', + 'file path' => drupal_get_path('module', 'system'), + 'type' => MENU_NORMAL_ITEM, + ); + + $items['admin/config/media/vef/settings'] = array( + 'title' => 'Settings', + 'description' => 'Video Embed Field module settings', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('video_embed_field_settings_form'), + 'file' => 'video_embed_field.admin.inc', + 'access arguments' => array('administer video styles'), + 'type' => MENU_NORMAL_ITEM, + ); + + return $items; +} + +/** + * Implements hook_permission(). + */ +function video_embed_field_permission() { + return array( + 'administer video styles' => array( + 'title' => t('Administer video styles'), + 'description' => t('Create and modify styles for embedded videos.'), + ), + ); +} + +/** + * Implements hook_theme(). + */ +function video_embed_field_theme() { + return array( + // Theme functions in video_embed_field.admin.inc. + 'video_embed_field_video_style_list' => array( + 'variables' => array('styles' => NULL), + ), + 'video_embed_field_embed_code' => array( + 'template' => 'video-embed-field-embed-code', + 'variables' => array( + 'url' => NULL, + 'style' => 'normal', + 'video_data' => array(), + ), + ), + 'video_embed_field_colorbox_code' => array( + 'variables' => array( + 'image_url' => NULL, + 'image_style' => 'normal', + 'image_alt' => NULL, + 'video_url' => NULL, + 'video_style' => NULL, + 'video_data' => array(), + ), + ), + ); +} + +/** + * Implements hook_views_api(). + */ +function video_embed_field_views_api() { + return array( + 'api' => 3, + 'path' => drupal_get_path('module', 'video_embed_field') . '/views', + ); +} + +/** + * Get an array of all styles and their settings. + * + * @return array + * An array of styles keyed by the video style name (name). + * + * @see video_embed_field_video_style_load() + */ +function video_embed_field_video_styles() { + $styles = &drupal_static(__FUNCTION__); + + // Grab from cache or build the array. + if (!isset($styles)) { + // Load the style via ctools - which will handle all the caching for us - + // Because it does a bit more logic, lets still statically cache this. + ctools_include('export'); + $styles = ctools_export_load_object('vef_video_styles'); + } + + return $styles; +} + +/** + * Load a style by style name. May be used as a loader for menu items. + * + * Note that you may also use ctools_export_load_object with the key being + * vef_video_styles + * + * @param string $name + * The name of the style. + * + * @return array + * An video style array containing the following keys: + * - "name": The unique video style ID. + * - "title": The human readable video style name. + * - "data": An array of video settings within this video style. + * If the video style name or ID is not valid, an empty array is returned. + */ +function video_embed_field_video_style_load($name) { + $styles = video_embed_field_video_styles(); + + return isset($styles[$name]) ? $styles[$name] : FALSE; +} + +/** + * Creates a hook that other modules can implement to get handlers. + * + * Can be used to add more handlers if needed - from other modules and such. + * + * @see hook_video_embed_handler_info + * @see video_embed_field.api.php + */ +function video_embed_get_handlers() { + $handlers = &drupal_static(__FUNCTION__); + + if (!isset($handlers)) { + if ($handlers = cache_get('video_embed_field_handlers')) { + $handlers = $handlers->data; + } + else { + $handlers = module_invoke_all('video_embed_handler_info'); + drupal_alter('video_embed_handler_info', $handlers); + cache_set('video_embed_field_handlers', $handlers); + } + } + + return $handlers; +} + +/** + * Retrieves the video handler for a video URL. + * + * @param string $url + * The video URL. + * + * @return string|bool + * The handler name for the URL, FALSE in case there is no handler. + */ +function video_embed_get_handler($url) { + // Process video URL. + if (!stristr($url, 'http://') && !stristr($url, 'https://')) { + $url = 'http://' . $url; + } + $parts = parse_url($url); + if (!isset($parts['host'])) { + return FALSE; + } + + $host = $parts['host']; + if (stripos($host, 'www.') > -1) { + $host = substr($host, 4); + } + + $domains = _video_embed_field_get_provider_domains(); + $handlers = video_embed_get_handlers(); + if (isset($domains[$host])) { + $handler_name = $domains[$host]; + $handler = $handlers[$handler_name]; + $handler['name'] = $handler_name; + return $handler; + } + else { + return FALSE; + } +} + +/** + * Creates a form from the player configuration options. + * + * @param array $defaults + * The default settings for the various fields. + * + * @return array + * The configuration form array. + */ +function video_embed_field_get_form($defaults) { + $form = array(); + + $handlers = video_embed_get_handlers(); + + foreach ($handlers as $name => $handler) { + if (isset($handler['form']) && function_exists($handler['form'])) { + $handler_defaults = isset($defaults[$name]) ? $defaults[$name] : array(); + $handler_defaults = array_merge($handler['defaults'], $handler_defaults); + + $form[$name] = call_user_func($handler['form'], $handler_defaults); + + $form[$name] += array( + '#type' => 'fieldset', + '#title' => t('@provider settings', array('@provider' => $handler['title'])), + '#tree' => TRUE, + '#element_validate' => isset($handler['form_validate']) ? array($handler['form_validate']) : array(), + ); + } + } + + return $form; +} + +/** + * Validates the iframe CSS dimensions. + * + * @param array $element + * The element to validate. + */ +function video_embed_field_validate_dimensions($element) { + if (!preg_match('/^(\d*)(px|%)?$/', $element['width']['#value'], $results)) { + form_error($element['width'], t('You should use a valid CSS value for width in @plugin plugin', array('@plugin' => $element['#title']))); + } + if (!preg_match('/^(\d*)(px|%)?$/', $element['height']['#value'], $results)) { + form_error($element['height'], t('You should use a valid CSS value for height in @plugin plugin', array('@plugin' => $element['#title']))); + } +} + +/** + * Get an array of image styles suitable for using as select list options. + * + * @param bool $include_empty + * If TRUE a option will be inserted in the options array. + * + * @return array + * Array of image styles both key and value are set to style name. + */ +function video_embed_field_video_style_options($include_empty = TRUE) { + $styles = video_embed_field_video_styles(); + $options = array(); + if ($include_empty && !empty($styles)) { + $options[''] = t(''); + } + foreach ($styles as $style) { + $options[$style->name] = $style->title; + } + if (empty($options)) { + $options[''] = t('No defined styles'); + } + return $options; +} + +/** + * Implements hook_filter_info(). + */ +function video_embed_field_filter_info() { + $filters['video_embed_field'] = array( + 'title' => t('Video Embedding'), + 'description' => t('Replaces [VIDEO::http://www.youtube.com/watch?v=someVideoID::aVideoStyle] tags with embedded videos.'), + 'process callback' => 'video_embed_field_filter_process', + 'tips callback' => '_filter_video_embed_tips', + ); + + return $filters; +} + +/** + * Implements callback_filter_tips(). + * + * Provides help for the URL filter. + * + * @see filter_filter_info() + */ +function _filter_video_embed_tips($filter, $format, $long = FALSE) { + return t('Replaces [VIDEO::http://www.youtube.com/watch?v=someVideoID::aVideoStyle] tags with embedded videos.'); +} + +/** + * Video Embed Field filter process callback. + */ +function video_embed_field_filter_process($text, $filter, $format) { + preg_match_all('/ \[VIDEO:: ( [^\[\]]+ )* \] /x', $text, $matches); + + $tag_match = (array) array_unique($matches[1]); + + foreach ($tag_match as $tag) { + $parts = explode('::', $tag); + + // Get video style. + if (isset($parts[1])) { + $style = $parts[1]; + } + else { + $style = 'normal'; + } + + $embed_code = theme('video_embed_field_embed_code', array('url' => $parts[0], 'style' => $style)); + + $text = str_replace('[VIDEO::' . $tag . ']', $embed_code, $text); + } + + return $text; +} + +/** + * Processes variables to format a video player. + * + * @param array $variables + * Contains the following information: + * - $url + * - $style + * - $video_data + * + * @see video-embed.tpl.php + */ +function template_preprocess_video_embed_field_embed_code(&$variables) { + // Get the handler. + $handler = video_embed_get_handler($variables['url']); + $variables['handler'] = $handler['name']; + + // Load the style. + $style = video_embed_field_video_style_load($variables['style']); + // If there was an issue load in the default style. + if ($style == FALSE) { + $style = video_embed_field_video_style_load('normal'); + } + if (isset($style->data[$variables['handler']])) { + $variables['style_settings'] = $style->data[$variables['handler']]; + } + // Safety value for when we add new handlers and there are styles stored. + else { + $variables['style_settings'] = $handler['defaults']; + } + + // Prepare the URL. + if (!stristr($variables['url'], 'http://') && !stristr($variables['url'], 'https://')) { + $variables['url'] = 'http://' . $variables['url']; + } + + // Prepare embed code. + if ($handler && isset($handler['function']) && function_exists($handler['function'])) { + $embed_code = call_user_func($handler['function'], $variables['url'], $variables['style_settings']); + $variables['embed_code'] = drupal_render($embed_code); + } + else { + $variables['embed_code'] = l($variables['url'], $variables['url']); + } + + // Prepare video data. + $variables['data'] = $variables['video_data']; + unset($variables['video_data']); +} + +/** + * Returns image style image with a link to an embedded video in colorbox. + * + * @param array $variables + * An associative array containing: + * - image_url: The image URL. + * - image_style: The image style to use. + * - image_alt: The image ALT attribute. + * - video_url: The video URL. + * - video_style: The video style to use. + * - video_data: An array of data about the video. + * + * @return string + * The themed output. + * + * @ingroup themeable + */ +function theme_video_embed_field_colorbox_code($variables) { + $path = video_embed_field_get_ajax_url($variables['video_url'], $variables['video_style']); + + $image = array( + '#theme' => 'image_formatter', + '#item' => array('uri' => $variables['image_url'], 'alt' => $variables['image_alt']), + '#image_style' => $variables['image_style'], + '#path' => $path, + ); + + return drupal_render($image); +} + +/** + * Gets the thumbnail url for a given video url. + * + * @param string $url + * The url of the video. + * + * @return string + * String representing the url of the thumbnail, or FALSE on error. + */ +function video_embed_field_thumbnail_url($url) { + $info = FALSE; + if ($handler = video_embed_get_handler($url)) { + if (isset($handler['thumbnail_function']) && function_exists($handler['thumbnail_function'])) { + $info = call_user_func($handler['thumbnail_function'], $url); + $info['handler'] = $handler['name']; + } + if (empty($info['url']) && isset($handler['thumbnail_default']) && file_exists($handler['thumbnail_default'])) { + $info = array( + 'handler' => $handler['name'], + 'id' => 'default_thumbnail', + 'url' => $handler['thumbnail_default'], + ); + } + } + return $info; +} + +/** + * Gets a video data array for a given video url. + * + * @param string $url + * A video URL of the data array you want returned. + * + * @return array|false + * An array of video data, or FALSE on error. + */ +function video_embed_field_get_video_data($url) { + $handler = video_embed_get_handler($url); + if ($handler && isset($handler['data_function']) && function_exists($handler['data_function'])) { + $data = call_user_func($handler['data_function'], $url); + $data['handler'] = $handler['name']; + return $data; + } + return FALSE; +} + +/** + * Generates the AJAX path array from the video URL and the video_style. + * + * @param string $video_url + * The URL to the video. + * @param string $video_style + * The video style to render the video. + * + * @return array + * The AJAX path array. + */ +function video_embed_field_get_ajax_url($video_url, $video_style) { + $style = video_embed_field_video_style_load($video_style); + + // If there was an issue load in the default style. + if ($style == FALSE) { + $style = video_embed_field_video_style_load('normal'); + } + + $handler = video_embed_get_handler($video_url); + + $data = $style->data[$handler['name']]; + + // Write values for later AJAX load. + $hash = _video_embed_field_store_video($video_url, $video_style); + + return array( + 'path' => 'vef/load/' . $hash, + 'options' => array( + 'attributes' => array( + 'class' => array( + 'colorbox-load', + 'colorbox' + ), + ), + 'query' => array( + 'width' => $data['width'], + 'height' => $data['height'] + 5, + ), + ), + ); +} + +/** + * Fetches all available provider domains. + * + * @return array + * An array containing the allowed video domains. + */ +function _video_embed_field_get_provider_domains() { + $domains = array(); + + $handlers = video_embed_get_handlers(); + foreach ($handlers as $name => $handler) { + if (isset($handler['function']) && function_exists($handler['function'])) { + foreach ($handler['domains'] as $domain) { + $domains[$domain] = $name; + } + } + } + + return $domains; +} + +/** + * Fetches all available provider domains for certain field instance. + * + * @param array $instance + * The instance definition. + * + * @return array + * An array containing the allowed video domains. + */ +function _video_embed_field_get_instance_provider_domains($instance) { + return array_intersect(_video_embed_field_get_provider_domains(), $instance['settings']['allowed_providers']); +} + +/** + * Fetches settings string. + * + * @param array $settings + * The settings array. + * + * @return string + * The settings string generated from the settings array. + */ +function _video_embed_code_get_settings_str($settings = array()) { + $values = array(); + + foreach ($settings as $name => $value) { + if (!isset($value)) { + $values[] = $name; + } + else { + $values[] = $name . '=' . $value; + } + } + + return implode('&', $values); +} + +/** + * Stores a video to be loaded later from an _video_embed_field_load_video. + * + * @param string $video_url + * The video URL. + * @param string $video_style + * The video style. + * + * @return string + * The hash generated for the video URL and the given style. + */ +function _video_embed_field_store_video($video_url, $video_style) { + // Create a hash key. + $hash = _video_embed_field_hash($video_url, $video_style); + + // Check that this record doesn't already exist before saving it. + if (!_video_embed_field_load_video($hash)) { + $record = array( + 'vhash' => $hash, + 'video_url' => $video_url, + 'video_style' => $video_style, + ); + + cache_set('vef-store-' . $hash, $record); + + // Add it to our static cache so we won't have to go to the database. + $static_cache = &drupal_static('vef_video_store', array()); + $static_cache[$hash] = $record; + } + return $hash; +} + +/** + * Renders a video for an AJAX call. + * + * @param string $hash + * The video hash. + * + * @return Null + * Null because prints an AJAX output. + */ +function _video_embed_field_show_video($hash) { + $data = _video_embed_field_load_video($hash); + $video = array( + '#theme' => 'video_embed_field_embed_code', + '#style' => $data['video_style'], + '#url' => $data['video_url'], + ); + + print drupal_render($video); + return NULL; +} + +/** + * Loads a video from the video store given its hash. + * + * @param string $hash + * The video hash. + * + * @return array|bool + * An array with video definition, FALSE if the hash does not exist. + */ +function _video_embed_field_load_video($hash) { + $static_cache = &drupal_static('vef_video_store', array()); + // Check if we've already loaded it. + if (isset($static_cache[$hash])) { + return $static_cache[$hash]; + } + else { + $result = cache_get('vef-store-' . $hash); + if ($result) { + // Cache it before returning. + $data = $result->data; + $static_cache[$hash] = $data; + return $data; + } + else { + return FALSE; + } + } +} + +/** + * Creates a hash for storing or looking up a video in the store table. + * + * @param string $video_url + * The video URL. + * @param string $video_style + * The video style. + * + * @return string + * The hash generated for the video URL and the given style. + */ +function _video_embed_field_hash($video_url, $video_style) { + return md5('vef' . $video_url . $video_style); +} diff --git a/sites/all/modules/contrib/fields/video_embed_field/views/handlers/views_embed_field_views_handler_field_thumbnail_path.inc b/sites/all/modules/contrib/fields/video_embed_field/views/handlers/views_embed_field_views_handler_field_thumbnail_path.inc new file mode 100644 index 00000000..c1178fe5 --- /dev/null +++ b/sites/all/modules/contrib/fields/video_embed_field/views/handlers/views_embed_field_views_handler_field_thumbnail_path.inc @@ -0,0 +1,22 @@ + 'views_handler_field', + 'thumbnail_path' => 'views_embed_field_views_handler_field_thumbnail_path', + 'description' => 'views_handler_field', + ); + + // Get the translated field information. + $properties = video_embed_field_data_property_info(); + + // Iterate over video_embed_field defined tables. + foreach ($data as &$table) { + // Make sure the parent Views field (video_embed_field) is defined. + if (isset($table[$field['field_name']]['field'])) { + // Use the parent field definition as a template for component columns. + $field_def = $table[$field['field_name']]['field']; + + // Remove 'additional fields' from the field definition. We don't + // necessarily want all our sibling columns. + unset($field_def['additional fields']); + + // Define the valid columns. + $valid_columns = array(); + foreach ($implemented as $implement => $handler) { + $column_name = $field['field_name'] . '_' . $implement; + $valid_columns[$column_name] = $handler; + } + + // Iterate over the video_embed_field components. + foreach ($table as $column_name => &$column) { + if (empty($column['field']) && isset($valid_columns[$column_name])) { + // Assign the default component definition. + $column['field'] = $field_def; + $column['field']['real field'] = $column_name; + $column['field']['handler'] = $valid_columns[$column_name]; + + // Assign human-friendly labels for video_embed_field components. + $field_labels = field_views_field_label($field['field_name']); + $field_label = array_shift($field_labels); + $property = str_replace($field_def['field_name'] . '_', '', $column_name); + + if (!empty($properties[$property])) { + $property_label = $properties[$property]['label']; + + $title = t('@field-label - @property-label', array( + '@field-label' => $field_label, + '@property-label' => $property_label, + )); + + $column['title'] = $title; + $column['title short'] = $title; + } + } + } + } + } + + return $data; +} diff --git a/sites/all/modules/contrib/fields/video_filter_field/LICENSE.txt b/sites/all/modules/contrib/fields/video_filter_field/LICENSE.txt old mode 100755 new mode 100644 diff --git a/sites/all/modules/contrib/fields/video_filter_field/README.txt b/sites/all/modules/contrib/fields/video_filter_field/README.txt old mode 100755 new mode 100644 diff --git a/sites/all/modules/contrib/fields/video_filter_field/video_filter_field.info b/sites/all/modules/contrib/fields/video_filter_field/video_filter_field.info old mode 100755 new mode 100644 diff --git a/sites/all/modules/contrib/fields/video_filter_field/video_filter_field.module b/sites/all/modules/contrib/fields/video_filter_field/video_filter_field.module old mode 100755 new mode 100644 index e0a9ae40..91dc5632 --- a/sites/all/modules/contrib/fields/video_filter_field/video_filter_field.module +++ b/sites/all/modules/contrib/fields/video_filter_field/video_filter_field.module @@ -266,6 +266,9 @@ function video_filter_field_process($text, $video) { 'video_filter_related' => 1, ); + # this added to avoid php 5.4 notice : array to string conversion + if(is_array($text)) $text = ""; + $text = (string)$text; // Make sure $text is a string. if (preg_match_all('/\[video(\:(.+))?( .+)?\]/isU', $text, $matches_code)) { foreach ($matches_code[0] as $ci => $code) { diff --git a/sites/all/modules/features/clameurs/clameurs.features.field_base.inc b/sites/all/modules/features/clameurs/clameurs.features.field_base.inc new file mode 100644 index 00000000..45f67107 --- /dev/null +++ b/sites/all/modules/features/clameurs/clameurs.features.field_base.inc @@ -0,0 +1,299 @@ + 1, + 'cardinality' => 1, + 'deleted' => 0, + 'entity_types' => array(), + 'field_name' => 'field_description', + 'field_permissions' => array( + 'type' => 0, + ), + 'foreign keys' => array( + 'format' => array( + 'columns' => array( + 'format' => 'format', + ), + 'table' => 'filter_format', + ), + ), + 'indexes' => array( + 'format' => array( + 0 => 'format', + ), + ), + 'locked' => 0, + 'module' => 'text', + 'settings' => array( + 'entity_translation_sync' => FALSE, + ), + 'translatable' => 0, + 'type' => 'text_long', + ); + + // Exported field_base: 'field_doc' + $field_bases['field_doc'] = array( + 'active' => 1, + 'cardinality' => 1, + 'deleted' => 0, + 'entity_types' => array(), + 'field_name' => 'field_doc', + 'field_permissions' => array( + 'type' => 0, + ), + 'foreign keys' => array( + 'taxonomy_term_data' => array( + 'columns' => array( + 'target_id' => 'tid', + ), + 'table' => 'taxonomy_term_data', + ), + ), + 'indexes' => array( + 'target_id' => array( + 0 => 'target_id', + ), + ), + 'locked' => 0, + 'module' => 'entityreference', + 'settings' => array( + 'entity_translation_sync' => FALSE, + 'handler' => 'views', + 'handler_settings' => array( + 'behaviors' => array( + 'views-select-list' => array( + 'status' => 0, + ), + ), + 'view' => array( + 'args' => array(), + 'display_name' => 'entityreference_1', + 'view_name' => 'actions_filter', + ), + ), + 'target_type' => 'taxonomy_term', + ), + 'translatable' => 0, + 'type' => 'entityreference', + ); + + // Exported field_base: 'field_ecouter' + $field_bases['field_ecouter'] = array( + 'active' => 1, + 'cardinality' => 1, + 'deleted' => 0, + 'entity_types' => array(), + 'field_name' => 'field_ecouter', + 'field_permissions' => array( + 'type' => 0, + ), + 'foreign keys' => array( + 'tid' => array( + 'columns' => array( + 'tid' => 'tid', + ), + 'table' => 'taxonomy_term_data', + ), + ), + 'indexes' => array( + 'tid' => array( + 0 => 'tid', + ), + ), + 'locked' => 0, + 'module' => 'taxonomy', + 'settings' => array( + 'allowed_values' => array( + 0 => array( + 'vocabulary' => 'actions', + 'parent' => 0, + ), + ), + 'entity_translation_sync' => FALSE, + ), + 'translatable' => 0, + 'type' => 'taxonomy_term_reference', + ); + + // Exported field_base: 'field_episodes' + $field_bases['field_episodes'] = array( + 'active' => 1, + 'cardinality' => -1, + 'deleted' => 0, + 'entity_types' => array(), + 'field_name' => 'field_episodes', + 'field_permissions' => array( + 'type' => 0, + ), + 'foreign keys' => array( + 'node' => array( + 'columns' => array( + 'target_id' => 'nid', + ), + 'table' => 'node', + ), + ), + 'indexes' => array( + 'target_id' => array( + 0 => 'target_id', + ), + ), + 'locked' => 0, + 'module' => 'entityreference', + 'settings' => array( + 'entity_translation_sync' => FALSE, + 'handler' => 'base', + 'handler_settings' => array( + 'behaviors' => array( + 'views-select-list' => array( + 'status' => 0, + ), + ), + 'sort' => array( + 'type' => 'none', + ), + 'target_bundles' => array( + 'episode' => 'episode', + ), + ), + 'target_type' => 'node', + ), + 'translatable' => 0, + 'type' => 'entityreference', + ); + + // Exported field_base: 'field_habiter' + $field_bases['field_habiter'] = array( + 'active' => 1, + 'cardinality' => 1, + 'deleted' => 0, + 'entity_types' => array(), + 'field_name' => 'field_habiter', + 'field_permissions' => array( + 'type' => 0, + ), + 'foreign keys' => array( + 'taxonomy_term_data' => array( + 'columns' => array( + 'target_id' => 'tid', + ), + 'table' => 'taxonomy_term_data', + ), + ), + 'indexes' => array( + 'target_id' => array( + 0 => 'target_id', + ), + ), + 'locked' => 0, + 'module' => 'entityreference', + 'settings' => array( + 'entity_translation_sync' => FALSE, + 'handler' => 'base', + 'handler_settings' => array( + 'behaviors' => array( + 'views-select-list' => array( + 'status' => 0, + ), + ), + 'sort' => array( + 'type' => 'none', + ), + 'target_bundles' => array( + 'actions' => 'actions', + ), + ), + 'target_type' => 'taxonomy_term', + ), + 'translatable' => 0, + 'type' => 'entityreference', + ); + + // Exported field_base: 'field_thematique' + $field_bases['field_thematique'] = array( + 'active' => 1, + 'cardinality' => 1, + 'deleted' => 0, + 'entity_types' => array(), + 'field_name' => 'field_thematique', + 'field_permissions' => array( + 'type' => 0, + ), + 'foreign keys' => array( + 'node' => array( + 'columns' => array( + 'target_id' => 'nid', + ), + 'table' => 'node', + ), + ), + 'indexes' => array( + 'target_id' => array( + 0 => 'target_id', + ), + ), + 'locked' => 0, + 'module' => 'entityreference', + 'settings' => array( + 'entity_translation_sync' => FALSE, + 'handler' => 'base', + 'handler_settings' => array( + 'behaviors' => array( + 'views-select-list' => array( + 'status' => 0, + ), + ), + 'sort' => array( + 'type' => 'none', + ), + 'target_bundles' => array( + 'thematique' => 'thematique', + ), + ), + 'target_type' => 'node', + ), + 'translatable' => 0, + 'type' => 'entityreference', + ); + + // Exported field_base: 'field_video' + $field_bases['field_video'] = array( + 'active' => 1, + 'cardinality' => 1, + 'deleted' => 0, + 'entity_types' => array(), + 'field_name' => 'field_video', + 'field_permissions' => array( + 'type' => 0, + ), + 'foreign keys' => array(), + 'indexes' => array( + 'height' => array( + 0 => 'height', + ), + 'width' => array( + 0 => 'width', + ), + ), + 'locked' => 0, + 'module' => 'video_filter_field', + 'settings' => array( + 'entity_translation_sync' => FALSE, + ), + 'translatable' => 0, + 'type' => 'video_filter', + ); + + return $field_bases; +} diff --git a/sites/all/modules/features/clameurs/clameurs.features.field_instance.inc b/sites/all/modules/features/clameurs/clameurs.features.field_instance.inc new file mode 100644 index 00000000..da1e44ba --- /dev/null +++ b/sites/all/modules/features/clameurs/clameurs.features.field_instance.inc @@ -0,0 +1,691 @@ + 'documentair', + 'default_value' => NULL, + 'deleted' => 0, + 'description' => '', + 'display' => array( + 'default' => array( + 'label' => 'hidden', + 'module' => 'text', + 'settings' => array(), + 'type' => 'text_default', + 'weight' => 0, + ), + 'teaser' => array( + 'label' => 'hidden', + 'module' => 'text', + 'settings' => array( + 'trim_length' => 600, + ), + 'type' => 'text_summary_or_trimmed', + 'weight' => 0, + ), + ), + 'entity_type' => 'node', + 'field_name' => 'body', + 'label' => 'Body', + 'required' => FALSE, + 'settings' => array( + 'display_summary' => TRUE, + 'entity_translation_sync' => FALSE, + 'text_processing' => 1, + 'user_register_form' => FALSE, + ), + 'widget' => array( + 'module' => 'text', + 'settings' => array( + 'rows' => 20, + 'summary_rows' => 5, + ), + 'type' => 'text_textarea_with_summary', + 'weight' => 5, + ), + ); + + // Exported field_instance: 'node-documentair-field_description' + $field_instances['node-documentair-field_description'] = array( + 'bundle' => 'documentair', + 'default_value' => NULL, + 'deleted' => 0, + 'description' => '', + 'display' => array( + 'default' => array( + 'label' => 'above', + 'module' => 'text', + 'settings' => array(), + 'type' => 'text_default', + 'weight' => 4, + ), + 'teaser' => array( + 'label' => 'above', + 'settings' => array(), + 'type' => 'hidden', + 'weight' => 0, + ), + ), + 'entity_type' => 'node', + 'field_name' => 'field_description', + 'label' => 'Description', + 'required' => 0, + 'settings' => array( + 'entity_translation_sync' => FALSE, + 'linkit' => array( + 'button_text' => 'Recherche', + 'enable' => 0, + 'profile' => '', + ), + 'text_processing' => 1, + 'user_register_form' => FALSE, + ), + 'widget' => array( + 'active' => 1, + 'module' => 'text', + 'settings' => array( + 'rows' => 5, + ), + 'type' => 'text_textarea', + 'weight' => 7, + ), + ); + + // Exported field_instance: 'node-documentair-field_doc' + $field_instances['node-documentair-field_doc'] = array( + 'bundle' => 'documentair', + 'default_value' => NULL, + 'deleted' => 0, + 'description' => '', + 'display' => array( + 'default' => array( + 'label' => 'above', + 'module' => 'entityreference', + 'settings' => array( + 'link' => FALSE, + ), + 'type' => 'entityreference_label', + 'weight' => 1, + ), + 'teaser' => array( + 'label' => 'above', + 'settings' => array(), + 'type' => 'hidden', + 'weight' => 0, + ), + ), + 'entity_type' => 'node', + 'field_name' => 'field_doc', + 'label' => 'Doc', + 'required' => 0, + 'settings' => array( + 'behaviors' => array( + 'taxonomy-index' => array( + 'status' => TRUE, + ), + ), + 'entity_translation_sync' => FALSE, + 'user_register_form' => FALSE, + ), + 'widget' => array( + 'active' => 1, + 'module' => 'options', + 'settings' => array(), + 'type' => 'options_select', + 'weight' => 1, + ), + ); + + // Exported field_instance: 'node-documentair-field_thematique' + $field_instances['node-documentair-field_thematique'] = array( + 'bundle' => 'documentair', + 'default_value' => NULL, + 'deleted' => 0, + 'description' => '', + 'display' => array( + 'default' => array( + 'label' => 'above', + 'module' => 'entityreference', + 'settings' => array( + 'link' => FALSE, + ), + 'type' => 'entityreference_label', + 'weight' => 3, + ), + 'teaser' => array( + 'label' => 'above', + 'settings' => array(), + 'type' => 'hidden', + 'weight' => 0, + ), + ), + 'entity_type' => 'node', + 'field_name' => 'field_thematique', + 'label' => 'Thématique', + 'required' => 0, + 'settings' => array( + 'entity_translation_sync' => FALSE, + 'user_register_form' => FALSE, + ), + 'widget' => array( + 'active' => 1, + 'module' => 'entityreference', + 'settings' => array( + 'match_operator' => 'CONTAINS', + 'path' => '', + 'size' => 60, + ), + 'type' => 'entityreference_autocomplete', + 'weight' => 2, + ), + ); + + // Exported field_instance: 'node-documentair-field_video' + $field_instances['node-documentair-field_video'] = array( + 'bundle' => 'documentair', + 'default_value' => NULL, + 'deleted' => 0, + 'description' => '', + 'display' => array( + 'default' => array( + 'label' => 'above', + 'module' => 'video_filter_field', + 'settings' => array(), + 'type' => 'video_filter_field_default', + 'weight' => 2, + ), + 'teaser' => array( + 'label' => 'above', + 'settings' => array(), + 'type' => 'hidden', + 'weight' => 0, + ), + ), + 'entity_type' => 'node', + 'field_name' => 'field_video', + 'label' => 'Video', + 'required' => 0, + 'settings' => array( + 'autoplay' => 0, + 'entity_translation_sync' => FALSE, + 'max_height' => 400, + 'max_width' => 400, + 'user_register_form' => FALSE, + ), + 'widget' => array( + 'active' => 0, + 'module' => 'video_filter_field', + 'settings' => array(), + 'type' => 'video_filter', + 'weight' => 6, + ), + ); + + // Exported field_instance: 'node-episode-body' + $field_instances['node-episode-body'] = array( + 'bundle' => 'episode', + 'default_value' => NULL, + 'deleted' => 0, + 'description' => '', + 'display' => array( + 'default' => array( + 'label' => 'hidden', + 'module' => 'text', + 'settings' => array(), + 'type' => 'text_default', + 'weight' => 0, + ), + 'teaser' => array( + 'label' => 'hidden', + 'module' => 'text', + 'settings' => array( + 'trim_length' => 600, + ), + 'type' => 'text_summary_or_trimmed', + 'weight' => 0, + ), + ), + 'entity_type' => 'node', + 'field_name' => 'body', + 'label' => 'Body', + 'required' => FALSE, + 'settings' => array( + 'display_summary' => TRUE, + 'entity_translation_sync' => FALSE, + 'text_processing' => 1, + 'user_register_form' => FALSE, + ), + 'widget' => array( + 'module' => 'text', + 'settings' => array( + 'rows' => 20, + 'summary_rows' => 5, + ), + 'type' => 'text_textarea_with_summary', + 'weight' => 2, + ), + ); + + // Exported field_instance: 'node-episode-field_description' + $field_instances['node-episode-field_description'] = array( + 'bundle' => 'episode', + 'default_value' => NULL, + 'deleted' => 0, + 'description' => '', + 'display' => array( + 'default' => array( + 'label' => 'above', + 'module' => 'text', + 'settings' => array(), + 'type' => 'text_default', + 'weight' => 2, + ), + 'teaser' => array( + 'label' => 'above', + 'settings' => array(), + 'type' => 'hidden', + 'weight' => 0, + ), + ), + 'entity_type' => 'node', + 'field_name' => 'field_description', + 'label' => 'Description', + 'required' => 0, + 'settings' => array( + 'entity_translation_sync' => FALSE, + 'linkit' => array( + 'button_text' => 'Recherche', + 'enable' => 0, + 'profile' => '', + ), + 'text_processing' => 0, + 'user_register_form' => FALSE, + ), + 'widget' => array( + 'active' => 1, + 'module' => 'text', + 'settings' => array( + 'rows' => 5, + ), + 'type' => 'text_textarea', + 'weight' => 4, + ), + ); + + // Exported field_instance: 'node-episode-field_habiter' + $field_instances['node-episode-field_habiter'] = array( + 'bundle' => 'episode', + 'default_value' => NULL, + 'deleted' => 0, + 'description' => '', + 'display' => array( + 'default' => array( + 'label' => 'above', + 'module' => 'entityreference', + 'settings' => array( + 'link' => FALSE, + ), + 'type' => 'entityreference_label', + 'weight' => 3, + ), + 'teaser' => array( + 'label' => 'above', + 'settings' => array(), + 'type' => 'hidden', + 'weight' => 0, + ), + ), + 'entity_type' => 'node', + 'field_name' => 'field_habiter', + 'label' => 'Habiter', + 'required' => 0, + 'settings' => array( + 'behaviors' => array( + 'taxonomy-index' => array( + 'status' => TRUE, + ), + ), + 'entity_translation_sync' => FALSE, + 'user_register_form' => FALSE, + ), + 'widget' => array( + 'active' => 1, + 'module' => 'field_extrawidgets', + 'settings' => array( + 'display_empty' => 0, + 'formatter' => 'entityreference_label', + 'formatter_settings' => array( + 'link' => 0, + ), + ), + 'type' => 'field_extrawidgets_read_only', + 'weight' => 1, + ), + ); + + // Exported field_instance: 'node-episode-field_thematique' + $field_instances['node-episode-field_thematique'] = array( + 'bundle' => 'episode', + 'default_value' => NULL, + 'deleted' => 0, + 'description' => '', + 'display' => array( + 'default' => array( + 'label' => 'above', + 'module' => 'entityreference', + 'settings' => array( + 'link' => FALSE, + ), + 'type' => 'entityreference_label', + 'weight' => 4, + ), + 'teaser' => array( + 'label' => 'above', + 'settings' => array(), + 'type' => 'hidden', + 'weight' => 0, + ), + ), + 'entity_type' => 'node', + 'field_name' => 'field_thematique', + 'label' => 'Thématique', + 'required' => 0, + 'settings' => array( + 'entity_translation_sync' => FALSE, + 'user_register_form' => FALSE, + ), + 'widget' => array( + 'active' => 1, + 'module' => 'entityreference', + 'settings' => array( + 'match_operator' => 'CONTAINS', + 'path' => '', + 'size' => 60, + ), + 'type' => 'entityreference_autocomplete', + 'weight' => 2, + ), + ); + + // Exported field_instance: 'node-episode-field_video' + $field_instances['node-episode-field_video'] = array( + 'bundle' => 'episode', + 'default_value' => NULL, + 'deleted' => 0, + 'description' => '', + 'display' => array( + 'default' => array( + 'label' => 'above', + 'module' => 'video_filter_field', + 'settings' => array(), + 'type' => 'video_filter_field_default', + 'weight' => 1, + ), + 'teaser' => array( + 'label' => 'above', + 'settings' => array(), + 'type' => 'hidden', + 'weight' => 0, + ), + ), + 'entity_type' => 'node', + 'field_name' => 'field_video', + 'label' => 'Video', + 'required' => 0, + 'settings' => array( + 'autoplay' => 0, + 'entity_translation_sync' => FALSE, + 'max_height' => 400, + 'max_width' => 400, + 'user_register_form' => FALSE, + ), + 'widget' => array( + 'active' => 0, + 'module' => 'video_filter_field', + 'settings' => array(), + 'type' => 'video_filter', + 'weight' => 3, + ), + ); + + // Exported field_instance: 'node-thematique-body' + $field_instances['node-thematique-body'] = array( + 'bundle' => 'thematique', + 'default_value' => NULL, + 'deleted' => 0, + 'description' => '', + 'display' => array( + 'default' => array( + 'label' => 'hidden', + 'module' => 'text', + 'settings' => array(), + 'type' => 'text_default', + 'weight' => 0, + ), + 'teaser' => array( + 'label' => 'hidden', + 'module' => 'text', + 'settings' => array( + 'trim_length' => 600, + ), + 'type' => 'text_summary_or_trimmed', + 'weight' => 0, + ), + ), + 'entity_type' => 'node', + 'field_name' => 'body', + 'label' => 'Body', + 'required' => FALSE, + 'settings' => array( + 'display_summary' => TRUE, + 'entity_translation_sync' => FALSE, + 'text_processing' => 1, + 'user_register_form' => FALSE, + ), + 'widget' => array( + 'module' => 'text', + 'settings' => array( + 'rows' => 20, + 'summary_rows' => 5, + ), + 'type' => 'text_textarea_with_summary', + 'weight' => 4, + ), + ); + + // Exported field_instance: 'node-thematique-field_description' + $field_instances['node-thematique-field_description'] = array( + 'bundle' => 'thematique', + 'default_value' => NULL, + 'deleted' => 0, + 'description' => '', + 'display' => array( + 'default' => array( + 'label' => 'above', + 'module' => 'text', + 'settings' => array(), + 'type' => 'text_default', + 'weight' => 2, + ), + 'teaser' => array( + 'label' => 'above', + 'settings' => array(), + 'type' => 'hidden', + 'weight' => 0, + ), + ), + 'entity_type' => 'node', + 'field_name' => 'field_description', + 'label' => 'Description', + 'required' => 0, + 'settings' => array( + 'entity_translation_sync' => FALSE, + 'linkit' => array( + 'button_text' => 'Recherche', + 'enable' => 0, + 'profile' => '', + ), + 'text_processing' => 1, + 'user_register_form' => FALSE, + ), + 'widget' => array( + 'active' => 1, + 'module' => 'text', + 'settings' => array( + 'rows' => 5, + ), + 'type' => 'text_textarea', + 'weight' => 6, + ), + ); + + // Exported field_instance: 'node-thematique-field_ecouter' + $field_instances['node-thematique-field_ecouter'] = array( + 'bundle' => 'thematique', + 'default_value' => NULL, + 'deleted' => 0, + 'description' => '', + 'display' => array( + 'default' => array( + 'label' => 'above', + 'module' => 'taxonomy', + 'settings' => array(), + 'type' => 'taxonomy_term_reference_link', + 'weight' => 5, + ), + 'teaser' => array( + 'label' => 'above', + 'settings' => array(), + 'type' => 'hidden', + 'weight' => 0, + ), + ), + 'entity_type' => 'node', + 'field_name' => 'field_ecouter', + 'label' => 'Écouter', + 'required' => 0, + 'settings' => array( + 'entity_translation_sync' => FALSE, + 'user_register_form' => FALSE, + ), + 'widget' => array( + 'active' => 1, + 'module' => 'field_extrawidgets', + 'settings' => array( + 'display_empty' => 0, + 'formatter' => 'taxonomy_term_reference_plain', + 'formatter_settings' => array(), + ), + 'type' => 'field_extrawidgets_read_only', + 'weight' => 9, + ), + ); + + // Exported field_instance: 'node-thematique-field_episodes' + $field_instances['node-thematique-field_episodes'] = array( + 'bundle' => 'thematique', + 'default_value' => NULL, + 'deleted' => 0, + 'description' => '', + 'display' => array( + 'default' => array( + 'label' => 'above', + 'module' => 'entityreference', + 'settings' => array( + 'link' => FALSE, + ), + 'type' => 'entityreference_label', + 'weight' => 3, + ), + 'teaser' => array( + 'label' => 'above', + 'settings' => array(), + 'type' => 'hidden', + 'weight' => 0, + ), + ), + 'entity_type' => 'node', + 'field_name' => 'field_episodes', + 'label' => 'Épisodes', + 'required' => 0, + 'settings' => array( + 'entity_translation_sync' => FALSE, + 'user_register_form' => FALSE, + ), + 'widget' => array( + 'active' => 1, + 'module' => 'entityreference', + 'settings' => array( + 'match_operator' => 'CONTAINS', + 'path' => '', + 'size' => 60, + ), + 'type' => 'entityreference_autocomplete', + 'weight' => 7, + ), + ); + + // Exported field_instance: 'node-thematique-field_video' + $field_instances['node-thematique-field_video'] = array( + 'bundle' => 'thematique', + 'default_value' => NULL, + 'deleted' => 0, + 'description' => '', + 'display' => array( + 'default' => array( + 'label' => 'above', + 'module' => 'video_filter_field', + 'settings' => array(), + 'type' => 'video_filter_field_default', + 'weight' => 1, + ), + 'teaser' => array( + 'label' => 'above', + 'settings' => array(), + 'type' => 'hidden', + 'weight' => 0, + ), + ), + 'entity_type' => 'node', + 'field_name' => 'field_video', + 'label' => 'Video', + 'required' => 0, + 'settings' => array( + 'autoplay' => 0, + 'entity_translation_sync' => FALSE, + 'max_height' => 400, + 'max_width' => 400, + 'user_register_form' => FALSE, + ), + 'widget' => array( + 'active' => 0, + 'module' => 'video_filter_field', + 'settings' => array(), + 'type' => 'video_filter', + 'weight' => 5, + ), + ); + + // Translatables + // Included for use with string extractors like potx. + t('Body'); + t('Description'); + t('Doc'); + t('Habiter'); + t('Thématique'); + t('Video'); + t('Écouter'); + t('Épisodes'); + + return $field_instances; +} diff --git a/sites/all/modules/features/clameurs/clameurs.features.inc b/sites/all/modules/features/clameurs/clameurs.features.inc new file mode 100644 index 00000000..4f182915 --- /dev/null +++ b/sites/all/modules/features/clameurs/clameurs.features.inc @@ -0,0 +1,51 @@ + "1"); + } + if ($module == "strongarm" && $api == "strongarm") { + return array("version" => "1"); + } +} + +/** + * Implements hook_node_info(). + */ +function clameurs_node_info() { + $items = array( + 'documentair' => array( + 'name' => t('Documentair'), + 'base' => 'node_content', + 'description' => '', + 'has_title' => '1', + 'title_label' => t('Titre'), + 'help' => '', + ), + 'episode' => array( + 'name' => t('Épisode'), + 'base' => 'node_content', + 'description' => '', + 'has_title' => '1', + 'title_label' => t('Titre'), + 'help' => '', + ), + 'thematique' => array( + 'name' => t('Thematique'), + 'base' => 'node_content', + 'description' => '', + 'has_title' => '1', + 'title_label' => t('Titre'), + 'help' => '', + ), + ); + drupal_alter('node_info', $items); + return $items; +} diff --git a/sites/all/modules/features/clameurs/clameurs.features.taxonomy.inc b/sites/all/modules/features/clameurs/clameurs.features.taxonomy.inc new file mode 100644 index 00000000..418f78df --- /dev/null +++ b/sites/all/modules/features/clameurs/clameurs.features.taxonomy.inc @@ -0,0 +1,21 @@ + array( + 'name' => 'Actions', + 'machine_name' => 'actions', + 'description' => '', + 'hierarchy' => 0, + 'module' => 'taxonomy', + 'weight' => 0, + ), + ); +} diff --git a/sites/all/modules/features/clameurs/clameurs.field_group.inc b/sites/all/modules/features/clameurs/clameurs.field_group.inc new file mode 100644 index 00000000..f4d4a541 --- /dev/null +++ b/sites/all/modules/features/clameurs/clameurs.field_group.inc @@ -0,0 +1,291 @@ +disabled = FALSE; /* Edit this to true to make a default field_group disabled initially */ + $field_group->api_version = 1; + $field_group->identifier = 'group_episodes|node|thematique|form'; + $field_group->group_name = 'group_episodes'; + $field_group->entity_type = 'node'; + $field_group->bundle = 'thematique'; + $field_group->mode = 'form'; + $field_group->parent_name = 'group_htabs'; + $field_group->data = array( + 'label' => 'Épisodes', + 'weight' => '9', + 'children' => array( + 0 => 'field_episodes', + ), + 'format_type' => 'htab', + 'format_settings' => array( + 'formatter' => 'closed', + 'instance_settings' => array( + 'description' => '', + 'classes' => 'group-episodes field-group-htab', + 'required_fields' => 1, + 'id' => '', + ), + ), + ); + $export['group_episodes|node|thematique|form'] = $field_group; + + $field_group = new stdClass(); + $field_group->disabled = FALSE; /* Edit this to true to make a default field_group disabled initially */ + $field_group->api_version = 1; + $field_group->identifier = 'group_htabs|node|documentair|form'; + $field_group->group_name = 'group_htabs'; + $field_group->entity_type = 'node'; + $field_group->bundle = 'documentair'; + $field_group->mode = 'form'; + $field_group->parent_name = ''; + $field_group->data = array( + 'label' => 'htabs', + 'weight' => '3', + 'children' => array( + 0 => 'group_texte', + 1 => 'group_video', + ), + 'format_type' => 'htabs', + 'format_settings' => array( + 'formatter' => '', + 'instance_settings' => array( + 'classes' => 'group-htabs field-group-htabs', + ), + ), + ); + $export['group_htabs|node|documentair|form'] = $field_group; + + $field_group = new stdClass(); + $field_group->disabled = FALSE; /* Edit this to true to make a default field_group disabled initially */ + $field_group->api_version = 1; + $field_group->identifier = 'group_htabs|node|episode|form'; + $field_group->group_name = 'group_htabs'; + $field_group->entity_type = 'node'; + $field_group->bundle = 'episode'; + $field_group->mode = 'form'; + $field_group->parent_name = ''; + $field_group->data = array( + 'label' => 'htabs', + 'weight' => '3', + 'children' => array( + 0 => 'group_texte', + 1 => 'group_video', + ), + 'format_type' => 'htabs', + 'format_settings' => array( + 'formatter' => '', + 'instance_settings' => array( + 'classes' => 'group-htabs field-group-htabs', + ), + ), + ); + $export['group_htabs|node|episode|form'] = $field_group; + + $field_group = new stdClass(); + $field_group->disabled = FALSE; /* Edit this to true to make a default field_group disabled initially */ + $field_group->api_version = 1; + $field_group->identifier = 'group_htabs|node|thematique|form'; + $field_group->group_name = 'group_htabs'; + $field_group->entity_type = 'node'; + $field_group->bundle = 'thematique'; + $field_group->mode = 'form'; + $field_group->parent_name = ''; + $field_group->data = array( + 'label' => 'htabs', + 'weight' => '1', + 'children' => array( + 0 => 'group_video', + 1 => 'group_texte', + 2 => 'group_episodes', + ), + 'format_type' => 'htabs', + 'format_settings' => array( + 'formatter' => '', + 'instance_settings' => array( + 'classes' => 'group-htabs field-group-htabs', + ), + ), + ); + $export['group_htabs|node|thematique|form'] = $field_group; + + $field_group = new stdClass(); + $field_group->disabled = FALSE; /* Edit this to true to make a default field_group disabled initially */ + $field_group->api_version = 1; + $field_group->identifier = 'group_texte|node|documentair|form'; + $field_group->group_name = 'group_texte'; + $field_group->entity_type = 'node'; + $field_group->bundle = 'documentair'; + $field_group->mode = 'form'; + $field_group->parent_name = 'group_htabs'; + $field_group->data = array( + 'label' => 'Texte', + 'weight' => '4', + 'children' => array( + 0 => 'body', + ), + 'format_type' => 'htab', + 'format_settings' => array( + 'formatter' => 'closed', + 'instance_settings' => array( + 'description' => '', + 'classes' => 'group-texte field-group-htab', + 'required_fields' => 1, + 'id' => '', + ), + ), + ); + $export['group_texte|node|documentair|form'] = $field_group; + + $field_group = new stdClass(); + $field_group->disabled = FALSE; /* Edit this to true to make a default field_group disabled initially */ + $field_group->api_version = 1; + $field_group->identifier = 'group_texte|node|episode|form'; + $field_group->group_name = 'group_texte'; + $field_group->entity_type = 'node'; + $field_group->bundle = 'episode'; + $field_group->mode = 'form'; + $field_group->parent_name = 'group_htabs'; + $field_group->data = array( + 'label' => 'Texte', + 'weight' => '9', + 'children' => array( + 0 => 'body', + ), + 'format_type' => 'htab', + 'format_settings' => array( + 'formatter' => 'closed', + 'instance_settings' => array( + 'description' => '', + 'classes' => 'group-texte field-group-htab', + 'required_fields' => 1, + 'id' => '', + ), + ), + ); + $export['group_texte|node|episode|form'] = $field_group; + + $field_group = new stdClass(); + $field_group->disabled = FALSE; /* Edit this to true to make a default field_group disabled initially */ + $field_group->api_version = 1; + $field_group->identifier = 'group_texte|node|thematique|form'; + $field_group->group_name = 'group_texte'; + $field_group->entity_type = 'node'; + $field_group->bundle = 'thematique'; + $field_group->mode = 'form'; + $field_group->parent_name = 'group_htabs'; + $field_group->data = array( + 'label' => 'Texte', + 'weight' => '7', + 'children' => array( + 0 => 'body', + ), + 'format_type' => 'fieldset', + 'format_settings' => array( + 'formatter' => 'collapsible', + 'instance_settings' => array( + 'description' => '', + 'classes' => 'group-texte field-group-fieldset', + 'required_fields' => 1, + ), + ), + ); + $export['group_texte|node|thematique|form'] = $field_group; + + $field_group = new stdClass(); + $field_group->disabled = FALSE; /* Edit this to true to make a default field_group disabled initially */ + $field_group->api_version = 1; + $field_group->identifier = 'group_video|node|documentair|form'; + $field_group->group_name = 'group_video'; + $field_group->entity_type = 'node'; + $field_group->bundle = 'documentair'; + $field_group->mode = 'form'; + $field_group->parent_name = 'group_htabs'; + $field_group->data = array( + 'label' => 'Video', + 'weight' => '5', + 'children' => array( + 0 => 'field_video', + 1 => 'field_description', + ), + 'format_type' => 'htab', + 'format_settings' => array( + 'formatter' => 'closed', + 'instance_settings' => array( + 'description' => '', + 'classes' => 'group-video field-group-htab', + 'required_fields' => 1, + 'id' => '', + ), + ), + ); + $export['group_video|node|documentair|form'] = $field_group; + + $field_group = new stdClass(); + $field_group->disabled = FALSE; /* Edit this to true to make a default field_group disabled initially */ + $field_group->api_version = 1; + $field_group->identifier = 'group_video|node|episode|form'; + $field_group->group_name = 'group_video'; + $field_group->entity_type = 'node'; + $field_group->bundle = 'episode'; + $field_group->mode = 'form'; + $field_group->parent_name = 'group_htabs'; + $field_group->data = array( + 'label' => 'Video', + 'weight' => '10', + 'children' => array( + 0 => 'field_video', + 1 => 'field_description', + ), + 'format_type' => 'htab', + 'format_settings' => array( + 'formatter' => 'closed', + 'instance_settings' => array( + 'description' => '', + 'classes' => 'group-video field-group-htab', + 'required_fields' => 1, + 'id' => '', + ), + ), + ); + $export['group_video|node|episode|form'] = $field_group; + + $field_group = new stdClass(); + $field_group->disabled = FALSE; /* Edit this to true to make a default field_group disabled initially */ + $field_group->api_version = 1; + $field_group->identifier = 'group_video|node|thematique|form'; + $field_group->group_name = 'group_video'; + $field_group->entity_type = 'node'; + $field_group->bundle = 'thematique'; + $field_group->mode = 'form'; + $field_group->parent_name = 'group_htabs'; + $field_group->data = array( + 'label' => 'Video', + 'weight' => '8', + 'children' => array( + 0 => 'field_video', + 1 => 'field_description', + ), + 'format_type' => 'htab', + 'format_settings' => array( + 'formatter' => 'closed', + 'instance_settings' => array( + 'description' => '', + 'classes' => 'group-video field-group-htab', + 'required_fields' => 1, + 'id' => '', + ), + ), + ); + $export['group_video|node|thematique|form'] = $field_group; + + return $export; +} diff --git a/sites/all/modules/features/clameurs/clameurs.info b/sites/all/modules/features/clameurs/clameurs.info new file mode 100644 index 00000000..d9fadf6a --- /dev/null +++ b/sites/all/modules/features/clameurs/clameurs.info @@ -0,0 +1,81 @@ +name = Clameurs +core = 7.x +package = Clameurs +dependencies[] = ctools +dependencies[] = entity +dependencies[] = entityreference +dependencies[] = features +dependencies[] = field_extrawidgets +dependencies[] = field_group +dependencies[] = node +dependencies[] = options +dependencies[] = page +dependencies[] = rules +dependencies[] = strongarm +dependencies[] = taxonomy +dependencies[] = text +dependencies[] = video_filter_field +features[ctools][] = field_group:field_group:1 +features[ctools][] = strongarm:strongarm:1 +features[features_api][] = api:2 +features[field_base][] = field_description +features[field_base][] = field_doc +features[field_base][] = field_ecouter +features[field_base][] = field_episodes +features[field_base][] = field_habiter +features[field_base][] = field_thematique +features[field_base][] = field_video +features[field_group][] = group_episodes|node|thematique|form +features[field_group][] = group_htabs|node|documentair|form +features[field_group][] = group_htabs|node|episode|form +features[field_group][] = group_htabs|node|thematique|form +features[field_group][] = group_texte|node|documentair|form +features[field_group][] = group_texte|node|episode|form +features[field_group][] = group_texte|node|thematique|form +features[field_group][] = group_video|node|documentair|form +features[field_group][] = group_video|node|episode|form +features[field_group][] = group_video|node|thematique|form +features[field_instance][] = node-documentair-body +features[field_instance][] = node-documentair-field_description +features[field_instance][] = node-documentair-field_doc +features[field_instance][] = node-documentair-field_thematique +features[field_instance][] = node-documentair-field_video +features[field_instance][] = node-episode-body +features[field_instance][] = node-episode-field_description +features[field_instance][] = node-episode-field_habiter +features[field_instance][] = node-episode-field_thematique +features[field_instance][] = node-episode-field_video +features[field_instance][] = node-thematique-body +features[field_instance][] = node-thematique-field_description +features[field_instance][] = node-thematique-field_ecouter +features[field_instance][] = node-thematique-field_episodes +features[field_instance][] = node-thematique-field_video +features[node][] = documentair +features[node][] = episode +features[node][] = thematique +features[rules_config][] = clameurs_habiter +features[rules_config][] = rules_ecouter +features[rules_config][] = rules_episode_th_matique +features[taxonomy][] = actions +features[variable][] = field_bundle_settings_node__documentair +features[variable][] = field_bundle_settings_node__episode +features[variable][] = field_bundle_settings_node__thematique +features[variable][] = language_content_type_documentair +features[variable][] = language_content_type_episode +features[variable][] = language_content_type_thematique +features[variable][] = menu_options_documentair +features[variable][] = menu_options_episode +features[variable][] = menu_options_thematique +features[variable][] = menu_parent_documentair +features[variable][] = menu_parent_episode +features[variable][] = menu_parent_thematique +features[variable][] = node_options_documentair +features[variable][] = node_options_episode +features[variable][] = node_options_thematique +features[variable][] = node_preview_documentair +features[variable][] = node_preview_episode +features[variable][] = node_preview_thematique +features[variable][] = node_submitted_documentair +features[variable][] = node_submitted_episode +features[variable][] = node_submitted_thematique +project path = sites/all/modules/features diff --git a/sites/all/modules/features/clameurs/clameurs.module b/sites/all/modules/features/clameurs/clameurs.module new file mode 100644 index 00000000..87a87f89 --- /dev/null +++ b/sites/all/modules/features/clameurs/clameurs.module @@ -0,0 +1,7 @@ +disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */ + $strongarm->api_version = 1; + $strongarm->name = 'field_bundle_settings_node__documentair'; + $strongarm->value = array( + 'view_modes' => array(), + 'extra_fields' => array( + 'form' => array( + 'title' => array( + 'weight' => '0', + ), + 'path' => array( + 'weight' => '8', + ), + 'redirect' => array( + 'weight' => '9', + ), + ), + 'display' => array(), + ), + ); + $export['field_bundle_settings_node__documentair'] = $strongarm; + + $strongarm = new stdClass(); + $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */ + $strongarm->api_version = 1; + $strongarm->name = 'field_bundle_settings_node__episode'; + $strongarm->value = array( + 'view_modes' => array(), + 'extra_fields' => array( + 'form' => array( + 'title' => array( + 'weight' => '0', + ), + 'path' => array( + 'weight' => '4', + ), + 'redirect' => array( + 'weight' => '5', + ), + ), + 'display' => array(), + ), + ); + $export['field_bundle_settings_node__episode'] = $strongarm; + + $strongarm = new stdClass(); + $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */ + $strongarm->api_version = 1; + $strongarm->name = 'field_bundle_settings_node__thematique'; + $strongarm->value = array( + 'view_modes' => array(), + 'extra_fields' => array( + 'form' => array( + 'title' => array( + 'weight' => '0', + ), + 'path' => array( + 'weight' => '2', + ), + 'redirect' => array( + 'weight' => '3', + ), + ), + 'display' => array(), + ), + ); + $export['field_bundle_settings_node__thematique'] = $strongarm; + + $strongarm = new stdClass(); + $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */ + $strongarm->api_version = 1; + $strongarm->name = 'language_content_type_documentair'; + $strongarm->value = '0'; + $export['language_content_type_documentair'] = $strongarm; + + $strongarm = new stdClass(); + $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */ + $strongarm->api_version = 1; + $strongarm->name = 'language_content_type_episode'; + $strongarm->value = '0'; + $export['language_content_type_episode'] = $strongarm; + + $strongarm = new stdClass(); + $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */ + $strongarm->api_version = 1; + $strongarm->name = 'language_content_type_thematique'; + $strongarm->value = '0'; + $export['language_content_type_thematique'] = $strongarm; + + $strongarm = new stdClass(); + $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */ + $strongarm->api_version = 1; + $strongarm->name = 'menu_options_documentair'; + $strongarm->value = array(); + $export['menu_options_documentair'] = $strongarm; + + $strongarm = new stdClass(); + $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */ + $strongarm->api_version = 1; + $strongarm->name = 'menu_options_episode'; + $strongarm->value = array(); + $export['menu_options_episode'] = $strongarm; + + $strongarm = new stdClass(); + $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */ + $strongarm->api_version = 1; + $strongarm->name = 'menu_options_thematique'; + $strongarm->value = array(); + $export['menu_options_thematique'] = $strongarm; + + $strongarm = new stdClass(); + $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */ + $strongarm->api_version = 1; + $strongarm->name = 'menu_parent_documentair'; + $strongarm->value = 'main-menu:0'; + $export['menu_parent_documentair'] = $strongarm; + + $strongarm = new stdClass(); + $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */ + $strongarm->api_version = 1; + $strongarm->name = 'menu_parent_episode'; + $strongarm->value = 'main-menu:0'; + $export['menu_parent_episode'] = $strongarm; + + $strongarm = new stdClass(); + $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */ + $strongarm->api_version = 1; + $strongarm->name = 'menu_parent_thematique'; + $strongarm->value = 'main-menu:0'; + $export['menu_parent_thematique'] = $strongarm; + + $strongarm = new stdClass(); + $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */ + $strongarm->api_version = 1; + $strongarm->name = 'node_options_documentair'; + $strongarm->value = array( + 0 => 'status', + ); + $export['node_options_documentair'] = $strongarm; + + $strongarm = new stdClass(); + $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */ + $strongarm->api_version = 1; + $strongarm->name = 'node_options_episode'; + $strongarm->value = array( + 0 => 'status', + ); + $export['node_options_episode'] = $strongarm; + + $strongarm = new stdClass(); + $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */ + $strongarm->api_version = 1; + $strongarm->name = 'node_options_thematique'; + $strongarm->value = array( + 0 => 'status', + ); + $export['node_options_thematique'] = $strongarm; + + $strongarm = new stdClass(); + $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */ + $strongarm->api_version = 1; + $strongarm->name = 'node_preview_documentair'; + $strongarm->value = '0'; + $export['node_preview_documentair'] = $strongarm; + + $strongarm = new stdClass(); + $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */ + $strongarm->api_version = 1; + $strongarm->name = 'node_preview_episode'; + $strongarm->value = '0'; + $export['node_preview_episode'] = $strongarm; + + $strongarm = new stdClass(); + $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */ + $strongarm->api_version = 1; + $strongarm->name = 'node_preview_thematique'; + $strongarm->value = '0'; + $export['node_preview_thematique'] = $strongarm; + + $strongarm = new stdClass(); + $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */ + $strongarm->api_version = 1; + $strongarm->name = 'node_submitted_documentair'; + $strongarm->value = 0; + $export['node_submitted_documentair'] = $strongarm; + + $strongarm = new stdClass(); + $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */ + $strongarm->api_version = 1; + $strongarm->name = 'node_submitted_episode'; + $strongarm->value = 0; + $export['node_submitted_episode'] = $strongarm; + + $strongarm = new stdClass(); + $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */ + $strongarm->api_version = 1; + $strongarm->name = 'node_submitted_thematique'; + $strongarm->value = 0; + $export['node_submitted_thematique'] = $strongarm; + + return $export; +}