aboutsummaryrefslogtreecommitdiff
path: root/mod
diff options
context:
space:
mode:
authorCash Costello <cash.costello@gmail.com>2011-10-03 19:02:49 -0700
committerCash Costello <cash.costello@gmail.com>2011-10-03 19:02:49 -0700
commitc1ae08ad43ef1eafbd92fc9526c2fdecbe5c5977 (patch)
treeb458316db9f39b2b0f820952d2a05ffd1ad145a0 /mod
parente1283016e48e2f785442ee8a0d18cd09376d241c (diff)
parent9d5c00c78c0666a31485d870a1e657d4557b23c4 (diff)
downloadelgg-c1ae08ad43ef1eafbd92fc9526c2fdecbe5c5977.tar.gz
elgg-c1ae08ad43ef1eafbd92fc9526c2fdecbe5c5977.tar.bz2
Merge pull request #70 from cash/embed-menu
Fixes #3852, #3854, #3855 Refs #3567 Embed plugin rewrite
Diffstat (limited to 'mod')
-rw-r--r--mod/embed/README.txt238
-rw-r--r--mod/embed/languages/en.php1
-rw-r--r--mod/embed/start.php133
-rw-r--r--mod/embed/views/default/embed/css.php270
-rw-r--r--mod/embed/views/default/embed/embed.php45
-rw-r--r--mod/embed/views/default/embed/item.php39
-rw-r--r--mod/embed/views/default/embed/layout.php30
-rw-r--r--mod/embed/views/default/embed/list.php58
-rw-r--r--mod/embed/views/default/embed/tabs.php40
-rw-r--r--mod/embed/views/default/group/default/embed.php5
-rw-r--r--mod/embed/views/default/js/embed/embed.php47
-rw-r--r--mod/embed/views/default/navigation/menu/embed.php18
-rw-r--r--mod/embed/views/default/object/default/embed.php6
-rw-r--r--mod/embed/views/default/object/file/embed.php16
-rw-r--r--mod/embed/views/default/object/file/embedlist.php11
-rw-r--r--mod/embed/views/default/site/default/embed.php5
-rw-r--r--mod/embed/views/default/user/default/embed.php5
-rw-r--r--mod/file/start.php19
-rw-r--r--mod/file/views/default/embed/file/content.php61
-rw-r--r--mod/file/views/default/embed/file_upload/content.php13
-rw-r--r--mod/file/views/default/icon/object/file.php15
21 files changed, 333 insertions, 742 deletions
diff --git a/mod/embed/README.txt b/mod/embed/README.txt
index 33c9fff65..51b120d96 100644
--- a/mod/embed/README.txt
+++ b/mod/embed/README.txt
@@ -1,198 +1,76 @@
-Embed plugin - Point-and-click embedding using ECML.
+Embed plugin
CONTENTS:
1. Overview
- 2. Extending Embed
- 1. Registering and Populating Embed Sections
- 2. Registering Upload Sections
- 3. Advanced Layouts
- 4. Javascript
- 3. Other Editors and Embed
+ 2. Adding a Tab
+ 3. Populating a Select Tab
+ 4. Populating an Upload Tab
+ 5. Other WYSIWYG Editors and Embed
1. Overview
The Embed plugin is a simple way to allow users to link to or embed
their personal network content or third party resources in any text area.
-
- Embed includes support for the default input/longtext view, but is easily
- extendable to include support for rich text editors like TinyMCE or CK
- Editor.
+ The Embed plugin adds a menu item to the longtext menu. Clicking on this
+ link pops up a lightbox. The lightbox supports lists of content for insertion
+ and uploading new content.
-2. Extending Embed
- The Embed plugin can be extended by other plugins using a combination
- of plugin hooks and specific views.
-
- Plugins can register a new content section or a new upload section.
-
- Plugins can also provide special views for their embed section, if
- they require something the default view doesn't provide.
+2. Adding a Tab
+ The Embed plugin uses the menu system to manage its tabs. Use
+ elgg_register_menu_item() for the embed menu to add a new tab like this:
-2.1 Registering and Populating Embed Sections
- Plugins providing embed content should reply to two hooks: embed_get_sections:all
- and embed_get_items:$section_name.
-
- Embed emits the 'embed_get_sections' hook to populate the tabs of the modal display.
- Plugins supporting embed should reply by pushing an array element to the passed
- $value.
-
- Register plugins hooks like this:
-
- register_plugin_hook('embed_get_sections', 'all', 'my_plugin_embed_get_sections');
-
- function my_plugin_embed_get_sections($hook, $type, $value, $params) {
- $value['videolist'] = array(
- 'name' => elgg_echo('my_plugin'),
- 'layout' => 'list',
- 'icon_size' => 'medium',
- );
-
- return $value;
- }
-
- The index of the returned array is the id used for the Embed section.
-
- Options available in the array value are:
- name => The friendly name to display in the tab
- layout => The layout style to use. Layouts are found in the
- embed/layouts/$layout and embed/item/$layout views.
- Default supported layouts are list and gallery.
- icon_size => The icon size to use for in the item list.
-
-
- Embed emits the 'embed_get_items' hook to populate the embed section. Plugins
- supporting embed should reply by returning an array of ElggEntities, which will
- be formatted by Embed. If you need specific formatting for items, see section 2.3.
-
- register_plugin_hook('embed_get_items', 'videolist', 'videolist_embed_get_items');
-
- function my_plugin_embed_get_items($hook, $type, $value, $params) {
- $options = array(
- 'owner_guid' => get_loggedin_userid(),
- 'type_subtype_pair' => array('object' => 'my_plugin_type'),
- 'count' => TRUE
- );
-
- if ($count = elgg_get_entities($options)) {
- $value['count'] += $count;
-
- unset($options['count']);
- $options['offset'] = $params['offset'];
- $options['limit'] = $params['limit'];
-
- $items = elgg_get_entities($options);
-
- $value['items'] = array_merge($items, $value['items']);
- }
-
- return $value;
- }
-
- Values passed in $params are:
- offset - Offset for entity list.
- limit - Limit for entity list.
- section - The current active section.
- upload_sections - Valid upload sections.
- internal_name - Internal name of the input field
-
- The function should return $value as:
- items - An array of ElggEntities
- count - The count of all available entities to embed
-
- In case other plugins want to mangle the value, be sure to
- check for existing values before appending.
+ $item = ElggMenuItem::factory(array(
+ 'name' => 'file',
+ 'text' => elgg_echo('file'),
+ 'priority' => 10,
+ 'data' => array(
+ 'options' => array(
+ 'type' => 'object',
+ 'subtype' => 'file',
+ ),
+ ),
+ ));
+ elgg_register_menu_item('embed', $item);
+ Parameters:
+ name: The unique name of the tab.
+ text: The text shown on the tab
+ priority: Placement of the tab.
+ data: An array of parameters for creating the tab and its content.
+ When listing content using the embed list view, pass the options for the
+ elgg_list_entities() function as 'options'.
+ When using a custom view for listing content or for uploading new
+ content, pass the view name as 'view'.
+
+ See the file plugin for examples of registering both tab types.
+
+
+3. Populating a Content Select Tab
+ Nothing should be required other than setting the options parameter array
+ when registering the tab. See the view embed/item to see how an entity is
+ rendered.
+
+ If creating a custom list, the <li> elements must have a class of .embed-item.
+ The HTML content that is inserted must use the class .embed-insert.
+
+
+4. Populating an Upload Tab
+ The view that is registered must be defined. It must include a form for
+ uploading the content. The form must .elgg-form-embed. Somewhere in the view
+ must be a hidden input field with the name embed_hidden with its value be
+ the name of the tab to forward the user to when uploading is complete.
+
+ See the view embed/file_upload/content for an example
-2.2 Registering Upload Sections
- Embed includes a special tab, Upload, that allows users to immediatley
- upload a new item. Like the embed sections, plugins can extend this
- to add their own upload form.
-
- Embed emits the embed_get_upload_sections:all hook to populate the
- dropdown in the upload tab. Plugins should respond to this hook
- by returning an array with details about the upload section:
-
- register_plugin_hook('embed_get_upload_sections', 'all', 'my_plugin_embed_get_upload_sections');
-
- function my_plugin_embed_get_upload_sections($hook, $type, $value, $params) {
- $value['my_plugin'] = array(
- 'name' => elgg_echo('my_plugin'),
- 'view' => 'my_plugin/forms/embed_upload'
- );
-
- return $value;
- }
-
- The array index is the ID of the upload section, and the values are:
- name - The friendly name of the upload section
- view - The view to use for the upload section's content
-
- The upload form view should use AJAX to upload a file and return
- the user to the correct section or automatically insert the new upload
- into the text area. See Tidypics as an example.
-
-
-2.3 Advanced Layouts
- By default, Embed will automatically format items returned by
- embed_get_items hooks. If you need special formatting you can
- override both the content and layout views.
-
- Embed looks for a section-specific views before defaulting to built
- in formatting:
- embed/$section/content - The content of the embed section
- including all headers and navigation elements.
- embed/$section/item/$layout - The content of the embed section
- for the specific layout. Inserted
- between navigation elements.
-
- Embed also supports adhoc layouts that can be shared among different plugins.
- To use a specific layout, register the embed section with your own layout
- and create the appropriate layout view:
-
- function my_plugin_embed_get_sections($hook, $type, $value, $params) {
- $value['videolist'] = array(
- 'name' => elgg_echo('my_plugin'),
- 'layout' => 'shared_embed_layout',
- 'icon_size' => 'medium',
- );
-
- return $value;
- }
-
- Create the views 'embed/layouts/shared_embed_layout' and
- 'embed/items/shared_embed_layout.' See the default list and
- gallery layouts as examples.
-
-
-2.4 Javascript
- If you use a custom layout you need to provide a way to insert
- the user's selection into the current editor. Usually this will be
- an onClick event via Javascript. Embed provides a helper function for
- this:
-
- elggEmbedInsertContent(content, textAreaId)
-
- Content is the pre-formatted content to insert into the text area,
- and textAreaId is the name of the text area. This name is
- sent via GET as 'internal_name.'
-
-3. Other Editors and Embed
+5. Other WYSIWYG Editors and Embed
Embed ships with support for the default input/longtext textarea.
- Plugins replacing this view are expected to include Javascript to
+ Plugins replacing this view are expected to include JaVascript to
allow embed to work with the new editors.
- The elggEmbedInsertContent() JS function can be extened for custom
- text editors by extending the embed/custom_insert_js view. Plugins
- should extend this view with javascript code that inserts
- content into the specific text area. Variables available within
- this view are:
- str content The content to insert.
- str textAreaId The name of the textarea to receive the content.
-
- Note: Extend this view; don't override it. It is important to correctly
- extend this view for compatibility across multiple plugins and textarea
- states. Your custom JS should run without error no matter plugin order
- or rich text editor status. See TinyMCE as an example of how to losely
- extend this function. \ No newline at end of file
+ To add custom JavaScript into the Embed plugin's elgg.embed.insert() function,
+ override the view embed/custom_insert_js. The textarea jQuery object is
+ available as the variable textArea and the content to be inserted is the
+ variable content. See the TinyMCE plugin for an example of this view. \ No newline at end of file
diff --git a/mod/embed/languages/en.php b/mod/embed/languages/en.php
index 287d34ca1..6ae99a56f 100644
--- a/mod/embed/languages/en.php
+++ b/mod/embed/languages/en.php
@@ -5,7 +5,6 @@
*/
$english = array(
- 'media:insert' => 'Embed content',
'embed:embed' => 'Embed',
'embed:media' => 'Embed content',
'embed:instructions' => 'Click on any file to embed it into your content.',
diff --git a/mod/embed/start.php b/mod/embed/start.php
index 6c26163e9..015c0c0e4 100644
--- a/mod/embed/start.php
+++ b/mod/embed/start.php
@@ -15,6 +15,7 @@ function embed_init() {
elgg_extend_view('css/elgg', 'embed/css');
elgg_register_plugin_hook_handler('register', 'menu:longtext', 'embed_longtext_menu');
+ elgg_register_plugin_hook_handler('register', 'menu:embed', 'embed_select_tab', 1000);
// Page handler for the modal media embed
elgg_register_page_handler('embed', 'embed_page_handler');
@@ -40,7 +41,7 @@ function embed_longtext_menu($hook, $type, $items, $vars) {
$items[] = ElggMenuItem::factory(array(
'name' => 'embed',
'href' => "embed",
- 'text' => elgg_echo('media:insert'),
+ 'text' => elgg_echo('embed:media'),
'rel' => 'lightbox',
'link_class' => "elgg-longtext-control elgg-lightbox embed-control embed-control-{$vars['id']}",
'priority' => 10,
@@ -54,68 +55,84 @@ function embed_longtext_menu($hook, $type, $items, $vars) {
}
/**
- * Serves pages for upload and embed.
+ * Select the correct embed tab for display
*
- * @param $page
+ * @param string $hook
+ * @param string $type
+ * @param array $items
+ * @param array $vars
*/
-function embed_page_handler($page) {
- if (!isset($page[0])) {
- $page[0] = 'embed';
+function embed_select_tab($hook, $type, $items, $vars) {
+
+ $tab_name = array_pop(explode('/', full_url()));
+ foreach ($items as $item) {
+ if ($item->getName() == $tab_name) {
+ $item->setSelected();
+ elgg_set_config('embed_tab', $item);
+ }
}
- switch ($page[0]) {
- case 'upload':
- echo elgg_view('embed/upload');
- break;
- case 'embed':
- default:
- // trigger hook to get section tabs
- // use views for embed/section/
- // listing
- // item
- // default to embed/listing | item if not found.
-
- // @todo the menu system is good for registering and sorting, but not great for
- // displaying tabs.
- // Pulling in the menu manually and passing it through the embed/tabs view.
- // We should work on making it easier to use tabs through the menu system, then fix
- // this mess.
- $menus = get_config('menus');
- $menu = $menus['embed:sections'];
-
- $sections = array();
- $upload_sections = array();
-
- foreach ($menu as $item) {
- switch ($item->section) {
- case 'upload':
- $upload_sections[$item->getName()] = array(
- 'name' => $item->getText(),
- );
- break;
-
- default:
- $sections[$item->getName()] = array(
- 'name' => $item->getText(),
- );
- break;
- }
- }
-
- $active_section = get_input('active_section', '');
- $active_section = preg_replace('[\W]', '', $active_section);
- $internal_id = get_input('internal_id', '');
- $internal_id = preg_replace('[\W]', '', $internal_id);
-
- echo elgg_view('embed/embed', array(
- 'sections' => $sections,
- 'active_section' => $active_section,
- 'upload_sections' => $upload_sections,
- 'internal_id' => $internal_id
- ));
- break;
+ if (!elgg_get_config('embed_tab') && count($items) > 0) {
+ $items[0]->setSelected();
+ elgg_set_config('embed_tab', $items[0]);
}
+}
+
+/**
+ * Serves the content for the embed lightbox
+ *
+ * @param array $page URL segments
+ */
+function embed_page_handler($page) {
+
+ echo elgg_view('embed/layout');
// exit because this is in a modal display.
exit;
-} \ No newline at end of file
+}
+
+/**
+ * A special listing function for selectable content
+ *
+ * This calls a custom list view for entities.
+ *
+ * @param array $entities Array of ElggEntity objects
+ * @param array $vars Display parameters
+ * @return string
+ */
+function embed_list_items($entities, $vars = array()) {
+
+ $defaults = array(
+ 'items' => $entities,
+ 'list_class' => 'elgg-list-entity',
+ );
+
+ $vars = array_merge($defaults, $vars);
+
+ return elgg_view('embed/list', $vars);
+}
+
+/**
+ * Set the options for the list of embedable content
+ *
+ * @param array $options
+ * @return array
+ */
+function embed_get_list_options($options = array()) {
+
+ if (elgg_get_page_owner_guid()) {
+ $container_guid = elgg_get_page_owner_guid();
+ } else {
+ $container_guid = elgg_get_logged_in_user_guid();
+ }
+
+ $defaults = array(
+ 'limit' => 6,
+ 'container_guid' => $container_guid,
+ 'item_class' => 'embed-item',
+ );
+
+ $options = array_merge($defaults, $options);
+
+ return $options;
+}
diff --git a/mod/embed/views/default/embed/css.php b/mod/embed/views/default/embed/css.php
index 03373da2b..034c0fcfe 100644
--- a/mod/embed/views/default/embed/css.php
+++ b/mod/embed/views/default/embed/css.php
@@ -8,7 +8,7 @@
.embed-wrapper {
width: 730px;
min-height: 400px;
- margin: 15px;
+ margin: 20px 15px;
}
.embed-wrapper h2 {
color: #333333;
@@ -28,270 +28,10 @@
.embed-wrapper p {
color: #333;
}
-.embed-wrapper .elgg-image-block:hover {
- background-color: #eee;
-}
-<?php
-return true;
-?>
-/***************
- Form
-******************/
-/* input field classes */
-.embed-wrapper .elgg-input-text,
-.embed-wrapper .elgg-input-tags {
- font: 120% Arial, Helvetica, sans-serif;
- padding: 5px;
- border: 1px solid #ccc;
- color:#666;
- background-color: white;
-
- -webkit-border-radius: 5px;
- -moz-border-radius: 5px;
- border-radius: 5px;
-
- -webkit-box-shadow: none;
- -moz-box-shadow: none;
- box-shadow: none;
-}
-.embed-wrapper .elgg-input-text:focus,
-.embed-wrapper .elgg-input-tags:focus {
- border: solid 1px #4690d6;
- background: #e4ecf5;
- color:#333;
-}
-.embed-wrapper .elgg-input-file {
- background-color: white;
-}
-
-.embed-wrapper label {
- color:#333;
-}
-
-
-
-
-#facebox {
- position: absolute;
- top: 0;
- left: 0;
- z-index: 10000;
- text-align: left;
-}
-#facebox .popup {
- position: relative;
-}
-#facebox .body {
- padding: 10px 15px 20px 15px;
- background-color: white;
- width: 730px;
- min-height:400px;
-
- -webkit-border-radius: 8px;
- -moz-border-radius: 8px;
- border-radius: 8px;
-}
-#facebox .loading {
- text-align: center;
- padding: 100px 10px 100px 10px;
-}
-#facebox .image {
- text-align: center;
-}
-#facebox .footer {
- float: right;
- width:22px;
- height:22px;
- margin:-4px 0 0 0;
- padding:0;
-}
-#facebox .footer img.close_image {
- background: url(<?php echo elgg_get_site_url(); ?>mod/embed/images/close_button.gif) no-repeat left top;
-}
-#facebox .footer img.close_image:hover {
- background: url(<?php echo elgg_get_site_url(); ?>mod/embed/images/close_button.gif) no-repeat left -31px;
-}
-#facebox_overlay {
- position: fixed;
- top: 0px;
- left: 0px;
- height:100%;
- width:100%;
-}
-.facebox_hide {
- z-index:-100;
-}
-.facebox_overlayBG {
- background-color: #000;
- z-index: 9999;
-}
-* html #facebox_overlay { /* ie6 hack */
- position: absolute;
- height: expression(document.body.scrollHeight > document.body.offsetHeight ? document.body.scrollHeight : document.body.offsetHeight + 'px');
-}
-
-#facebox .body .content h2 {
- color:#333333;
-}
-
-
-/* embeded content links */
-.embeded_file.link {
- display: inline;
- margin-right: 5px;
- padding-left: 14px;
- background-repeat: no-repeat;
-
- -webkit-background-size: 12px 16px;
- -moz-background-size: 12px 16px;
- background-size: 12px 16px;
-}
-
-/* entity listings */
-.embed_data .elgg-image img {
- cursor: pointer;
-}
-.embed_data .elgg-image-block {
- border-bottom:none;
-}
-.embed_modal_videolist .elgg-image img {
- width:75px;
- height:auto;
-}
-.embed_modal_document .embed_data .elgg-body {
- margin-top:0;
- margin-left:7px;
-}
-.embed_modal_tidypics .embed_data .elgg-body {
- margin-top:11px;
+.embed-item {
+ padding-left: 5px;
+ padding-right: 5px;
}
-.embed_modal_file .embed_data .elgg-body {
- margin-top:0px;
- margin-left:9px;
-}
-.embed_data .elgg-body {
- width:auto;
- margin-top:15px;
- margin-left:15px;
-}
-.embed_data .elgg-image-block {
- cursor:pointer;
-}
-
-/* input field classes */
-#facebox .content .elgg-input-text,
-#facebox .content .elgg-input-tags {
- font: 120% Arial, Helvetica, sans-serif;
- padding: 5px;
- border: 1px solid #ccc;
- color:#666;
- background-color: white;
-
- -webkit-border-radius: 5px;
- -moz-border-radius: 5px;
- border-radius: 5px;
-
- -webkit-box-shadow: none;
- -moz-box-shadow: none;
- box-shadow: none;
-}
-#facebox .content .elgg-input-text:focus,
-#facebox .content .elgg-input-tags:focus {
- border: solid 1px #4690d6;
- background: #e4ecf5;
- color:#333;
-}
-#facebox .content .elgg-input-file {
- background-color: white;
-}
-#facebox .content p {
- color:#333;
-}
-#facebox .content p.entity-title {
- color:#666;
-}
-#facebox .content .elgg-image-block:hover {
+.embed-item:hover {
background-color: #eee;
}
-#facebox .content label {
- color:#333;
-}
-
-
-/* ***************************************
- ELGG TABBED PAGE NAVIGATION
-*************************************** */
-#facebox .body .elgg-tabs {
- margin-bottom:5px;
- padding: 0;
- border-bottom: 2px solid #ccc;
- display:table;
- width:100%;
-}
-#facebox .body .elgg-tabs ul {
- list-style: none;
- padding: 0;
- margin: 0;
-}
-#facebox .body .elgg-tabs li {
- float: left;
- border: 2px solid #ccc;
- border-bottom-width: 0;
- background: #eee;
- margin: 0 0 0 10px;
-
- -webkit-border-radius:5px 5px 0 0;
- -moz-border-radius: 5px 5px 0 0;
- border-raidus: 5px 5px 0 0;
-}
-#facebox .body .elgg-tabs a {
- text-decoration: none;
- display: block;
- padding:3px 10px 0 10px;
- text-align: center;
- height:21px;
- color:#999;
-}
-#facebox .body .elgg-tabs a:hover {
- background: #dedede;
- color:#666;
-}
-#facebox .body .elgg-tabs .selected {
- border-color: #ccc;
- background: white;
-}
-#facebox .body .elgg-tabs .selected a {
- position: relative;
- top: 2px;
- background: white;
-}
-
-
-
-/* Pagination (override core elgg css defaults) */
-#facebox .body .pagination {
- float:right;
-}
-#facebox .body .pagination .pagination-number {
- border:1px solid #999;
- color:#666;
-}
-#facebox .body .pagination .pagination-number:hover {
- background-color:#aaa;
- color:black;
-}
-#facebox .body .pagination .pagination-previous,
-#facebox .body .pagination .pagination-next {
- border:1px solid #999;
- color:#666;
-}
-#facebox .body .pagination .pagination-previous:hover,
-#facebox .body .pagination .pagination-next:hover {
- background-color:#aaa;
- color:black;
-}
-#facebox .body .pagination .pagination-currentpage {
- background-color:#666;
- border:1px solid #666;
- color:white;
-} \ No newline at end of file
diff --git a/mod/embed/views/default/embed/embed.php b/mod/embed/views/default/embed/embed.php
deleted file mode 100644
index 2bd329690..000000000
--- a/mod/embed/views/default/embed/embed.php
+++ /dev/null
@@ -1,45 +0,0 @@
-<?php
-/**
- * Embed landing page
- *
- * @todo Yes this is a lot of logic for a view. A good bit of it can be moved
- * to the page handler
- *
- * @uses string $vars['sections'] Array of section_id => Section Display Name
- * @uses string $vars['active_section'] Currently selected section_id
- */
-
-$sections = elgg_extract('sections', $vars, array());
-$active_section = elgg_extract('active_section', $vars, array_shift(array_keys($sections)), false);
-$upload_sections = elgg_extract('upload_sections', $vars, array());
-
-if (!$sections) {
- $content = elgg_echo('embed:no_sections');
-} else {
- $content = elgg_view_title(elgg_echo('embed:media'));
- $content .= elgg_view('embed/tabs', $vars);
-
- $offset = (int)max(0, get_input('offset', 0));
- $limit = (int)get_input('limit', 5);
-
- // find the view to display
- // @todo make it so you don't have to manually create views for each page
- $view = "embed/$active_section/content";
-
- $section_content = elgg_view($view, $vars);
-
- // build the items and layout.
- if ($section_content) {
- $content .= $section_content;
- } else {
- $content .= elgg_echo('embed:no_section_content');
- }
-}
-
-echo '<div class="embed-wrapper">' . $content . '</div>';
-
-if (isset($js)) {
- echo '<script type="text/javascript">';
- echo $js;
- echo '</script>';
-}
diff --git a/mod/embed/views/default/embed/item.php b/mod/embed/views/default/embed/item.php
new file mode 100644
index 000000000..3060de879
--- /dev/null
+++ b/mod/embed/views/default/embed/item.php
@@ -0,0 +1,39 @@
+<?php
+/**
+ * Embeddable content list item view
+ *
+ * @uses $vars['entity'] ElggEntity object
+ */
+
+$entity = $vars['entity'];
+
+$title = $entity->title;
+if (!$title) {
+ $title = $entity->name;
+}
+
+// different entity types have different title attribute names.
+$title = isset($entity->name) ? $entity->name : $entity->title;
+// don't let it be too long
+$title = elgg_get_excerpt($title);
+
+$owner = $entity->getOwnerEntity();
+if ($owner) {
+ $author_text = elgg_echo('byline', array($owner->name));
+ $date = elgg_view_friendly_time($entity->time_created);
+ $subtitle = "$author_text $date";
+} else {
+ $subtitle = '';
+}
+
+$params = array(
+ 'title' => $title,
+ 'entity' => $entity,
+ 'subtitle' => $subtitle,
+ 'tags' => FALSE,
+);
+$body = elgg_view('object/elements/summary', $params);
+
+$image = elgg_view_entity_icon($entity, 'small', array('link_class' => 'embed-insert'));
+
+echo elgg_view_image_block($image, $body);
diff --git a/mod/embed/views/default/embed/layout.php b/mod/embed/views/default/embed/layout.php
new file mode 100644
index 000000000..c1e43f13c
--- /dev/null
+++ b/mod/embed/views/default/embed/layout.php
@@ -0,0 +1,30 @@
+<?php
+/**
+ * Layout of embed panel loaded in lightbox
+ */
+
+$title = elgg_view_title(elgg_echo('embed:media'));
+
+$menu = elgg_view_menu('embed');
+
+$selected = elgg_get_config('embed_tab');
+if ($selected->getData('view')) {
+ $tab = elgg_view($selected->getData('view'), $vars);
+} else {
+ $tab = elgg_list_entities(
+ embed_get_list_options($selected->getData('options')),
+ 'elgg_get_entities',
+ 'embed_list_items'
+ );
+ if (!$tab) {
+ $tab = elgg_echo('embed:no_section_content');
+ }
+}
+
+echo <<<HTML
+<div class="embed-wrapper">
+ $title
+ $menu
+ $tab
+</div>
+HTML;
diff --git a/mod/embed/views/default/embed/list.php b/mod/embed/views/default/embed/list.php
new file mode 100644
index 000000000..c13639cff
--- /dev/null
+++ b/mod/embed/views/default/embed/list.php
@@ -0,0 +1,58 @@
+<?php
+/**
+ * View a list of embeddable items
+ *
+ * @package Elgg
+ *
+ * @uses $vars['items'] Array of ElggEntity objects
+ * @uses $vars['offset'] Index of the first list item in complete list
+ * @uses $vars['limit'] Number of items per page
+ * @uses $vars['count'] Number of items in the complete list
+ *
+ * @uses $vars['list_class'] Additional CSS class for the <ul> element
+ * @uses $vars['item_class'] Additional CSS class for the <li> elements
+ */
+
+$items = $vars['items'];
+$offset = $vars['offset'];
+$limit = $vars['limit'];
+$count = $vars['count'];
+
+$offset_key = elgg_extract('offset_key', $vars, 'offset');
+
+$list_class = 'elgg-list';
+if (isset($vars['list_class'])) {
+ $list_class = "$list_class {$vars['list_class']}";
+}
+
+$item_class = 'elgg-item';
+if (isset($vars['item_class'])) {
+ $item_class = "$item_class {$vars['item_class']}";
+}
+
+$html = "";
+$nav = "";
+
+if ($count) {
+ $nav .= elgg_view('navigation/pagination', array(
+ 'offset' => $offset,
+ 'count' => $count,
+ 'limit' => $limit,
+ 'offset_key' => $offset_key,
+ ));
+}
+
+if (is_array($items) && count($items) > 0) {
+ $html .= "<ul class=\"$list_class\">";
+ foreach ($items as $item) {
+ $id = "elgg-{$item->getType()}-{$item->getGUID()}";
+ $html .= "<li id=\"$id\" class=\"$item_class\">";
+ $html .= elgg_view('embed/item', array('entity' => $item));
+ $html .= '</li>';
+ }
+ $html .= '</ul>';
+}
+
+$html .= $nav;
+
+echo $html;
diff --git a/mod/embed/views/default/embed/tabs.php b/mod/embed/views/default/embed/tabs.php
deleted file mode 100644
index 3f377fee5..000000000
--- a/mod/embed/views/default/embed/tabs.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-/**
- * Embed tabs
- *
- * @uses $vars['sections']
- * @uses $vars['upload_sections']
- * @uses $vars['actibe_section']
- */
-
-$sections = elgg_extract('sections', $vars, array());
-$active_section = elgg_extract('active_section', $vars, array_shift(array_keys($sections)));
-$upload_sections = elgg_extract('upload_sections', $vars, array());
-
-$tabs = array();
-foreach ($sections as $section_id => $section_info) {
- $tab = array(
- 'title' => $section_info['name'],
- 'url' => '#',
- 'url_class' => 'embed-section',
- 'url_id' => $section_id,
- );
-
- if ($section_id == $active_section) {
- $tab['selected'] = TRUE;
- }
- $tabs[] = $tab;
-}
-
-// make sure upload is always the last tab
-if ($upload_sections) {
- $tabs[] = array(
- 'title' => elgg_echo('embed:upload'),
- 'url' => '#',
- 'url_class' => 'embed-section',
- 'url_id' => 'upload',
- 'selected' => ($active_section == 'upload')
- );
-}
-
-echo elgg_view('navigation/tabs', array('tabs' => $tabs));
diff --git a/mod/embed/views/default/group/default/embed.php b/mod/embed/views/default/group/default/embed.php
deleted file mode 100644
index bf51f0a7d..000000000
--- a/mod/embed/views/default/group/default/embed.php
+++ /dev/null
@@ -1,5 +0,0 @@
-<?php
- if ($vars['entity'] instanceof ElggGroup) {
- echo '<a href="'. $vars['entity']->getURL() .'">' . $vars['entity']->name . '</a>';
- }
-?> \ No newline at end of file
diff --git a/mod/embed/views/default/js/embed/embed.php b/mod/embed/views/default/js/embed/embed.php
index e9e08f9a0..3126e12f7 100644
--- a/mod/embed/views/default/js/embed/embed.php
+++ b/mod/embed/views/default/js/embed/embed.php
@@ -1,10 +1,9 @@
-//<script>
elgg.provide('elgg.embed');
elgg.embed.init = function() {
// inserts the embed content into the textarea
- $(".embed_data").live('click', elgg.embed.insert);
+ $(".embed-item").live('click', elgg.embed.insert);
// caches the current textarea id
$(".embed-control").live('click', function() {
@@ -15,28 +14,36 @@ elgg.embed.init = function() {
});
// special pagination helper for lightbox
- $('.embed-wrapper .elgg-pagination a').live('click', elgg.embed.pagination);
+ $('.embed-wrapper .elgg-pagination a').live('click', elgg.embed.forward);
- $('.embed-section').live('click', elgg.embed.loadTab);
+ $('.embed-section').live('click', elgg.embed.forward);
- $('.embed-upload .elgg-form').live('submit', elgg.embed.submit);
+ $('.elgg-form-embed').live('submit', elgg.embed.submit);
}
/**
* Inserts data attached to an embed list item in textarea
*
- * @todo generalize lightbox closing and wysiwyg refreshing
+ * @todo generalize lightbox closing
*
* @param {Object} event
* @return void
*/
elgg.embed.insert = function(event) {
var textAreaId = elgg.embed.textAreaId;
+ var textArea = $('#' + textAreaId);
- var content = $(this).data('embed_code');
- $('#' + textAreaId).val($('#' + textAreaId).val() + ' ' + content + ' ');
+ // generalize this based on a css class attached to what should be inserted
+ var content = ' ' + $(this).find(".embed-insert").parent().html() + ' ';
+
+ textArea.val(textArea.val() + content);
+ textArea.focus();
+
+<?php
+// See the TinyMCE plugin for an example of this view
+ echo elgg_view('embed/custom_insert_js');
+?>
- <?php echo elgg_view('embed/custom_insert_js'); ?>
$.fancybox.close();
@@ -67,9 +74,8 @@ elgg.embed.submit = function(event) {
elgg.system_message(response.system_messages.success);
}
if (response.status >= 0) {
- // @todo - really this should forward to what the registered defined
- // For example, forward to images tab if an image was uploaded
- var url = elgg.config.wwwroot + 'embed/embed?active_section=file';
+ var forward = $('input[name=embed_forward]').val();
+ var url = elgg.normalize_url('embed/tab/' + forward);
$('.embed-wrapper').parent().load(url);
}
}
@@ -82,27 +88,14 @@ elgg.embed.submit = function(event) {
}
/**
- * Loads the next chunk of content within the lightbox
+ * Loads content within the lightbox
*
* @param {Object} event
* @return void
*/
-elgg.embed.pagination = function(event) {
+elgg.embed.forward = function(event) {
$('.embed-wrapper').parent().load($(this).attr('href'));
event.preventDefault();
}
-/**
- * Loads an embed tab
- *
- * @param {Object} event
- * @return void
- */
-elgg.embed.loadTab = function(event) {
- var section = $(this).attr('id');
- var url = elgg.config.wwwroot + 'embed/embed?active_section=' + section;
- $('.embed-wrapper').parent().load(url);
- event.preventDefault();
-}
-
elgg.register_hook_handler('init', 'system', elgg.embed.init);
diff --git a/mod/embed/views/default/navigation/menu/embed.php b/mod/embed/views/default/navigation/menu/embed.php
new file mode 100644
index 000000000..1a6a18f05
--- /dev/null
+++ b/mod/embed/views/default/navigation/menu/embed.php
@@ -0,0 +1,18 @@
+<?php
+/**
+ * Embed tabs
+ *
+ * @uses $vars['menu']['default']
+ */
+
+$tabs = array();
+foreach ($vars['menu']['default'] as $menu_item) {
+ $tabs[] = array(
+ 'title' => $menu_item->getText(),
+ 'url' => 'embed/tab/' . $menu_item->getName(),
+ 'url_class' => 'embed-section',
+ 'selected' => $menu_item->getSelected(),
+ );
+}
+
+echo elgg_view('navigation/tabs', array('tabs' => $tabs));
diff --git a/mod/embed/views/default/object/default/embed.php b/mod/embed/views/default/object/default/embed.php
deleted file mode 100644
index aca2ceea1..000000000
--- a/mod/embed/views/default/object/default/embed.php
+++ /dev/null
@@ -1,6 +0,0 @@
-<?php
-
-if ($vars['entity'] instanceof ElggObject) {
- $title = htmlspecialchars($vars['entity']->title, ENT_QUOTES);
- echo "<a href=\"{$vars['entity']->getURL()}\">$title</a>";
-}
diff --git a/mod/embed/views/default/object/file/embed.php b/mod/embed/views/default/object/file/embed.php
deleted file mode 100644
index b93c46e5e..000000000
--- a/mod/embed/views/default/object/file/embed.php
+++ /dev/null
@@ -1,16 +0,0 @@
-<?php
- $mime = $vars['entity']->mimetype;
-
- if (elgg_view_exists('file/specialcontent/' . $mime)) {
- $content = elgg_view('file/specialcontent/' . $mime, $vars);
- } else if (elgg_view_exists("file/specialcontent/" . substr($mime,0,strpos($mime,'/')) . "/default")) {
- $content = elgg_view("file/specialcontent/" . substr($mime,0,strpos($mime,'/')) . "/default", $vars);
- }
-
- if (empty($content) || substr_count(strtolower($content),'<embed') || substr_count(strtolower($content),'<object') || substr_count(strtolower($content),'<script')) {
- echo elgg_view('object/default/embed',$vars);
- } else {
- echo $content;
- }
-
-?> \ No newline at end of file
diff --git a/mod/embed/views/default/object/file/embedlist.php b/mod/embed/views/default/object/file/embedlist.php
deleted file mode 100644
index 5a3163e4c..000000000
--- a/mod/embed/views/default/object/file/embedlist.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
- $file = $vars['entity'];
- $friendlytime = elgg_view_friendly_time($vars['entity']->time_created);
-
- $info = "<p class='entity-title'> <a href=\"{$file->getURL()}\">{$file->title}</a></p>";
- $info .= "<p class='elgg-subtitle'>{$friendlytime}";
- $icon = "<a href=\"{$file->getURL()}\">" . elgg_view("file/icon", array("mimetype" => $file->mimetype, 'thumbnail' => $file->thumbnail, 'file_guid' => $file->guid, 'size' => 'small')) . "</a>";
-?>
-<div id="embed_entity_<?php echo $file->guid; ?>">
- <?php echo elgg_view_image_block($icon, $info); ?>
-</div>
diff --git a/mod/embed/views/default/site/default/embed.php b/mod/embed/views/default/site/default/embed.php
deleted file mode 100644
index 2e8920a9a..000000000
--- a/mod/embed/views/default/site/default/embed.php
+++ /dev/null
@@ -1,5 +0,0 @@
-<?php
- if ($vars['entity'] instanceof ElggSite) {
- echo '<a href="'. $vars['entity']->getURL() .'">' . $vars['entity']->name . '</a>';
- }
-?> \ No newline at end of file
diff --git a/mod/embed/views/default/user/default/embed.php b/mod/embed/views/default/user/default/embed.php
deleted file mode 100644
index df538c94c..000000000
--- a/mod/embed/views/default/user/default/embed.php
+++ /dev/null
@@ -1,5 +0,0 @@
-<?php
- if ($vars['entity'] instanceof ElggUser) {
- echo '<a href="'. $vars['entity']->getURL() .'">' . $vars['entity']->name . '</a>';
- }
-?> \ No newline at end of file
diff --git a/mod/file/start.php b/mod/file/start.php
index 749d7a519..843ae0794 100644
--- a/mod/file/start.php
+++ b/mod/file/start.php
@@ -61,19 +61,26 @@ function file_init() {
$item = ElggMenuItem::factory(array(
'name' => 'file',
'text' => elgg_echo('file'),
- 'href' => '#',
- 'section' => 'select'
+ 'priority' => 10,
+ 'data' => array(
+ 'options' => array(
+ 'type' => 'object',
+ 'subtype' => 'file',
+ ),
+ ),
));
- elgg_register_menu_item('embed:sections', $item);
+ elgg_register_menu_item('embed', $item);
$item = ElggMenuItem::factory(array(
'name' => 'file_upload',
'text' => elgg_echo('file:upload'),
- 'href' => '#',
- 'section' => 'upload'
+ 'priority' => 100,
+ 'data' => array(
+ 'view' => 'embed/file_upload/content',
+ ),
));
- elgg_register_menu_item('embed:sections', $item);
+ elgg_register_menu_item('embed', $item);
}
/**
diff --git a/mod/file/views/default/embed/file/content.php b/mod/file/views/default/embed/file/content.php
deleted file mode 100644
index eadcd1a6d..000000000
--- a/mod/file/views/default/embed/file/content.php
+++ /dev/null
@@ -1,61 +0,0 @@
-<?php
-/**
- * List files available for upload
- */
-
-$active_section = elgg_extract('active_section', $vars);
-
-$options = array(
- 'owner_guid' => elgg_get_logged_in_user_guid(),
- 'type_subtype_pair' => array('object' => 'file'),
- 'count' => true
-);
-
-$count = elgg_get_entities($options);
-
-if ($count) {
- echo "<div class='embed_modal_$active_section'>";
-
- unset($options['count']);
- $items = elgg_get_entities($options);
-
- foreach ($items as $item) {
-
- // different entity types have different title attribute names.
- $title = isset($item->name) ? $item->name : $item->title;
- // don't let it be too long
- $title = elgg_get_excerpt($title);
-
- $author_text = elgg_echo('byline', array($owner->name));
- $date = elgg_view_friendly_time($item->time_created);
-
- $subtitle = "$author_text $date";
-
- $icon = "<img src=\"{$item->getIconURL($icon_size)}\" />";
-
- $embed_code = elgg_view('output/url', array(
- 'href' => $item->getURL(),
- 'title' => $title,
- 'text' => $icon,
- 'encode_text' => FALSE
- ));
-
- $item_icon = elgg_view_entity_icon($item, $icon_size);
-
- $params = array(
- 'title' => $title,
- 'entity' => $item,
- 'subtitle' => $subtitle,
- 'tags' => FALSE,
- );
- $list_body = elgg_view('object/elements/summary', $params);
-
- // @todo JS 1.8: is this approach better than inline js?
- echo "<div class=\"embed_data\" id=\"embed_{$item->getGUID()}\">" . elgg_view_image_block($item_icon, $list_body) . '</div>';
- echo "<script type=\"text/javascript\">
- $('#embed_{$item->getGUID()}').data('embed_code', " . json_encode($embed_code) . ");
- </script>";
- }
-
- echo '</div>';
-} \ No newline at end of file
diff --git a/mod/file/views/default/embed/file_upload/content.php b/mod/file/views/default/embed/file_upload/content.php
index 13c18f745..4d3db0d97 100644
--- a/mod/file/views/default/embed/file_upload/content.php
+++ b/mod/file/views/default/embed/file_upload/content.php
@@ -5,11 +5,12 @@
$form_vars = array(
'enctype' => 'multipart/form-data',
- 'class' => 'elgg-form',
+ 'class' => 'elgg-form-embed',
);
-$upload_content = elgg_view_form('file/upload', $form_vars);
+echo elgg_view_form('file/upload', $form_vars);
-echo "<div class='mbm'>" . elgg_echo('embed:upload_type') . "$input</div>";
-echo "<div class='embed-upload'>";
-echo $upload_content;
-echo "</div>"; \ No newline at end of file
+// the tab we want to be forwarded to after upload is complete
+echo elgg_view('input/hidden', array(
+ 'name' => 'embed_forward',
+ 'value' => 'file',
+)); \ No newline at end of file
diff --git a/mod/file/views/default/icon/object/file.php b/mod/file/views/default/icon/object/file.php
index 6357d418f..7feba7af3 100644
--- a/mod/file/views/default/icon/object/file.php
+++ b/mod/file/views/default/icon/object/file.php
@@ -2,9 +2,10 @@
/**
* File icon view
*
- * @uses $vars['entity'] The entity the icon represents - uses getIconURL() method
- * @uses $vars['size'] topbar, tiny, small, medium (default), large, master
- * @uses $vars['href'] Optional override for link
+ * @uses $vars['entity'] The entity the icon represents - uses getIconURL() method
+ * @uses $vars['size'] topbar, tiny, small, medium (default), large, master
+ * @uses $vars['href'] Optional override for link
+ * @uses $vars['link_class'] Optional CSS class added to img
*/
$entity = $vars['entity'];
@@ -32,10 +33,14 @@ $img_src = elgg_format_url($img_src);
$img = "<img $class src=\"$img_src\" alt=\"$title\" />";
if ($url) {
- echo elgg_view('output/url', array(
+ $params = array(
'href' => $url,
'text' => $img,
- ));
+ );
+ if (isset($vars['link_class'])) {
+ $params['class'] = $vars['link_class'];
+ }
+ echo elgg_view('output/url', $params);
} else {
echo $img;
}