diff -r 267c9f93b51f -r 08a7875258b4 includes/pageprocess.php --- a/includes/pageprocess.php Mon Jul 28 13:10:22 2008 -0600 +++ b/includes/pageprocess.php Mon Jul 28 13:13:09 2008 -0600 @@ -1300,6 +1300,42 @@ global $email; global $lang; + /** + * PLUGGING INTO USER PAGES + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * Userpages are highly programmable and extendable using a number of + * hooks. These hooks are: + * + * - userpage_sidebar_left + * - userpage_sidebar_right + * - userpage_tabs_links + * - userpage_tabs_body + * + * You can add a variety of sections to user pages, including new tabs + * and new sections on the tables. To add a tab, attach to + * userpage_tabs_links and echo out: + * + *
  • YOUR TAB TEXT
  • + * + * Then hook into userpage_tabs_body and echo out: + * + *
    YOUR TAB CONTENT
    + * + * The userpage javascript runtime will take care of everything else, + * meaning transitions, click events, etc. Currently it's not possible + * to add custom click events to tabs, but any DOM-related JS that needs + * to run in your tab can be run onload and the effects will be seen when + * your tab is clicked. YOURTABID should be lowercase alphanumeric and + * have a short prefix so as to assure that it remains specific to your + * plugin. + * + * To hook into the "profile" tab, use userpage_sidebar_{left,right}. Just + * echo out table cells as normal. The table on the left (the wide one) has + * four columns, and the one on the right has one column. + * + * See plugins.php for a guide on creating and attaching to hooks. + */ + $page_urlname = dirtify_page_id($this->page_id); if ( $this->page_id == $paths->page_id && $this->namespace == $paths->namespace ) { @@ -1322,7 +1358,7 @@ if ( ( $page_name == str_replace('_', ' ', $this->page_id) || $page_name == $paths->nslist['User'] . str_replace('_', ' ', $this->page_id) ) || !$this->page_exists ) { - $page_name = $lang->get('userpage_page_title', array('username' => htmlspecialchars($target_username))); + $page_name = $lang->get('userpage_page_title', array('username' => $target_username)); } else { @@ -1367,9 +1403,13 @@ } else { + // get the rank data for the anonymous user (placeholder basically) $rank_data = $session->get_user_rank(1); } + // add the userpage script to the header + $template->add_header(''); + $this->header(); // if ( $send_headers ) @@ -1377,153 +1417,304 @@ // display_page_headers(); // } - // Start left sidebar: basic user info, latest comments - - if ( $user_exists ): - - echo ''; - echo ''; - - $code = $plugins->setHook('userpage_sidebar_left'); - foreach ( $code as $cmd ) - { - eval($cmd); } - echo '
    '; - - echo '
    - '; - // - // Main part of sidebar + // BASIC INFORMATION + // Presentation of username/rank/avatar/basic info // - // Basic user info - - echo ''; - - echo ''; - echo ''; - echo ''; - - if ( !empty($userdata['real_name']) ) - { - echo ''; - } - - // Administer user button - - if ( $session->user_level >= USER_LEVEL_ADMIN ) + if ( $user_exists ) { - echo ''; - } - - // Comments - - echo ''; - $q = $db->sql_query('SELECT page_id, namespace, subject, time FROM '.table_prefix.'comments WHERE name=\'' . $db->escape($target_username) . '\' AND user_id=' . $userdata['authoritative_uid'] . ' AND approved=1 ORDER BY time DESC LIMIT 5;'); - if ( !$q ) - $db->_die(); - - $comments = Array(); - $no_comments = false; - - if ( $row = $db->fetchrow() ) - { - do - { - $row['time'] = enano_date('F d, Y', $row['time']); - $comments[] = $row; - } - while ( $row = $db->fetchrow() ); - } - else - { - $no_comments = true; - } - - echo ''; + + // + // CONTACT INFORMATION + // + + echo ' '; + + // + // End of profile + // + + echo '
    ' . $lang->get('userpage_heading_basics', array('username' => htmlspecialchars($target_username))) . '
    '; - if ( $userdata['user_has_avatar'] == '1' ) - { - echo '' . $lang->get('usercp_avatar_image_alt', array('username' => $userdata['username'])) . '
    '; - } - // username - echo '' . htmlspecialchars($target_username) . '
    '; - // user title, if appropriate - if ( $rank_data['user_title'] ) - echo htmlspecialchars($rank_data['user_title']) . '
    '; - // rank - echo htmlspecialchars($lang->get($rank_data['rank_title'])); - echo '
    ' . $lang->get('userpage_lbl_joined') . ' ' . enano_date('F d, Y h:i a', $userdata['reg_time']) . '
    ' . $lang->get('userpage_lbl_num_comments') . ' ' . $userdata['n_comments'] . '
    ' . $lang->get('userpage_lbl_real_name') . ' ' . $userdata['real_name'] . '
    ' . $lang->get('userpage_btn_administer_user') . '
    ' . $lang->get('userpage_heading_comments', array('username' => htmlspecialchars($target_username))) . '
    '; - echo '
    '; - - echo ''; - $class = 'row1'; - $tpl = ' - '; + + echo '
    - class="wikilink-nonexistent">{PAGE}
    - {lang:userpage_comments_lbl_posted} {DATE}
    - {SUBJECT} + ?> +
    + + +
    + + +
    '; + + echo '
    + '; + + // heading + echo ' + + ' . ( + $session->user_level >= USER_LEVEL_ADMIN ? + '' + : '' + ) . ' + '; + + // avi/rank/username + echo ' + + '; + + // join date & total comments + echo ''; + echo ' - '; - $parser = $template->makeParserText($tpl); - - if ( count($comments) > 0 ) - { - foreach ( $comments as $comment ) + '; + echo ' + '; + echo ''; + + // real name + if ( !empty($userdata['real_name']) ) { - $c_page_id = $paths->nslist[ $comment['namespace'] ] . sanitize_page_id($comment['page_id']); - if ( isset($paths->pages[ $c_page_id ]) ) + echo ' + + + '; + } + + // latest comments + + echo ''; + $q = $db->sql_query('SELECT page_id, namespace, subject, time FROM '.table_prefix.'comments WHERE name=\'' . $db->escape($target_username) . '\' AND user_id=' . $userdata['authoritative_uid'] . ' AND approved=1 ORDER BY time DESC LIMIT 7;'); + if ( !$q ) + $db->_die(); + + $comments = Array(); + $no_comments = false; + + if ( $row = $db->fetchrow() ) + { + do { - $parser->assign_bool(array( - 'page_exists' => true - )); - $page_title = htmlspecialchars($paths->pages[ $c_page_id ]['name']); - } - else - { - $parser->assign_bool(array( - 'page_exists' => false - )); - $page_title = htmlspecialchars(dirtify_page_id($c_page_id)); + $row['time'] = enano_date('F d, Y', $row['time']); + $comments[] = $row; } - $parser->assign_vars(array( - 'CLASS' => $class, - 'PAGE_LINK' => makeUrlNS($comment['namespace'], sanitize_page_id($comment['page_id'])), - 'PAGE' => $page_title, - 'SUBJECT' => $comment['subject'], - 'DATE' => $comment['time'], - 'COMMENT_LINK' => makeUrlNS($comment['namespace'], sanitize_page_id($comment['page_id']), 'do=comments', true) - )); - $class = ( $class == 'row3' ) ? 'row1' : 'row3'; - echo $parser->run(); + while ( $row = $db->fetchrow() ); + } + else + { + $no_comments = true; + } + + echo ''; + + $code = $plugins->setHook('userpage_sidebar_left'); + foreach ( $code as $cmd ) + { + eval($cmd); } - } - else - { - echo ''; - } - echo '
    + ' . $lang->get('userpage_heading_basics', array('username' => htmlspecialchars($target_username))) . ' + » ' . $lang->get('userpage_btn_administer_user') . '
    + ' . ( + $userdata['user_has_avatar'] == 1 ? + '
    + ' . $lang->get('usercp_avatar_image_alt', array('username' => $userdata['username'])) . ' +
    ' + : '' + ) . ' + ' . htmlspecialchars($userdata['username']) . ' + ' . ( !empty($rank_data['user_title']) ? '
    ' . htmlspecialchars($rank_data['user_title']) : '' ) . ' + ' . ( !empty($rank_data['rank_title']) ? '
    ' . htmlspecialchars($lang->get($rank_data['rank_title'])) : '' ) . ' +
    + ' . $lang->get('userpage_lbl_joined') . '
    + ' . enano_date('F d, Y h:i a', $userdata['reg_time']) . ' + + ' . $lang->get('userpage_lbl_num_comments') . ' + + ' . $userdata['n_comments'] . ' +
    + ' . $lang->get('userpage_lbl_real_name') . ' + + ' . htmlspecialchars($userdata['real_name']) . ' +
    ' . $lang->get('userpage_heading_comments', array('username' => htmlspecialchars($target_username))) . '
    '; + echo '
    '; + + echo ''; + $class = 'row1'; + + $tpl = ' '; + $parser = $template->makeParserText($tpl); + + if ( count($comments) > 0 ) + { + foreach ( $comments as $comment ) + { + $c_page_id = $paths->nslist[ $comment['namespace'] ] . sanitize_page_id($comment['page_id']); + if ( isset($paths->pages[ $c_page_id ]) ) + { + $parser->assign_bool(array( + 'page_exists' => true + )); + $page_title = htmlspecialchars($paths->pages[ $c_page_id ]['name']); + } + else + { + $parser->assign_bool(array( + 'page_exists' => false + )); + $page_title = htmlspecialchars(dirtify_page_id($c_page_id)); + } + $parser->assign_vars(array( + 'CLASS' => $class, + 'PAGE_LINK' => makeUrlNS($comment['namespace'], sanitize_page_id($comment['page_id'])), + 'PAGE' => $page_title, + 'SUBJECT' => $comment['subject'], + 'DATE' => $comment['time'], + 'COMMENT_LINK' => makeUrlNS($comment['namespace'], sanitize_page_id($comment['page_id']), 'do=comments', true) + )); + $class = ( $class == 'row3' ) ? 'row1' : 'row3'; + echo $parser->run(); + } + } + else + { + echo ''; + } + echo '
    + class="wikilink-nonexistent">{PAGE}
    + {lang:userpage_comments_lbl_posted} {DATE}
    + {SUBJECT} +
    ' . $lang->get('userpage_msg_no_comments') . '
    '; + + echo '
    '; + echo '
    ' . $lang->get('userpage_msg_no_comments') . '
    '; + + echo '
    +
    '; + + echo '
    '; + + echo '
    + '; + + // + // Main part of sidebar + // + + // Contact information + + echo ''; + + $class = 'row3'; + + if ( $userdata['email_public'] == 1 ) + { + $class = ( $class == 'row1' ) ? 'row3' : 'row1'; + $email_link = $email->encryptEmail($userdata['email']); + echo ''; + } + + $class = ( $class == 'row1' ) ? 'row3' : 'row1'; + if ( $session->user_logged_in ) + { + echo ''; + } + else + { + echo ''; + } + + if ( !empty($userdata['user_aim']) ) + { + $class = ( $class == 'row1' ) ? 'row3' : 'row1'; + echo ''; + } + + if ( !empty($userdata['user_yahoo']) ) + { + $class = ( $class == 'row1' ) ? 'row3' : 'row1'; + echo ''; + } + + if ( !empty($userdata['user_msn']) ) + { + $class = ( $class == 'row1' ) ? 'row3' : 'row1'; + $email_link = $email->encryptEmail($userdata['user_msn']); + echo ''; + } + + if ( !empty($userdata['user_xmpp']) ) + { + $class = ( $class == 'row1' ) ? 'row3' : 'row1'; + $email_link = $email->encryptEmail($userdata['user_xmpp']); + echo ''; + } + + // Real life + + echo ''; + + if ( !empty($userdata['user_location']) ) + { + $class = ( $class == 'row1' ) ? 'row3' : 'row1'; + echo ''; + } + + if ( !empty($userdata['user_job']) ) + { + $class = ( $class == 'row1' ) ? 'row3' : 'row1'; + echo ''; + } + + if ( !empty($userdata['user_hobbies']) ) + { + $class = ( $class == 'row1' ) ? 'row3' : 'row1'; + echo ''; + } + + if ( empty($userdata['user_location']) && empty($userdata['user_job']) && empty($userdata['user_hobbies']) ) + { + $class = ( $class == 'row1' ) ? 'row3' : 'row1'; + echo ''; + } + + $code = $plugins->setHook('userpage_sidebar_right'); + foreach ( $code as $cmd ) + { + eval($cmd); + } + + echo '
    ' . $lang->get('userpage_heading_contact') . '
    ' . $lang->get('userpage_lbl_email') . ' ' . $email_link . '
    ' . $lang->get('userpage_btn_send_pm', array('username' => htmlspecialchars($target_username), 'pm_link' => makeUrlNS('Special', 'PrivateMessages/Compose/to/' . $this->page_id, false, true))) . '
    ' . $lang->get('userpage_btn_send_pm_guest', array('username' => htmlspecialchars($target_username), 'login_flags' => 'href="' . makeUrlNS('Special', 'Login/' . $paths->nslist[$this->namespace] . $this->page_id) . '" onclick="ajaxStartLogin(); return false;"')) . '
    ' . $lang->get('userpage_lbl_aim') . ' ' . $userdata['user_aim'] . '
    ' . $lang->get('userpage_lbl_yim') . ' ' . $userdata['user_yahoo'] . '
    ' . $lang->get('userpage_lbl_wlm') . ' ' . $email_link . '
    ' . $lang->get('userpage_lbl_xmpp') . ' ' . $email_link . '
    ' . $lang->get('userpage_heading_real_life', array('username' => htmlspecialchars($target_username))) . '
    ' . $lang->get('userpage_lbl_location') . ' ' . $userdata['user_location'] . '
    ' . $lang->get('userpage_lbl_job') . ' ' . $userdata['user_job'] . '
    ' . $lang->get('userpage_lbl_hobbies') . ' ' . $userdata['user_hobbies'] . '
    ' . $lang->get('userpage_msg_no_contact_info', array('username' => htmlspecialchars($target_username))) . '
    +
    '; + echo '
    '; + + echo '
    '; // tab:profile - echo ''; - echo '
    - '; - - echo ''; - - else: - - // Nothing for now - - endif; - // User's own content $send_headers = $this->send_headers; $this->send_headers = false; + echo ''; + + echo '
    '; + if ( $this->page_exists ) { $this->render(); @@ -1533,116 +1724,26 @@ $this->err_page_not_existent(true); } - // Right sidebar - - if ( $user_exists ): - - echo ''; - - echo '
    - '; - - // - // Main part of sidebar - // - - // Contact information - - echo ''; - - $class = 'row3'; - - if ( $userdata['email_public'] == 1 ) - { - $class = ( $class == 'row1' ) ? 'row3' : 'row1'; - $email_link = $email->encryptEmail($userdata['email']); - echo ''; - } - - $class = ( $class == 'row1' ) ? 'row3' : 'row1'; - if ( $session->user_logged_in ) - { - echo ''; - } - else - { - echo ''; - } - - if ( !empty($userdata['user_aim']) ) - { - $class = ( $class == 'row1' ) ? 'row3' : 'row1'; - echo ''; - } + echo ''; // tab:content - if ( !empty($userdata['user_yahoo']) ) - { - $class = ( $class == 'row1' ) ? 'row3' : 'row1'; - echo ''; - } - - if ( !empty($userdata['user_msn']) ) - { - $class = ( $class == 'row1' ) ? 'row3' : 'row1'; - $email_link = $email->encryptEmail($userdata['user_msn']); - echo ''; - } - - if ( !empty($userdata['user_xmpp']) ) - { - $class = ( $class == 'row1' ) ? 'row3' : 'row1'; - $email_link = $email->encryptEmail($userdata['user_xmpp']); - echo ''; - } - - // Real life - - echo ''; - - if ( !empty($userdata['user_location']) ) - { - $class = ( $class == 'row1' ) ? 'row3' : 'row1'; - echo ''; - } - - if ( !empty($userdata['user_job']) ) - { - $class = ( $class == 'row1' ) ? 'row3' : 'row1'; - echo ''; - } - - if ( !empty($userdata['user_hobbies']) ) - { - $class = ( $class == 'row1' ) ? 'row3' : 'row1'; - echo ''; - } - - if ( empty($userdata['user_location']) && empty($userdata['user_job']) && empty($userdata['user_hobbies']) ) - { - $class = ( $class == 'row1' ) ? 'row3' : 'row1'; - echo ''; - } - - $code = $plugins->setHook('userpage_sidebar_right'); + $code = $plugins->setHook('userpage_tabs_body'); foreach ( $code as $cmd ) { eval($cmd); } - echo '
    ' . $lang->get('userpage_heading_contact') . '
    ' . $lang->get('userpage_lbl_email') . ' ' . $email_link . '
    ' . $lang->get('userpage_btn_send_pm', array('username' => htmlspecialchars($target_username), 'pm_link' => makeUrlNS('Special', 'PrivateMessages/Compose/to/' . $this->page_id, false, true))) . '
    ' . $lang->get('userpage_btn_send_pm_guest', array('username' => htmlspecialchars($target_username), 'login_flags' => 'href="' . makeUrlNS('Special', 'Login/' . $paths->nslist[$this->namespace] . $this->page_id) . '" onclick="ajaxStartLogin(); return false;"')) . '
    ' . $lang->get('userpage_lbl_aim') . ' ' . $userdata['user_aim'] . '
    ' . $lang->get('userpage_lbl_yim') . ' ' . $userdata['user_yahoo'] . '
    ' . $lang->get('userpage_lbl_wlm') . ' ' . $email_link . '
    ' . $lang->get('userpage_lbl_xmpp') . ' ' . $email_link . '
    ' . $lang->get('userpage_heading_real_life', array('username' => htmlspecialchars($target_username))) . '
    ' . $lang->get('userpage_lbl_location') . ' ' . $userdata['user_location'] . '
    ' . $lang->get('userpage_lbl_job') . ' ' . $userdata['user_job'] . '
    ' . $lang->get('userpage_lbl_hobbies') . ' ' . $userdata['user_hobbies'] . '
    ' . $lang->get('userpage_msg_no_contact_info', array('username' => htmlspecialchars($target_username))) . '
    -
    '; - - echo ''; - - else: - - if ( !is_valid_ip($target_username) ) + if ( $user_exists ) + { + echo '
    '; // userpage_wrap + } + else { - echo '

    ' . $lang->get('userpage_msg_user_not_exist', array('username' => htmlspecialchars($target_username))) . '

    '; + if ( !is_valid_ip($target_username) ) + { + echo '

    ' . $lang->get('userpage_msg_user_not_exist', array('username' => htmlspecialchars($target_username))) . '

    '; + } } - endif; - // if ( $send_headers ) // { // display_page_footers(); @@ -1823,7 +1924,7 @@ global $db, $session, $paths, $template, $plugins; // Common objects global $lang; - header('HTTP/1.1 404 Not Found'); + @header('HTTP/1.1 404 Not Found'); $this->header(); $this->do_breadcrumbs(); @@ -1838,7 +1939,7 @@ { if ( $userpage ) { - echo '

    ' . $lang->get('page_msg_404_title') . '

    + echo '

    ' . $lang->get('page_msg_404_title_userpage') . '

    ' . $lang->get('page_msg_404_body_userpage'); } else