Skip to content

Commit

Permalink
introduce P2P_List_Renderer class
Browse files Browse the repository at this point in the history
It keeps all the code related to rendering lists of items in one place.
  • Loading branch information
scribu committed Apr 10, 2013
1 parent 0335eb4 commit fdbd735
Show file tree
Hide file tree
Showing 8 changed files with 106 additions and 100 deletions.
2 changes: 1 addition & 1 deletion core/api.php
Original file line number Diff line number Diff line change
Expand Up @@ -297,7 +297,7 @@ function p2p_list_posts( $posts, $args = array() ) {
$list = new P2P_List( $posts, 'P2P_Item_Post' );
}

return $list->render( $args );
return P2P_List_Renderer::render( $list, $args );
}

/**
Expand Down
101 changes: 101 additions & 0 deletions core/list-renderer.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
<?php

class P2P_List_Renderer {

static function query_and_render( $args ) {
$ctype = p2p_type( $args['ctype'] );
if ( !$ctype ) {
trigger_error( sprintf( "Unregistered connection type '%s'.", $ctype ), E_USER_WARNING );
return '';
}

$directed = $ctype->find_direction( $args['item'] );
if ( !$directed )
return '';

$context = $args['context'];

$extra_qv = array(
'p2p:per_page' => -1,
'p2p:context' => $context
);

$connected = call_user_func( array( $directed, $args['method'] ), $args['item'], $extra_qv, 'abstract' );

switch ( $args['mode'] ) {
case 'inline':
$render_args = array(
'separator' => ', '
);
break;

case 'ol':
$render_args = array(
'before_list' => '<ol id="' . $ctype->name . '_list">',
'after_list' => '</ol>',
);
break;

case 'ul':
default:
$render_args = array(
'before_list' => '<ul id="' . $ctype->name . '_list">',
'after_list' => '</ul>',
);
break;
}

$render_args['echo'] = false;

$html = self::render( $connected, $render_args );

return apply_filters( "p2p_{$context}_html", $html, $connected, $directed, $args['mode'] );
}

static function render( $list, $args = array() ) {
if ( empty( $list->items ) )
return '';

$args = wp_parse_args( $args, array(
'before_list' => '<ul>', 'after_list' => '</ul>',
'before_item' => '<li>', 'after_item' => '</li>',
'separator' => false,
'echo' => true
) );

if ( $args['separator'] ) {
if ( '<ul>' == $args['before_list'] )
$args['before_list'] = '';

if ( '</ul>' == $args['after_list'] )
$args['after_list'] = '';
}

if ( !$args['echo'] )
ob_start();

echo $args['before_list'];

if ( $args['separator'] ) {
$rendered = array();
foreach ( $list->items as $item ) {
$rendered[] = self::render_item( $item );
}
echo implode( $args['separator'], $rendered );
} else {
foreach ( $list->items as $item ) {
echo $args['before_item'] . self::render_item( $item ) . $args['after_item'];
}
}

echo $args['after_list'];

if ( !$args['echo'] )
return ob_get_clean();
}

private static function render_item( $item ) {
return html_link( $item->get_permalink(), $item->get_title() );
}
}

46 changes: 0 additions & 46 deletions core/list.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,51 +14,5 @@ function __construct( $items, $item_type ) {
$this->items = _p2p_wrap( $items, $item_type );
}
}

function render( $args = array() ) {
if ( empty( $this->items ) )
return '';

$args = wp_parse_args( $args, array(
'before_list' => '<ul>', 'after_list' => '</ul>',
'before_item' => '<li>', 'after_item' => '</li>',
'separator' => false,
'echo' => true
) );

if ( $args['separator'] ) {
if ( '<ul>' == $args['before_list'] )
$args['before_list'] = '';

if ( '</ul>' == $args['after_list'] )
$args['after_list'] = '';
}

if ( !$args['echo'] )
ob_start();

echo $args['before_list'];

if ( $args['separator'] ) {
$list = array();
foreach ( $this->items as $item ) {
$list[] = $this->render_item( $item );
}
echo implode( $args['separator'], $list );
} else {
foreach ( $this->items as $item ) {
echo $args['before_item'] . $this->render_item( $item ) . $args['after_item'];
}
}

echo $args['after_list'];

if ( !$args['echo'] )
return ob_get_clean();
}

protected function render_item( $item ) {
return html_link( $item->get_permalink(), $item->get_title() );
}
}

2 changes: 1 addition & 1 deletion core/shortcodes.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ private static function get_list( $attr, $method ) {
'mode' => 'ul',
), $attr );

return _p2p_get_list( array(
return P2P_List_Renderer::query_and_render( array(
'ctype' => $attr['type'],
'method' => $method,
'item' => $post,
Expand Down
49 changes: 0 additions & 49 deletions core/util.php
Original file line number Diff line number Diff line change
Expand Up @@ -123,52 +123,3 @@ function _p2p_get_other_id( $item ) {
trigger_error( "Corrupted data for item $inner_item->ID", E_USER_WARNING );
}

/** @internal */
function _p2p_get_list( $args ) {
$ctype = p2p_type( $args['ctype'] );
if ( !$ctype ) {
trigger_error( sprintf( "Unregistered connection type '%s'.", $ctype ), E_USER_WARNING );
return '';
}

$directed = $ctype->find_direction( $args['item'] );
if ( !$directed )
return '';

$context = $args['context'];

$extra_qv = array(
'p2p:per_page' => -1,
'p2p:context' => $context
);

$connected = call_user_func( array( $directed, $args['method'] ), $args['item'], $extra_qv, 'abstract' );

switch ( $args['mode'] ) {
case 'inline':
$render_args = array(
'separator' => ', '
);
break;

case 'ol':
$render_args = array(
'before_list' => '<ol id="' . $ctype->name . '_list">',
'after_list' => '</ol>',
);
break;

case 'ul':
default:
$render_args = array(
'before_list' => '<ul id="' . $ctype->name . '_list">',
'after_list' => '</ul>',
);
break;
}

$render_args['echo'] = false;

return apply_filters( "p2p_{$context}_html", $connected->render( $render_args ), $connected, $directed, $args['mode'] );
}

2 changes: 1 addition & 1 deletion core/widget.php
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ function form( $instance ) {
function widget( $args, $instance ) {
$instance = array_merge( $this->defaults, $instance );

$output = _p2p_get_list( array(
$output = P2P_List_Renderer::query_and_render( array(
'ctype' => $instance['ctype'],
'method' => ( 'related' == $instance['listing'] ? 'get_related' : 'get_connected' ),
'item' => get_queried_object(),
Expand Down
Binary file modified diagrams/core.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 2 additions & 2 deletions tests/test-list.php
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ private static function count_occurences( $haystack, $needle ) {
}

function test_default_output() {
$output = self::$list->render( array(
$output = P2P_List_Renderer::render( self::$list, array(
'echo' => false
) );

Expand All @@ -46,7 +46,7 @@ function test_default_output() {
}

function test_separator_output() {
$output = self::$list->render( array(
$output = P2P_List_Renderer::render( self::$list, array(
'separator' => __FUNCTION__,
'echo' => false
) );
Expand Down

0 comments on commit fdbd735

Please sign in to comment.