Голубь головного мозга
Join Date: Jul 2023
Location: Кинешма
Posts: 428
Версия vB: 3.8.x
Пол: 
Reputation:
Гуру 167
Репутация в разделе: 17
|
Обзор mybb 1.8
4
MyBB - что за зверь?
Предисловие
Вспомнил, что хотел написать статью, сделал черновик, но забыл про него. Если кому интересен данный движок, можете повнимательней посмотреть, всегда рад поправить недочёты.
ЗЫ. Кому не хочется читать чей-то (мой) поток сознания - не читайте и не разворачивайте спойлеры! Ваша психика на 90% будет разрушена, а понять вы вряд ли что-то сможете из данного текста
MyBB - очередной форумный движок, написанный на PHP, использующий такие СУБД, как PostgreSQL, MySQL, SQLite. Создан в 2002 году.
Уже давно ходят слухи, что MyBB является форком воблы (второй с примесью третей).
В данной статье поковыряем Mybb 1.8.x, поищем сходства с воблой
1. Структура расположения скриптов по папке
Спойлер

Итак, видим основные скрипты, куда юзверы ходят. Некоторые их имена, например, usercp, прямо слизаны с воблы (можно было ucpl, usercpl, ucp...). Папка inc аналогична вобловым includes, jscripts - наша clientscripts, admin - понятно что, картинки у стилей тоже видно где. Модпанель... Её утащили прямо в корень в виде отдельного скрипта. Инклюды... global.php съехал в корень, в inc заливаются языки. Локализация у нас в таком виде:

Впрочем, редактировать можно значения и из админки
2. Админка
Спойлер
украли у ipb
Помощь на сайте, встроенной нет
Описывать особо нечего. Однако шаблоны аки в вобле. Но запутанные. Отдельно стили, отдельно группы шаблонов. В стилях можно поменять css, шаблоны имеют группы. Группа шаблонов может использоваться несколькими стилями. Не знаю, зачем, но так сделано. В стилях можно использовать как обычный css, так и составитель. Можно прямо из панели добавлять цсс-ники для определённых скриптов. Очень удобно. На скрине продвинутый режим редактирования стиля.

3. Шаблоны
Спойлер
Вкладываем фразы крайне просто: 
Увы, шаблоны друг друга включать в себя не могут (только вручную подключать через редактуру скриптов). ПХП и кондиции только плагином :(
Группировка по шаблонам есть
4. Плагины
Спойлер
От вобловых хаков отличаются. Там, где мы заливали xml с плагином в БД, всё дефинируется в главном скрипте в inc/plugins/pluginname.php
Но в принципе оно понимаемо.
Хуки отрубать из админки нельзя :(
5. Запланированные задания
Спойлер
В админке управление что-то типа управлялки cron-а, скрипты лежат в inc/tasks
6. Код
Спойлер
Откроем usercp.php.
МайББ:
PHP Code:
define("IN_MYBB", 1); define('THIS_SCRIPT', 'usercp.php'); define("ALLOWABLE_PAGE", "removesubscription,removesubscriptions");
$templatelist = "usercp,usercp_nav,usercp_profile,usercp_changename,usercp_password,usercp_subscriptions_thread,forumbit_depth2_forum_lastpost,usercp_forumsubscriptions_forum,postbit_reputation_formatted,usercp_subscriptions_thread_icon"; $templatelist .= ",usercp_usergroups_memberof_usergroup,usercp_usergroups_memberof,usercp_usergroups_joinable_usergroup,usercp_usergroups_joinable,usercp_usergroups,usercp_nav_attachments,usercp_options_style,usercp_warnings_warning_post"; $templatelist .= ",usercp_nav_messenger,usercp_nav_changename,usercp_nav_profile,usercp_nav_misc,usercp_usergroups_leader_usergroup,usercp_usergroups_leader,usercp_currentavatar,usercp_reputation,usercp_avatar_remove,usercp_resendactivation"; $templatelist .= ",usercp_attachments_attachment,usercp_attachments,usercp_profile_away,usercp_profile_customfield,usercp_profile_profilefields,usercp_profile_customtitle,usercp_forumsubscriptions_none,usercp_profile_customtitle_currentcustom"; $templatelist .= ",usercp_forumsubscriptions,usercp_subscriptions_none,usercp_subscriptions,usercp_options_pms_from_buddys,usercp_options_tppselect,usercp_options_pppselect,usercp_themeselector,usercp_profile_customtitle_reverttitle"; $templatelist .= ",usercp_nav_editsignature,usercp_referrals,usercp_notepad,usercp_latest_threads_threads,forumdisplay_thread_gotounread,usercp_latest_threads,usercp_subscriptions_remove,usercp_nav_messenger_folder,usercp_profile_profilefields_text"; $templatelist .= ",usercp_editsig_suspended,usercp_editsig,usercp_avatar_current,usercp_options_timezone_option,usercp_drafts,usercp_options_language,usercp_options_date_format,usercp_profile_website,usercp_latest_subscribed,usercp_warnings"; $templatelist .= ",usercp_avatar,usercp_editlists_userusercp_editlists,usercp_drafts_draft,usercp_usergroups_joingroup,usercp_attachments_none,usercp_avatar_upload,usercp_options_timezone,usercp_usergroups_joinable_usergroup_join"; $templatelist .= ",usercp_warnings_warning,usercp_nav_messenger_tracking,multipage,multipage_end,multipage_jump_page,multipage_nextpage,multipage_page,multipage_page_current,multipage_page_link_current,multipage_prevpage,multipage_start"; $templatelist .= ",codebuttons,usercp_nav_messenger_compose,usercp_options_language_option,usercp_editlists,usercp_profile_contact_fields_field,usercp_latest_subscribed_threads,usercp_profile_contact_fields,usercp_profile_day,usercp_nav_home"; $templatelist .= ",usercp_profile_profilefields_select_option,usercp_profile_profilefields_multiselect,usercp_profile_profilefields_select,usercp_profile_profilefields_textarea,usercp_profile_profilefields_radio,usercp_profile_profilefields_checkbox"; $templatelist .= ",usercp_options_tppselect_option,usercp_options_pppselect_option,forumbit_depth2_forum_lastpost_never,forumbit_depth2_forum_lastpost_hidden,usercp_avatar_auto_resize_auto,usercp_avatar_auto_resize_user,usercp_options"; $templatelist .= ",usercp_editlists_no_buddies,usercp_editlists_no_ignored,usercp_editlists_no_requests,usercp_editlists_received_requests,usercp_editlists_sent_requests,usercp_drafts_draft_thread,usercp_drafts_draft_forum,usercp_editlists_user"; $templatelist .= ",usercp_usergroups_leader_usergroup_memberlist,usercp_usergroups_leader_usergroup_moderaterequests,usercp_usergroups_memberof_usergroup_leaveprimary,usercp_usergroups_memberof_usergroup_display,usercp_email,usercp_options_pms"; $templatelist .= ",usercp_usergroups_memberof_usergroup_leaveleader,usercp_usergroups_memberof_usergroup_leaveother,usercp_usergroups_memberof_usergroup_leave,usercp_usergroups_joinable_usergroup_description,usercp_options_time_format"; $templatelist .= ",usercp_editlists_sent_request,usercp_editlists_received_request,usercp_drafts_none,usercp_usergroups_memberof_usergroup_setdisplay,usercp_usergroups_memberof_usergroup_description,usercp_options_quick_reply"; $templatelist .= ",usercp_addsubscription_thread,forumdisplay_password,forumdisplay_password_wrongpass,";
require_once "./global.php"; require_once MYBB_ROOT."inc/functions_post.php"; require_once MYBB_ROOT."inc/functions_search.php"; require_once MYBB_ROOT."inc/functions_user.php"; require_once MYBB_ROOT."inc/class_parser.php"; $parser = new postParser;
// Load global language phrases $lang->load("usercp");
if($mybb->user['uid'] == 0 || $mybb->usergroup['canusercp'] == 0) { error_no_permission(); }
$errors = '';
$mybb->input['action'] = $mybb->get_input('action');
usercp_menu();
$server_http_referer = ''; if(isset($_SERVER['HTTP_REFERER'])) { $server_http_referer = htmlentities($_SERVER['HTTP_REFERER']);
if(my_strpos($server_http_referer, $mybb->settings['bburl'].'/') !== 0) { if(my_strpos($server_http_referer, '/') === 0) { $server_http_referer = my_substr($server_http_referer, 1); } $url_segments = explode('/', $server_http_referer); $server_http_referer = $mybb->settings['bburl'].'/'.end($url_segments); } }
$plugins->run_hooks("usercp_start"); if($mybb->input['action'] == "do_editsig" && $mybb->request_method == "post") { require_once MYBB_ROOT."inc/datahandlers/user.php"; $userhandler = new UserDataHandler();
$data = array( 'uid' => $mybb->user['uid'], 'signature' => $mybb->get_input('signature'), );
$userhandler->set_data($data);
if(!$userhandler->verify_signature()) { $error = inline_error($userhandler->get_friendly_errors()); }
if(isset($error) || !empty($mybb->input['preview'])) { $mybb->input['action'] = "editsig"; } }
Вобла:
PHP Code:
// #################### DEFINE IMPORTANT CONSTANTS ####################### define('THIS_SCRIPT', 'usercp'); define('CSRF_PROTECTION', true);
// ################### PRE-CACHE TEMPLATES AND DATA ###################### // get special phrase groups $phrasegroups = array('user', 'infractionlevel');
// get special data templates from the datastore $specialtemplates = array( 'iconcache', 'noavatarperms', 'smiliecache', 'bbcodecache', );
// pre-cache templates used by all actions $globaltemplates = array( 'USERCP_SHELL', 'USERCP', 'usercp_nav_folderbit', // subscribed threads templates 'threadbit', // subscribed forums templates 'forumhome_forumbit_level1_post', 'forumhome_forumbit_level1_nopost', 'forumhome_forumbit_level2_post', 'forumhome_forumbit_level2_nopost', 'forumhome_subforumbit_nopost', 'forumhome_subforumbit_post', 'forumhome_subforumseparator_nopost', 'forumhome_subforumseparator_post', 'forumhome_lastpostby', 'forumhome_moderator', 'forumhome_markread_script', 'forumdisplay_loggedinuser', // private messages templates 'pm_messagelistbit', 'pm_messagelistbit_ignore', 'pm_messagelistbit_user', // reputation templates 'usercp_reputationbits', // infraction templates 'userinfraction_infobit', 'usercp_newvisitormessagebit', 'usercp_pendingfriendbit', 'usercp_groupinvitebit', 'usercp_groupattentionbit', 'socialgroups_css', 'socialgroups_discussion', 'socialgroups_grouplist_bit', 'socialgroups_groupmodlist_bit' );
// pre-cache templates used by specific actions $actiontemplates = array();
// ######################### REQUIRE BACK-END ############################ require_once('./global.php'); require_once(DIR . '/includes/functions_forumlist.php'); require_once(DIR . '/includes/functions_user.php');
// ####################################################################### // ######################## START MAIN SCRIPT ############################ // #######################################################################
if (!$vbulletin->userinfo['userid'] OR !($permissions['forumpermissions'] & $vbulletin->bf_ugp_forumpermissions['canview'])) { print_no_permission(); }
// main page:
($hook = vBulletinHook::fetch_hook('usercp_start')) ? eval($hook) : false;
// ############################### start reputation ###############################
$show['reputation'] = false;
if ($vbulletin->options['reputationenable']) { $vbulletin->options['showuserrates'] = intval($vbulletin->options['showuserrates']); $vbulletin->options['showuserraters'] = $permissions['genericpermissions'] & $vbulletin->bf_ugp_genericpermissions['canseeownrep']; $reputations = $db->query_read_slave(" SELECT reputation.whoadded, reputation.postid, reputation.reputation, reputation.reason, reputation.dateline, user.userid, user.username, post.threadid, thread.title FROM " . TABLE_PREFIX . "reputation AS reputation LEFT JOIN " . TABLE_PREFIX . "post AS post ON (reputation.postid = post.postid AND post.visible = 1) LEFT JOIN " . TABLE_PREFIX . "thread AS thread ON (post.threadid = thread.threadid AND thread.visible = 1) LEFT JOIN " . TABLE_PREFIX . "user AS user ON (user.userid = reputation.whoadded) WHERE reputation.userid = " . $vbulletin->userinfo['userid'] . " " . iif($vbulletin->options['showuserraters'] AND trim($vbulletin->userinfo['ignorelist']), " AND reputation.whoadded NOT IN (0," . str_replace(' ', ',', trim($vbulletin->userinfo['ignorelist'])). ")") . " ORDER BY reputation.dateline DESC LIMIT 0, " . $vbulletin->options['showuserrates'] );
$reputationcommentbits = ''; if ($vbulletin->options['showuserraters']) { $reputationcolspan = 5; $reputationbgclass = 'alt2'; } else { $reputationcolspan = 4; $reputationbgclass = 'alt1'; }
require_once(DIR . '/includes/class_bbcode.php'); $bbcode_parser = new vB_BbCodeParser($vbulletin, fetch_tag_list());
while ($reputation = $db->fetch_array($reputations)) { if ($reputation['reputation'] > 0) { $posneg = 'pos'; } else if ($reputation['reputation'] < 0) { $posneg = 'neg'; } else { $posneg = 'balance'; } $reputation['timeline'] = vbdate($vbulletin->options['timeformat'], $reputation['dateline']); $reputation['dateline'] = vbdate($vbulletin->options['dateformat'], $reputation['dateline']); $reputation['reason'] = $bbcode_parser->parse($reputation['reason']); if (vbstrlen($reputation['title']) > 25) { $reputation['title'] = fetch_trimmed_title($reputation['title'], 24); }
($hook = vBulletinHook::fetch_hook('usercp_reputationbit')) ? eval($hook) : false;
eval('$reputationcommentbits .= "' . fetch_template('usercp_reputationbits') . '";'); $show['reputation'] = true; } unset($bbcode_parser); }
Структура начала скрипта не одинаковая, но очень похожая. Дефайны (один в один), подключаем шаблоны (в vb изящней сделано), далее импортируем скрипты (очень похожим способом), вешаем хук начала скрипта и выполняем необходимые вещи. Только в вобле работа с БД прибита гвоздями к одной mysql, в то время как на mybb можно работать с разными СУБД без особой перепилки.
7. Структура БД
Спойлер
Список таблиц примерно такой же, но в mybb их меньше.
Скрины одной таблиц в разных движках:

Сначала ВБ, внизу майбб. Похоже ж?
8. Фронтенд
Спойлер
9. Модпанель
Спойлер
|