diff --git a/addons/Core/Core.inc b/addons/Core/Core.inc index 490efb0..f8257fb 100644 --- a/addons/Core/Core.inc +++ b/addons/Core/Core.inc @@ -9,8 +9,10 @@ class ComicPressAddonCore extends ComicPressAddon { * Initialize the addon. * @param ComicPress $comicpress The master ComicPress object. */ - function init(&$comicpress) { - add_action('admin_menu', array(&$this, 'setup_admin_interface')); + function init() { + $this->comicpress = ComicPress::get_instance(); + + add_action('admin_menu', array(&$this, 'setup_admin_interface')); add_filter('attachment_fields_to_edit', array(&$this, 'setup_comic_metadata_buttons'), 10, 2); add_action('show_comic', array(&$this, 'show_comic'), 1, 1); add_action('show_archive', array(&$this, 'show_archive'), 1, 1); @@ -21,8 +23,6 @@ class ComicPressAddonCore extends ComicPressAddon { add_action('template_redirect', array(&$this, 'go_to_random_comic')); } - $this->comicpress = $comicpress; - if (current_user_can('edit_posts') && isset($comicpress->comicpress_options['helpers']['show_inline_comic_ordering'])) { add_filter('comicpress_attached_image', array(&$this, 'comicpress_attached_image'), 10, 3); add_filter('comicpress_display_attached_images', array(&$this, 'comicpress_display_attached_images'), 10, 2); @@ -192,12 +192,19 @@ class ComicPressAddonCore extends ComicPressAddon { * Set up the admin interface and meta boxes. */ function setup_admin_interface() { + global $plugin_page; + add_theme_page(__("ComicPress Core", 'comicpress'), __('ComicPress Core', 'comicpress'), 'edit_themes', 'comicpress/render_admin', array(&$this, 'render_admin')); add_theme_page(__("Edit Partials", 'comicpress'), __('Edit Partials', 'comicpress'), 'edit_themes', 'comicpress/edit_partials', array(&$this, 'render_edit_partials')); if (isset($_REQUEST['post'])) { add_meta_box("comic-image-ordering", __("Comic Image Ordering", 'comicpress'), array(&$this, 'render_comic_image_ordering'), "post", "normal", "low"); } + + if ($plugin_page == 'comicpress/render_admin') { + wp_enqueue_style('cp-admin', get_stylesheet_directory_uri() . '/css/cp-admin.css'); + wp_enqueue_script('cp-admin', get_stylesheet_directory_uri() . '/js/Storyline.js', array('jquery', 'jquery-ui-sortable')); + } } /** @@ -293,10 +300,24 @@ class ComicPressAddonCore extends ComicPressAddon { $nonce = wp_create_nonce('comicpress'); $root_categories = $this->get_root_categories(); $storyline = new ComicPressStoryline(); - $storyline->create_structure(get_option('comicpress-storyline-category-order')); + $storyline->read_from_options(); include(dirname(__FILE__) . '/partials/options-admin.inc'); } + + function _render_admin_storyline_tree($node, $parent_id = "0") { + foreach ($node as $category_id => $children) { + $category = get_category($category_id); + echo '
'; + echo '' . $category->name . ''; + if (is_array($children)) { + echo '
'; + $this->_render_admin_storyline_tree($children, $parent_id . '/' . $category_id); + echo '
'; + } + echo '
'; + } + } function render_edit_partials() { $nonce = wp_create_nonce('comicpress'); @@ -392,105 +413,8 @@ class ComicPressAddonCore extends ComicPressAddon { } return implode("\n", $output); } - - /** - * Determine whether or not storyline categories can be moved or not. - * @return array The storyline nodes with their move statuses. - */ - function get_storyline_move_statuses() { - $nodes_with_statuses = array(); - for ($i = 0, $il = count($this->comicpress->category_tree); $i < $il; ++$i) { - $node = $this->comicpress->category_tree[$i]; - $nodes_with_statuses[$node] = array(); - $parts_count = count(explode("/", $node)); - foreach (array( - '0' => -1, - '1' => 1 - ) as $position => $direction) { - $current_node_index = $i; - $status = false; - do { - $current_node_index += $direction; - if (isset($this->comicpress->category_tree[$current_node_index])) { - $current_node = $this->comicpress->category_tree[$current_node_index]; - $current_parts_count = count(explode("/", $current_node)); - if ($current_parts_count == $parts_count) { $status = true; break; } - if ($current_parts_count < $parts_count) { break; } - } - } while (isset($this->comicpress->category_tree[$current_node_index])); - $nodes_with_statuses[$node][$position] = $status; - } - } - return $nodes_with_statuses; - } - /** - * Move a category in the hierarchy. - * @param array $category The category to move. - * @param int $direction The direction to move it in (-1 for up, 1 for down) - */ - 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; - } - } - } - } - - /** + /** * Update attachment information. */ function handle_update_attachments() { @@ -509,18 +433,18 @@ class ComicPressAddonCore extends ComicPressAddon { /** * Update ComicPress options. */ - function handle_update_comicpress_options() { + function handle_update_comicpress_options($info) { foreach (array('helpers', 'options') as $type) { $this->comicpress->comicpress_options[$type] = array(); } foreach ($this->comicpress->comicpress_options as $option => $value) { - if (isset($_POST['cp'][$option])) { + if (isset($info[$option])) { switch ($option) { case 'comic_category_id': - if (is_numeric($_POST['cp'][$option])) { - $result = get_category($_POST['cp'][$option]); + if (is_numeric($info[$option])) { + $result = get_category($info[$option]); if (!(is_a($result, 'WP_Error') || empty($result))) { - $this->comicpress->comicpress_options[$option] = $_POST['cp'][$option]; + $this->comicpress->comicpress_options[$option] = $info[$option]; } } break; @@ -528,11 +452,11 @@ class ComicPressAddonCore extends ComicPressAddon { case 'rss_dimensions': case 'archive_dimensions': case 'mini_dimensions': - if (is_array($_POST['cp'][$option])) { + if (is_array($info[$option])) { $dim_parts = array(); $is_valid = true; foreach (array('width', 'height') as $field) { - $requested_dim = trim($_POST['cp'][$option][$field]); + $requested_dim = trim($info[$option][$field]); if ($requested_dim == "") { $dim_parts[] = $requested_dim; } else { @@ -550,19 +474,23 @@ class ComicPressAddonCore extends ComicPressAddon { } break; case 'blogpost_count': - $this->comicpress->comicpress_options[$option] = (int)$_POST['cp'][$option]; + $this->comicpress->comicpress_options[$option] = (int)$info[$option]; break; case 'comic_space': case 'category_usage': case 'layout'; - $this->comicpress->comicpress_options[$option] = $_POST['cp'][$option]; + $this->comicpress->comicpress_options[$option] = $info[$option]; break; case 'helpers': case 'addons': - foreach ($_POST['cp'][$option] as $type => $set) { + foreach ($info[$option] as $type => $set) { $this->comicpress->comicpress_options[$option][$type] = true; } break; + case 'storyline_order': + $storyline = new ComicPressStoryline(); + var_dump($storyline->set_flattened_storyline_order($info[$option])); + break; } } } @@ -595,13 +523,14 @@ class ComicPressAddonCore extends ComicPressAddon { /** * Handle an update. */ - function handle_update() { + function handle_update($info) { if (isset($_POST['attachments'])) { //coming from media editor $this->handle_update_attachments(); - } else if (is_array($_POST['cp']['ordering'])) { + } else if (is_array($info['ordering'])) { // comic ordering + /* if (isset($_POST['meta'])) { $meta_key_to_ignore = false; foreach ($_POST['meta'] as $meta_key => $params) { @@ -617,21 +546,18 @@ class ComicPressAddonCore extends ComicPressAddon { } } - $this->handle_update_comic_ordering(); - } else if (isset($_POST['cp']['partial'])) { - $this->handle_update_override_partial($_POST['cp']); - $this->info(sprintf(__("Partial %s updated.", 'comicpress'), $_POST['cp']['partial'])); + $this->handle_update_comic_ordering($info); + */ + } else if (isset($info['partial'])) { + $this->handle_update_override_partial($info); + $this->info(sprintf(__("Partial %s updated.", 'comicpress'), $info['partial'])); $this->comicpress->save(); $this->comicpress->init(); } else { //coming from us - $this->handle_update_comicpress_options(); + $this->handle_update_comicpress_options($info); - 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.", 'comicpress')); diff --git a/addons/Core/partials/options-admin.inc b/addons/Core/partials/options-admin.inc index de16393..30ea65e 100644 --- a/addons/Core/partials/options-admin.inc +++ b/addons/Core/partials/options-admin.inc @@ -40,36 +40,16 @@ - + - get_storyline_move_statuses() as $node => $statuses) { - $parts = explode("/", $node); - $category = get_category(end($parts)); - if (!empty($category)) { - ?> -
- name ?> - __("Up", 'comicpress'), - "1" => __("Down", 'comicpress') - ) as $direction => $label) { - $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); ?> - | - -
- -

Categories page)', 'comicpress') ?>

+ +
+ _render_admin_storyline_tree(reset($storyline->get_simple_storyline())) + ?> +
+ +

Categories page)', 'comicpress') ?>

diff --git a/classes/ComicPress.inc b/classes/ComicPress.inc index 7123f97..e093be2 100644 --- a/classes/ComicPress.inc +++ b/classes/ComicPress.inc @@ -17,7 +17,8 @@ class ComicPress { 'layout' => 'classic.inc', 'helpers' => array(), 'override_partials' => array(), - 'addons' => array() + 'addons' => array(), + 'storyline_order' => '' ); var $additional_stylesheets = array(); @@ -29,6 +30,16 @@ class ComicPress { var $partial_paths = array(); var $layouts = null; + function get_instance() { + static $instance; + + if (empty($instance)) { + $instance = &new ComicPress(); + } + + return $instance; + } + /** * Load ComicPress options. */ diff --git a/classes/ComicPressStoryline.inc b/classes/ComicPressStoryline.inc index 8fe0b09..cac22e1 100644 --- a/classes/ComicPressStoryline.inc +++ b/classes/ComicPressStoryline.inc @@ -1,10 +1,43 @@ create_structure($comicpress->comicpress_options['storyline_order']); + } + + function get_flattened_storyline() { + $comicpress = ComicPress::get_instance(); + return $comicpress->comicpress_options['storyline_order']; + } + + function set_flattened_storyline($storyline) { + $comicpress = ComicPress::get_instance(); + $comicpress->comicpress_options['storyline_order'] = $storyline; + $comicpress->save(); + } + + function set_order_via_flattened_storyline($order) { + $nodes = explode(',', $order); + $original_nodes = explode(',', $this->get_flattened_storyline()); + + $missing_good_nodes = array_diff($original_nodes, $nodes); + $any_bad_nodes = array_diff($nodes, $original_nodes); + + if (empty($missing_good_nodes) && empty($any_bad_nodes)) { + $this->set_flattened_storyline($order); + return true; + } else { + return false; + } + } + /** * Create a searchable structure from a node list. * @param array $structure The structure to process. @@ -134,6 +167,28 @@ class ComicPressStoryline { $simple_storyline[$parent][$category_id] = true; } + return $this->_merge_simple_storyline($simple_storyline); + } + + function get_category_simple_structure($parent) { + $structure = array(); + foreach (get_all_category_ids() as $category_id) { + $category = get_category($category_id); + if (!isset($structure[$category->parent])) { + $structure[$category->parent] = array(); + } + $structure[$category->parent][$category_id] = true; + } + $structure = $this->_merge_simple_storyline($structure); + if (isset($structure[0])) { + foreach ($structure[0] as $key => $children) { + if ($key != $parent) { unset($structure[0][$key]); } + } + } + return $structure; + } + + function _merge_simple_storyline($simple_storyline) { while (count($simple_storyline) > 0) { $merge_found = false; foreach ($simple_storyline as $parent => $children) { @@ -163,6 +218,61 @@ class ComicPressStoryline { } return $simple_storyline; } + + function normalize_flattened_storyline($storyline, $comic_categories) { + $storyline_nodes = explode(",", $storyline); + $category_nodes = explode(",", $comic_categories); + + $missing_from_storyline = array_diff($category_nodes, $storyline_nodes); + $extra_in_storyline = array_diff($storyline_nodes, $category_nodes); + + if (!empty($missing_from_storyline)) { + foreach ($missing_from_storyline as $node) { + $parent_pattern = implode('/', array_slice(explode('/', $node), 0, -1)); + $last = null; + for ($i = 0, $il = count($storyline_nodes); $i < $il; ++$i) { + if (strpos($storyline_nodes[$i], $parent_pattern) === 0) { + $last = $i; + } + } + if (!is_null($last)) { + array_splice($storyline_nodes, $last + 1, 0, array($node)); + } + } + } + + if (!empty($extra_in_storyline)) { + $new = array(); + foreach ($storyline_nodes as $node) { + if (!in_array($node, $extra_in_storyline)) { + $new[] = $node; + } + } + $storyline_nodes = $new; + } + + return implode(',', $storyline_nodes); + } + + function flatten_simple_storyline($storyline) { + return implode(',', $this->_follow_simple_storyline($storyline)); + } + + function _follow_simple_storyline($storyline, $parent = null) { + $output = array(); + foreach ($storyline as $key => $children) { + if (is_null($parent)) { + $new_parent = $key; + } else { + $new_parent = $parent . '/' . $key; + $output[] = $new_parent; + } + if (is_array($children)) { + $output = array_merge($output, $this->_follow_simple_storyline($children, $new_parent)); + } + } + return $output; + } } ?> \ No newline at end of file diff --git a/css/cp-admin.css b/css/cp-admin.css new file mode 100644 index 0000000..708c355 --- /dev/null +++ b/css/cp-admin.css @@ -0,0 +1,17 @@ +.cp-children { + padding-left: 20px +} + +.ui-draggable { + border: solid black 1px; + background-color: #ddd +} + +.cp-category-info span { + cursor: move; + color: #004 +} + +.placeholder { + border: dashed #ddd 2px +} \ No newline at end of file diff --git a/functions.php b/functions.php index 049375d..560ff04 100644 --- a/functions.php +++ b/functions.php @@ -14,7 +14,7 @@ function __comicpress_init() { if (is_file($file)) { require_once($file); } } - $comicpress = new ComicPress(); + $comicpress = ComicPress::get_instance(); $comicpress->init(); $addons = array(); @@ -34,13 +34,13 @@ function __comicpress_init() { $comicpress->comicpress_options['addons'][$addon->name] || $addon->is_addon_manager ) { - $addon->init(&$comicpress); + $addon->init(); if (current_user_can('edit_posts')) { if (is_array($_REQUEST['cp'])) { if (isset($_REQUEST['cp']['_nonce'])) { if (wp_verify_nonce($_REQUEST['cp']['_nonce'], 'comicpress')) { if (method_exists($addon, 'handle_update')) { - $addon->handle_update(); + $addon->handle_update($_REQUEST['cp']); $comicpress->load(); } } diff --git a/js/Storyline.js b/js/Storyline.js new file mode 100644 index 0000000..0757689 --- /dev/null +++ b/js/Storyline.js @@ -0,0 +1,25 @@ +var Storyline = {}; + +Storyline.get_order = function() { + var order = [] + jQuery('#storyline-sorter .cp-category-info').each(function() { + var matches = this.className.match(/category-([0-9\/]+)/); + if (matches) { order.push(matches[1]); } + }); + jQuery('input[name=cp[storyline_order]]').attr('value', order.join(',')); +}; + +Storyline.setup = function() { + jQuery('.cp-children').sortable({ + handle: 'span', + cursor: 'move', + placeholder: 'placeholder', + forcePlaceholderSize: true, + opacity: 0.4, + change: function(e, ui) { + Storyline.get_order(); + } + }); +}; + +jQuery(function() { Storyline.get_order(); }); \ No newline at end of file diff --git a/test/ComicPressStorylineTest.php b/test/ComicPressStorylineTest.php index c11ecf0..a10cc16 100644 --- a/test/ComicPressStorylineTest.php +++ b/test/ComicPressStorylineTest.php @@ -181,6 +181,110 @@ class ComicPressStorylineTest extends PHPUnit_Framework_TestCase { $this->assertEquals($expected_result, $this->css->get_simple_storyline()); } + + function providerTestSetFlattenedStorylineOrder() { + return array( + array('0/1,0/1/2,0/1/2/3,0/1/2/4', '0/1,0/1/2,0/1/2/3,0/1/2/4', true), + array('0/1,0/1/2,0/1/2/4,0/1/2/3', '0/1,0/1/2,0/1/2/4,0/1/2/3', true), + array('0/1,0/1/2,0/1/2/5,0/1/2/3', '0/1,0/1/2,0/1/2/3,0/1/2/4', false), + ); + } + + /** + * @dataProvider providerTestSetFlattenedStorylineOrder + */ + function testSetFlattenedStorylineOrder($input, $expected_result, $expected_return) { + $css = $this->getMock('ComicPressStoryline', array( + 'get_flattened_storyline', 'set_flattened_storyline' + )); + + $css->expects($this->once()) + ->method('get_flattened_storyline') + ->will($this->returnValue('0/1,0/1/2,0/1/2/3,0/1/2/4')); + + if ($expected_return === true) { + $css->expects($this->once()) + ->method('set_flattened_storyline') + ->with($input); + } else { + $css->expects($this->never()) + ->method('set_flattened_storyline'); + } + + $this->assertEquals($expected_return, $css->set_order_via_flattened_storyline($input)); + } + + function testMergeSimpleStoryline() { + $original = array( + 0 => array(1 => true), + 1 => array(2 => true), + 2 => array(3 => true, 4 => true) + ); + + $expected = array( + 0 => array( + 1 => array( + 2 => array( + 3 => true, + 4 => true + ) + ) + ) + ); + + $this->assertEquals($expected, $this->css->_merge_simple_storyline($original)); + } + + function testGetCategorySimpleStructure() { + add_category(1, (object)array('parent' => 0)); + add_category(2, (object)array('parent' => 1)); + add_category(3, (object)array('parent' => 2)); + add_category(4, (object)array('parent' => 2)); + + $this->assertEquals(array( + '0' => array( + '1' => array( + '2' => array( + '3' => true, + '4' => true + ) + ) + ) + ), $this->css->get_category_simple_structure(1)); + } + + function providerTestNormalizeFlattenedStoryline() { + return array( + array('0/1,0/1/2,0/1/2/4', '0/1,0/1/2,0/1/2/4,0/1/2/3'), + array('0/1,0/1/2,0/1/2/4,0/1/2/3,0/1/5', '0/1,0/1/2,0/1/2/4,0/1/2/3'), + array('0/1,0/1/2,0/1/2/3,0/1/5', '0/1,0/1/2,0/1/2/3,0/1/2/4'), + ); + } + + /** + * @dataProvider providerTestNormalizeFlattenedStoryline + */ + function testNormalizeFlattenedStoryline($original_structure, $expected_structure) { + $this->assertEquals( + $expected_structure, + $this->css->normalize_flattened_storyline($original_structure, '0/1,0/1/2,0/1/2/3,0/1/2/4') + ); + } + + function testFlattenSimpleStoryline() { + $this->assertEquals('0/1,0/1/2,0/1/2/3,0/1/2/4', $this->css->flatten_simple_storyline( + array( + 0 => array( + 1 => array( + 2 => array( + 3 => true, + 4 => true + ) + ) + ) + ) + )); + } } ?> \ No newline at end of file diff --git a/test/addons/CoreTest.php b/test/addons/CoreTest.php index 4965499..513ccbe 100644 --- a/test/addons/CoreTest.php +++ b/test/addons/CoreTest.php @@ -12,25 +12,6 @@ class CoreTest extends PHPUnit_Framework_TestCase { $this->core = new ComicPressAddonCore(); } - function testShowOptionsPage() { - $nonce = wp_create_nonce('comicpress'); - - $this->core->comicpress = $this->getMock('ComicPress', array('get_layout_choices')); - $this->core->comicpress->expects($this->once())->method('get_layout_choices')->will($this->returnValue(array())); - - ob_start(); - $this->core->render_admin(); - $source = ob_get_clean(); - - $this->assertTrue(($xml = _to_xml($source)) !== false); - foreach (array( - '//input[@name="cp[_nonce]" and @value="' . $nonce . '"]' => true, - '//select[@name="cp[comic_category_id]"]' => true - ) as $xpath => $value) { - $this->assertTrue(_xpath_test($xml, $xpath, $value), $xpath); - } - } - function providerTestGetRootComicCategories() { return array( array(array(), array()), @@ -169,136 +150,13 @@ class CoreTest extends PHPUnit_Framework_TestCase { $_POST = $change; - $this->core->handle_update_comicpress_options(); + $this->core->handle_update_comicpress_options($_POST['cp']); foreach ($new as $key => $value) { $this->assertEquals($value, $this->core->comicpress->comicpress_options[$key]); } } - - function testGetStorylineMoveStatuses() { - $this->core->comicpress = (object)array( - 'category_tree' => array( - '0/1', - '0/1/2', - '0/1/2/3', - '0/1/2/4', - '0/1/2/5', - '0/1/6', - '0/1/6/7', - '0/1/6/8', - '0/1/9', - '0/1/9/10', - '0/1/11' - ) - ); - - $this->assertEquals(array( - '0/1' => array(false, false), - '0/1/2' => array(false, true), - '0/1/2/3' => array(false, true), - '0/1/2/4' => array(true, true), - '0/1/2/5' => array(true, false), - '0/1/6' => array(true, true), - '0/1/6/7' => array(false, true), - '0/1/6/8' => array(true, false), - '0/1/9' => array(true, true), - '0/1/9/10' => array(false, false), - '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']); - } - + function providerTestUpdateAttachments() { return array( array(