Skip to:
Content

BuddyPress.org

Ticket #1269: loop-template.php

File loop-template.php, 3.4 KB (added by rvenable, 14 years ago)

Base class BP_Loop_Template

Line 
1<?php
2
3/**
4 * If you want to go a step further, you can create your own custom WordPress loop for your component.
5 * By doing this you could output a number of items within a loop, just as you would output a number
6 * of blog posts within a standard WordPress loop.
7 *
8 * The example template class below would allow you do the following in the template file:
9 *
10 *      <?php if ( bp_get_plans_has_items() ) : ?>
11 *
12 *              <?php while ( bp_get_plans_items() ) : bp_get_plans_the_item(); ?>
13 *
14 *                      <p><?php bp_get_plans_item_name() ?></p>
15 *
16 *              <?php endwhile; ?>
17 *
18 *      <?php else : ?>
19 *
20 *              <p class="error">No items!</p>
21 *
22 *      <?php endif; ?>
23 *
24 * Obviously, you'd want to be more specific than the word 'item'.
25 *
26 */
27
28abstract class BP_Loop_Template {
29        protected $current_item = -1;
30        public $item_count;
31        public $items;
32        public $item;
33
34        protected $in_the_loop;
35
36        public $pag_page;
37        public $pag_num;
38        public $pag_links;
39
40        /*
41         * Functions to be called by the constructor
42         */
43        protected function set_user_id($user_id) {
44                global $bp;
45
46                if (empty($user_id)) $user_id = $bp->displayed_user->id;
47                $this->user_id = $user_id;
48
49                return $this->user_id;
50        }
51
52        protected function set_per_page($per_page) {
53                /***
54                 * If you want to make parameters that can be passed, then append a
55                 * character or two to "page" like this: $_REQUEST['xpage']
56                 * You can add more than a single letter.
57                 *
58                 * The "x" in "xpage" should be changed to something unique so as not to conflict with
59                 * BuddyPress core components which use the unique characters "b", "g", "u", "w",
60                 * "ac", "fr", "gr", "ml", "mr" with "page".
61                 */
62
63                $this->pag_page = isset( $_REQUEST['bp_page'] ) ? intval( $_REQUEST['bp_page'] ) : 1;
64                $this->pag_num = isset( $_GET['num'] ) ? intval( $_GET['num'] ) : $per_page;
65        }
66
67        protected function set_max($max) {
68                // Item Requests
69                if ( $max && ($max < $this->item_count ) )
70                        $this->item_count = $max;
71        }
72
73        protected function set_page_links() {
74                /* Remember to change the "x" in "bp_page" to match whatever character(s) you're using above */
75                $this->pag_links = paginate_links( array(
76                        'base' => add_query_arg( 'bp_page', '%#%' ),
77                        'format' => '',
78                        'total' => ceil( (int) $this->total_item_count / (int) $this->pag_num ),
79                        'current' => (int) $this->pag_page,
80                        'prev_text' => '&laquo;',
81                        'next_text' => '&raquo;',
82                        'mid_size' => 1
83                ));
84
85                $this->from_num = intval( ( $this->pag_page - 1 ) * $this->pag_num ) + 1;
86                $this->to_num = ( $this->from_num + ( $this->pag_num - 1 ) > $this->total_item_count ) ? $this->total_item_count : $this->from_num + ( $this->pag_num - 1) ;
87        }
88
89        /*
90         * Functions to be called by template tags
91         */
92
93        public function has_items() {
94                if ( $this->item_count )
95                        return true;
96
97                return false;
98        }
99
100        public function next_item() {
101                $this->current_item++;
102                $this->item = $this->items[$this->current_item];
103
104                return $this->item;
105        }
106
107        public function rewind_items() {
108                $this->current_item = -1;
109                if ( $this->item_count > 0 ) {
110                        $this->item = $this->items[0];
111                }
112        }
113
114        public function items() {
115                if ( $this->current_item + 1 < $this->item_count ) {
116                        return true;
117                } elseif ( $this->current_item + 1 == $this->item_count ) {
118                        do_action('loop_end');
119                        // Do some cleaning up after the loop
120                        $this->rewind_items();
121                }
122
123                $this->in_the_loop = false;
124                return false;
125        }
126
127        public function the_item() {
128                $this->in_the_loop = true;
129                $this->item = $this->next_item();
130
131                if ( 0 == $this->current_item ) // loop has just started
132                        do_action('loop_start');
133        }
134}
135
136?>