رفع مشکل وجود کش (cache) از فایل های CSS انجمن mybb در مرورگر اینترنت کاربران و عدم مشاهده تغییرات جدید انجمن توسط آنها (معرفی یک روش دستی)
هنگامی که ما تغییرات مورد نظرمان را در پوسته انجمن (در واقع، فایل های CSS انجمن) اعمال می کنیم، به دلیل اینکه آن فایل های CSS ، قبلا در مرورگر اینترنت کاربران انجمن، به صورت کش (cache) ذخیره شده اند، کاربران آن تغییرات را در همان لحظه مشاهده نخواهند کرد. در این مواقع توصیه می شود که کلیدهای Ctrl و F5 از کیبورد به صورت همزمان زده شوند تا تغییرات جدید مشاهده شود، ولی این روش تنها برای مدیر انجمن و در هنگام اعمال تغییرات و مشاهده نتایج، مناسب خواهد بود و برای کاربران انجمن، آزاردهنده می باشد. در واقع به محض اعمال تغییرات، باید روشی داشته باشیم که بر اساس آن، تغییرات جدید را همه کاربران مشاهده کنند.
شاید روش های مختلفی برای این منظور وجود داشته باشد، ولی قصد داریم در این مبحث، یک روش دستی را معرفی کنیم که دید بهتری در مورد ساختارانجمن به شما خواهد داد (در واقع، به این بهانه، کمی هم در مورد ساختار انجمن صحبت خواهیم کرد).
ما از روش شرح داده شده در آموزش شماره 3498 استفاده خواهیم کرد.
ابتدا در کدهای یک صفحه از انجمن، بخش مربوط به فایل های CSS را پیدا می کنیم (کمی از کدهای قبل و بعد از آن را هم ذکر می کنیم تا موقعیت نسبی آنها در صفحه را متوجه شوید) :
<script type="text/javascript" src="http://www.kelidestan.com/forum/jscripts/jquery.plugins.min.js?ver=1806"></script>
<script type="text/javascript" src="http://www.kelidestan.com/forum/jscripts/general.js?ver=1806"></script>
<link type="text/css" rel="stylesheet" href="http://www.kelidestan.com/forum/cache/themes/theme4/global.css" />
<link type="text/css" rel="stylesheet" href="http://www.kelidestan.com/forum/cache/themes/theme4/css3.css" />
<link type="text/css" rel="stylesheet" href="http://www.kelidestan.com/forum/cache/themes/theme4/star_ratings.css" />
<link type="text/css" rel="stylesheet" href="http://www.kelidestan.com/forum/cache/themes/theme4/showthread.css" />
<link type="text/css" rel="stylesheet" href="http://www.kelidestan.com/forum/cache/themes/theme4/shar.css" />
<script type="text/javascript">
lang.unknown_error = "یک خطای ناشناخته رخ داده است.";
lang.select2_match = "یک نتیجه یافت شد، لطفا کلید Enter را برای انتخاب آن فشار دهید.";
lang.select2_matches = "{1} نتیجه دردسترس است، لطفا از کلیدهای بالا و پایین برای انتخاب نتیجه استفاده کنید.";
lang.select2_nomatches = "هیچ نتیجهای یافت نشد";
اکنون اگر بخواهیم که همین بخش را در کنترل پنل مدیریت و در بخش قالب ها بیابیم، به مسیر زیر خواهیم رسید :
پنل مدیریت >> قالبها و پوستهها >> قالبها >> قالب مورد نظر >> قالبهای گروه بندی نشده >> بخش headerinclude
در کدهای بخش بالا، قسمتی از کدها به صورت زیر است :
<script type="text/javascript" src="{$mybb->asset_url}/jscripts/jquery.plugins.min.js?ver=1806"></script>
<script type="text/javascript" src="{$mybb->asset_url}/jscripts/general.js?ver=1806"></script>
{$stylesheets}
<script type="text/javascript">
lang.unknown_error = "{$lang->unknown_error}";
lang.select2_match = "{$lang->select2_match}";
lang.select2_matches = "{$lang->select2_matches}";
lang.select2_nomatches = "{$lang->select2_nomatches}";
بنابراین {$stylesheets} مربوط به فایل های CSS می باشد. اما شما در بخش های مختلف قالب، آن را پیدا نخواهید کرد زیرا متغیری می باشد که در فایل های هسته (core) انجمن mybb تعریف شده است.
با کمی جستجو، به سراغ فایل global.php می رویم که در پوشه اصلی محل نصب انجمن mybb قرار دارد. آن را با یک ویرایشگر متن باز کرده و بخش مربوط به $stylesheets را پیدا می کنیم (همه آن را ذکر می کنیم، اما تنها 2 خط از کدهای آن برایمان مهم است) :
$stylesheets = '';
$theme['stylesheets'] = my_unserialize($theme['stylesheets']);
$stylesheet_scripts = array("global", basename($_SERVER['PHP_SELF']));
if(!empty($theme['color']))
{
$stylesheet_scripts[] = $theme['color'];
}
$stylesheet_actions = array("global");
if(!empty($mybb->input['action']))
{
$stylesheet_actions[] = $mybb->get_input('action');
}
foreach($stylesheet_scripts as $stylesheet_script)
{
// Load stylesheets for global actions and the current action
foreach($stylesheet_actions as $stylesheet_action)
{
if(!$stylesheet_action)
{
continue;
}
if(!empty($theme['stylesheets'][$stylesheet_script][$stylesheet_action]))
{
// Actually add the stylesheets to the list
foreach($theme['stylesheets'][$stylesheet_script][$stylesheet_action] as $page_stylesheet)
{
if(!empty($already_loaded[$page_stylesheet]))
{
continue;
}
if(strpos($page_stylesheet, 'css.php') !== false)
{
$stylesheet_url = $mybb->settings['bburl'] . '/' . $page_stylesheet;
}
else
{
$stylesheet_url = $mybb->get_asset_url($page_stylesheet);
}
if($mybb->settings['minifycss'])
{
$stylesheet_url = str_replace('.css', '.min.css', $stylesheet_url);
}
if(strpos($page_stylesheet, 'css.php') !== false)
{
// We need some modification to get it working with the displayorder
$query_string = parse_url($stylesheet_url, PHP_URL_QUERY);
$id = (int) my_substr($query_string, 11);
$query = $db->simple_select("themestylesheets", "name", "sid={$id}");
$real_name = $db->fetch_field($query, "name");
$theme_stylesheets[$real_name] = "<link type=\"text/css\" rel=\"stylesheet\" href=\"{$stylesheet_url}?v=0.001\" />\n";
}
else
{
$theme_stylesheets[basename($page_stylesheet)] = "<link type=\"text/css\" rel=\"stylesheet\" href=\"{$stylesheet_url}?v=0.001\" />\n";
}
$already_loaded[$page_stylesheet] = 1;
}
}
}
}
unset($actions);
if(!empty($theme_stylesheets))
{
foreach($theme['disporder'] as $style_name => $order)
{
if(!empty($theme_stylesheets[$style_name]))
{
$stylesheets .= $theme_stylesheets[$style_name];
}
}
}
در واقع، چون فایل های هسته انجمن mybb در نسخه های مختلف آن تغییر می کنند، شما تنها باید این بخش را پیدا کرده (حالا هر کدی که دارد) و خط های مربوط به ساخت آدرس فایل های CSS را بیابید و به آخر آنها، یک شماره اضافه کنید (بر اساس توضیحات آموزش شماره 3498 )، سپس هر زمان که تغییرات شما در فایل های CSS اعمال شد و قصد داشتید آنها را همه کاربران ببینند، این فایل را باز کرده و شماره را افزایش می دهید و به دلیل اینکه آدرس فایل CSS تغییر می کند، مرورگر اینترنت، فایل جدید را دریافت کرده و استفاده می نماید.
مثلا برای همین کدی که ذکر شد، ابتدا کد خط زیر را :
به این کد تغییر می دهیم (عبارت ?v=0.001 به انتهای آدرس فایل های CSS افزوده می شود) :
سپس کد خط زیر را :
به کد زیر تغییر خواهیم داد (عبارت ?v=0.001 به انتهای آدرس فایل های CSS افزوده می شود) :
پس اگر این بار کدهای یک صفحه از انجمن mybb را مشاهده کنیم، عبارت ?v=0.001 به انتهای آدرس فایل های CSS افزوده شده و مرورگر اینترنت، به دلیل جدید بودن آدرس فایل ها، آنها را دریافت کرده و از آنها برای نمایش صفحه استفاده خواهد کرد (نه از فایل های قدیمی cache شده) :
<script type="text/javascript" src="http://www.kelidestan.com/forum/jscripts/jquery.plugins.min.js?ver=1806"></script>
<script type="text/javascript" src="http://www.kelidestan.com/forum/jscripts/general.js?ver=1806"></script>
<link type="text/css" rel="stylesheet" href="http://www.kelidestan.com/forum/cache/themes/theme4/global.css?v=0.001" />
<link type="text/css" rel="stylesheet" href="http://www.kelidestan.com/forum/cache/themes/theme4/css3.css?v=0.001" />
<link type="text/css" rel="stylesheet" href="http://www.kelidestan.com/forum/cache/themes/theme4/star_ratings.css?v=0.001" />
<link type="text/css" rel="stylesheet" href="http://www.kelidestan.com/forum/cache/themes/theme4/showthread.css?v=0.001" />
<link type="text/css" rel="stylesheet" href="http://www.kelidestan.com/forum/cache/themes/theme4/shar.css?v=0.001" />
<script type="text/javascript">
lang.unknown_error = "یک خطای ناشناخته رخ داده است.";
lang.select2_match = "یک نتیجه یافت شد، لطفا کلید Enter را برای انتخاب آن فشار دهید.";
lang.select2_matches = "{1} نتیجه دردسترس است، لطفا از کلیدهای بالا و پایین برای انتخاب نتیجه استفاده کنید.";
lang.select2_nomatches = "هیچ نتیجهای یافت نشد";
در سری بعد که دوباره تغییراتی را اعمال کنیم، تنها کافی است که شماره را از 0.001 به 0.002 افزایش دهید (یا می توانید از شماره های 1 و 2 و 3 و ... استفاده نمایید).