Go Back   vb.org Archive > vBulletin Article Depository > Read An Article > vBulletin 4 Articles
FAQ Community Calendar Today's Posts Search

Reply
 
Thread Tools
[HOW TO - vB4] Create your own vBulletin page
Lynne's Avatar
Lynne
Join Date: Sep 2004
Posts: 41,180

 

California/Idaho
Show Printable Version Email this Page Subscription
Lynne Lynne is offline 11-15-2009, 10:00 PM

This is an updated article on how to create your own vbulletin powered page. It's only for use with vB4.

This is NOT my work. I'm posting this from another thread where vB Style took the time to write this out. And his work is based on the article by Gary King here - How to create your own vBulletin-powered page! (uses vB templates)

Instructions to Create your Own Page:


1. Create the php page:
- Create a new file, whatever you want to call it (let's say test.php).
- Open up test.php and add the following (replace TEST with whatever template you want to show - WARNING: the template name is CASE SENSITIVE!!!):
Code:
<?php

// ####################### SET PHP ENVIRONMENT ###########################
error_reporting(E_ALL & ~E_NOTICE);

// #################### DEFINE IMPORTANT CONSTANTS #######################

define('THIS_SCRIPT', 'test');
define('CSRF_PROTECTION', true);  
// change this depending on your filename

// ################### PRE-CACHE TEMPLATES AND DATA ######################
// get special phrase groups
$phrasegroups = array();

// get special data templates from the datastore
$specialtemplates = array();

// pre-cache templates used by all actions
$globaltemplates = array('TEST',
);

// pre-cache templates used by specific actions
$actiontemplates = array();

// ######################### REQUIRE BACK-END ############################
// if your page is outside of your normal vb forums directory, you should change directories by uncommenting the next line
// chdir ('/path/to/your/forums');
require_once('./global.php');

// #######################################################################
// ######################## START MAIN SCRIPT ############################
// #######################################################################

$navbits = construct_navbits(array('' => 'Test Page'));
$navbar = render_navbar_template($navbits);

// ###### YOUR CUSTOM CODE GOES HERE #####
$pagetitle = 'My Page Title';

// ###### NOW YOUR TEMPLATE IS BEING RENDERED ######

$templater = vB_Template::create('TEST');
$templater->register_page_templates();
$templater->register('navbar', $navbar);
$templater->register('pagetitle', $pagetitle);
print_output($templater->render());

?>
- Be sure to change 'TEST' to the actual template name (WARNING: the template name is CASE SENSITIVE!!!), and change 'test' to the filename or a unique name for the page. Also, change 'Test Page' and 'My Page Title' to whatever you want to show in the navbits, such as 'Viewing Member Profile' (just an example).

2. Create the Template:
- If you are in debug mode, create the template in your MASTER STYLE so it shows up in all your styles, otherwise make sure you create the template in the style you are using. If following the page above, call the template TEST (WARNING: the template name is CASE SENSITIVE!!!) with the following content:
HTML Code:
{vb:stylevar htmldoctype}
<html xmlns="http://www.w3.org/1999/xhtml" dir="{vb:stylevar textdirection}" lang="{vb:stylevar languagecode}" id="vbulletin_html">
  <head>
    <title>{vb:raw vboptions.bbtitle} - {vb:raw pagetitle}</title>
    {vb:raw headinclude}
    {vb:raw headinclude_bottom}
  </head>
  <body>
    
    {vb:raw header}
    
    {vb:raw navbar}
    
    <div id="pagetitle">
      <h1>{vb:raw pagetitle}</h1>
    </div>
    
    <h2 class="blockhead">Title</h2>
    <div class="blockbody">
      <div class="blockrow">
        Text
      </div>
    </div>
    
    {vb:raw footer}
  </body>
</html>
.
Instructions to Add your Page to the Who's Online List (WOL):
Create two plugins using the following hooks. Replace mypage and similar with your information.

1. hook location - online_location_process:
Code:
switch ($filename)
{
    case 'test.php':
        $userinfo['activity'] = 'mypage';
        break;
// add more cases here if you have more than one custom page. no need for multiple plugins. one plugin can handle all.
}
.
2. hook location online_location_unknown:
Code:
switch ($userinfo['activity'])
{
    case 'mypage':
        $userinfo['where'] = '<a href="test.php?'.$vbulletin->session->vars[sessionurl].'">My Page</a>';
        $userinfo['action'] = "Viewing My Page";
        $handled = true;
        break;
// add more cases here if you have more than one custom page. no need for multiple plugins. one plugin can handle all.
}
.
The colored part in the code above shows what you need to change in the plugins (both reds should be the same and both blues should be the same, whereas green can be whatever you want).


Please see this article for help with rendering templates - [vB4] Rendering templates and registering variables - a short guide
Reply With Quote
  #712  
Old 11-19-2011, 12:17 PM
rokslide rokslide is offline
 
Join Date: Nov 2011
Posts: 16
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

OK, this may be a dumb question, but here goes:

I followed the instructions of creating a new tab. Worked perfectly. Then, I followed these directions to create a new page in vBulletin and it worked perfectly. Now, I would like to incorporate all of my existing html pages (outside of vBulletin) I have created for my website within vBulletin. How do I link up the new page I created within Vbulletin to my existing pages? I want all of my pages to be within vBulletin so thatall of the formatting remains exactly the same. Do I copy and paste all of the html into the new template I just created, or can you simply direct the new template to point at the existing html file? Hope I didn't confuse everyone.

Thanks,
Reply With Quote
  #713  
Old 11-19-2011, 03:02 PM
Lynne's Avatar
Lynne Lynne is offline
 
Join Date: Sep 2004
Location: California/Idaho
Posts: 41,180
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

You will need to copy your page html into a new template that is called in the php page you make.
Reply With Quote
  #714  
Old 11-21-2011, 09:39 PM
cellarius's Avatar
cellarius cellarius is offline
 
Join Date: Aug 2005
Posts: 1,987
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

And make sure you have valid html afterwards - you need to copy just stuff between the body tags, not the head etc., or you will end up with doubles.
Reply With Quote
  #715  
Old 12-02-2011, 03:54 AM
Shadow666 Shadow666 is offline
 
Join Date: May 2010
Posts: 24
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Hi,

I have this:

test.php
Code:
<?php

// ####################### SET PHP ENVIRONMENT ###########################
error_reporting(E_ALL & ~E_NOTICE);

// #################### DEFINE IMPORTANT CONSTANTS #######################

define('THIS_SCRIPT', 'test');
define('CSRF_PROTECTION', true);  
// change this depending on your filename

// ################### PRE-CACHE TEMPLATES AND DATA ######################
// get special phrase groups
$phrasegroups = array();

// get special data templates from the datastore
$specialtemplates = array();

// pre-cache templates used by all actions
$globaltemplates = array('TEST',
);

// pre-cache templates used by specific actions
$actiontemplates = array();

// ######################### REQUIRE BACK-END ############################
// if your page is outside of your normal vb forums directory, you should change directories by uncommenting the next line
// chdir ('/path/to/your/forums');
require_once('./global.php');

// #######################################################################
// ######################## START MAIN SCRIPT ############################
// #######################################################################

$navbits = construct_navbits(array('' => 'Test Page'));
$navbar = render_navbar_template($navbits);

// ###### YOUR CUSTOM CODE GOES HERE #####
$pagetitle = 'My Page Title';

// ###### NOW YOUR TEMPLATE IS BEING RENDERED ######

$templater = vB_Template::create('TEST');
$templater->register_page_templates();
$templater->register('navbar', $navbar);
$templater->register('pagetitle', $pagetitle);
$templater->register('includebody', $includebody);
print_output($templater->render());

?>
template TEST
Code:
{vb:stylevar htmldoctype}
<html xmlns="http://www.w3.org/1999/xhtml" dir="{vb:stylevar textdirection}" lang="{vb:stylevar languagecode}" id="vbulletin_html">
  <head>
    <title>{vb:raw vboptions.bbtitle} - {vb:raw pagetitle}</title>
    {vb:raw headinclude}
    {vb:raw headinclude_bottom}
  </head>
  <body>
    
    {vb:raw header}
    
    {vb:raw navbar}
    
    <div id="pagetitle">
      <h1>{vb:raw pagetitle}</h1>
    </div>
    
{vb:raw includebody}
    
    {vb:raw footer}
  </body>
</html>
Plugin global_start
Code:
if (THIS_SCRIPT == 'test') 
{ 
ob_start(); 
include('./test/game/start.php'); 
$includebody = ob_get_contents(); 
ob_end_clean(); 
}
I want to upgrade the plugin from global_start to global_bootstrap_init_start, as global_start has been deprecated since 4.0.2.

When I changed the global_start to global_bootstrap_init_start the php file that was been called no longer displayed.

Can anyone help with this please.
Reply With Quote
  #716  
Old 12-02-2011, 02:21 PM
kh99 kh99 is offline
 
Join Date: Aug 2009
Location: Maine
Posts: 13,185
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Quote:
Originally Posted by Shadow666 View Post
Hi,

I have this:....
I think your problem is that global_bootstrap_init_start code is called inside a function, so your $includebody variable is not global. You could fix it by adding a "global $includebody" statement.

But if that plugin is only being executed when your custom script is running, you could also just move the plugin code to in to your test.php script. It will work exactly the same - there's no reason that code has to be at the global_start hook, it's just that that's a good place to put it if you want to include an external file when you're not writing a custom php script.
Reply With Quote
  #717  
Old 12-02-2011, 07:53 PM
Shadow666 Shadow666 is offline
 
Join Date: May 2010
Posts: 24
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Quote:
Originally Posted by kh99 View Post
I think your problem is that global_bootstrap_init_start code is called inside a function, so your $includebody variable is not global. You could fix it by adding a "global $includebody" statement.

But if that plugin is only being executed when your custom script is running, you could also just move the plugin code to in to your test.php script. It will work exactly the same - there's no reason that code has to be at the global_start hook, it's just that that's a good place to put it if you want to include an external file when you're not writing a custom php script.
Thank you that fixed it.
Reply With Quote
  #718  
Old 12-04-2011, 11:34 AM
satlazone satlazone is offline
 
Join Date: Mar 2008
Location: Israel
Posts: 62
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Quote:
Originally Posted by kh99 View Post
OK, well, it's clearly some kind of encoding issue. I found this in the php manual: http://www.php.net/manual/en/language.types.string.php



So do you happen to know how your script files are encoded (like what your OS or editor default encoding is, I guess). And how do you have your vb configured?

Or I suppose we could take another guess and try utf8_encode().
I did try to use utf8_encode
It did change the characters but it's still not written in Hebrew.
example: ???? ????? ???? ???

I didn't understand how I can solve it via the link you have provided.
Do you have any other suggestions?
Reply With Quote
  #719  
Old 12-08-2011, 12:49 AM
Rocket2009 Rocket2009 is offline
 
Join Date: Mar 2009
Posts: 19
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Over the past day I have used this tutorial and thread and others to create pages that link to menu options and it is working exactly as expected.

Now I want to embed a knowledge base tool (KBPublisher) within a vb4 page so it has the vb menus over it and vbstyles. I did this in vb3 and am now working the vb4 issues with this tutorial.

I am at the 98% point. The kb tool integrates and works well all with the vb menus. The problem is that it doesn't recognize the user login information and I am having trouble figuring out how to pass the information through the rendering process. All of my test cases recognized the user including the php file if called directly rather than through the kb tool, including highlighting the added buttons. So most of the information is getting through.

I am hoping to get help on how to pass the userinfo through the rendering process so I can display the kb system within this vbpage. It looks pretty awesome, but just keeps asking my sign-up even though I am logged in and any page I shift to recognizes me.

My php code is pretty vanilla and is called knowledgebase.php:

PHP Code:
<?php

// ####################### SET PHP ENVIRONMENT ###########################
error_reporting(E_ALL & ~E_NOTICE);

// #################### DEFINE IMPORTANT CONSTANTS #######################

define('THIS_SCRIPT''knowledgebase');
define('CSRF_PROTECTION'true);  
// change this depending on your filename

// ################### PRE-CACHE TEMPLATES AND DATA ######################
// get special phrase groups
$phrasegroups = array();

// get special data templates from the datastore
$specialtemplates = array();

// pre-cache templates used by all actions
$globaltemplates = array('KBPublisher',
);

// pre-cache templates used by specific actions
$actiontemplates = array();

// ######################### REQUIRE BACK-END ############################
// if your page is outside of your normal vb forums directory, you should change directories by uncommenting the next line
chdir ('/home/touring7/public_html/');
require_once(
'./global.php');

// #######################################################################
// ######################## START MAIN SCRIPT ############################
// #######################################################################

$navbits construct_navbits(array('' => 'Test Page'));
$navbar render_navbar_template($navbits);

// ###### YOUR CUSTOM CODE GOES HERE #####
$pagetitle 'My Page Title';



// ###### NOW YOUR TEMPLATE IS BEING RENDERED ######

$templater vB_Template::create('KBPublisher');
$templater->register_page_templates();
$templater->register('navbar'$navbar);
// $templater->register('pagetitle', $pagetitle);
print_output($templater->render());

?>
My template follows the tutorial plus uses the template provided by the KBPublisher software and is naturally called KBPublisher (my template):

HTML Code:
{vb:stylevar htmldoctype}
<html xmlns="http://www.w3.org/1999/xhtml" dir="{vb:stylevar textdirection}" lang="{vb:stylevar languagecode}" id="vbulletin_html">
  <head>
    <title>{vb:raw vboptions.bbtitle} - {vb:raw pagetitle}</title>
    {vb:raw headinclude}
    {vb:raw headinclude_bottom}

             <title>{meta_title}</title>
	<meta http-equiv="content-type" content="text/html; charset={meta_charset}" />
	<meta http-equiv="content-language" content="{meta_content_lang}" />
	<meta name="keywords"  content="{meta_keywords}" />
	<meta name="description"  content="{meta_description}" />
	<meta name="robots"  content="{meta_robots}" />
	
	<!--[if IE]>
	<link rel="stylesheet" type="text/css" href="{common_ie_css}" />
	<![endif]-->
	<link rel="stylesheet" type="text/css" href="{common_css}" />
	<link rel="stylesheet" type="text/css" href="{common_view_css}" />
	{style_css_links}
	{rss_head_links}
	<script src="{base_href}client/jscript/common.js" type="text/javascript"></script>

        

  </head>
  <body>

    {vb:raw header}
    
    {vb:raw navbar}
    
    <div id="pagetitle">
      <h1>{vb:raw pagetitle}</h1>
    </div>
    
    <h2 class="blockhead">Title</h2>
    <div class="blackbody">

{content}

    </div>
    
    {vb:raw footer}
  </body>
</html>
The key aspect is that the KBPublisher knowledgebase software requires a minimum of three tags in the html code of the kbpublisher system template file

{style_css_links}, {rss_head_links}, and {content}

as shown in the default kbpublisher template file shown here:

HTML Code:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
	<title>{meta_title}</title>
	<meta http-equiv="content-type" content="text/html; charset={meta_charset}" />
	<meta http-equiv="content-language" content="{meta_content_lang}" />
	<meta name="keywords"  content="{meta_keywords}" />
	<meta name="description"  content="{meta_description}" />
	<meta name="robots"  content="{meta_robots}" />
	
	<!--[if IE]>
	<link rel="stylesheet" type="text/css" href="{common_ie_css}" />
	<![endif]-->
	<link rel="stylesheet" type="text/css" href="{common_css}" />
	<link rel="stylesheet" type="text/css" href="{common_view_css}" />
	{style_css_links}
	{rss_head_links}
	<script src="{base_href}client/jscript/common.js" type="text/javascript"></script>
</head>
<body>
	
	your html here
	
	{content}

	your html here
	
</body>
</html>

then the KBPublisher system renders the page replacing the {tags} with the appropriate code. Obviously the {content} tag is where the KB software gets inserted (it's great).

KBPublisher is open source and I can modify the index.php file if needed. I did it for the VB3 integration but naturally I need to minimize the number of hacks to make support easy. However, inside the index.php file for KBPublisher is the following comment:

PHP Code:

// example of adding global variable to template
// in template you should have a template tag - {global_test}
//$page->assign('global_test', '<b>test global variable</b>'); 
So I could potentially assign a value to 'global test' inside the index.php file for KBPublisher say and then add a {global test} tag within the template to pass a value to it. In the KB3 implementation I used this pass different HTML based upon user status.

The way the kb software works is that when I call its index.php I have already specified in a configuration file the name of the template file, in this case knowledgebase.php, which uses the vb rendering system which calls the vb template.

Everything displays just the way I want, but it keeps showing the user as not logged in. I know this is a long entry, but I wanted to be complete for the help. Plus, if we get this solved, others might like to know how to integrate a comprehensive knowledgebase tool within a vb page.

I have experimented with various incarnations of input security token but I either didn't get the format correct, the location correct, or was otherwise unsuccessful
Reply With Quote
  #720  
Old 12-08-2011, 02:38 AM
kh99 kh99 is offline
 
Join Date: Aug 2009
Location: Maine
Posts: 13,185
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Check your "Path to Save Cookies" setting under Settings > Options > Cookies and HTTP Header Options in the adminCP. Like it says in the comments, this must be set to / if you want the vb cookies to be sent no matter which directory your custom page is in.
Reply With Quote
  #721  
Old 12-08-2011, 03:00 AM
Rocket2009 Rocket2009 is offline
 
Join Date: Mar 2009
Posts: 19
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Quote:
Check your "Path to Save Cookies" setting under Settings > Options > Cookies and HTTP Header Options in the adminCP. Like it says in the comments, this must be set to / if you want the vb cookies to be sent no matter which directory your custom page is in.
Yes, at

admincp -> options -> cookies and HTTP Header Options

Path to Save Cookies is set to a ; /

I also experimented with Cookie domain selected .touringmotorgliders.org as well as the default 'blank' to my domain .touringmotorgliders.org with no difference.

Incidentally, I can put knowledgebase.php into the same directory as the forum and it doesn't make a difference. The index.php file for the kbpublisher system needs to be in its directory. I can add the global cast in that file, but it doesn't make any difference, unless I can find a way to pass the user information.

Thanks.


So I am still experimenting ...
Reply With Quote
Reply


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT. The time now is 04:06 PM.


Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2024, vBulletin Solutions Inc.
X vBulletin 3.8.12 by vBS Debug Information
  • Page Generation 0.06659 seconds
  • Memory Usage 2,405KB
  • Queries Executed 26 (?)
More Information
Template Usage:
  • (1)SHOWTHREAD
  • (1)ad_footer_end
  • (1)ad_footer_start
  • (1)ad_header_end
  • (1)ad_header_logo
  • (1)ad_navbar_below
  • (1)ad_showthread_beforeqr
  • (6)bbcode_code
  • (3)bbcode_html
  • (2)bbcode_php
  • (4)bbcode_quote
  • (1)footer
  • (1)forumjump
  • (1)forumrules
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (1)modsystem_article
  • (1)navbar
  • (4)navbar_link
  • (120)option
  • (1)pagenav
  • (1)pagenav_curpage
  • (4)pagenav_pagelink
  • (3)pagenav_pagelinkrel
  • (11)post_thanks_box
  • (58)post_thanks_box_bit
  • (11)post_thanks_button
  • (1)post_thanks_javascript
  • (1)post_thanks_navbar_search
  • (1)post_thanks_postbit
  • (11)post_thanks_postbit_info
  • (10)postbit
  • (11)postbit_onlinestatus
  • (11)postbit_wrapper
  • (1)spacer_close
  • (1)spacer_open
  • (1)tagbit_wrapper 

Phrase Groups Available:
  • global
  • inlinemod
  • postbit
  • posting
  • reputationlevel
  • showthread
Included Files:
  • ./showthread.php
  • ./global.php
  • ./includes/init.php
  • ./includes/class_core.php
  • ./includes/config.php
  • ./includes/functions.php
  • ./includes/class_hook.php
  • ./includes/modsystem_functions.php
  • ./includes/functions_bigthree.php
  • ./includes/class_postbit.php
  • ./includes/class_bbcode.php
  • ./includes/functions_reputation.php
  • ./includes/functions_post_thanks.php 

Hooks Called:
  • init_startup
  • init_startup_session_setup_start
  • init_startup_session_setup_complete
  • cache_permissions
  • fetch_threadinfo_query
  • fetch_threadinfo
  • fetch_foruminfo
  • style_fetch
  • cache_templates
  • global_start
  • parse_templates
  • global_setup_complete
  • showthread_start
  • showthread_getinfo
  • forumjump
  • showthread_post_start
  • showthread_query_postids
  • showthread_query
  • bbcode_fetch_tags
  • bbcode_create
  • showthread_postbit_create
  • postbit_factory
  • postbit_display_start
  • post_thanks_function_post_thanks_off_start
  • post_thanks_function_post_thanks_off_end
  • post_thanks_function_fetch_thanks_start
  • fetch_musername
  • post_thanks_function_fetch_thanks_end
  • post_thanks_function_thanked_already_start
  • post_thanks_function_thanked_already_end
  • post_thanks_function_fetch_thanks_bit_start
  • post_thanks_function_show_thanks_date_start
  • post_thanks_function_show_thanks_date_end
  • post_thanks_function_fetch_thanks_bit_end
  • post_thanks_function_fetch_post_thanks_template_start
  • post_thanks_function_fetch_post_thanks_template_end
  • postbit_imicons
  • bbcode_parse_start
  • bbcode_parse_complete_precache
  • bbcode_parse_complete
  • postbit_display_complete
  • post_thanks_function_can_thank_this_post_start
  • pagenav_page
  • pagenav_complete
  • tag_fetchbit_complete
  • forumrules
  • navbits
  • navbits_complete
  • showthread_complete