Владельцам 3.8.6: не поставили патч - потеряли форум!

Файловый Архив

  • Неограниченное количество категорий и суб-категорий
  • Настройки прав доступа по группам
  • Настройки прав доступа по каждой категории
  • Предпросмотр медиа файлов: FLV, IFLV, F4A, F4V, MP4, MP3, MOV и других...
  • Мультизагрузка файлов - SWFUploader
  • Добавление файлов с сервера
Подробности и история обновлений продукта в этой теме
Loading

Go Back   форум vBSupport.org > > >
Register Изображения Меню vBsupport Files Manager Аллея Звёзд Реклама на форуме Search Today's Posts Mark Forums Read
  • Мемберка
  • Администраторам
  • Premoderation
  • For English speaking users
  • Изменения в правах
  • Каталог Фрилансеров
Пароли на скачивание файлов в Member Area меняются автоматически каждый день
Если вам нужно скачать какой то скрипт, за паролем ко мне в ЛС
привет какирам kerk
Ещё раз обращаем Ваше внимание: всё, что Вы скачиваете и устанавливаете на свой форум, Вы устанавливаете исключительно на свой страх и риск.
Сообщество vBSupport'а физически не в состоянии проверять все стили, хаки и нули, выкладываемые пользователями.
Помните: безопасность Вашего проекта - Ваша забота.
Убедительная просьба: при обнаружении уязвимостей или сомнительных кодов обязательно отписывайтесь в теме хака/стиля
Спасибо за понимание
На форуме введена премодерация ВСЕХ новых пользователей

Почта с временных сервисов, типа mailinator.com, gawab.com и/или прочих, которые предоставляют временный почтовый ящик без регистрации и/или почтовый ящик для рассылки спама, отслеживается и блокируется, а так же заносится в спам-блок форума, аккаунты удаляются
for English speaking users:
You may be surprised with restriction of access to the attachments of the forum. The reason is the recent change in vbsupport.org strategy:

- users with reputation < 10 belong to "simple_users" users' group
- if your reputation > 10 then administrator (kerk, Luvilla) can decide to move you into an "improved" group, but only manually

Main idea is to increase motivation of community members to share their ideas and willingness to support to each other. You may write an article for the subject where you are good enough, you may answer questions, you may share vbulletin.com/org content with vbsupport.org users, receiving "thanks" equal your reputation points. We should not only consume, we should produce something.

- you may:
* increase your reputation (doing something useful for another members of community) and being improved
* purchase temporary access to the improved category:
10 $ for 3 months. - this group can download attachments, reputation/posts do not matter.
20 $ for 3 months. - this group can download attachments, reputation/posts do not matter + adds eliminated + Inbox capacity increased + files manager increased permissions.

Please contact kerk or Luvilla regarding payments.

Important!:
- if your reputation will become less then 0, you will be moved into "simple_users" users' group automatically.*
*for temporary groups (pre-paid for 3 months) reputation/posts do not matter.
Не можете скачать вложение?
Изменения в правах групп пользователей
внимательно читаем эту и эту темы
Короткая версия - тут
Уважаемые пользователи!

На форуме открыт новый раздел "Каталог фрилансеров"

и отдельный раздел для платных заказов "Куплю/Закажу"

 
 
Old  
zCarot
zМарковь
Хочет третью строчку =)
 
zCarot's Avatar
Default Качаем с официальных сайтов! Заявки принимаются. 118

Запросы на скачку с сайтов, к которым нет прямого бесплатного доступа.
название хака + версия хака + ссылка на хак
Помните, что тут просьбы, а не требования.


При запросе давайте не только линк на тему, но и оригинальное название хака.
Перед тем, как оформить запрос на скачку, воспользуйтесь поиском в теме и убедитесь, что этот хак ранее точно не выкладывался.

Запрещенные к запросу хаки/модули/продукты:
  • Read PM
  • Admin Login in as User
  • И им подобные
 
Old  
Cr00t
Продвинутый
Default 0

Нихрена себе запросик =)
выложу по мере форматирования
 
Bot
Yandex Bot Yandex Bot is online now
 
Join Date: 05.05.2005
Реклама на форуме А что у нас тут интересного? =)
Old  
Cr00t
Продвинутый
Default 0

Create your own vBulletin tables by Triky

Hi, this simple tutorial will tech you how to create a table(s) in your vBulletin forum. Step by step you will learn how to use tables, how to edit them and how to adjust them!
Ok, first question: what's a vBulletin table? You must know that vBulletin is mostly composed by tables. A vBulletin table could be this, for example:

Click image for larger version

Name:	vBTablesTutorial[1].jpg
Views:	20
Size:	19.8 KB
ID:	7811

Code used:

HTML Code:
 <table class="tborder" cellpadding="$stylevar[cellpadding]" cellspacing="$stylevar[cellspacing]" border="0" width="100%" align="center">
<tr>
    <td class="alt1" width="100%">
<div class="smallfont">Hi, this is a vBulletin table. Table class: <strong>tborder</strong>. Td class: <strong>alt1</strong>. Border: 0. Width: 100%. Align: center.</div>
</td>
</tr>
</table>
And now, we can try to change the table class. As you can see, now it's tborder. Let's change it to tcat!

Code:
<table class="tcat" ...
Result:

Click image for larger version

Name:	vBTablesTutorial[2].jpg
Views:	12
Size:	19.8 KB
ID:	7812

Using our vBulletin CSS specifications, we can change the style of our new or existing tables.
Now we'll change the Td class, using the tborder table class and the tcat table class.
  • Table class: tborder. Td class: alt1:
  • Click image for larger version

Name:	vBTablesTutorial[1].jpg
Views:	20
Size:	19.8 KB
ID:	7811
  • Table class: tcat. Td class: alt2:
  • Click image for larger version

Name:	vBTablesTutorial[31].jpg
Views:	4
Size:	19.9 KB
ID:	7813

More usefull question, now, could be: how do I do a table like the follow?

Click image for larger version

Name:	vBTablesTutorial[4].jpg
Views:	7
Size:	23.7 KB
ID:	7814

Simple! Using a Tr. In above examples, we was using just one Tr. Using two Tr, we can do a table like that.

Here the code I've used:

HTML Code:
 <table class="tborder" cellpadding="$stylevar[cellpadding]" cellspacing="$stylevar[cellspacing]" border="0" width="100%" align="center">
<tr>

<td class="tcat" width="100%">
<div style="text-align: center;">
New Table Title
</div>
</td>

</tr>

<tr>

<td class="alt1" width="100%">
<div class="smallfont">
This is a vBulletin table. Table class: <strong>tborder</strong>. 1st Td class: <strong>tcat</strong>. 1st Td text align: <strong>center</strong>. Second Td class: <strong>alt1</strong>. Border: 0. Width: 100%. Align: center.
</div>
</td>

</tr>
</table>
Table class: tborder. 1st Td class: tcat. 1st Td text align: center. Second Td class: alt1. Border: 0. Width: 100%. Align: center.

You could want to have a collapsible vBulletin table. It's simple.
This is the code you're searching:

HTML Code:
 <a  style="float:$stylevar[right]" href="#top" onclick="return toggle_collapse('my_table')"><img id="collapseimg_my_table" src="$stylevar[imgdir_button]/collapse_tcat$vbcollapse[collapseimg_my_table].gif" alt="" border="0" /></a>

<tbody id="collapseobj_my_table" style="$vbcollapse[collapseobj_my_table]">
"Where should I put it?" In your first table Td, usually. Using codes we have used as far as now..

Code:
 <table class="tborder" cellpadding="$stylevar[cellpadding]" cellspacing="$stylevar[cellspacing]" border="0" width="100%" align="center">
<tr>

<td class="tcat" width="100%">
<a  style="float:$stylevar[right]" href="#top" onclick="return toggle_collapse('my_table')"><img id="collapseimg_my_table" src="$stylevar[imgdir_button]/collapse_tcat$vbcollapse[collapseimg_my_table].gif" alt="" border="0" /></a>
<div style="text-align: center;">
New Table Title
</div>
</td>
<tbody id="collapseobj_my_table" style="$vbcollapse[collapseobj_my_table]">
</tr>

<tr>

<td class="alt1" width="100%">
<div class="smallfont">
[snip]
</div>
</td>

</tr>
</table>
Result:
  • Click image for larger version

Name:	vBTablesTutorial[5].jpg
Views:	11
Size:	18.6 KB
ID:	7815
  • Click image for larger version

Name:	vBTablesTutorial[6].jpg
Views:	10
Size:	24.9 KB
ID:	7816

With tables you can do what you want! vBulletin is a big main table, remember. I hope you've appreciated this little tutorial. Let me know in this thread if you have more and specific questions.
 
Old  
Cr00t
Продвинутый
Default 0

How-To Cache Templates by Princeton

This article assumes that you are building your own product with end-user options.


INTRODUCTORY ON CACHING TEMPLATES:
Whenever you create a product you should cache your templates by adding them to the $globaltemplates and $actiontemplates array.

$globaltemplates are templates loaded by all actions.
$actiontemplates are templates loaded when a specified action is called such as $do (e.g. ?do=edit).


TEMPLATES NOT CACHED:

Quote:
When displaying an "error message" on the same page I notice that the templates are not cached.
This is due to the fact that the "action" does not have any templates to load (via $actiontemplates).*

To remedy this some coders add the uncached templates to the $globaltemplates array. However, this is the wrong way to do it. As a coder, our obligation is to cache the least amount of templates to consume less memory.

*NOTE: This usually happens when you are redirected back to the page via $_POST.

THE FIX:
To cache these templates, we add the following:

PHP Code:
$actiontemplates['insertsettings'] =& $actiontemplates['options']; 
below the $actiontemplates array.


EXAMPLE:
A blog product that I am working on will display an error message to the end-user upon an error. The error message will be on the same page (redirected back via $_POST) not a STANDARD_ERROR page.

The interface is full of options that at the very least requires the end-user to enter a TITLE and DESCRIPTION.

The interface is accessible by the action "do=options".
To cache the required templates to build the interface I add the templates to the $actiontemplates array such as:

PHP Code:
$actiontemplates = array(
    
'options' => array(
        
'gtblog_options',
        
'gtblog_radio_option',
        
'newpost_errormessage',
    ) 
Back to the interface...
whenever the end-user forgets to enter a TITLE an error message is displayed. (The system requires the title.)

When the error message is displayed none of the templates are cached. We are missing something...

To remedy this we need to look at the $_POST "do" action of the form. A closer look at the html source tells me that the "do" action is

HTML Code:
<input name="do" value="insertsettings" type="hidden">
With this new information we fix the uncached issue by adding

PHP Code:
$actiontemplates['insertsettings'] =& $actiontemplates['options']; 
below the $actiontemplates array.

The final code should look like this:

PHP Code:
$actiontemplates = array(
    
'options' => array(
        
'gtblog_options',
        
'gtblog_radio_option',
        
'newpost_errormessage',
    )
$actiontemplates['insertsettings'] =& $actiontemplates['options']; 
Click image for larger version

Name:	1.gif
Views:	8
Size:	18.7 KB
ID:	7817 Click image for larger version

Name:	1a.gif
Views:	15
Size:	26.3 KB
ID:	7818
 
Old  
Cr00t
Продвинутый
Default 0

Flash Headers, Footers, and Avatars for vBulletin by ShawnV

Flash, Flash for vBulletin, Flash Headers, Flash Footers, and Flash Avatars


# Flash, what is it?

Strictly speaking, flash is an integrated development environment (IDE) while Flash Player is a virtual machine used to run, or parse, the Flash files. But in contemporary colloquial terms "Flash" can refer to the authoring environment, the player, or the application files.

Flash technology has become a popular method for adding animation and interactivity to web pages; several software products, systems, and devices are able to create or display Flash. Flash is commonly used to create animation, advertisements, various web-page components, to integrate video into web pages, and more recently, to develop rich Internet applications.

The Flash files, traditionally called "Flash movies" have a .swf file extension and may be an object of a web page, strictly "played" in a standalone Flash Player, or incorporated into a Projector, a self-executing Flash movie with the .exe extension in Windows. Flash Video files have an .FLV file extension and are utilized from within .swf files.

Most Flash imbued sites set up a splash page to notify the user that the site requires the flash plug-in to view properly and provides a link to the current version. Splash pages also advise of resolutions, content warnings and have bypass links.




# Flash for vBulletin

There are several ways to do flash in any HTML or XHTML document including vBulletin.

The standard, object embed method is to add the code below to your template, setting the param's, width, colors, location and movie name to reflect your .swf file needs.

Code:
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" 
   codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0" 
   width="550" height="400" id="Untitled-1" align="middle">
<param name="allowScriptAccess" value="sameDomain" />
<param name="movie" value="mymovie.swf" />
<param name="quality" value="high" />
<param name="bgcolor" value="#ffffff" />
<embed src="mymovie.swf" quality="high" bgcolor="#ffffff" width="550" 
   height="400" name="mymovie" align="middle" allowScriptAccess="sameDomain" 
   type="application/x-shockwave-flash" pluginspage="http://www.adobe.com/go/getflashplayer" />
</object>
The SWFObject method uses a Java file and is more flexible, it HTML or XHTML validates; It works with all browsers and has version detection. It also fixes the click to activate problem with IE browsers and can be set to display alternative content if the user does not have a flash plug in.

Developed by Deconcept and adopted by Adobe and most web designers, I recommend this method of embedding flash for all primary assets; however I will sometimes mix the two methods depending on the requirements of the page, as is demonstrated in this article.

Example pages, source files and the Java script file needed for SWFObject embedding can be found in the link below.

swfobject.zip

Example of SWFObject method in comparison to the Object method listed above.

Code:
<script type="text/javascript" src="http://www.yoursite.com/swfobject.js"></script>	

<div id="header">
<script type="text/javascript">
   var so = new SWFObject("http://www.yoursite.com/forum/flash/movie.swf", " clsid:d27cdb6e-ae6d-11cf-96b8-444553540000", "1000", "274", "8", "#000000");
   so.addParam("quality", "high");
   so.addParam("salign", "t");
   so.write("header");
</script>
</div>
This short bit of Javascript is what passes in the Flash movie parameters – from the original code, above - so that the FlashObject script can display the Flash movie properly. Here’s the breakdown:

var so = new SWFObject( "movie.swf ", -- the full path to your Flash movie

"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000", -- this matches the “ID” from your Flash movie parameters, yours could be different, an easy way to find this ID is to set the publish settings in flash to output HTML along with the .swf file and then open the HTML in notepad or any editor.

"1000", -- the width of the Flash movie

"274", -- the height of the Flash movie

"8", -- the minimum version of the Flash Player that is required, you can set this to any version you desire, however I recommend setting it one version behind the current stable release.

"#000000"); -- the background color

fo.addVariable("variable", "varvalue"); -- this is only necessary if you are passing in variables to the Flash movie through the HTML code. You can duplicate this line if you are passing in several variables.


Note: If you are running more then one instance of a flash element on a page as I am: header, footer, bot avatar and so on, you want to name each instance of the <div id="NAME"> and the so.write("NAME"); with a different ID. Ergo: <div id="header"> <div id="footer"> with matching so.write("header"); & so.write("footer"); variants.

More information:

http://blog.deconcept.com/swfobject/


Note: I recommend creating a flash folder in your forum root for either method and using complete paths to the files in the edits, ergo: "http://www.yoursite.com/forum/flash/movie.swf"


# Flash Headers

Adding flash to your vBulletin header,

Goto admincp> styles&templates> style manager> edit template > Find the header template and open.

Depending on your template setup, find this code:

Code:
<!-- logo --> 
<a name="top"></a>
<table border="0" width="$stylevar[outertablewidth]" cellpadding="0" cellspacing="0" align="center">
<tr>
    <td align="$stylevar[left]"><a href="$vboptions[forumhome].php$session[sessionurl_q]"><img src="$stylevar[titleimage]" border="0" alt="$vboptions[bbtitle]" /></a></td>
    <td align="$stylevar[right]">
        &nbsp;
    </td>
</tr>
</table>
<!-- /logo -->
Example: header template, change the variables and paths to suit your needs and add / replace with this code below:

Code:
<script type="text/javascript" src="http://www.yoursite.com/swfobject.js"></script>

<div id="header">
<script type="text/javascript">
   var so = new SWFObject("http://www.yoursite.com/forum/flash/movie.swf", "clsid:d27cdb6e-ae6d-11cf-96b8-444553540000", "1000", "274", "8", "#000000");
   so.addParam("quality", "high");
   so.addParam("salign", "t");
   so.write("header");
</script>
</div>
# Flash Footers

Adding flash to your vBulletin footer,

Goto admincp> styles&templates> style manager> edit template > Find the footer template and open.

Depending on your template setup, find this code at the bottom of the template:

Code:
<!--
    // Main vBulletin Javascript Initialization
    vBulletin_init();
//-->
Example: footer template, change the variables and paths to suit your needs and add this code below.

Code:
<script type="text/javascript" src="http://www.yoursite.com/swfobject.js"></script>	

<div id="footer">
<script type="text/javascript">
   var so = new SWFObject("http://www.yoursite.com/forum/flash/movie.swf", "clsid:d27cdb6e-ae6d-11cf-96b8-444553540000", "1000", "382", "8", "#000000");
   so.addParam("quality", "high");
   so.addParam("salign", "b");
   so.write("footer");
</script>
</div>
# Flash Avatars

Adding flash avatars to your vBulletin postbit and postbit legacy templates using the standard Object method.

Goto admincp> styles&templates> style manager> edit template > Find the postbit or postbit lagacy template and open.

Depending on your template setup, find this code:

Code:
<if condition="$show['avatar']"><td class="alt2"><a href="member.php?$session[sessionurl]u=$post[userid]"><img src="$post[avatarurl]" $post[avwidth] $post[avheight] alt="<phrase 1="$post[username]">$vbphrase[xs_avatar]</phrase>" border="0" /></a></td></if>
Example: postbit template, change the variables and paths to suit your needs and add this code above.

Standard Object Embed:

Code:
<if condition="$post['userid']=='58'"><td class="alt2">

<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
 <object type="application/x-shockwave-flash" data="http://www.yoursite.com/forum/flash/movie.swf" width="100" height="100">
            <param name="allowScriptAccess" value="sameDomain" />
            <param name="movie" value="http://www.yoursite.com/forum/flash/movie.swf" />
            <param name="menu" value="false" />
            <param name="quality" value="high" />
                        <param name="wmode" value="transparent">
            <a href="http://www.macromedia.com/go/getflashplayer/"><img src="http://www.macromedia.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Flash Player!" /></a>
        </object></td></if>
Note: Change the IF conditional to the user ID you want to display the flash avatar.
 
Old  
Cr00t
Продвинутый
Default 1

Using the vBulletin Input Cleaner by Alan @ CIT

Note: This article assumes that you are familier with PHP, and will introduce you to input filtering using vBulletin

Using the vBulletin Input Cleaner Class

Introduction

Most scripts will require data from a user at some point. When using this data, you should never assume that it is "clean" data. With XSS (Cross-Site Scripting) and SQL exploits being identified in scripts on a daily basis, you should do everything you can to ensure that all data coming from the user has been cleaned ("sanatized").

vBulletin provides us with the vB_Input_Cleaner class to do just this.
The vBulletin Input Cleaner class is setup when the page loads, and can be accessed as $vbulletin->input,

Data Types

When you accept data from the user, you should know what type of data you are expecting to receive. the vBulletin Input Cleaner allows the following types of data to be cleaned:
  • TYPE_NOCLEAN
  • Will not be cleaned
  • TYPE_BOOL
  • Will check it is either true or false
  • TYPE_INT
  • Will check that it is an integer
  • TYPE_UINT
  • Will check that it is an unsigned integer
  • TYPE_NUM
  • Will check that it is a number
  • TYPE_UNUM
  • Will check that it is an unsigned number
  • TYPE_UNIXTIME
  • Will check that it is a unix-style timestamp (unsigned int)
  • TYPE_STR
  • Will check that it is a string, and runs trim() on it
  • TYPE_NOTRIM
  • Will check that it is a string and will not run trim() on it
  • TYPE_NOHTML
  • WIll check that it is a string and run htmlspecialchars_uni() and trim() on it
  • TYPE_ARRAY
  • WIll check that it is an array
  • TYPE_FILE
  • Will check that it is a file (ie, uploaded by the user)

You can also clean arrays of these types by using TYPE_ARRAY_<type>. For example, if you had an array of numbers, you could use TYPE_ARRAY_INT, or TYPE_ARRAY_NUM.

Cleaning Functions

The input cleaner class provides a number of useful functions that we can use to clean our data, depending on what data you wish to clean.

Cleaning Superglobal Arrays

By Superglobal, I mean $_POST, $_GET, $_REQUEST and so on. These arrays are created automaticly by PHP and contain the user-sent input. They are referenced in the vBulletin Input Cleaner by nice short single letter names. These are:
  • p - $_POST
  • g - $_GET
  • r - $_REQUEST
  • s - $_SERVER
  • e - $_ENV
  • c - $_COOKIE
  • f - $_FILES

The vBulletin Input Cleaner class provides the clean_array_gpc() function which allows us to clean data in these Superglobal arrays in one hit, without having to clean every individual variable in them.

Example:

PHP Code:
$vbulletin->input->clean_array_gpc('p', array(
'name' => TYPE_NOHTML,
'age' => TYPE_UINT,
'usepm' => TYPE_BOOL
)); 
As you can see from this example, clean_array_gpc() takes 2 paramaters. The first paramater specifies which Superglobal array you wish to clean, and the second is an array of variables and their types.

So, in the example above, we are telling clean_array_gpc() that we wish to clean the $_POST array, and that $_POST contains 3 variables, 'name', 'age', and 'usepm', and that we wish to clean them as TYPE_NOHTML, TYPE_UINT and TYPE_BOOL respectivly.

Once cleaned, the new (clean) variables will be available in the $vbulletin->GPC array. So, to follow on from our previous example, we would use something like:

PHP Code:
echo 'Your name is ' $vbulletin->GPC['name'] . '<br />';
echo 
'Your age is ' $vbulletin->GPC['age'] . <br />;
// etc... 
Cleaning a Single Superglobal Variable

If you have a single variable that you wish to clean, use the clean_gpc() function. This function allows you to specify a single variable in any of the Superglobal arrays, and it's type.

Example:

PHP Code:
$vbulletin->input->clean_gpc('g''age'TYPE_UINT);
echo 
'Your age is: ' $vbulletin->GPC['age']; 
In this example, the 'age' variable in the $_GET Superglobal array will be cleaned to make sure it is an unsigned integer.

Cleaning a Single Variable

If you wish to clean a single variable that is not in one of the Superglobal arrays, you should use the clean() function.

Example:

PHP Code:
$cleaned_var $vbulletin->input->clean($dirty_varTYPE_NOHTML); 
From this example you can see that clean() takes 2 paramaters. The first is the variable that you wish to clean and the second is its type. Unlike the last 2 functions, clean() returns the variable directly.

Cleaning an Array of Variables

For times when you wish to clean an array of variables of mixed types, vBulletin provides the clean_array() function. The clean_array() function takes 2 paramaters. The first is the array to be cleaned, and the second is an array of variable names, and their types.

This function works exactly the same as clean_array_gpc(), except instead of specifying which Superglobal array to clean, you specify your own array.

Conclusion

So, to sum up - always run all input from the user through the vBulletin Input Cleaner! As well as being a good coding practice, this will drasticly decrease the chances of someone exploiting your script using an XSS or SQL attack.

Good luck using your new found knowledge of the vBulletin Input Cleaner class, and remember: If you get stuck, just ask! Knowledge sharing is what vBulletin.org is all about!

(Note: If you want to reproduce this article anywhere, I have no objections, but I do request that you give me credit for writing it, and a PM letting me know would be appreciated )

Добавлено через 4 минуты
Using the vBulletin Database Class by Alan @ CIT

Note: This tutorial assumes that you are familier with PHP and SQL, and will introduce you to the vBulletin way of running SQL commands

Using the vBulletin Database Class

Introduction

Like most large web-based software, vBulletin includes a Database Abstraction Layer. This allows you to read and write to databases without having to use database-specific functions such as mysql_query, or pgsql_query. The database abstraction layer allows you to run SQL without having to worry about what database server is being used as it will all be handled in the background.

This article is a brief introduction to the vBulletin Database class which handles all database abstraction within vBulletin and the add-ons that you create.

Accessing the Database functions

When vBulletin loads any page, the database object is created and stored in the $db variable. This object contains all of the functions that you will use to access the vBulletin database.

Note: You can also access the $db variable as $vbulletin->db, but for readability, I will refer to it as $db for the rest of this article.

Table Prefix

We'll start with the most important part of reading and writing data within vBulletin, the TABLE_PREFIX constant. As you've probably noticed, you can choose a string to prefix all of your database tables within vBulletin. By default, this is "vb_". So your users table would be called "vb_user", your posts table "vb_post" and so on.

It is important that you remember that not everyone will be using the same prefix (if any) as you, so hard-coding "vb_" into your script will not work for a lot of users.

Luckily, vBulletin provides the TABLE_PREFIX constant for us to use. TABLE_PREFIX should be fairly self-explanatory, it contains the table prefix for the vBulletin database tables. For example, if in your config.php, you set the table prefix to be "vb36_", then TABLE_PREFIX would contain "vb36_". TABLE_PREFIX is set automaticly when vBulletin runs so will be available in every vBulletin page.

Example:

PHP Code:
$db->query_read("SELECT username FROM " TABLE_PREFIX "user WHERE userid = 1"); 
As you can see in this example, we escape out of our SQL query string to include the TABLE_PREFIX constant. This is vitally important in every query that you run! If you leave it out of a query, your script will likely break for a lot of users.

For ease of reading, I will be leaving the TABLE_PREFIX constant out of my example queries below, but you should not!

Selecting Data

Almost every addon will need to read some data from a database table at some point. vBulletin provides the query_read() function for this purpose.

Example:

PHP Code:
$result $db->query_read("SELECT column FROM table"); 
query_read() takes the SQL that you wish to execute as its paramater, and returns a database result set containing the results. This is the equivilent to mysql_query()

Handling the Result Set

As query_read() returns a database result set, rather than an array, we will need a function to read the result set and provide us with an array which we can then use. vBulletin provides a few functions which will do the job, namely:
  • fetch_field()
  • fetch_row()
  • fetch_array()

We will be concentrating on the last function, fetch_array() as that is the one you will find yourself using day-to-day.

Example:

PHP Code:
$array $db->fetch_array($result); 
fetch_array() takes a result set as it's paramater and returns an array with the current row. Because it will only return 1 row at a time, you will need to use it in a while() loop if you are fetching more than 1 row.

Example:

PHP Code:
while ($array $db->fetch_array($result))
{
// Do something with the current row here

As you can see, each time fetch_array() is run within the while() loop, it moves on to the next row in the result set.

Selecting a single row

If you know that you will just be selecting a single row of data from your table (ie, a users details, or a single forum post), then vBulletin provides a handy function called query_first() which will not only run your SQL query, but also return the row as an array for you.

Example:

PHP Code:
$array $db->query_first("SELECT userid, username FROM user WHERE email = 'this@example.com' LIMIT 1); 
In this example, you can see that query_first() takes your SQL query as it's paramater and returns an array, rather than a result set. The query_first() function is handy when you know that you will only be selecting a single row from the table.

Writing to the Database

At some point, it is likely you will need to save some data to the database, or update an existing table with some changed data. To do this, vBulletin provides the query_write() function.

Example:

PHP Code:
$db->query_write("INSERT INTO table (column) 'value'"); 
As you can see, query_write() takes the SQL statement as its paramater.

Another useful function when writing to the database is the affected_rows() function. This will tell us how many rows where affected by the last INSERT, UPDATE or REPLACE query.

Example:

PHP Code:
$row_count $db->affected_rows(); 
This function takes no paramaters as it only works with the last write query that was performed, and will return the number of rows affected.

Fetching the last Auto-Increment number

If you have ever used PHP's MySQL functions, you'll likely be aware of the mysql_insert_id() function. When you have written a new row to a table that contains an Auto Increment field, mysql_insert_id() will return the Auto-Increment number for the new row.

Thankfully, vBulletin provides us with the insert_id() function which does the same job.

Example:

PHP Code:
$id $db->insert_id(); 
This function takes no paramaters and will return the most recent Auto-Increment field.

Handling Errors

vBulletin provides 2 functions that allow us to see if any errors have occured when we run our SQL. These are error() and errno().

$db->error() will return the Error Text for the most recent database operation.
$db->errno() will return the Error Number for the most recent database operation.

By default, if an SQL error occurs, vBulletin will display an error page with details of the SQL error on it. You can prevent this by using the hide_errors() function. When using this, be sure to perform your own manual error checking.

You can show the error page again by using the show_errors() function.

Freeing up Memory

vBulletin will destroy all of your result sets once the page has loaded. However, if you are running queries that are returning a lot of rows, you should unset the result set yourself once you are finished with it to free up memory.

vBulletin provides the free_result() function for this purpose.

Example:

PHP Code:
$db->free_result($huge_result_set); 
free_result() takes the result set as it's paramater

Cleaning User Input

Most of us need to to run some form of SQL query that includes data submitted by the user. When using this data, you should never assume that it matches the data you have told the user to provide, as not all users are as honest as us

Thankfully, vBulletin provides us with some functions that will clean input for us. escape_string() and escape_string_like() being 2 of them.

escape_string() does exactly what it says on the tin. It will escape (usually using backslashes, although some Database Servers use a different method) any string value that you parse it.

Example:

PHP Code:
$db->query_read("SELECT * FROM user WHERE username = '" $db->escape_string($username) . "'"); 
escape_string_like() does exactly the same, but should be used when you are using the LIKE statement in your query.

Example:

PHP Code:
$db->query_read("SELECT * FROM user WHERE username LIKE '" $db->escale_string_like($username) . "'"); 
Important! You should never use addslashes() in your SQL queries. addslashes() was not designed to escape SQL strings, and doesn't do a particularly good job at doing it. Always use escape_string() or escape_string_like() to make strings safer

Conclusion

To sum up, vBulletin provides you with functions to perform all common SQL tasks, without you having to worry about which database system is being used.

You should always use the vBulletin provided functions rather than database specific functions, as not everyone will be using the same database server as you. What's that you say? Only you will be using the script and you use MySQL? ok, but what happens 2 years down the line when you decide to switch to MySQLi, or PostgreSQL? Do you really want to have to go through your script replacing all the functions?

Good luck using your new found knowledge of the vBulletin Database Abstraction Layer, and remember: If you get stuck, just ask! Knowledge sharing is what vBulletin.org is all about!


(Note: If you want to reproduce this article anywhere, I have no objections, but I do request that you give me credit for writing it, and a PM letting me know would be appreciated )

Last edited by Cr00t : 06-14-2007 at 09:41 PM. Reason: Добавлено сообщение
 
Old  
Cr00t
Продвинутый
Default 0

Integrate or bridge with MediaWiki by HolisticEarth

Do you want to use vBulletin's user database with your MediaWiki? You might like this.

I have taken Kai Backman's MediaWiki authentication plugin idea, fixed coding errors, and expanded greatly on it.

Working on:
vBulletin 3.5.4 and MediaWiki 1.6.3

Features:
  • Allows you to run MediaWiki with your vBulletin user database
  • Disallows users with invalid username characters
  • Disallows users who are not part of specified usergroups
  • Sets users to sysop status in MediaWiki if they are part of a specified admin usergroup
  • Removes users from sysop status in MediaWiki if they no longer are a part of a specified admin usergroup
  • For same-database setups, allows easy installation

Possible Future Features:
These are possible features for inclusion in the how-to in the future. They have not been investigated for their feasibility, but are here to let you know they have been requested and I am thinking about them. If you know how to add the features, please let us know.
  • No-login required (automatic) integration
  • Option: User profile field points to, or has option to link to vBulletin profile
  • To register, link the user to vBulletin's registration script on the login pages

How to:
  1. Install Reynaldovb's Restrict usernames to alphanumeric and underscore plugin, and disallow both spaces and underscores
  2. Optional: On boards that already have existing users, somehow have their usernames changed so that they are only alphanumeric. This is required if you wish your users to be able to login and edit the wiki using their vBulletin username. The reason you have to do this is because MediaWiki has some Restrictions on what can go in a page title, and as usernames have to be passed as page titles, they also have to adhere to the same restrictions. If you do not change the usernames, I have included a check to not allow users to login if their username contains non-alphanumeric characters.
  3. Open your wiki/LocalSettings.php file
  4. Insert the following code at the end of the file, before the ?>:
    PHP Code:
    # vBulletin integration script 
    require_once("AuthPlugin_vBulletin.php"); 
    // if vBulletin and MediaWiki are not installed on the same database 
    // change these values to reflect your vBulletin database information 
    $wgAuth = new AuthPlugin_vBulletin($wgDBserver$wgDBuser$wgDBpassword$wgDBname"vb_"); 
    If you are running vBulletin and MediaWiki in the same database, then it already uses the connection information.
    If you are not running vBulletin and MediaWiki in the same database, please change the strings to reflect your vBulletin database information.
    In either case, the last value is whatever your vBulletin table prefix is.
  5. Insert this code below the require_once( "includes/DefaultSettings.php" ); at the top of the LocalSettings.php file:
    PHP Code:
    # Disabling new user registrations 
    $wgWhitelistAccount = array ( "sysop" => 1"developer" => ); 
    # Disabling anonymous edits 
    $wgGroupPermissions['*']['createaccount'] = false
    $wgGroupPermissions['*']['read'] = false
    $wgGroupPermissions['*']['edit'] = false
    $wgWhitelistRead = array ("Special:Userlogin"); 
    This prevents people from registering new accounts on the wiki, requiring people to register on vBulletin. It also prevents anonymous edits. This code may only work on MediaWiki 1.5.x and above, but I am unsure.
  6. Download the AuthPlugin_vBulletin.php file and put it in your main wiki directory, ie: /wiki/AuthPlugin_vBulletin.php

Please let me know if this was helpful, or if you can expand on this code.

AuthPlugin_vBulletin.php
 
Old  
Cr00t
Продвинутый
Default 3

[How-To] vBulletin API Basics: Variables, Functions, Objects by Psionic Vision

vBulletin API Basics: Variables, Functions, Objects

THIS SHOULD NOT BE REPRINTED WITHOUT MY EXPLICIT PERMISSION


This How-To should serve as a reference to coders, who have a basic knowledge of PHP and who want to make their own mods.

$vbulletin (Type: Object)

Contains vBulletin data that has been in separate variables in vB 3.0.x.
Below you can find a translation table of changed variables and functions.
This is an expanded version of the list that you can find in vBulletin's source code (functions_legacy.php).
vBulletin 3.0.3 locations are on the left hand side, and the corresponding vBulletin 3.5.0 locations are on the right hand side.
Legacy locations can be enabled by running legacy_enable(), although this is officially not recommended for long term compatibility.

Code:
* $vboptions['x']                            --> $vbulletin->options['x']
* $iforumcache                               --> $vbulletin->iforumcache
* $forumcache                                --> $vbulletin->forumcache
* $usergroupcache                            --> $vbulletin->usergroupcache
* $datastore['wol_spiders']                  --> $vbulletin->wol_spiders
* $smiliecache                               --> $vbulletin->smiliecache
* $stylechoosercache                         --> $vbulletin->stylecache
* $datastore['x']                            --> $vbulletin->x
* $bbuserinfo['x']                           --> $vbulletin->userinfo['x']
* $session['x']                              --> $vbulletin->session->vars['x']
*
* $_BITFIELD['usergroup']                    --> $vbulletin->bf_ugp
* $_BITFIELD['usergroup']['x']               --> $vbulletin->bf_ugp_x
* $_BITFIELD['usergroup']['x']['y']          --> $vbulletin->bf_ugp_x['y']
* $_BITFIELD['calmoderatorpermissions']['x'] --> $vbulletin->bf_misc_calmoderatorpermissions['x']
* $_BITFIELD['moderatorpermissions']['x']    --> $vbulletin->bf_misc_moderatorpermissions['x']
* $_BITFIELD['languageoptions']['x']         --> $vbulletin->bf_misc_languageoptions['x']
* $_USEROPTIONS['x']                         --> $vbulletin->bf_misc_useroptions['x']
* $_FORUMOPTIONS['x']                        --> $vbulletin->bf_misc_forumoptions['x']
* $_INTPERMS                                 --> $vbulletin->bf_misc_intperms
* $_INTPERMS['x']                            --> $vbulletin->bf_misc_intperms['x']
*
* ------------------------------------------------------------------------------
* Variables and Functions below are NOT affected/re-enabled by legacy_enable()
* ------------------------------------------------------------------------------
*
* $_GET/$_POST/$_REQUEST/$_COOKIE/$_FILES    --> $vbulletin->GPC['x']
* $DB_Site->x()                              --> $vbulletin->db->x()
* $url                                       --> $vbulletin->url
* $nozip                                     --> $vbulletin->nozip
* $script                                    --> $vbulletin->script
* $scriptpath                                --> $vbulletin->scriptpath
*
* HTML_SELECTED                              --> not defined anymore in vB 3.5
* HTML_CHECKED                               --> not defined anymore in vB 3.5
*
* bbcode_parse()                             --> $bbcode_parser->parse
* iif($condition, $r_true, $r_false)         --> obsolete, use ($condition ? $r_true : $r_false) instead;
Please note the following:
  1. $vbulletin
    Inside of object classes, you should access $vbulletin->[...] as $this->registry->[...]. Therefore, use that structure when modifying code inside of any classes.
    .
  2. VARIABLES ENABLED FOR TEMPLATES
    $vboptions['x'], $bbuserinfo['x'] and $session['x'] do work in the template system without running legacy_enable().
    .
  3. SUPERGLOBALS
    $_GET/$_POST/$_REQUEST/$_COOKIE/$_FILES/$_SERVER/$_ENV are available anywhere, but generally you should avoid using them. Instead, "clean" those variables and place them into $vbulletin->GPC using $vbulletin->input->clean_gpc() and $vbulletin->input->clean_array_gpc() methods.
    You can read more about these two "cleaning" methods here.

    As a summary:
    1. Use $vbulletin->input->clean_gpc() for a single variable, and $vbulletin->input->clean_array_gpc() for arrays.
    2. After variables are patched through, they can be accessed using $vbulltin->GPC (which is an array).
    3. Cleaning 'somevar' will not create variable $somevar.
    4. $vbulletin->input->clean_gpc() returns the clean value, therefore the following code will work out nicely:
    Code:
    $id = $vbulletin->input->clean_gpc('r', 'id', TYPE_UINT);
    Once you get to know the syntax of those functions, you can use the following as a reference:

    Code:
    ------------------------------------
    SOURCES AND THEIR EQUIVALENTS
    ------------------------------------
    
    'g'                    - $_GET
    'p'                    - $_POST
    'r'                    - $_REQUEST
    'c'                    - $_COOKIE
    's'                    - $_SERVER
    'e'                    - $_ENV
    'f'                    - $_FILES
    
    ------------------------------------
    VALID DATA TYPES
    ------------------------------------
    
    TYPE_BOOL              - Boolean
    TYPE_INT               - Integer
    TYPE_UINT              - Unsigned Integer
    TYPE_NUM               - Floating Point Number
    TYPE_UNUM              - Unsigned Floating Point Number
    TYPE_UNIXTIME          - Unix Timestamp (Unsigned Integer)
    TYPE_STR               - Trimmed String (No leading or trailing whitespace)
    TYPE_NOTRIM            - String
    TYPE_NOHTML            - Trimmed String sent through htmlspecialchars_uni()
    TYPE_ARRAY             - Array
    TYPE_FILE              - File
    TYPE_NOCLEAN           - Unvalidated
  4. GLOBALIZING VARIABLES IN FUNCTIONS
    Since most of the variables can be found within the $vbulletin class, there is generally no need to globalize more than one variable (which is $vbulletin). An exception would be the $vbphrase array, which currently cannot be found within the $vbulletin class.

    Taking the above account, the following code is not good:

    Code:
    function foo()
    {
        global $forumcache, $vbulletin, $vboptions;
    
        $forumcache =& $vbulletin->forumcache;
        $vboptions =& $vbulletin->options;
    
        foreach ($forumcache AS $forumid => $forum)
        {
            if ($vboptions['something'])
            {
                // do stuff
            }
        }
    }
    Instead, you should use the following code (which is, obviously, shorter and easier to use):

    Code:
    function foo()
    {
        global $vbulletin;
    
        foreach ($vbulletin->forumcache AS $forumid => $forum)
        {
            if ($vbulletin->options['something'])
            {
                // do something
            }
        }
    }
  5. DATASTORE ITEMS
    In vBulletin 3.0.x you could commonly see the following code:

    PHP Code:
    if (isset($datastore_item)) 
    Unfortunately, this does not work in vBulletin 3.5.0, since the datastore items are now contained within $vbulletin class.
    You need to use the following code instead:

    PHP Code:
    if ($vbulletin->datastore_item !== null
  6. BITFIELDS
    In case you have been wondering, "ugp" stands for "UserGroup Permissions".
    To avoid the confusing "$object->array[key1][key2][key3][key4]...[key10]" stuff, there are references set up that allow you to talk to deep elements quickly. For example, $vbulletin->bf_ugp_adminpermissions is a reference to $vbulletin->bf_ugp['adminpermissions'].
    .
  7. BBCODE PARSE
    BBCode Parser has changed slightly in vBulletin 3.5.
    To familiarize yourself with the new syntax, check out KirbyDE's How-To.
    .
  8. MISCELLANEOUS
    It is impossible to list here every aspect of vBulletin code, therefore you should familizarize yourself with the contents of init.php and class_core.php before beginning to hack into the system (and I know you are in a rush ).


$db (Type: Object)

As you might have judged from the Table 1 in this tutorial, the database object in vB3.5 is $vbulletin->db.
However, $db is another way to access that object; it is the way that used everywhere unless you call it from within a function. In functions, use $vbulletin->db.
Obviously, the purpose of the database method is to perform various operations on the database. Most common methods are described below.
  • $db->query();
    Deprecated in favor of below methods (to save memory).
    Returns: MySQL Resource
    .
  • $db->query_read();
    Performs SELECT and SHOW operations only.
    These queries will execute on the slave server, if one is defined.
    Returns: MySQL Resource
    .
  • $db->query_write();
    Performs INSERT, REPLACE, UPDATE, DROP, ALTER and other data-modifying queries.
    These queries will execute on the master server.
    Returns: MySQL Resource
    .
  • $db->query_first();
    Same as query_read(), but returns first result as an array.
    Returns: array on success / boolean false on failure
    .
  • $db->num_rows($mysql_resource_var);
    Input: A MySQL resource variable (usually output of the first three methods).
    Returns: int Amount of Resulting Rows
    .
  • $db->fetch_array($mysql_resource_var);
    Input: A MySQL resource variable (usually output of the first three methods).
    Returns: array One row from the mysql results on success / boolean false on failure

    To fetch each row consecutively, use the following code:

    Code:
    Code:
    while ($var = $db->fetch_array($mysql_resource_var))
    {
    	// your code ($var contains the array);
    }
  • $db->insert_id();
    Input: None.
    Returns: int Row ID of the latest INSERT operation.
    .
  • $db->escape_string(); and $db->escape_string_like();
    Input: String.
    Returns: string A string with appropriate characters escaped.

    These two functions must be used instead of the PHP built-in addslashes() and addslashes_like().
    Using the PHP built-in functions may cause problems on non-MySQL systems.
    .
  • $db->show_errors(); and $db->hide_errors();
    Input: None.
    Returns: None.

    The first function enables sql error output (default), whereas the second function disables such output.
    Useful when you do not want the script to die on error (example: no die on product installation if a table already exists).


Data Managers

Data Managers (DMs) are an interface to various data objects used within vBulletin. They enforce necessary constraints and administrator-set options on the data to ensure that the data is valid.
You can read more about Data Managers in vBulletin's online manual.
Also, you can read specifically about the User DM in this KirbyDE's How-To, and about Thread DM here.


Authentication Storage

The authentication data is stored in the following way (thank to Kirby for this info):

$_COOKIE:
{cookiepfx}userid - plain(userid)
{cookiepfx}password - md5(md5(md5('PlaintextPassword') . salt) . 'LicenseNo').

TABLE user:
password - md5(md5('PlaintextPassword') . salt)

Note that for cookie, {cookiepfx} is your board's cookie prefix. It is configurable via admincp and is accessible via the COOKIE_PREFIX constant.


Important Functions
  • construct_page_nav($pagenumber, $perpage, $results, $address, $address2 = '');

    Returns the HTML for multi-page navigation.
    Two latest arguments are not used yet, therefore they are not documented.

    Code:
    $pagenumber	int     Total number of items found
    $perpage        string  Base address for links eg: showthread.php?t=99{&page=4}
    $results        string  Ending portion of address for links
  • eval(standard_error(fetch_error('error_phrase')));

    Outputs a standard error message with a phrase of your choice.
    fetch_error looks up the phrase you specify in the "Front-End Error Messages" phrase category.
    Error phrases must be prefixed with "error_".
    .
  • print_standard_redirect($redir_phrase, $doquery = true, $forceredirect = false);

    Returns eval()-able code to initiate a standard redirect
    $vbulletin->url should contain the target url for the redirect.

    Code:
    $redir_phrase	string   Name of redirect phrase
    $doquery        boolean  If true, it will fetch $redir_phrase from "Front-End Redirect Messages" phrase category. Must be prefixed with "redirect_".
                             If false, it will use the value of $redir_phrase as the phrase itself.
    $forceredirect  boolean  Should generally be set to true.
  • iis_valid_email($email);

    Checks an email for validity and returns true or false.
    .
  • can_moderate($forumid = 0, $do = '', $userid = -1, $usergroupids = '');

    Checks whether a user can moderate a certain forum.

    Code:
    $forumid       int       Specific forum to check. If not set, will check whether the user is a moderator of any forum at all.
    $do            string    Specific mod action to check. If not set, will check whether the user is a moderator of the forum specified in $forumid.
    $userid        int       User ID to check. If not set, will use $vbulletin->userinfo.
    $usergroupids  string    List of group IDs, separate by commas, to which the user belongs. Should be generally left blank.
  • can_administer();

    Checks whether or not the visiting user has administrative permissions

    This function can optionally take any number of parameters, each of which
    should be a particular administrative permission you want to check. For example:
    can_administer('canadminsettings', 'canadminstyles', 'canadminlanguages')
    If any one of these permissions is met, the function will return true.
    If no parameters are specified, the function will simply check that the user is an administrator.
    .
  • convert_bits_to_array(&$bitfield, $_FIELDNAMES);

    Converts a bitfield into an array of 1 / 0 values based on the array describing the resulting fields. Returns an array.

    Code:
    &$bitfield      int      (ref) Bitfield
    $_FIELDNAMES    array     Array containing field definitions - array('canx' => 1, 'cany' => 2, 'canz' => 4) etc.
  • function convert_array_to_bits(&$arry, $_FIELDNAMES, $unset = 0);

    Takes an array and returns the bitwise value.

    Code:
    &arry           array     Array for input.
    $_FIELDNAMES    array     Array containing field definitions - array('canx' => 1, 'cany' => 2, 'canz' => 4) etc.
    $unset          int       Defines whether to unset the array data once it has been converted to bits
  • fetch_template($templatename, $escape = 0, $gethtmlcomments = true);

    Returns a single template from the templatecache or the database.

    Code:
    $templatename    string   Name of template to be fetched
    $escape          int      Escape quotes in template? 1: escape; -1: unescape; 0: do nothing
    $gethtmlcomments boolean  Wrap template in HTML comments showing the template name?
    Two most common uses are:

    Code:
    eval('$mycustomvar .= "' . fetch_template('mycustomtemplate') . '";');
    eval('print_output("' . fetch_template('mycustomtemplate') . '");');
  • vbsetcookie($name, $value = '', $permanent = true);

    Sets a cookie based on vBulletin environmental settings.

    Code:
    $name           string    Cookie name
    $value          mixed     Value to store in the cookie
    $permanent      boolean   If true, do not set an expiry date for the cookie
  • vb_number_format($number, $decimals = 0, $bytesize = false, $decimalsep = null, $thousandsep = null);

    Formats a number with user's own decimal and thousands chars and returns the formatted number.

    Code:
    $number          mixed     Number to be formatted: integer / 8MB / 16 GB / 6.0 KB / 3M / 5K / ETC
    $decimals        integer   Number of decimal places to display
    $bytesize        boolean   Special case for byte-based numbers
    $decimalsep      string    Custom decimal separator (to override user's preference) 
    $thousandsep     string    Custom thousands separator (to override user's preference)
  • vbmail($toemail, $subject, $message, $notsubscription = false, $from = '', $uheaders = '', $username = '');

    Starts the process of sending an email - either immediately or by adding it to the mail queue.

    Code:
    $toemail          string     Destination email address
    $subject          string     Email message subject
    $message	  string     Email message body
    $notsubscription  boolean    If true, do not use the mail queue and send immediately
    $from             string     Optional name/email to use in 'From' header
    $uheaders         string     Additional headers
    $username         string     Username of person sending the email
 
Old  
Passord
Простоузер
Default 0

Quote:
Originally Posted by Cr00t View Post
...
Огромное спасибо!!!
Советую скопировать эти сообщения в раздел "Как ЭТО сделать", вдруг кому ещё помогут
 
Old  
grumman
Простоузер
Default 0

vbportal 3.6.4 ищу ни где не могу найти плиз скиньте или дайте ссылку
Заранее спасибо
 
Old  
Cr00t
Продвинутый
Default 1

Quote:
Originally Posted by Passord View Post
Огромное спасибо!!!
Советую скопировать эти сообщения в раздел "Как ЭТО сделать", вдруг кому ещё помогут
за эти "труды" надо по 100 спасибо нажимать :-)))
 
 

Tags
addon, hack, module, product, request, skin, style, template, theme, vbulletin, vbulletin.org, дизайн, дополнения, модули, продукты, скачать, скин, стили, хак, хаки, шаблон

Thread Tools

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




All times are GMT +4. The time now is 07:09 AM.


Powered by vBulletin® Version 3.6.9
Copyright ©2000 - 2016, Jelsoft Enterprises Ltd.