Working on fixing the Pools extension.

This commit is contained in:
green-ponies (jgen) 2012-02-07 23:15:23 -05:00
parent 2d443f0be9
commit 76c6031b04
2 changed files with 73 additions and 61 deletions

View File

@ -1,16 +1,28 @@
<?php <?php
/** /**
* Name: Pools System * Name: Pools System
* Author: Sein Kraft <mail@seinkraft.info> * Author: Sein Kraft <mail@seinkraft.info>, jgen <jgen.tech@gmail.com>
* License: GPLv2 * License: GPLv2
* Description: Allow users to create groups of images * Description: Allow users to create groups of images and order them.
* Documentation: * Documentation: This extension allows users to created named groups of
* images, and order the images within the group.
* Useful for related images like in a comic, etc.
*/ */
/**
* This class is just a wrapper around SCoreException.
*/
class PoolCreationException extends SCoreException { class PoolCreationException extends SCoreException {
var $error;
public function __construct($error) {
$this->error = $error;
}
} }
class Pools extends SimpleExtension { class Pools extends SimpleExtension {
public function onInitExt($event) { public function onInitExt($event) {
global $config, $database; global $config, $database;
@ -67,8 +79,16 @@ class Pools extends SimpleExtension {
public function onPageRequest($event) { public function onPageRequest($event) {
global $config, $page, $user; global $config, $page, $user;
if ($event->page_matches("pool")) {
if($event->page_matches("pool")) { var $pool_id, $pool;
// Check if we have pool id, since this is most often the case.
if (isset($_POST["pool_id"])) {
$pool_id = int_escape($_POST["pool_id"]);
$pool = $this->get_single_pool($pool_id);
}
switch($event->get_arg(0)) { switch($event->get_arg(0)) {
case "list": //index case "list": //index
$this->list_pools($page, int_escape($event->get_arg(1))); $this->list_pools($page, int_escape($event->get_arg(1)));
@ -89,8 +109,8 @@ class Pools extends SimpleExtension {
$page->set_mode("redirect"); $page->set_mode("redirect");
$page->set_redirect(make_link("pool/view/".$newPoolID)); $page->set_redirect(make_link("pool/view/".$newPoolID));
} }
catch(PoolCreationException $pce) { catch(PoolCreationException $e) {
$this->theme->display_error($pce->getMessage()); $this->theme->display_error($e->error);
} }
break; break;
@ -117,8 +137,7 @@ class Pools extends SimpleExtension {
$pools = $this->get_pool($poolID); $pools = $this->get_pool($poolID);
foreach($pools as $pool) { foreach($pools as $pool) {
// if the pool is public and user is logged OR if the user is admin OR the user is the owner if (have_permission($user, $pool)) {
if(($pool['public'] == "Y" && !$user->is_anonymous()) || $user->is_admin() || $user->id == $pool['user_id']) {
$this->theme->edit_pool($page, $this->get_pool($poolID), $this->edit_posts($poolID)); $this->theme->edit_pool($page, $this->get_pool($poolID), $this->edit_posts($poolID));
} else { } else {
$page->set_mode("redirect"); $page->set_mode("redirect");
@ -133,8 +152,7 @@ class Pools extends SimpleExtension {
$pools = $this->get_pool($poolID); $pools = $this->get_pool($poolID);
foreach($pools as $pool) { foreach($pools as $pool) {
//if the pool is public and user is logged OR if the user is admin if (have_permission($user, $pool)) {
if(($pool['public'] == "Y" && !$user->is_anonymous()) || $user->is_admin() || $user->id == $pool['user_id']) {
$this->theme->edit_order($page, $this->get_pool($poolID), $this->edit_order($poolID)); $this->theme->edit_order($page, $this->get_pool($poolID), $this->edit_order($poolID));
} else { } else {
$page->set_mode("redirect"); $page->set_mode("redirect");
@ -143,10 +161,7 @@ class Pools extends SimpleExtension {
} }
} }
else { else {
$pool_id = int_escape($_POST["pool_id"]); if (have_permission($user, $pool)) {
$pool = $this->get_single_pool($pool_id);
if(($pool['public'] == "Y" && !$user->is_anonymous()) || $user->is_admin() || $user->id == $pool['user_id']) {
$this->order_posts(); $this->order_posts();
$page->set_mode("redirect"); $page->set_mode("redirect");
$page->set_redirect(make_link("pool/view/".$pool_id)); $page->set_redirect(make_link("pool/view/".$pool_id));
@ -157,10 +172,7 @@ class Pools extends SimpleExtension {
break; break;
case "import": case "import":
$pool_id = int_escape($_POST["pool_id"]); if (have_permission($user, $pool)) {
$pool = $this->get_single_pool($pool_id);
if(($pool['public'] == "Y" && !$user->is_anonymous()) || $user->is_admin() || $user->id == $pool['user_id']) {
$this->import_posts(); $this->import_posts();
} else { } else {
$this->theme->display_error("Permssion denied."); $this->theme->display_error("Permssion denied.");
@ -168,10 +180,7 @@ class Pools extends SimpleExtension {
break; break;
case "add_posts": case "add_posts":
$pool_id = int_escape($_POST["pool_id"]); if (have_permission($user, $pool)) {
$pool = $this->get_single_pool($pool_id);
if(($pool['public'] == "Y" && !$user->is_anonymous()) || $user->is_admin() || $user->id == $pool['user_id']) {
$this->add_posts(); $this->add_posts();
$page->set_mode("redirect"); $page->set_mode("redirect");
$page->set_redirect(make_link("pool/view/".$pool_id)); $page->set_redirect(make_link("pool/view/".$pool_id));
@ -181,10 +190,7 @@ class Pools extends SimpleExtension {
break; break;
case "remove_posts": case "remove_posts":
$pool_id = int_escape($_POST["pool_id"]); if (have_permission($user, $pool)) {
$pool = $this->get_single_pool($pool_id);
if(($pool['public'] == "Y" && !$user->is_anonymous()) || $user->is_admin() || $user->id == $pool['user_id']) {
$this->remove_posts(); $this->remove_posts();
$page->set_mode("redirect"); $page->set_mode("redirect");
$page->set_redirect(make_link("pool/view/".$pool_id)); $page->set_redirect(make_link("pool/view/".$pool_id));
@ -195,11 +201,8 @@ class Pools extends SimpleExtension {
break; break;
case "nuke": case "nuke":
$pool_id = int_escape($_POST['pool_id']); // only admins and owners may do this
$pool = $this->get_single_pool($pool_id); if($user->is_admin() || $user->id == $pool['user_id']) {
// only admins and owners may do this
if($user->is_admin() || $user->id == $pool['user_id']) {
$this->nuke_pool($pool_id); $this->nuke_pool($pool_id);
$page->set_mode("redirect"); $page->set_mode("redirect");
$page->set_redirect(make_link("pool/list")); $page->set_redirect(make_link("pool/list"));
@ -257,7 +260,24 @@ class Pools extends SimpleExtension {
} }
} }
/* ------------------------------------------------- */
/* -------------- Private Functions -------------- */
/* ------------------------------------------------- */
/**
* Check if the given user has permission to edit/change the pool.
* @retval bool
*/
private function have_permission($user, $pool) {
// If the pool is public and user is logged OR if the user is admin OR if the pool is owned by the user.
if ( (($pool['public'] == "Y" || $pool['public'] == "y") && !$user->is_anonymous()) || $user->is_admin() || $user->id == $pool['user_id'])
{
return true;
} else {
return false;
}
}
/* /*
* HERE WE GET THE LIST OF POOLS * HERE WE GET THE LIST OF POOLS
*/ */
@ -420,7 +440,7 @@ class Pools extends SimpleExtension {
$count = $database->get_one("SELECT COUNT(*) FROM pool_images WHERE pool_id=:pid", array("pid"=>$poolID)); $count = $database->get_one("SELECT COUNT(*) FROM pool_images WHERE pool_id=:pid", array("pid"=>$poolID));
$this->add_history($poolID, 0, $images, $count); $this->add_history($poolID, 0, $images, $count);
return $poolID; return $poolID;
} }

View File

@ -1,7 +1,8 @@
<?php <?php
class PoolsTheme extends Themelet { class PoolsTheme extends Themelet {
/* /**
* HERE WE ADD THE POOL INFO ON IMAGE * Adds a block to the panel with information on the pool(s) the image is in.
*/ */
public function pool_info($linksPools) { public function pool_info($linksPools) {
global $page; global $page;
@ -60,7 +61,6 @@ class PoolsTheme extends Themelet {
$html .= "</tbody></table>"; $html .= "</tbody></table>";
$nav_html = " $nav_html = "
<a href=".make_link().">Index</a> <a href=".make_link().">Index</a>
<br><a href=".make_link("pool/new").">Create Pool</a> <br><a href=".make_link("pool/new").">Create Pool</a>
@ -154,9 +154,7 @@ class PoolsTheme extends Themelet {
$pool_images = ''; $pool_images = '';
foreach($images as $image) { foreach($images as $image) {
$thumb_html = $this->build_thumb_html($image); $thumb_html = $this->build_thumb_html($image);
$pool_images .= '<span class="thumb">'. $pool_images .= "\n".$thumb_html."\n";
'<a href="$image_link">'.$thumb_html.'</a>'.
'</span>';
} }
$page->add_block(new Block("Viewing Posts", $pool_images, "main", 30)); $page->add_block(new Block("Viewing Posts", $pool_images, "main", 30));
@ -172,17 +170,17 @@ class PoolsTheme extends Themelet {
$editor = " $editor = "
".make_form(make_link("pool/import"))." ".make_form(make_link("pool/import"))."
<input type='text' name='pool_tag' id='edit' value='Please enter a tag' onclick='this.value=\"\";'/> <input type='text' name='pool_tag' id='edit_pool_tag' value='Please enter a tag' onclick='this.value=\"\";'/>
<input type='submit' name='edit' id='edit' value='Import'/> <input type='submit' name='edit' id='edit_pool_import_btn' value='Import'/>
<input type='hidden' name='pool_id' value='".$pool['id']."'> <input type='hidden' name='pool_id' value='".$pool['id']."'>
</form> </form>
<form method='GET' action='".make_link("pool/edit/".$pool['id'])."'> <form method='GET' action='".make_link("pool/edit/".$pool['id'])."'>
<input type='submit' name='edit' id='edit' value='Edit Pool'/> <input type='submit' name='edit' id='edit_pool_btn' value='Edit Pool'/>
</form> </form>
<form method='GET' action='".make_link("pool/order/".$pool['id'])."'> <form method='GET' action='".make_link("pool/order/".$pool['id'])."'>
<input type='submit' name='edit' id='edit' value='Order Pool'/> <input type='submit' name='edit' id='edit_pool_order_btn' value='Order Pool'/>
</form> </form>
"; ";
@ -195,7 +193,7 @@ class PoolsTheme extends Themelet {
</script> </script>
".make_form(make_link("pool/nuke"))." ".make_form(make_link("pool/nuke"))."
<input type='submit' name='delete' id='delete' value='Delete Pool' onclick='return confirm_action()' /> <input type='submit' name='delete' id='delete_pool_btn' value='Delete Pool' onclick='return confirm_action()' />
<input type='hidden' name='pool_id' value='".$pool['id']."'> <input type='hidden' name='pool_id' value='".$pool['id']."'>
</form> </form>
"; ";
@ -225,6 +223,7 @@ class PoolsTheme extends Themelet {
* HERE WE DISPLAY THE RESULT OF THE SEARCH ON IMPORT * HERE WE DISPLAY THE RESULT OF THE SEARCH ON IMPORT
*/ */
public function pool_result(Page $page, $images, $pool_id) { public function pool_result(Page $page, $images, $pool_id) {
// TODO: this could / should be done using jQuery
$pool_images = " $pool_images = "
<script language='JavaScript' type='text/javascript'> <script language='JavaScript' type='text/javascript'>
function setAll(value) { function setAll(value) {
@ -247,14 +246,12 @@ class PoolsTheme extends Themelet {
foreach($images as $image) { foreach($images as $image) {
$thumb_html = $this->build_thumb_html($image); $thumb_html = $this->build_thumb_html($image);
$pool_images .= '<span class="thumb">'. $pool_images .= '<span class="thumb">'. $thumb_html .'<br>'.
'<a href="$image_link">'.$thumb_html.'</a>'.
'<br>'.
'<input name="check[]" type="checkbox" value="'.$image->id.'" />'. '<input name="check[]" type="checkbox" value="'.$image->id.'" />'.
'</span>'; '</span>';
} }
$pool_images .= "<br>". $pool_images .= "<br>".
"<input type='submit' name='edit' id='edit' value='Add Selected' onclick='return confirm_action()'/>". "<input type='submit' name='edit' id='edit_pool_add_btn' value='Add Selected' onclick='return confirm_action()'/>".
"<input type='hidden' name='pool_id' value='".$pool_id."'>". "<input type='hidden' name='pool_id' value='".$pool_id."'>".
"</form>"; "</form>";
@ -278,13 +275,12 @@ class PoolsTheme extends Themelet {
$this->display_top($pools, "Sorting Pool"); $this->display_top($pools, "Sorting Pool");
$pool_images = "<form action='".make_link("pool/order")."' method='POST' name='checks'>"; $pool_images = "\n<form action='".make_link("pool/order")."' method='POST' name='checks'>";
$n = 0; $n = 0;
foreach($images as $pair) { foreach($images as $pair) {
$image = $pair[0]; $image = $pair[0];
$thumb_html = $this->build_thumb_html($image); $thumb_html = $this->build_thumb_html($image);
$pool_images .= '<span class="thumb">'. $pool_images .= '<span class="thumb">'."\n".$thumb_html."\n".
'<a href="$image_link">'.$thumb_html.'</a>'.
'<br><input name="imgs['.$n.'][]" type="text" style="max-width:50px;" value="'.$image->image_order.'" />'. '<br><input name="imgs['.$n.'][]" type="text" style="max-width:50px;" value="'.$image->image_order.'" />'.
'<input name="imgs['.$n.'][]" type="hidden" value="'.$image->id.'" />'. '<input name="imgs['.$n.'][]" type="hidden" value="'.$image->id.'" />'.
'</span>'; '</span>';
@ -292,7 +288,7 @@ class PoolsTheme extends Themelet {
} }
$pool_images .= "<br>". $pool_images .= "<br>".
"<input type='submit' name='edit' id='edit' value='Order'/>". "<input type='submit' name='edit' id='edit_pool_order' value='Order'/>".
"<input type='hidden' name='pool_id' value='".$pools[0]['id']."'>". "<input type='hidden' name='pool_id' value='".$pools[0]['id']."'>".
"</form>"; "</form>";
@ -310,24 +306,20 @@ class PoolsTheme extends Themelet {
$this->display_top($pools, "Editing Pool", true); $this->display_top($pools, "Editing Pool", true);
$pool_images = " $pool_images = "\n<form action='".make_link("pool/remove_posts")."' method='POST' name='checks'>";
";
$pool_images = "<form action='".make_link("pool/remove_posts")."' method='POST' name='checks'>";
foreach($images as $pair) { foreach($images as $pair) {
$image = $pair[0]; $image = $pair[0];
$thumb_html = $this->build_thumb_html($image); $thumb_html = $this->build_thumb_html($image);
$pool_images .= '<span class="thumb">'. $pool_images .= '<span class="thumb">'."\n".$thumb_html."\n".
'<a href="$image_link">'.$thumb_html.'</a>'.
'<br><input name="check[]" type="checkbox" value="'.$image->id.'" />'. '<br><input name="check[]" type="checkbox" value="'.$image->id.'" />'.
'</span>'; '</span>';
} }
$pool_images .= "<br>". $pool_images .= "<br>".
"<input type='submit' name='edit' id='edit' value='Remove Selected'/>". "<input type='submit' name='edit' id='edit_pool_remove_sel' value='Remove Selected'/>".
"<input type='hidden' name='pool_id' value='".$pools[0]['id']."'>". "<input type='hidden' name='pool_id' value='".$pools[0]['id']."'>".
"</form>"; "</form>";
@ -392,8 +384,8 @@ class PoolsTheme extends Themelet {
} }
/* /**
* HERE WE DISPLAY THE ERROR * Display an error message to the user.
*/ */
public function display_error($errMessage) { public function display_error($errMessage) {
global $page; global $page;