$txt

Автор BogdanNB, 17 октября 2011, 22:50:29

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

BogdanNB

Рылся-рылся я поиском по форуму, но так и не нашел ответа... если проморгал - киньте в меня ссылкой, пожалуйста! =)

Вопрос может показаться кому-то странным, а многие вообще им врядли задавались (наверное)):
Где и как в движке SMF впервые подгружается/объявляется (глобальным) наш любимый локализационный массивчик $txt?

В разрешении этого (почти риторического) вопроса до PHP-дебагера дело у меня пока не дошло, но отследить пытался (глазами по коду)))...

--------------------------------

Первое (по ходу выполнения скриптов) объявление массива $txt как глобального встречается в корне index.php - в методе reloadSettings(), но там уже идет использование значения одного из полей этого массива... =/

Потом в index.php:smf_main() начинается подгрузка настроек пользователя -> Load.php:loadUserSettings() (где $txt не используется), loadBoard() (где $txt используется уже как существующий глобальный массив), loadTheme() (где я нашел $txt = array();?!) и прочие "лоады", в которых, естественно, все и грузится... 

Знаю также, что разные языковые файлы подгружаются с помощью Load.php:loadLanguage(), но к этому моменту $txt уже, как правило, является существующим (объявленным) глобальным массивом.

Но где же тогда по ходу выполнения скриптов впервые появляется/объявляется массив $txt??? В Load.php:loadTheme(), который (Load.php) инклюдится в самом-самом начале?

Если кто-то задавался этим вопросом - подскажите пожалуйста!
Что-то меня уже глючить начинает с областью видимости этой переменной. =\

--------------------------------

Ради интереса ставил эксперимент даже... создавал следующие файлы:
index.php
main.php
language.php


в index.php объявлял функцию аналогичную smf_main (назовем ее f_index()) и делал ее вызов аналогичным образом (call_user_func(f_index());), в ней обычным require_once делал подгрузку языкового файла language.php (с тестовой версией $txt с набором значений, как в языковых файлах SMF),.. далее, аналогично логике SMF, делал в f_index() подгрузку файла main.php и вызов объявленной в нем (в main.php) функции - f_main()... уже внутри f_main() объявлял $txt глобальной, но скрипт в упор не видит значений этого массива (из файла language.php). При этом $txt прекрасно видна внутри f_index(), что естественно, т.к. файл language.php подгружается внутри f_index() задавая тем самым область видимости для его содержимого. И если внутри f_index() добавить объявление $txt как глобальной переменной, то она становится прекрасно видна и в f_main()

Но в smf_main() ведь $txt не объявляется глобальным... вообще не фигурирует и затрагивается уже глубже. =/

В общем, что-то я потерялся совсем... краем сознания подозреваю, что дело в начальных инклюдах (где подключается Load.php), но там ведь массив создается только внутри loadTheme?! =\

Заранее благодарен за любые ответы/высказывания/замечания/пояснения!!!

BIOHAZARD

вопрос из разряда "сколько ангелов умещается на конце иглы"
ну найдёте вы это место, толку-то?

может лучше вы сразу расскажете, что сподвигло вас на такие изыскания?
Мои моды:
  • RedirectPage
  • Counters
  • CustomSearch
  • SypexDumper
   адаптирую темы    1.1.хx<=>2.0задавая вопросы, старайтесь сразу указывать конечную цель, предполагаемый Вами путь не обязательно окажется самым коротким

Любые моды на заказ

BogdanNB

#2
Это долгая история,.. но попробую в нескольких словах объяснить.
Началось все с того, что мне пришлось создавать один проект тесно интегрированный с SMF. Началось все, как обычно бывает, с необходимости общей системы авторизации сайта и форума... и т.к. сайт писался с нуля и без CMS, а выбор движка форума был однозначным (уже лет 6 использую везде SMF) - я решил просто "срастить" сайт с движком форума. Исходным инструментом для сращивания стал SSI (т.е. писал собственные методы-аналоги SSI, используя логику в качестве примеров и дополняя реализацию своими потребностями), а для большего удобства логику скриптов сайта построил по аналогии с SMF. Имеется ввиду логика выбора и подключения скриптов для выполнения тех или иных действий пользователя, построения шаблонов страниц и т.п.... в общем сам каркас.

И так мне приглянулась эта "механика", что следующий мультиязычный проект (не требующий пока форума) решил построить аналогичным образом... и когда дело дошло до механизма построения темплейтов разных страниц и выбора локализации (языка) столкнулся с проблемой области видимости массива $txt в своей реализации подобия СМФ... проблему то я у себя решил сразу - навел порядок с областью видимости/глобальностью, но вопрос/интерес остался,.. поэтому и полез разбираться где же в СМФ у этого массива ноги растут. =)
Проблема у меня, кстати, возникла в ситуации, подобной той, что описана в первом сообщении в укороченном эксперименте...

Вот как-то так. =)))
В общем, хочется найти это место, чтобы лучше/глубже понимать логику скриптов SMF... понимаю, что это уже будут знания уровня команды разработчиков СМФ или писателя модов, и обычному "потребителю" готового форума такое врядли пригодится,.. но стремление к знаниям не грех! Да и раздражает это противное ощущение, что есть какой-то неясный момент. =)

BIOHAZARD

если у вас интеграция в smf, то всё решается require_once('SSI.php') и не надо нечего мудрить

а вообще инициирование происходит в loadTheme
// Wireless mode?  Load up the wireless stuff.
if (WIRELESS)
{
$context['template_layers'] = array(WIRELESS_PROTOCOL);
loadTemplate('Wireless');
loadLanguage('Wireless+index+Modifications');
}
// Output is fully XML, so no need for the index template.
elseif (isset($_REQUEST['xml']))
{
loadLanguage('index+Modifications');
loadTemplate('Xml');
$context['template_layers'] = array();
}
// These actions don't require the index template at all.
elseif (!empty($_REQUEST['action']) && in_array($_REQUEST['action'], $simpleActions))
{
loadLanguage('index+Modifications');
$context['template_layers'] = array();
}
else
{
// Custom templates to load, or just default?
if (isset($settings['theme_templates']))
$templates = explode(',', $settings['theme_templates']);
else
$templates = array('index');

// Load each template...
foreach ($templates as $template)
loadTemplate($template);

// ...and attempt to load their associated language files.
$required_files = implode('+', array_merge($templates, array('Modifications')));
loadLanguage($required_files, '', false);

// Custom template layers?
if (isset($settings['theme_layers']))
$context['template_layers'] = explode(',', $settings['theme_layers']);
else
$context['template_layers'] = array('html', 'body');
}
Мои моды:
  • RedirectPage
  • Counters
  • CustomSearch
  • SypexDumper
   адаптирую темы    1.1.хx<=>2.0задавая вопросы, старайтесь сразу указывать конечную цель, предполагаемый Вами путь не обязательно окажется самым коротким

Любые моды на заказ

BogdanNB

С интеграцией в SMF у меня проблем тогда и не возникало, все как раз и решалось require_once('SSI.php')!

Спасибо за ответ!
Я, наковырявшись в коде, пришел к таким же выводам. =)