finally got storyline category shuffling working

This commit is contained in:
John Bintz 2009-07-13 21:21:53 -04:00
parent ef1077b3d4
commit 0bd7e17299
4 changed files with 172 additions and 15 deletions

View File

@ -205,6 +205,69 @@ class ComicPressAddonCore extends ComicPressAddon {
return $nodes_with_statuses;
}
function move_storyline_category_order($category, $direction) {
for ($i = 0, $il = count($this->comicpress->category_tree); $i < $il; ++$i) {
$node = $this->comicpress->category_tree[$i];
$parts = explode("/", $node);
$parts_count = count($parts);
if (end($parts) == $category) {
$current_node_index = $i;
$target_index = null;
do {
$current_node_index += $direction;
if (isset($this->comicpress->category_tree[$current_node_index])) {
$current_parts_count = count(explode("/", $this->comicpress->category_tree[$current_node_index]));
if ($current_parts_count == $parts_count) { $target_index = $current_node_index; break; }
if ($current_parts_count < $parts_count) { break; }
}
} while (isset($this->comicpress->category_tree[$current_node_index]));
if (!is_null($target_index)) {
$end_i_index = $i;
do {
$end_i_index++;
if (isset($this->comicpress->category_tree[$end_i_index])) {
if (strpos($this->comicpress->category_tree[$end_i_index], $node) !== 0) {
break;
}
}
} while (isset($this->comicpress->category_tree[$end_i_index]));
$new_order = $this->comicpress->category_tree;
$target_index_node = $new_order[$target_index];
$move = array_splice($new_order, $i, $end_i_index - $i);
$target = array_search($target_index_node, $new_order);
$prefix = array_splice($new_order, 0, $target);
if ($direction == -1) {
$new_order = array_merge($prefix, $move, $new_order);
} else {
$leftover = array();
if (count($new_order) > 1) {
$start_parts_count = count(explode("/", $new_order[0]));
for ($j = 1, $jl = count($new_order); $j < $jl; ++$j) {
if (count(explode("/", $new_order[$i])) < $start_parts_count) {
$leftover = array_splice($new_order, $j); break;
}
}
}
$new_order = array_merge($prefix, $new_order, $move, $leftover);
}
$this->comicpress->comicpress_options['category_order'] = $new_order;
break;
}
}
}
}
function handle_update() {
if (isset($_POST['attachments'])) {
//coming from media editor
@ -263,9 +326,16 @@ class ComicPressAddonCore extends ComicPressAddon {
}
}
}
if (isset($_GET['cp']['move_direction']) && isset($_GET['cp']['category'])) {
$this->move_storyline_category_order($_GET['cp']['category'], $_GET['cp']['move_direction']);
}
$this->comicpress->save();
$this->info("ComicPress configuration updated.");
$this->comicpress->init();
}
}
}

View File

@ -34,8 +34,7 @@
<th scope="row" valign="top"><?php _e("Set storyline category order", 'comicpress') ?></th>
<td>
<?php
for ($i = 0, $il = count($this->comicpress->category_tree); $i < $il; ++$i) {
$node = $this->comicpress->category_tree[$i];
foreach ($this->get_storyline_move_statuses() as $node => $statuses) {
$parts = explode("/", $node);
$category = get_category(end($parts));
if (!empty($category)) {
@ -47,16 +46,13 @@
"-1" => __("Up", 'comicpress'),
"1" => __("Down", 'comicpress')
) as $direction => $label) {
$target = ($i - $direction);
if (isset($this->comicpress->category_tree[$target])) {
$target_parts = explode("/", $this->comicpress->category_tree[$target]);
if (count($target_parts) == count($parts)) {
$status = array_shift($statuses);
if ($status) {
$query = add_query_arg('cp[_nonce]', $nonce);
$query = add_query_arg('cp[category]', $category->term_id, $query);
$query = add_query_arg('cp[move_direction', $direction, $query);
?>
$query = add_query_arg('cp[move_direction]', $direction, $query); ?>
| <a href="<?php echo $query ?>"><?php echo $label ?></a>
<?php }
<?php
}
}
?>

View File

@ -153,7 +153,7 @@ class CoreTest extends PHPUnit_Framework_TestCase {
* @dataProvider providerTestHandleUpdate
*/
function testHandleUpdate($original, $change, $new) {
$this->core->comicpress = $this->getMock('ComicPress', array('save'));
$this->core->comicpress = $this->getMock('ComicPress', array('save', 'init'));
$this->core->comicpress->comicpress_options = array(
'comic_category_id' => 1,
'comic_dimensions' => '760x',
@ -204,6 +204,97 @@ class CoreTest extends PHPUnit_Framework_TestCase {
'0/1/11' => array(true, false)
), $this->core->get_storyline_move_statuses());
}
function providerTestMoveStorylineCategoryOrder() {
return array(
array(
array('0/1', '0/1/2', '0/1/3'),
3, -1,
array('0/1', '0/1/3', '0/1/2')
),
array(
array('0/1', '0/1/2', '0/1/2/4', '0/1/3'),
3, -1,
array('0/1', '0/1/3', '0/1/2', '0/1/2/4')
),
array(
array('0/1', '0/1/2', '0/1/2/4', '0/1/3', '0/1/3/5'),
3, -1,
array('0/1', '0/1/3', '0/1/3/5', '0/1/2', '0/1/2/4')
),
array(
array('0/1', '0/1/2', '0/1/3', '0/1/3/5'),
3, -1,
array('0/1', '0/1/3', '0/1/3/5', '0/1/2')
),
array(
array('0/1', '0/1/3', '0/1/3/5', '0/1/3/6', '0/1/3/7'),
7, -1,
array('0/1', '0/1/3', '0/1/3/5', '0/1/3/7', '0/1/3/6')
),
array(
array('0/1', '0/1/3', '0/1/3/5', '0/1/3/6', '0/1/3/7', '0/1/4'),
7, -1,
array('0/1', '0/1/3', '0/1/3/5', '0/1/3/7', '0/1/3/6', '0/1/4')
),
array(
array('0/1', '0/1/3', '0/1/3/5', '0/1/3/6', '0/1/3/7', '0/1/4'),
3, 1,
array('0/1', '0/1/4', '0/1/3', '0/1/3/5', '0/1/3/6', '0/1/3/7')
),
array(
array('0/1', '0/1/2', '0/1/2/4', '0/1/3'),
2, 1,
array('0/1', '0/1/3', '0/1/2', '0/1/2/4')
),
array(
array('0/1', '0/1/2', '0/1/2/4', '0/1/3', '0/1/3/5'),
2, 1,
array('0/1', '0/1/3', '0/1/3/5', '0/1/2', '0/1/2/4')
),
array(
array('0/1', '0/1/2', '0/1/3', '0/1/3/5'),
2, 1,
array('0/1', '0/1/3', '0/1/3/5', '0/1/2')
),
array(
array('0/1', '0/1/3', '0/1/3/5', '0/1/3/6', '0/1/3/7'),
6, 1,
array('0/1', '0/1/3', '0/1/3/5', '0/1/3/7', '0/1/3/6')
),
array(
array('0/1', '0/1/3', '0/1/3/5', '0/1/3/6', '0/1/3/7', '0/1/4'),
6, 1,
array('0/1', '0/1/3', '0/1/3/5', '0/1/3/7', '0/1/3/6', '0/1/4')
),
array(
array('0/1', '0/1/3', '0/1/3/5', '0/1/3/6', '0/1/3/7', '0/1/4'),
5, 1,
array('0/1', '0/1/3', '0/1/3/6', '0/1/3/5', '0/1/3/7', '0/1/4')
),
array(
array('0/1', '0/1/3', '0/1/3/5', '0/1/3/6', '0/1/3/7', '0/1/4', '0/1/4/9'),
9, 1,
array('0/1', '0/1/3', '0/1/3/5', '0/1/3/6', '0/1/3/7', '0/1/4', '0/1/4/9')
),
);
}
/**
* @dataProvider providerTestMoveStorylineCategoryOrder
*/
function testMoveStorylineCategoryOrder($original_order, $category, $direction, $new_order) {
$this->core->comicpress = (object)array(
'category_tree' => $original_order,
'comicpress_options' => array(
'category_order' => $original_order
)
);
$this->core->move_storyline_category_order($category, $direction);
$this->assertEquals($new_order, $this->core->comicpress->comicpress_options['category_order']);
}
}
?>

View File

@ -31,9 +31,9 @@ function __comicpress_init() {
$addons[] = new $classname();
end($addons)->init(&$comicpress);
if (is_admin()) {
if (is_array($_POST['cp'])) {
if (isset($_POST['cp']['_nonce'])) {
if (wp_verify_nonce($_POST['cp']['_nonce'], 'comicpress')) {
if (is_array($_REQUEST['cp'])) {
if (isset($_REQUEST['cp']['_nonce'])) {
if (wp_verify_nonce($_REQUEST['cp']['_nonce'], 'comicpress')) {
if (method_exists(end($addons), 'handle_update')) {
end($addons)->handle_update();
}