From 8e21dda195015a3c9420553f874c10d3ebfa5dfa Mon Sep 17 00:00:00 2001 From: Bharat Mediratta Date: Mon, 3 Jan 2011 20:24:21 -0800 Subject: Complete rewrite of the organize module in Javascript using the Sencha JavaScript library. It's got all the functionality from the Flash version except it doesn't support creating new albums or uploading photos. Only tested in Chrome 10.0.x so far. --- modules/organize/controllers/organize.php | 165 +++++++++++++++++++++++++----- 1 file changed, 139 insertions(+), 26 deletions(-) (limited to 'modules/organize/controllers') diff --git a/modules/organize/controllers/organize.php b/modules/organize/controllers/organize.php index 2b6e4186..35e4cd66 100644 --- a/modules/organize/controllers/organize.php +++ b/modules/organize/controllers/organize.php @@ -18,43 +18,156 @@ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ class Organize_Controller extends Controller { + function frame($album_id) { + $album = ORM::factory("item", $album_id); + access::required("view", $album); + access::required("edit", $album); + + $v = new View("organize_frame.html"); + $v->album = $album; + print $v; + } + function dialog($album_id) { + $album = ORM::factory("item", $album_id); + access::required("view", $album); + access::required("edit", $album); + + $v = new View("organize_dialog.html"); + $v->album = $album; + print $v; + } + + function tree($selected_album_id) { + $root = ORM::factory("item", Input::instance()->post("root_id", 1)); + $selected_album = ORM::factory("item", $selected_album_id); + access::required("view", $root); + access::required("view", $selected_album); + + $tree = $this->_get_tree($root, $selected_album); + json::reply($tree); + } + + function album_info($album_id) { + $album = ORM::factory("item", $album_id); + access::required("view", $album); + + $data = array( + "sort_column" => $album->sort_column, + "sort_order" => $album->sort_order, + "children" => array()); + + foreach ($album->viewable()->children() as $child) { + $dims = $child->scale_dimensions(120); + $data["children"][] = array( + "id" => $child->id, + "thumb_url" => $child->thumb_url(), + "width" => $dims[1], + "height" => $dims[0], + "type" => $child->type, + "title" => $child->title); + } + json::reply($data); + } + + function reparent() { + access::verify_csrf(); + $input = Input::instance(); + $new_parent = ORM::factory("item", $input->post("target_id")); + access::required("edit", $new_parent); + + foreach (explode(",", $input->post("source_ids")) as $source_id) { + $source = ORM::factory("item", $source_id); + access::required("edit", $source->parent()); + + $source->parent_id = $new_parent->id; + $source->save(); + } + json::reply(null); + } + function set_sort($album_id) { + access::verify_csrf(); $album = ORM::factory("item", $album_id); access::required("view", $album); access::required("edit", $album); - $user = identity::active_user(); - $sort_fields = array(); - foreach (album::get_sort_order_options() as $field => $description) { - $sort_fields[$field] = (string)$description; + foreach (array("sort_column", "sort_order") as $key) { + if ($val = Input::instance()->post($key)) { + $album->$key = $val; + } } - $sort_order = array("ASC" => (string)t("Ascending"), "DESC" => (string)t("Descending")); - $file_filter = json_encode(array( - "photo" => array("label" => "Images", "types" => array("*.jpg", "*.jpeg", "*.png", "*.gif")), - "movie" => array("label" => "Movies", "types" => array("*.flv", "*.mp4", "*.m4v")))); + $album->save(); - $v = new View("organize_dialog.html"); - $v->album = $album; - $v->domain = $input->server("HTTP_HOST"); - $v->access_key = rest::access_key(); - $v->file_filter = addslashes($file_filter); - $v->sort_order = addslashes(json_encode($sort_order)); - $v->sort_fields = addslashes(json_encode($sort_fields)); - $v->selected_id = Input::instance()->get("selected_id", null); - $v->rest_uri = url::site("rest") . "/"; - $v->controller_uri = url::site("organize") . "/"; - $v->swf_uri = url::file("modules/organize/lib/Gallery3WebClient.swf?") . - filemtime(MODPATH . "organize/lib/Gallery3WebClient.swf"); - print $v; + json::reply(null); } - function add_album_fields() { - json::reply(array("title" => (string)t("Title"), - "description" => (string)t("Description"), - "name" => (string)t("Directory name"), - "slug" => (string)t("Internet Address"))); + function move_before() { + access::verify_csrf(); + + $input = Input::instance(); + $target = ORM::factory("item", $input->post("target_id")); + $album = $target->parent(); + access::required("edit", $album); + + if ($album->sort_column != "weight") { + // Force all the weights into the current order before changing the order to manual + $weight = 0; + foreach ($album->children() as $child) { + $child->weight = ++$weight; + $child->save(); + } + + $album->sort_column = "weight"; + $album->sort_order = "ASC"; + $album->save(); + } + + $source_ids = explode(",", $input->post("source_ids")); + if ($source_ids) { + // Make a hole the right size + db::build() + ->update("items") + ->set("weight", db::expr("`weight` + " . count($source_ids))) + ->where("parent_id", "=", $album->id) + ->where("weight", ">=", $target->weight) + ->execute(); + + // Move all the source items to the right spots. + for ($i = 0; $i < count($source_ids); $i++) { + $source = ORM::factory("item", $source_ids[$i]); + if ($source->parent_id = $album->id) { + $source->weight = $target->weight + $i; + $source->save(); + } + } + } + json::reply(null); } + private function _get_tree($item, $selected) { + $tree = array(); + $children = $item->viewable() + ->children(null, null, array(array("type", "=", "album"))) + ->as_array(); + foreach ($children as $child) { + $node = array( + "allowChildren" => true, + "editable" => false, + "expandable" => true, + "id" => $child->id, + "leaf" => false, + "text" => $child->title, + "nodeType" => "async"); + + // If the child is in the selected path, open it now. Else, mark it async. + if ($child->contains($selected)) { + $node["children"] = $this->_get_tree($child, $selected); + $node["expanded"] = true; + } + $tree[] = $node; + } + return $tree; + } } -- cgit v1.2.3 From 3a11e0d825d1f7d2698bd5c7b6b812236c7626a3 Mon Sep 17 00:00:00 2001 From: Bharat Mediratta Date: Tue, 4 Jan 2011 22:21:02 -0800 Subject: This was left out of 31652eae44bdd93b45d965a8288a3069e37d1934. --- modules/organize/controllers/organize.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'modules/organize/controllers') diff --git a/modules/organize/controllers/organize.php b/modules/organize/controllers/organize.php index 35e4cd66..18e6054b 100644 --- a/modules/organize/controllers/organize.php +++ b/modules/organize/controllers/organize.php @@ -153,7 +153,8 @@ class Organize_Controller extends Controller { ->as_array(); foreach ($children as $child) { $node = array( - "allowChildren" => true, + "allowDrag" => false, + "allowDrop" => access::can("edit", $child), "editable" => false, "expandable" => true, "id" => $child->id, -- cgit v1.2.3 From 372905bd1310fc446db795661e1eb013674e5a75 Mon Sep 17 00:00:00 2001 From: Bharat Mediratta Date: Wed, 5 Jan 2011 02:00:40 -0800 Subject: Support moving an item before or after the target. --- modules/organize/controllers/organize.php | 11 ++++++++--- modules/organize/css/organize.css | 7 ++++++- modules/organize/views/organize_dialog.html.php | 23 +++++++++++++++++------ 3 files changed, 31 insertions(+), 10 deletions(-) (limited to 'modules/organize/controllers') diff --git a/modules/organize/controllers/organize.php b/modules/organize/controllers/organize.php index 18e6054b..c23d6d61 100644 --- a/modules/organize/controllers/organize.php +++ b/modules/organize/controllers/organize.php @@ -103,7 +103,7 @@ class Organize_Controller extends Controller { json::reply(null); } - function move_before() { + function rearrange() { access::verify_csrf(); $input = Input::instance(); @@ -125,20 +125,25 @@ class Organize_Controller extends Controller { } $source_ids = explode(",", $input->post("source_ids")); + $base_weight = $target->weight; + if ($input->post("relative") == "after") { + $base_weight++; + } + if ($source_ids) { // Make a hole the right size db::build() ->update("items") ->set("weight", db::expr("`weight` + " . count($source_ids))) ->where("parent_id", "=", $album->id) - ->where("weight", ">=", $target->weight) + ->where("weight", ">=", $base_weight) ->execute(); // Move all the source items to the right spots. for ($i = 0; $i < count($source_ids); $i++) { $source = ORM::factory("item", $source_ids[$i]); if ($source->parent_id = $album->id) { - $source->weight = $target->weight + $i; + $source->weight = $base_weight + $i; $source->save(); } } diff --git a/modules/organize/css/organize.css b/modules/organize/css/organize.css index be449138..82de9ad7 100644 --- a/modules/organize/css/organize.css +++ b/modules/organize/css/organize.css @@ -45,11 +45,16 @@ background: #eee; } -.g-organize div.active { +.g-organize div.active-left { border-left: 4px solid #C9D8EB; margin-left: 4px; } +.g-organize div.active-right { + border-right: 4px solid #C9D8EB; + margin-right: 4px; +} + div.multi-proxy div { display: inline-block; } diff --git a/modules/organize/views/organize_dialog.html.php b/modules/organize/views/organize_dialog.html.php index 773e1955..a482fb92 100644 --- a/modules/organize/views/organize_dialog.html.php +++ b/modules/organize/views/organize_dialog.html.php @@ -131,13 +131,22 @@ getTargetFromEvent: function(e) { return e.getTarget("div.thumb", 10); }, - onNodeEnter: function(target, dd, e, data) { - Ext.fly(target).addClass("active"); - }, onNodeOut: function(target, dd, e, data) { - Ext.fly(target).removeClass("active"); + Ext.fly(target).removeClass("active-left"); + Ext.fly(target).removeClass("active-right"); }, onNodeOver: function(target, dd, e, data) { + var target_x = Ext.lib.Dom.getX(target); + var target_center = target_x + (target.offsetWidth / 2); + if (Ext.lib.Event.getPageX(e) < target_center) { + Ext.fly(target).addClass("active-left"); + Ext.fly(target).removeClass("active-right"); + this.drop_side = "before"; + } else { + Ext.fly(target).removeClass("active-left"); + Ext.fly(target).addClass("active-right"); + this.drop_side = "after"; + } return Ext.dd.DropZone.prototype.dropAllowed; }, onNodeDrop: function(target, dd, e, data) { @@ -147,8 +156,9 @@ source_ids.push(Ext.fly(nodes[i]).getAttribute("rel")); } start_busy(for_js() ?>); + target = Ext.fly(target); Ext.Ajax.request({ - url: '', + url: '', method: "post", success: function() { stop_busy(); @@ -161,7 +171,8 @@ }, params: { source_ids: source_ids.join(","), - target_id: Ext.fly(target).getAttribute("rel"), + target_id: target.getAttribute("rel"), + relative: this.drop_side, // calculated in onNodeOver csrf: '' } }); -- cgit v1.2.3 From 2167168f5112fe9337c544578baa51cc5aed7652 Mon Sep 17 00:00:00 2001 From: Bharat Mediratta Date: Wed, 5 Jan 2011 22:32:33 -0800 Subject: Get rid of the expando caret in front of empty folders --- modules/organize/controllers/organize.php | 4 ++-- modules/organize/css/organize.css | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) (limited to 'modules/organize/controllers') diff --git a/modules/organize/controllers/organize.php b/modules/organize/controllers/organize.php index c23d6d61..2ded8a2e 100644 --- a/modules/organize/controllers/organize.php +++ b/modules/organize/controllers/organize.php @@ -161,9 +161,9 @@ class Organize_Controller extends Controller { "allowDrag" => false, "allowDrop" => access::can("edit", $child), "editable" => false, - "expandable" => true, + "expandable" => false, "id" => $child->id, - "leaf" => false, + "leaf" => $child->children_count(array(array("type", "=", "album"))) == 0, "text" => $child->title, "nodeType" => "async"); diff --git a/modules/organize/css/organize.css b/modules/organize/css/organize.css index c14faf8c..be0e0e18 100644 --- a/modules/organize/css/organize.css +++ b/modules/organize/css/organize.css @@ -73,6 +73,10 @@ line-height: 20px; } +.g-organize .x-tree-node-leaf .x-tree-node-icon{ + background-image:url(../vendor/ext/images/default/tree/folder.gif); +} + .loading div { font-size: 1.1em; padding-left: 24px; -- cgit v1.2.3 From 84f287865e5382d7c01c11d1b518c97e8d2bd97b Mon Sep 17 00:00:00 2001 From: Bharat Mediratta Date: Thu, 6 Jan 2011 08:17:01 -0800 Subject: Don't allow moving an item into its own hierarchy. Just silently skip those sources for now. --- modules/organize/controllers/organize.php | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'modules/organize/controllers') diff --git a/modules/organize/controllers/organize.php b/modules/organize/controllers/organize.php index 2ded8a2e..82f74c9e 100644 --- a/modules/organize/controllers/organize.php +++ b/modules/organize/controllers/organize.php @@ -81,6 +81,12 @@ class Organize_Controller extends Controller { $source = ORM::factory("item", $source_id); access::required("edit", $source->parent()); + if ($source->contains($new_parent) || $source->id == $new_parent->id) { + // Can't move an item into its own hierarchy. Silently skip this, + // since the UI shouldn't even allow this operation. + continue; + } + $source->parent_id = $new_parent->id; $source->save(); } -- cgit v1.2.3 From 514d5affa62f5646ecc7843a39b36d4fad3abbd5 Mon Sep 17 00:00:00 2001 From: Bharat Mediratta Date: Thu, 6 Jan 2011 09:49:37 -0800 Subject: When generating the tree, don't mark nodes with no children as a leaf because that confuses the TreeDropZone JS into thinking that it can't ever have children. --- modules/organize/controllers/organize.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'modules/organize/controllers') diff --git a/modules/organize/controllers/organize.php b/modules/organize/controllers/organize.php index 82f74c9e..eb040778 100644 --- a/modules/organize/controllers/organize.php +++ b/modules/organize/controllers/organize.php @@ -169,7 +169,7 @@ class Organize_Controller extends Controller { "editable" => false, "expandable" => false, "id" => $child->id, - "leaf" => $child->children_count(array(array("type", "=", "album"))) == 0, + "leaf" => false, "text" => $child->title, "nodeType" => "async"); @@ -178,6 +178,11 @@ class Organize_Controller extends Controller { $node["children"] = $this->_get_tree($child, $selected); $node["expanded"] = true; } + + if ($child->children_count(array(array("type", "=", "album"))) == 0) { + $node["children"] = array(); + $node["expanded"] = true; + } $tree[] = $node; } return $tree; -- cgit v1.2.3 From 9682b7ea6e2486c2e5dc43799ca215c51dda0baf Mon Sep 17 00:00:00 2001 From: Bharat Mediratta Date: Thu, 6 Jan 2011 09:59:08 -0800 Subject: Remove unnecessary leaf param from TreeNode results. --- modules/organize/controllers/organize.php | 1 - 1 file changed, 1 deletion(-) (limited to 'modules/organize/controllers') diff --git a/modules/organize/controllers/organize.php b/modules/organize/controllers/organize.php index eb040778..cfd385fe 100644 --- a/modules/organize/controllers/organize.php +++ b/modules/organize/controllers/organize.php @@ -169,7 +169,6 @@ class Organize_Controller extends Controller { "editable" => false, "expandable" => false, "id" => $child->id, - "leaf" => false, "text" => $child->title, "nodeType" => "async"); -- cgit v1.2.3 From fc6907dcfe35f2341528620ccedf2db02a30d065 Mon Sep 17 00:00:00 2001 From: Bharat Mediratta Date: Thu, 6 Jan 2011 11:46:15 -0800 Subject: Switch back to setting nodes as leaves, but fix the drop zone code to allow dropping on leaves. --- modules/organize/controllers/organize.php | 6 +----- modules/organize/views/organize_frame.html.php | 7 +++++++ 2 files changed, 8 insertions(+), 5 deletions(-) (limited to 'modules/organize/controllers') diff --git a/modules/organize/controllers/organize.php b/modules/organize/controllers/organize.php index cfd385fe..82f74c9e 100644 --- a/modules/organize/controllers/organize.php +++ b/modules/organize/controllers/organize.php @@ -169,6 +169,7 @@ class Organize_Controller extends Controller { "editable" => false, "expandable" => false, "id" => $child->id, + "leaf" => $child->children_count(array(array("type", "=", "album"))) == 0, "text" => $child->title, "nodeType" => "async"); @@ -177,11 +178,6 @@ class Organize_Controller extends Controller { $node["children"] = $this->_get_tree($child, $selected); $node["expanded"] = true; } - - if ($child->children_count(array(array("type", "=", "album"))) == 0) { - $node["children"] = array(); - $node["expanded"] = true; - } $tree[] = $node; } return $tree; diff --git a/modules/organize/views/organize_frame.html.php b/modules/organize/views/organize_frame.html.php index 13a5ff5c..cfc3933c 100644 --- a/modules/organize/views/organize_frame.html.php +++ b/modules/organize/views/organize_frame.html.php @@ -345,6 +345,13 @@ return returnCls; } + // Override Ext.tree.TreeDropZone.getDropPoint so that it allows dropping + // on any node. The standard function won't let you drop on leaves, but + // in our model we consider an album without sub-albums a leaf. + v.dropZone.getDropPoint = function(e, n, dd) { + return "append"; + } + v.dropZone.onNodeDrop = function(target, dd, e, data) { var nodes = data.nodes; source_ids = []; -- cgit v1.2.3 From 600e04b58cb19c53871e60abfe4a4d9deab6dc1e Mon Sep 17 00:00:00 2001 From: Bharat Mediratta Date: Thu, 6 Jan 2011 12:02:01 -0800 Subject: Lock the drag zone if the album is not editable so that users don't start illegal drags. --- modules/organize/controllers/organize.php | 1 + modules/organize/views/organize_frame.html.php | 5 +++++ 2 files changed, 6 insertions(+) (limited to 'modules/organize/controllers') diff --git a/modules/organize/controllers/organize.php b/modules/organize/controllers/organize.php index 82f74c9e..c53e7f66 100644 --- a/modules/organize/controllers/organize.php +++ b/modules/organize/controllers/organize.php @@ -55,6 +55,7 @@ class Organize_Controller extends Controller { $data = array( "sort_column" => $album->sort_column, "sort_order" => $album->sort_order, + "editable" => access::can("edit", $album), "children" => array()); foreach ($album->viewable()->children() as $child) { diff --git a/modules/organize/views/organize_frame.html.php b/modules/organize/views/organize_frame.html.php index cfc3933c..5516d7d8 100644 --- a/modules/organize/views/organize_frame.html.php +++ b/modules/organize/views/organize_frame.html.php @@ -53,6 +53,11 @@ thumb_data_view.bindStore(store); sort_column_combobox.setValue(album_info.sort_column); sort_order_combobox.setValue(album_info.sort_order); + if (album_info.editable) { + thumb_data_view.dragZone.unlock(); + } else { + thumb_data_view.dragZone.lock(); + } }, failure: show_generic_error }); -- cgit v1.2.3 From 8f5a3fd0c269745e2d540a85bfe54fcde66a6687 Mon Sep 17 00:00:00 2001 From: Bharat Mediratta Date: Sat, 8 Jan 2011 18:45:10 -0800 Subject: Update the dialog title to reflect the album we're currently organizing. --- modules/organize/controllers/organize.php | 1 + modules/organize/views/organize_frame.html.php | 3 +++ 2 files changed, 4 insertions(+) (limited to 'modules/organize/controllers') diff --git a/modules/organize/controllers/organize.php b/modules/organize/controllers/organize.php index c53e7f66..62417525 100644 --- a/modules/organize/controllers/organize.php +++ b/modules/organize/controllers/organize.php @@ -56,6 +56,7 @@ class Organize_Controller extends Controller { "sort_column" => $album->sort_column, "sort_order" => $album->sort_order, "editable" => access::can("edit", $album), + "title" => $album->title, "children" => array()); foreach ($album->viewable()->children() as $child) { diff --git a/modules/organize/views/organize_frame.html.php b/modules/organize/views/organize_frame.html.php index cdbf3be7..d9bb71e5 100644 --- a/modules/organize/views/organize_frame.html.php +++ b/modules/organize/views/organize_frame.html.php @@ -65,6 +65,9 @@ } else { thumb_data_view.dragZone.lock(); } + if (parent.set_title) { + parent.set_title(album_info.title); + } }, failure: show_generic_error }); -- cgit v1.2.3 From 4c80ed53d2a3fa3392d2da61c730b6d30de9f2be Mon Sep 17 00:00:00 2001 From: Bharat Mediratta Date: Sat, 8 Jan 2011 19:27:08 -0800 Subject: Put up a more visually pleasing placeholder for items that are missing a thumbnail. Fixes #1591. --- modules/organize/controllers/organize.php | 2 +- modules/organize/css/organize_frame.css | 14 +++++++++++++- modules/organize/views/organize_frame.html.php | 8 ++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) (limited to 'modules/organize/controllers') diff --git a/modules/organize/controllers/organize.php b/modules/organize/controllers/organize.php index 62417525..bffc52f7 100644 --- a/modules/organize/controllers/organize.php +++ b/modules/organize/controllers/organize.php @@ -63,7 +63,7 @@ class Organize_Controller extends Controller { $dims = $child->scale_dimensions(120); $data["children"][] = array( "id" => $child->id, - "thumb_url" => $child->thumb_url(), + "thumb_url" => $child->has_thumb() ? $child->thumb_url() : null, "width" => $dims[1], "height" => $dims[0], "type" => $child->type, diff --git a/modules/organize/css/organize_frame.css b/modules/organize/css/organize_frame.css index 3f7ce8f6..3f8246a2 100644 --- a/modules/organize/css/organize_frame.css +++ b/modules/organize/css/organize_frame.css @@ -18,6 +18,18 @@ border: 4px solid white; } +.g-organize div.thumb-missing span { + display: block; + background: #eee; + width: 120px; + height: 120px; + padding-top: 8px; + text-align: center; + font: 14px arial, tahoma; + border: 1px solid #ddd; + font-style: italic; +} + .g-organize div.thumb:hover { border: 2px solid #eee; margin: 2px; @@ -65,7 +77,7 @@ } .g-organize label.sort { - font: 12px tahoma, arial; + font: 12px arial, tahoma; vertical-align: middle; font-weight: bold; height: 22px; diff --git a/modules/organize/views/organize_frame.html.php b/modules/organize/views/organize_frame.html.php index 0354fa1d..d8e7920c 100644 --- a/modules/organize/views/organize_frame.html.php +++ b/modules/organize/views/organize_frame.html.php @@ -213,10 +213,18 @@ selectedClass: "selected", tpl: new Ext.XTemplate( '', + '', '
', '', '
', '
', + '
', + '', + '
', + '' + for_js() ?> + '', + '
', + '
', + '
', '
') }); -- cgit v1.2.3 From b78a1319ae10841ff6be00d041b3d8d6967ca7a3 Mon Sep 17 00:00:00 2001 From: Beckett Madden-Woods Date: Sun, 9 Jan 2011 03:59:25 +0000 Subject: Add item delete support to the organize module. Fixes #1588. --- modules/organize/controllers/organize.php | 15 ++++++++ modules/organize/views/organize_frame.html.php | 53 ++++++++++++++++++++++++-- 2 files changed, 65 insertions(+), 3 deletions(-) (limited to 'modules/organize/controllers') diff --git a/modules/organize/controllers/organize.php b/modules/organize/controllers/organize.php index 62417525..4e6178b6 100644 --- a/modules/organize/controllers/organize.php +++ b/modules/organize/controllers/organize.php @@ -159,6 +159,21 @@ class Organize_Controller extends Controller { json::reply(null); } + function delete() { + access::verify_csrf(); + + $input = Input::instance(); + + foreach (explode(",", $input->post("item_ids")) as $item_id) { + $item = ORM::factory("item", $item_id); + if (access::can("edit", $item)) { + $item->delete(); + } + } + + json::reply(null); + } + private function _get_tree($item, $selected) { $tree = array(); $children = $item->viewable() diff --git a/modules/organize/views/organize_frame.html.php b/modules/organize/views/organize_frame.html.php index 0354fa1d..6dfa54d6 100644 --- a/modules/organize/views/organize_frame.html.php +++ b/modules/organize/views/organize_frame.html.php @@ -11,6 +11,13 @@