Весь контент Ciko
-
Самостоятельный перевод хуков и компонентов
1) Для того чтобы что-то перевести для установки, нам потребуется удобный текстовый редактор. Я рекомендую использовать программуNotepad++, скачать её можете тут: " notepad-plus-plus.org ". Почему именно этот редактор? Потому что он бесплатный, работает со всеми популярными языками программирования и подсвечивает ошибки в коде, которые в обычном блокноте можно и не заметить! 2) Теперь нам нужно понять отличие перевода хуков и компонентов (Если речь идёт о переводе и последующей установке). В хуке всё просто, ибо там, как правило, один файл где всё спрятано, редко к хукам прилагаются файлы для загрузки, в которых фраз для перевода я не встречал. Короче, в хуке переводим фразы только в файле самого хука. В компоненте чуть сложнее, там есть несколько файлов, их количество зависит от его крутости. Обычно нужные нам файлы, где спрятаны фразы для перевода находятся в папке "/admin/applications_addon/other/компонент/xml", но это не правило. Бывает некоторые слова и фразы спрятаны и в других файлах, да ещё и зашифрованы, хотя такое я не встречал, для этого придётся искать нужные фразы по всем файлам компонента. И в итоге, получается что, в компоненте переводим фразы в некоторых файлах папки "xml" и в других файлах если есть необходимость.1) Для того чтобы что-то перевести для установки, нам потребуется удобный текстовый редактор. Я рекомендую использовать программуNotepad++, скачать её можете тут: " notepad-plus-plus.org ". Почему именно этот редактор? Потому что он бесплатный, работает со всеми популярными языками программирования и подсвечивает ошибки в коде, которые в обычном блокноте можно и не заметить! 2) Теперь нам нужно понять отличие перевода хуков и компонентов (Если речь идёт о переводе и последующей установке). В хуке всё просто, ибо там, как правило, один файл где всё спрятано, редко к хукам прилагаются файлы для загрузки, в которых фраз для перевода я не встречал. Короче, в хуке переводим фразы только в файле самого хука. В компоненте чуть сложнее, там есть несколько файлов, их количество зависит от его крутости. Обычно нужные нам файлы, где спрятаны фразы для перевода находятся в папке "/admin/applications_addon/other/компонент/xml", но это не правило. Бывает некоторые слова и фразы спрятаны и в других файлах, да ещё и зашифрованы, хотя такое я не встречал, для этого придётся искать нужные фразы по всем файлам компонента. И в итоге, получается что, в компоненте переводим фразы в некоторых файлах папки "xml" и в других файлах если есть необходимость. И есть способ перевода, когда хук или компонент уже установлены, в этом случае всё делается через АЦ. Этот и другие способы рассмотрим дальше. 3) Давайте начнём разбирать непосредственно сам персонализированный перевод, будь то хук или компонент, будь то перед установкой в файлах или после через АЦ. Перевод хука для установки: Открываем файл хука и первое что видим, это кучу информации про наш хук в теге: <config></config>Там название, описание, автор, почта, сайт и т.д Редактируем если нужно, например, название и описание переводим и т.д. под наши нужды. Дальше идёт уже кракозябра хука, её не трогаем. А уже за ней скрываются наши языковые фразы. В теге: <setting></setting>Находятся настройки, которые потом будут в АЦ и которыми вы будете настраивать хук. А в теге: <language></language>Паблик-фразы, которые уже будут отображаться не в АЦ, а на форуме. Теперь подробней что трогать, а что нет. Начнём с названия настроек, то есть что в теге <setting />, сразу пишу теги и что между ними находится: <conf_title_title>Название хука</conf_title_title> <conf_title_desc>Описание настроек хука</conf_title_desc><conf_title_tab>Группа настроек</conf_title_tab>Остальное трогать не рекомендуется. Это что касается кнопки в настройках АЦ, которая будет, например, во вкладке "Модификации". А теперь сами настройки хука, которые так же в теге <setting />, но ниже: <conf_title>Название опции</conf_title><conf_description>Описание опции</conf_description>Это самый простой вариант какой-то опции. Но могут быть всякие выпадающие меню на выбор в настройках, и все эти слова будут находиться между тегами <setting />, так что не должны потеряться. Надеюсь смысл понятен. Публичные фразы хука, которые уже в теге <language />, и тут, запомните, нам нужна только строчка с тегами: <word_default></word_default>Куда что писать? Например, в файле у нас: <language><word_app>core</word_app><word_pack>public_global</word_pack><word_key>membersSidebarStats_likes</word_key><word_default>likes</word_default></language>И вы переводите только ключевое слово, не трогая другие: <word_default>лайки</word_default>Или "лайков", или "баллов репутации", или "баллы репутации", тут уже и начинается другая работа, поймать смысл перевода нашего могучего русского языка с английского неочёмского. Так же и с настройками, заменяете английские фразы в нужных тегах на свои и всё. На этом с переводом хуков всё. Просто сохранили и установили. Проблем особых возникнуть не должно. Перевод компонента для установки: Чтобы перевести компонент нам нужна папка "/admin/applications_addon/other/компонент/xml". Там может быть несколько файлов, и запомните, самые главные это: information.xml - Информация про компонент, как в файле хука в начале. admin_компонент_language_pack.xml - Фразы админки public_компонент_language_pack.xml - Фразы паблика И ещё иногда есть такой, когда настройки не в "admin_компонент_language_pack.xml", а в: компонент_settings.xml - Настройки компонента Что же мы найдём в этих файлах? information.xml - Тут такая же фигня как и в начале файла хука, информация про компонент, только уже в теге: <information></information>Как обычно название, описание, автор и т.д. Но не забывайте про: <public_name></public_name>Публичное название компонента, это перевод кнопки, которая появляется обычно рядом с кнопками "Форумы", "Пользователи", то есть внавигационном меню. Ну и не забываем сохранять файл если редактировали. admin_компонент_language_pack.xml - Фразы, которые будут в АЦ public_компонент_language_pack.xml - Фразы, которые будут на форуме у компонента По содержимому эти два файла одинаковы, вот я их и объединил. Что в них будет? Куча повторяющихся кракозябр, но нам пофигу на них, всё что нам нужно из этого, это то что находится внутри этого тега: <word_default></word_default>Прям как в хуке помните? Вот аналогично между этих постоянно повторяющихся тегов вы будете видеть слова, которые нужно переводить. Например, хлоп, это: <lang><word_app>tournaments</word_app><word_pack>admin_tournaments</word_pack><word_key>add_cat</word_key><word_default>Add Category</word_default><word_custom/><word_default_version>31007</word_default_version><word_custom_version/><word_js>0</word_js></lang>И вы переводите лишь этот кусочек ключевой: Добавить категорию А всё остальное оставляете как есть. Как перевели всё между тегами , сохранили файл, готово. Осталось установить компонент. компонент_settings.xml - Если есть этот файл, значит и компонент не мелкий, и куча настроек. В нём настройки, которые будут в АЦ. Насчёт того что в этом файле, всё то же, что в файлах хуков в части настроек АЦ хука. Можете вернуться и сравнить. Рекомендации точно такие же. Есть конечно ещё и другие файлы, бывает ещё и папка с хуками тут же, которые в свою очередь тоже нужно переводить если есть, ведь там хуки которые с компонентом устанавливаются. Рекомендую так же просматривать оставшиеся файлы на наличие в них фраз для перевода. Перевод установленных хуков и компонентов через АЦ Когда мы хук или компонент установили, переводить немного, и из-за этого переустанавливать неохото, ещё что-нибудь, то можно редактировать языковые пакеты и через АЦ, то есть через наш любимый Админ Центр. Для этого входим в него, жмём сверху в меню "Внешний вид", в выпадающем меню "Языки", тут кстати мы можем экспортировать и импортировать языковые пакеты уже для установленных компонентов, нажимая справа стрелку вниз, и выбирая нужный. Но сейчас не про это, далее тыкаем на наш "Русский" язык. Теперь вы вошли в редактирование языковых пакетов непосредственно через АЦ. Тут мы видем поиск и все разделы. Если речь идёт о переводе компонента, жмём на нужный раздел, где наш компонент, так даже быстрей будет если имеем ввиду перевод множества слов. Если же речь идёт о переводе всего нескольких слов, то гораздо проще использовать поиск, а если переводим какое-то слово из хука, то нам кроме поиска искать то и не чем, то есть если переводим фразу из хука, то ищем через поиск, в разделах только компонентные фразы. Пример. Нужно нам какое-то слово перевести в хуке, ну пусть это слово "Topic", пишем в поиск, ищем, оно находится и строго справа от него будет поле, где вы пишете для этого слова перевод. Слово не обязательно английское, тут вы можете и любое русское слово найти и изменить. Есть недостатки поиска, если в поиск написать какое-то популярное слово, тот же "Topic", то скорей вы замучаетесь искать именно нужное слово по страницам поиска, ибо он много таких слов найдёт. И ещё если какое-то слово ищите, то обязательно соблюдайте регистр, то есть если слово с большой буквы, такое и пишите, и наоборот, ну и не пишите в поиск слова с двоеточиями и другими знаками - не найдёт. Бывает такая проблема, что при изменении языковых пакетов через АЦ вылазит такая ошибка: "Невозможно перевести защищенный пакет языков", то не паникуем и читает эту статью. Исправляется за пару минут. Ну и в заключении бы стоило обратить момент на то, что есть файлы языкового пакета, те же, которые в папке "xml", в них перевод для установки компонента, там ключ каждой фразы, само слово для этого ключа, группа этих слов, там всё ещё относительно понятно, а есть файлы языкового пакета, которые мы экспортируем из АЦ, в которых сплошная каша символов, где ничего не понятно, в них перевод для уже установленного компонента, соответственно из-за каши внутри файла как переводить не ясно. Отсюда вывод, что переводить можно только предустановочные файлы, а не там где уже готовый перевод и конвертация из одного в другое невозможна. Автор статьи: WzGeee
-
Альтернативный способ группы ВК
Что бы сделать в боковой панели группу ВК без каких либо хуков и приложений вам не потребуется особых усилий Для этого: Переходим на vk.com/dev/CommunityДелаем виджет, получаем код!!!Идем в АЦ > Настройки > Настройки системы рекламы >Включить систему рекламы - ДАКод для добавления в боковую панель - сюда вставляем кодЖмем применитьИдем в АЦ > Приложения > Управление хуками и влючаем хук Блок рекламы v1.0.0Вывод рекламы в правом блоке на главной страницеЕсли он выключен
-
Как узнать подходит ли хостинг для форума IPB
Как узнать подходит ли хостинг для форума IPB? MySQL 5.x или выше (на сервере должен быть отключен режим STRICT_TRANS_TABLES)Apache 1.4 или вышеВерсия PHP интерпретатора 5.2 или вышеТакже в архиве с форумом вы найдете папку Tools, там находится файл check_requirements.php, залейте его на ФТП и запустите, он проверит подходит ли хостинг для форума.Какие права CHOMD нужно установить? /cache/ 0777/cache/lang_cache/ 0777/cache/lang_cache/1/ 0777/cache/skin_cache/ 0777/cache/tmp/ 0777/public/style_images/ 0777/public/style_css/ 0777/uploads 0777Для корректной работы форума нужно поставить на эти папки соответствующие права CHMOD[/quote]При обновлении форума возникает ошибка связанная с кодировкой Ваша БД должна быть в UTF-8 формате, чтобы перекодировать её, используйте этот скрипт: <?php// Database infoinclude("conf_global.php");$dbhost = $INFO['sql_host'];$dbuser = $INFO['sql_user'];$dbpass = $INFO['sql_pass'];$dbname = $INFO['sql_database'];//---------------header('Content-type: text/plain');$dbconn = mysql_connect($dbhost, $dbuser, $dbpass) or die( mysql_error() );$db = mysql_select_db($dbname) or die( mysql_error() );$sql = "ALTER DATABASE `".$dbname."` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci";$result = mysql_query($sql) or die( mysql_error() );print "Database changed to UTF-8.\n";$sql = 'SHOW TABLES';$result = mysql_query($sql) or die( mysql_error() );while ( $row = mysql_fetch_row($result) ){$table = mysql_real_escape_string($row[0]);$sql = "ALTER TABLE $table DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci, CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci";mysql_query($sql) or die( mysql_error() );print "$table changed to UTF-8.\n";}mysql_close($dbconn);?>Сохраните его в формате convert.php и запустите по адресу site.com/convert.php При установке форума вылетает белый экран, как быть? В большинстве случаев проблема в требованиях к хостингу, проверьте еще раз соответствует ли хостинг требованиям IPB На 10,11 шаге установки возникает ошибка связанная с кодировкой. Вы создали БД в неправильной кодировке, нужно в utf8_general_ciПосле установки форума у меня появились крякозябры, что делать? В корне форума создайте файл .htaccess с таким содержимымAddDefaultCharset utf-8AddCharset utf-8 *<IfModule mod_charset.c>CharsetSourceEnc utf-8CharsetDefault utf-8</IfModule>Как отключить ЧПУ в IPB? Переходим в файл conf_global.php находим$INFO['use_friendly_urls'] = '1';Заменяем на$INFO['use_friendly_urls'] = '0';Как сменить ссылки на темы с русского на латиницу?Заходим в файл initdata.php и там ищемdefine( 'IPB_USE_SEO_TRANSLIT', FALSE );меняем наdefine( 'IPB_USE_SEO_TRANSLIT', TRUE );При попытке изменить фразу пишет "Невозможно перевести защищенный пакет языков" Чтобы решить данную проблему зайдите в phpMyAdmin и выполните запрос UPDATE core_sys_lang SET lang_protected = 0;
-
Защищаем форум IPB от ботов
“Управление” –> “Дополнительные поля профиля” –> “Добавление дополнительного поля”. 2. Прописываем название данного поля, например “Супер защита от ботов”. 3. Составляем описание данного поля: Скопируйте в данное поле цифры с дефисами и без кавычек - “3468-3897-54-913″. Цифры могут быть разными. 4. Ставим тип поля “Однострочное”. 5. Максимальная длина поля: 16. 6. Порядок сортировки: 0. 7. Прописываем формат поля: nnnn-nnnn-nn-nnn. 8. Далее надо поставить вариант “Да” на против двух вопросов: “Это поле обязательно к заполнению?” и “Добавить на страницу регистрации?” 9. Потом ставим отображение поля в сообщении следующим образом {title}: {content}
-
Голосовой поиск по форуму
Идём по пути: АЦ-Внешний вид-Ваш шаблон-глобальные-quickSearch. Там находим код, в моём случае: <input type='text' id='main_search' name='search_term' class='inactive' size='17' tabindex='6' />Ищите у себя что то подобное..Он там в начале шаблона почти. Перед /> добавляем следующие: x-webkit-speech="" speech="" onwebkitspeechchange="this.form.submit();"То есть в моём случае получилось так: <input type='text' id='main_search' name='search_term' class='inactive' size='17' tabindex='6' x-webkit-speech="" speech="" onwebkitspeechchange="this.form.submit();" />
-
Добавление текста при копировании информации с сайта
При копировании текста с сайта добавить в этот текст свою информацию. Другими словами, если кто-то скопирует с вашего сайта текст, скажем, Привет, то при вставке будет что-то вроде Привет Источник: ссылка Решение Нетривиальное. Простейший способ, который работает (что важно). Переходим в АЦ → Внешний вид → ваш стиль Открываем шаблон globalTemplate. Почти в самом начале ищем: //<![CDATA[jsDebug = {parse expression="intval($this->settings['_jsDebug'])"}; /* Must come before JS includes */USE_RTE = 1;DISABLE_AJAX = parseInt({$this->settings['disable_text_ajax']}); /* Disables ajax requests where text is sent to the DB; helpful for charset issues */inACP = false;var isRTL = false;var rtlIe = '';var rtlFull = '';//]]></script>Ниже вставляем: <script type="text/javascript">//<![CDATA[function addLink() {var eBody = document.getElementsByTagName('body')[0];var selection = window.getSelection();// Вы можете изменить текст в этой строчкеvar info = "Источник: <a href='"+document.location.href+"'>"+document.location.href+"</a>";var copytext = selection + info;var newdiv = document.createElement('div');newdiv.style.position = 'absolute';newdiv.style.left = '-99999px';eBody.appendChild(newdiv);newdiv.innerHTML = copytext;selection.selectAllChildren(newdiv);window.setTimeout( function() { eBody.removeChild(newdiv);}, 0);}document.oncopy = addLink;//]]></script>Сохраняем. В строчке var info = "Источник: <a href='"+document.location.href+"'>"+document.location.href+"</a>";можете написать любой свой текст. document.location.hrefзаменится на страницу, с которой текст был скопирован.
-
Смена фона по времени
Глобальные --> globalTemplate Находим: <body id='ipboard_body'>Ниже вставляем: <script type="text/javascript">theTime = new Date();theHour = theTime.getHours();theMinute = theTime.getMinutes();if(theHour>=9&&theHour<=17){document.body.style.cssText = "background: #59b0ee url('__ipb-board.com/public/style_images/ваш_стиль/_backgrounds/bg1.jpg') top center repeat-x";}else if(theHour>6&&theHour<9){document.body.style.cssText = "background: #26abf6 url('__ipb-board.com/public/style_images/ваш_стиль/_backgrounds/bg2.jpg') top center repeat-x";}else if(theHour>17&&theHour<21){document.body.style.cssText = "background: #26abf6 url('__ipb-board.com/public/style_images/ваш_стиль/_backgrounds/bg3.jpg') top center repeat-x";}else{document.body.style.cssText = "background: #155e87 url('__ipb-board.com/public/style_images/ваш_стиль/_backgrounds/bg4.jpg') top center repeat-x";}</script>если ваше время: - больше или равно 9 и меньше или равно 17 - устанавливается bg1.jpg из папки _backgrounds - больше 6 и меньше 9 - устанавливается bg2.jpg из папки _backgrounds - больше 17 и меньше 21 - устанавливается bg3.jpg из папки _backgrounds - в остальное время - устанавливается bg4.jpg из папки _backgrounds Не забудьте загрузить сами фоновые изображения в папку _backgrounds вашего стиля! А так же не забудьте поменять в коде http://ipb-board.com/на адрес Вашего сайта /ваш_стиль/
-
Смайлики в статусах пользователей
Описание: По стандарту, смайлики в статусах пользователей на главной странице запрещены. То есть, они вообще никак не обрабатываются. Чтобы задействовать их, необходимо открыть файл ./admin/sources/classes/member/status.php Найти: $statuses[ $row['status_id'] ] = $row;Добавить выше: $row['status_content'] = IPSText::getTextClass( 'bbcode' )->preDisplayParse( IPSText::getTextClass( 'bbcode' )->preDbParse( $row['status_content'] ) );
-
Добавляем ID пользователя в его профиль
Данная модификация позволит отображать ID (номер) пользователя в информации его профиля. Заходим в: Админцентр > Внешний вид > Ваш стиль > userInfoPane Находим: <li class='post_count desc lighter'> {parse expression="$this->registry->getClass('class_localization')->formatNumber( intval( $author['posts'] ) )"} {$this->lang->words['m_posts']} </li> </if> </ul>Вставляем перед </ul>: <span class="post_count desc lighter">Пользователь №{$author['member_id']}</span>
-
Ник или выделенный текст в форму быстрого ответа для 3.2.х
Заходим в: Админцентр > Внешний вид ˃ Ваш шаблон ˃ Темы ˃ post Находим: <li class='report'> <a href="{$this->settings['base_url']}app=core&module=reports§ion=reports&do=show_report&rid={$this->memberData['_cache']['report_temp']['post_marker']['post'][$post['post']['pid']]['info']['id']}" id='post-report-{$post['post']['pid']}' class='ipbmenu'> <span id="rstat-{$this->memberData['_cache']['report_temp']['post_marker']['post'][ $post['post']['pid'] ]['info']['id']}"><img src="{$this->settings['img_url']}/reports/post_alert_{$this->memberData['_cache']['report_temp']['post_marker']['post'][$post['post']['pid']]['gfx']}.png" alt="" /></span> </a> </li> </if> </if>Ниже добавляем: <if test="replyButton:|:$post['post']['_canReply']"> <li style='position:absolute;'><a class='ipsButton_secondary' onmouseover="copyQ('{$post['author']['members_display_name']}', '{$post['post']['pid']}');" href="javascript:ins('{$post['author']['members_display_name']}')">Вставить ник или выделенный текст</a></li> </if>Заходим в: Админцентр > Внешний вид ˃ Ваш шаблон ˃ Темы ˃ topicViewTemplate Находим: <script type='text/javascript'> ipb.topic.fastReplyId = '{$this->settings['_lastEditorId']}';Ниже добавляем: function copyQ( qinf, pid ) { txt=''; if (window.getSelection) { txt=window.getSelection(); } else if (document.selection) { txt=document.selection.createRange().text; } if (txt != "") { txt='[quote name="'+qinf+'" post="'+pid+'"]'+txt+'; } } function ins( name ) { editor = ipb.textEditor.getEditor( ipb.topic.fastReplyId ) if (txt!= "") { editor.insert( txt, true ); } else { editor.insert( "[member="+name+"],", true ); } }
-
Сокращение количества символов в блоке "Последние темы"
В боковой панеле форума IP.Board отображается дополнительный блок под названием Последние темы. Заголовки последних тем отображаются полность, если у темы длинный заголовок, строка перенесётся на следующую.. Если сократить количество отображаемых символов в заголовках тем в блоке Последние темы, вид блока будет выглядеть намного приятнее.. Для этого необходимо открыть шаблон hookRecentTopics в Список форумов. Находим строку: {$r['topic_title']}Заменяем на: {parse expression="IPSText::truncate( $r['topic_title'], XX)"}Где XX - количество знаков. В примере на скриншоте XX равно 35.
-
Убираем кнопку "Жалоба"
Заходим в: Админцентр > Внешний вид > Управление стилями и шаблонами > Управление шаблонами > Управление шаблонами и CSS > Темы > post Находим: <li class='report'><a href='{parse url="app=core&module=reports&rcom=post&tid={$this->request['t']}&pid={$post['post']['pid']}&st={$this->request['st']}" base="public"}'>{$this->lang->words['report']}</a></li>Заменяем на: <if test="noselfreport:|:$post['author']['member_id'] != $this->memberData['member_id']"><li class='report'><a href='{parse url="app=core&module=reports&rcom=post&tid={$this->request['t']}&pid={$post['post']['pid']}&st={$this->request['st']}" base="public"}'>{$this->lang->words['report']}</a></li></if>
-
Меняем кол-во последних изменений статусов
По-умолчанию в IP.Board 3.2.x на главной странице отображается только пять последних изменений статусов пользователей, благодаря этой статье, вы научитесь изменять их кол-во. Заходим в корневую директорию форума (ФТП): Открываем файл conf_global.php Находим: $INFO['status_sidebar_show_x'] = '5';Значение '5' изменяем на свое.
-
Избавляемся от дублированных вкладок навигации
При обновлении форума до версии 3.3.x, у многих в навигации стало по две вкладки Форумы и Пользователи. Для исправления этого нам потребуется изменить шаблона globalTemplate, находим: {parse variable="forumActive" default="" oncondition="IPS_APP_COMPONENT == 'forums'" value="active"}{parse variable="membersActive" default="" oncondition="IPS_APP_COMPONENT == 'members'" value="active"}{parse variable="helpActive" default="" oncondition="IPS_APP_COMPONENT == 'core' AND $this->request['module'] == 'help'" value="active"}<if test="!ipsRegistry::$applications['forums']['app_hide_tab'] && !count(ipsRegistry::$applications['forums']['app_tab_groups']) && !IPSMember::isInGroup( $this->memberData, ipsRegistry::$applications['forums']['app_tab_groups'] )"><li id='nav_discussion' class='left {parse variable="forumActive"}'><a href='{parse url="act=idx" seotitle="false" base="public"}' title='{$this->lang->words['go_to_discussion']}'>{IPSLib::getAppTitle( 'forums' )}</a></li></if><if test="!ipsRegistry::$applications['members']['app_hide_tab'] && !count(ipsRegistry::$applications['members']['app_tab_groups']) && !IPSMember::isInGroup( $this->memberData, ipsRegistry::$applications['members']['app_tab_groups'] )"><li id='nav_members' class='left {parse variable="membersActive"}'><a href='{parse url="app=members&module=list" base="public" template="members_list" seotitle="false"}' title='{$this->lang->words['go_to_memberlist']}'>{IPSLib::getAppTitle( 'members' )}</a></li></if><if test="applicationsloop:|:is_array($header_items['applications']) AND count($header_items['applications'])"> <foreach loop="applications:$header_items['applications'] as $data"> <if test="showingapp:|:$data['app_show']"> {parse variable="appActive" default="" oncondition="$data['app_active']" value="active"} <li id='nav_app_{$data['app_dir']}' class="left {parse variable="appActive"}"><a href='{parse url="{$data['app_link']}" seotitle="false" base="public"}' title='{parse expression="sprintf( $this->lang->words['go_to_prefix'], IPSLib::getAppTitle($data['app_dir']) )"}'>{IPSLib::getAppTitle($data['app_dir'])}</a></li> </if> </foreach></if>Заменить на: <if test="hasCustomPrimaryNavigation:|:!empty($header_items['primary_navigation_menu'])"> {$header_items['primary_navigation_menu']}<else /> <if test="applicationsloop:|:is_array($header_items['applications']) AND count($header_items['applications'])"> <foreach loop="applications:$header_items['applications'] as $data"> <if test="showingapp:|:$data['app_show']"> {parse variable="appActive" default="" oncondition="$data['app_active']" value="active"} <li id='nav_app_{$data['app_dir']}' class="left {parse variable="appActive"}"><a href='{parse url="{$data['app_link']}" seotitle="{$data['app_seotitle']}" template="{$data['app_template']}" base="{$data['app_base']}"}' title='{parse expression="sprintf( $this->lang->words['go_to_prefix'], IPSLib::getAppTitle($data['app_dir']) )"}'>{IPSLib::getAppTitle($data['app_dir'])}</a></li> </if> </foreach> </if></if>
-
Исправляем единичное отображение файлов в категориях IP.Downloads
Этот баг разработчики исправили в новой версии IP.Downloads, которая пока ещё не вышла.. Для исправления этого бага нужно отредактировать файлик category.php, который находится по пути: admin/applications_addon/ips/downloads/modules_public/displНайти Найти код: $this->DB->execute(); while( $row = $this->DB->fetch() )И заменить его на: $res = $this->DB->execute(); while( $row = $this->DB->fetch( $res ) )
-
Исправляем баг с загрузкой следующих тем
При просмотре определенного форума, если нажать на "Загрузить следующие темы", то зачастую следующие темы будут дублироваться с той страницы, на которой вы находитесь. Данная статья поможет вам исправить это. Заходим в: Админцентр > Внешний вид > Ваш стиль > Список тем форума > forumIndexTemplate Находим: <script type='text/javascript'>ipb.forums.fetchMore = {'f': parseInt("{$this->request['showforum']}") ,'st': parseInt("{$this->request['st']}"),'sort_by': "{$this->request['sort_by']}",'sort_key': "{$this->request['sort_key']}",'topicfilter': "{$this->request['topicfilter']}",'prune_day': "{$this->request['prune_day']}"};</script>Заменяем на: <script type='text/javascript'>ipb.forums.fetchMore = {'f': parseInt("{$this->request['showforum']}") ,'st': parseInt("{$this->request['st']}"),'sort_by': "{$this->request['sort_by']}",'sort_key': "{$this->request['sort_key']}",'topicfilter': "{$this->request['topicfilter']}",'prune_day': "{$this->request['prune_day']}",'max_topics': "{$this->settings['display_max_topics']}"};</script>
-
Исправляем вид в личных сообщениях
На многих стилях бывает случается так, что вид у быстрого просмотра сообщений, корявый. Сейчас мы это исправим. Заходим в: Админцентр > Внешний вид > Управление стилями и шаблонами > Управление шаблонами > Прочие > inboxList Найти: <ul class="ipsList_withminiphoto">Добавить перед: <br />
-
Восстанавливаем регистрационную форму
У многих после перехода на версию 3.2.3 и при обновлении шаблонов форума, возникает проблема с регистрационной формой. В этой статье мы исправим это. Заходим в: Админцентр > Внешний вид > Управление стилями и шаблонами > Управление шаблонами > Управление шаблонами и CSS > Регистрация > registerForm Заменяем весь код на этот: {parse js_module="register"}<script type='text/javascript'>//<![CDATA[ipb.register.inSection = "mainform";ipb.register.nameMaxLength = "{$this->settings['max_user_name_length']}";ipb.register.allowedChars = "{$this->settings['username_characters']}";ipb.templates['accept'] = " <span id='[id]_msg' class='reg_msg reg_accept' style='display: none'><img src='{$this->settings['img_url']}/accept.png' alt='' /> [msg]</span>";ipb.templates['error'] = " <span id='[id]_msg' class='reg_msg reg_error' style='display: none'><img src='{$this->settings['img_url']}/exclamation.png' alt='' /> [msg]</span>";//]]></script><div id='register_form'><!--<h1 class='ipsType_pagetitle'>{$this->lang->words['ready_register']}</h1>-->{parse template="registerStepBar" group="register" params="array('register_form' => 'ipsSteps_active', 'confirmation' => '')"}<if test="registerHasErrors:|:is_array( $general_errors ) && count( $general_errors )"><div class='message error'> {$this->lang->words['following_errors']} <ul> <foreach loop="general_errors:$general_errors as $r"> <li>{$r}</li> </foreach> </ul></div><br /></if><form action="{parse url="app=core&module=global§ion=register" base="public"}" method="post" name="REG" id='register'> <input type="hidden" name="termsread" value="1" /> <input type="hidden" name="agree_to_terms" value="1" /> <input type="hidden" name="do" value="process_form" /> <input type="hidden" name="coppa_user" value="{$data['coppa_user']}" /> <input type='hidden' name='nexus_pass' value='1' /> <input type='hidden' name='time_offset' id='auto_time_offset' value='0' /> <input type='hidden' name='dst' id='auto_dst' value='0' /> <h1 class='maintitle'> {$this->lang->words['ready_register']} </h1> <div class='ipsBox'> <div class='ipsBox_container ipsPad'> <if test="registerServices:|:IPSLib::fbc_enabled() || IPSLib::twitter_enabled() === true"> <div class='ipsBox_container ipsBox_notice ipsForm ipsForm_horizontal' id='external_services'> <strong class='ipsField_title' id='save_time'>{$this->lang->words['want_to_save_time']}</strong> <div class='ipsField_content'> <ul class='ipsList_inline'> <if test="registerUsingFb:|:IPSLib::fbc_enabled()"> <li><a href="{$this->settings['_original_base_url']}/interface/facebook/index.php?_reg=1"><img src="{$this->settings['img_url']}/facebook_login.png" alt="" /></a></li> </if> <if test="twitterBox:|:IPSLib::twitter_enabled() === true"> <li><a href="{$this->settings['_original_base_url']}/interface/twitter/index.php?_reg=1"><img src="{$this->settings['img_url']}/twitter_login.png" alt="" /></a></li> </if> </ul> </div> </div> </if> <if test="registerHasInlineErrors:|:is_array( $inline_errors ) && ( $inline_errors['username'] || $inline_errors['dname'] || $inline_errors['email'] || $inline_errors['password'] )"> <p class='message error'>{$this->lang->words['reg_errors_found']}</p> <br /> </if> <fieldset> <ul class='ipsForm ipsForm_horizontal'> <li class='ipsField'> <p class='ipsField_content'> <span class='ipsForm_required ipsType_smaller'>* {$this->lang->words['required_field']}</span> </p> </li> <li class='ipsField clear <if test="ieDnameClass:|:$inline_errors['dname']">error</if>'> <label for='display_name' class='ipsField_title'>{$this->lang->words['reg_choose_dname']} <span class='ipsForm_required'>*</span></label> <p class='ipsField_content'> <input type='text' class='input_text' id='display_name' size='45' maxlength='{$this->settings['max_user_name_length']}' value='{$this->request['members_display_name']}' name='members_display_name' /><br /> <span class='desc primary lighter'> <if test="ieDname:|:$inline_errors['dname']"><span class='error'>{$inline_errors['dname']}<br /></span></if> {parse expression="sprintf( $this->lang->words['dname_desc'], $this->settings['max_user_name_length'])"} </span> </p> </li> <li class='ipsField clear <if test="ieEmailClass:|:$inline_errors['email']">error</if>'> <label for='email_1' class='ipsField_title'>{$this->lang->words['reg_enter_email']} <span class='ipsForm_required'>*</span></label> <p class='ipsField_content'> <input type='text' id='email_1' class='input_text email' size='45' maxlength='150' name='EmailAddress' value='{$this->request['EmailAddress']}' /><br /> <if test="ieEmail:|:$inline_errors['email']"><span class='desc'><span class='error'>{$inline_errors['email']}</span></span></if> </p> </li> <li class='ipsField clear <if test="iePasswordClass:|:$inline_errors['password']">error</if>'> <label for='password_1' class='ipsField_title'>{$this->lang->words['reg_choose_password']} <span class='ipsForm_required'>*</span></label> <p class='ipsField_content'> <input type='password' id='password_1' class='input_text password' size='45' maxlength='32' value='{$this->request['PassWord']}' name='PassWord' /><br /> <span class='desc lighter'><if test="iePassword:|:$inline_errors['password']"><span class='error'>{$inline_errors['password']}<br /></span></if>{$this->lang->words['reg_choose_password_desc']}</span> </p> </li> <li class='ipsField clear'> <label for='password_2' class='ipsField_title'>{$this->lang->words['reg_reenter_password']} <span class='ipsForm_required'>*</span></label> <p class='ipsField_content'> <input type='password' id='password_2' class='input_text password' size='45' maxlength='32' value='{$this->request['PassWord_Check']}' name='PassWord_Check' /><br /> </p> </li> </ul> </fieldset> <if test="hasNexusFields:|:!empty( $nexusFields )"> <script type='text/javascript'> var _countriesWithStates = []; <foreach loop="statesJs:$nexusStates as $k => $v"> _countriesWithStates["{$k}"] = 1; </foreach> </script> <hr /> <fieldset> <ul class='ipsForm ipsForm_horizontal'> <foreach loop="fields:$nexusFields as $f"> <if test="isAddressOrPhone:|:in_array( $f['f_column'], array( 'cm_address_1', 'cm_phone' ) )"> <br /> </if> <if test="isText:|:$f['f_type'] == 'text'"> <li class='ipsField clear'> <label for='{$f['f_column']}' class='ipsField_title'><if test="isAddress1:|:$f['f_column'] == 'cm_address_1'">{$this->lang->words['cm_address']}<else /><if test="isAddress2:|:$f['f_column'] == 'cm_address_2'"> <else />{$f['f_name']}</if></if> <if test="textRequired:|:$f['f_reg_require']"><span class='ipsForm_required'>*</span></if></label> <p class='ipsField_content'> <input type='text' class='input_text' id='{$f['f_column']}' size='25' maxlength='255' value='{$this->request[ $f['f_column'] ]}' name='{$f['f_column']}' /> </p> <if test="textErrorMessage:|:$f['f_reg_require'] and $this->request['do'] == 'process_form' and !$this->request[ $f['f_column'] ]"> <span class='error'>{$this->lang->words['err_complete_form']}</span> </if> </li> </if> <if test="isDropdown:|:$f['f_type'] == 'dropdown'"> <li class='ipsField clear'> <label for='{$f['f_column']}' class='ipsField_title'>{$f['f_name']} <if test="dropdownRequired:|:$f['f_reg_require']"><span class='ipsForm_required'>*</span></if></label> <div class='ipsField_content'> <select name='{$f['f_column']}' id='{$f['f_column']}' <if test="isCountry:|:$f['f_column'] == 'cm_country'">onchange='states()'</if>> <foreach loop="options:explode( "n", $f['f_extra'] ) as $k => $v"> {parse variable="selected" default="" oncondition="$k == $this->request[ $f['f_column'] ] or $v == $this->request[ $f['f_column'] ]" value=" selected='selected'"} <option value='<if test="isCountrySelect:|:$f['f_column'] == 'cm_country'">{$v}<else />{$k}</if>'{parse variable="selected"}><if test="isCountryWords:|:$f['f_column'] == 'cm_country'">{$this->lang->words['nc_'.$v]}<else />{$v}</if></option> </foreach> </select> </div> <if test="dropdownErrorMessage:|:$f['f_reg_require'] and $this->request['do'] == 'process_form' and !$this->request[ $f['f_column'] ]"> <span class='error'>{$this->lang->words['err_complete_form']}</span> </if> </li> </if> <if test="isSpecial:|:$f['f_type'] == 'special'"> <li class='ipsField clear'> <label for='cm_state' class='ipsField_title'>{$this->lang->words['cm_state']} <if test="specialRequired:|:$f['f_reg_require']"><span class='ipsForm_required'>*</span></if></label> <div class='ipsField_content'> <input type='text' class='input_text' id='text-states' size='25' name='cm_state' value='{$this->request['cm_state']}' /> <foreach loop="statesCountries:$nexusStates as $country => $_states"> <select name='_cm_state' id='{$country}-states' class='input_select' style='display:none'> <foreach loop="states:$_states as $s"> {parse variable="selected" default="" oncondition="$s[0] == $this->request['cm_state']" value=" selected='selected'"} <option value='{$s[0]}'{parse variable="selected"}>{$s[1]}</option> </foreach> </select> </foreach> </div> <if test="specialErrorMessage:|:$f['f_reg_require'] and $this->request['do'] == 'process_form' and !$this->request[ $f['f_column'] ]"> <span class='error'>{$this->lang->words['err_complete_form']}</span> </if> </li> </if> </foreach> </ul> </fieldset> <script type='text/javascript'> function states() { var c = $('cm_country').value; if ( c in _countriesWithStates ) { $( _display ).style.display = 'none'; $( _display ).name = '_cm_state'; $( c + '-states' ).style.display = ''; $( c + '-states' ).name = 'cm_state'; _display = c + '-states'; } else { $( _display ).style.display = 'none'; $( _display ).name = '_cm_state'; $( 'text-states' ).style.display = ''; $( 'text-states' ).name = 'cm_state'; _display = 'text-states'; } } var _display = 'text-states'; states(); </script> </if> <if test="hasCfields:|<img src='__ipbmafia.ru/public/style_emoticons/<#EMO_DIR#>/7.gif' class='bbc_emoticon' alt=':)' /> is_array( $custom_fields['required'] ) && count( $custom_fields['required'] ) ) || ( is_array( $custom_fields['optional'] ) && count( $custom_fields['optional'] ) )"> <hr /> <fieldset> <ul class='ipsForm ipsForm_horizontal'> <if test="reqCfields:|:is_array( $custom_fields['required'] ) && count( $custom_fields['required'] )"> <foreach loop="custom_required:$custom_fields['required'] as $_field"> <li class='ipsField clear ipsField_{$_field['type']}'> <label for='cprofile_{$_field['id']}' class='ipsField_title'>{$_field['name']} <span class='ipsForm_required'>*</span></label> <div class='ipsField_content'> {$_field['field']} <if test="reqCfieldDescSpan:|:$_field['desc'] != ''"><br /><span class='desc'>{$_field['desc']}</span></if> </div> </li> </foreach> </if> <if test="optCfields:|:is_array( $custom_fields['optional'] ) && count( $custom_fields['optional'] )"> <foreach loop="custom_optional:$custom_fields['optional'] as $_field"> <li class='ipsField clear ipsField_{$_field['type']}'> <label for='cprofile_{$_field['id']}' class='ipsField_title'>{$_field['name']}</label> <div class='ipsField_content'> {$_field['field']} <if test="optCfieldDescSpan:|:$_field['desc'] != ''"><br /><span class='desc'>{$_field['desc']}</span></if> </div> </li> </foreach> </if> </fieldset> </if> <hr /> {$data['qandaHTML']} {$data['captchaHTML']} <hr /> <fieldset> <ul class='ipsForm ipsForm_horizontal'> <li class='ipsField clear ipsField_checkbox'> <input type="checkbox" name="allow_admin_mail" id="allow_admin_mail" value="1" class="input_check" <if test="defaultAAE:|:$this->request['allow_admin_mail'] || !isset( $this->request['allow_admin_mail'] )">checked='checked'</if> /> <p class='ipsField_content'> <label for='allow_admin_mail'>{$this->lang->words['receive_admin_emails']}</label> </p> </li> <li class='ipsField clear ipsField_checkbox'> <input type='checkbox' name='agree_tos' id='agree_tos' value='1' class='input_check' <if test="checkedTOS:|:$this->request['agree_tos']">checked="checked"</if> /> <p class='ipsField_content'> <label for='agree_tos' <if test="ieDnameClass:|:$inline_errors['dname']">error</if>> <strong>{$this->lang->words['agree_to_tos']} <a href='#' id='tou_link'>{$this->lang->words['terms_of_use']}</a></strong> <if test="ieTOS:|:$inline_errors['tos']"><br /><span class='error'>{$inline_errors['tos']}</span></if> </label> <textarea id='tou' class='input_text' style='width: 350px; height: 100px; display: block;'> {$this->settings['_termsAndConditions']} </textarea> </p> </li> </ul> <script type='text/javascript'> $('tou').hide(); </script> </fieldset> <br /> <fieldset> <input type='submit' class='ipsButton' id='register_submit' value='{$this->lang->words['register']}' /> </fieldset> </div> </div></form><script type='text/javascript'> ipb.templates['registration_terms'] = new Template("<h3>{$this->lang->words['reg_terms_popup_title']}</h3><div class='ipsPad' id='tou_popup'>#{content}</div>");</script>{parse template="registerCoppaStart" group="register" params=""}</div>
-
Скрываем статистику форума от гостей
Переходим в админцентр форума --> Внешний Вид --> Управление стилями --> Ваш стиль --> Список форумов --> boardIndexTemplate Найти: <div id='board_statistics' class='statistics clearfix'>Заменить на: <if test="$this->memberData['member_id']"><div id='board_statistics' class='statistics general_box clearfix'Далее в самом низу шаблона найдите последний закрывающийся оператор </if>, и добавьте рядом с ним такой же оператор..
-
Выравнивание текста
Доброго времени суток. Бывает случается так, что вся информация на каком-нибудь стиле смещена влево, в этой статье мы исправим этот небольшой "косяк" для ipb 3.2.x Заходим в: Админцентр > Внешний вид > Управление стилями и шаблонами > Ваш шаблон > CSS > ipb_common.css Находим следующий кусок кода: span.bbc_center, div.bbc_center { text-align: center; display: block; }span.bbc_left, div.bbc_left { text-align: left; display: block; }span.bbc_right , div.bbc_right { text-align: right; display: block; }Заменяем его на: span.bbc_center, div.bbc_center, p.bbc_center {text-align: center; display: block; }span.bbc_left, div.bbc_left, p.bbc_left {text-align: left; display: block; }span.bbc_right, div.bbc_right, p.bbc_right {text-align: right; display: block; }
-
Форма входа на главной странице форума
Открытая форма входа на главной странице форума Данная инструкция поможет вам вывести форму входа на главую страницу форума, как на рисунке. Для этого необходимо внести изменения в globalTemplate, а иенно вынести в него форму входа из showLogInForm. Находим в globalTemplate следующий код: <a href="{parse url="app=core&module=global§ion=login" base="public"}" title="{$this->lang->words[" sign_in']}'="" id="sign_in">Заменяем на: <input id="ips_username" type="text" class="input_text" name="ips_username" size="10"" onclick="this.value='';" onfocus="this.select()" onblur="this.value=!this.value?'':this.value;" value="Username"><input id="ips_password" type="password" class="input_text" name="ips_password" size="10" onclick="this.value='';" onfocus="this.select()" onblur="this.value=!this.value?'':this.value;" value="Password"><input type="submit" class="input_submit" value="{$this->lang->words['sign_in']}"><fieldset><input type="hidden" name="auth_key" value="{$this->member->form_hash}"><input type="checkbox" id="remember" checked="checked" name="rememberMe" value="1" class="input_check"></fieldset>
-
Дублирование вкладок форума
Некоторые обновив версию форума сталкиваются с этим Исправляем вот так! АЦ - Внешний вид - Ваш стиль - globalTemplate Увидеть {parse variable="forumActive" default="" oncondition="IPS_APP_COMPONENT == 'forums'" value="active"}{parse variable="membersActive" default="" oncondition="IPS_APP_COMPONENT == 'members'" value="active"}{parse variable="helpActive" default="" oncondition="IPS_APP_COMPONENT == 'core' AND $this->request['module'] == 'help'" value="active"}<if test="!ipsRegistry::$applications['forums']['app_hide_tab'] && !count(ipsRegistry::$applications['forums']['app_tab_groups']) && !IPSMember::isInGroup( $this->memberData, ipsRegistry::$applications['forums']['app_tab_groups'] )"><li id='nav_discussion' class='left {parse variable="forumActive"}'><a href='{parse url="act=idx" seotitle="false" base="public"}' title='{$this->lang->words['go_to_discussion']}'>{IPSLib::getAppTitle( 'forums' )}</a></li></if><if test="!ipsRegistry::$applications['members']['app_hide_tab'] && !count(ipsRegistry::$applications['members']['app_tab_groups']) && !IPSMember::isInGroup( $this->memberData, ipsRegistry::$applications['members']['app_tab_groups'] )"><li id='nav_members' class='left {parse variable="membersActive"}'><a href='{parse url="app=members&module=list" base="public" template="members_list" seotitle="false"}' title='{$this->lang->words['go_to_memberlist']}'>{IPSLib::getAppTitle( 'members' )}</a></li></if><if test="applicationsloop:|:is_array($header_items['applications']) AND count($header_items['applications'])"> <foreach loop="applications:$header_items['applications'] as $data"> <if test="showingapp:|:$data['app_show']"> {parse variable="appActive" default="" oncondition="$data['app_active']" value="active"} <li id='nav_app_{$data['app_dir']}' class="left {parse variable="appActive"}"><a href='{parse url="{$data['app_link']}" seotitle="false" base="public"}' title='{parse expression="sprintf( $this->lang->words['go_to_prefix'], IPSLib::getAppTitle($data['app_dir']) )"}'>{IPSLib::getAppTitle($data['app_dir'])}</a></li> </if> </foreach></if>Заменить : <if test="hasCustomPrimaryNavigation:|:!empty($header_items['primary_navigation_menu'])"> {$header_items['primary_navigation_menu']}<else /> <if test="applicationsloop:|:is_array($header_items['applications']) AND count($header_items['applications'])"> <foreach loop="applications:$header_items['applications'] as $data"> <if test="showingapp:|:$data['app_show']"> {parse variable="appActive" default="" oncondition="$data['app_active']" value="active"} <li id='nav_app_{$data['app_dir']}' class="left {parse variable="appActive"}"><a href='{parse url="{$data['app_link']}" seotitle="{$data['app_seotitle']}" template="{$data['app_template']}" base="{$data['app_base']}"}' title='{parse expression="sprintf( $this->lang->words['go_to_prefix'], IPSLib::getAppTitle($data['app_dir']) )"}'>{IPSLib::getAppTitle($data['app_dir'])}</a></li> </if> </foreach> </if></if>
-
Разделение при слиянии сообщений
При включенной функции слияния сообщений, можно разделить два сообщения картинкой или текстом. Делаем это так. Открыть: /admin/applications/forums/sources/classes/post/classPost.php Найти: $new_post = $last_post['post'].'<br /><br />'.$post['post'];Заменить на: $new_post = $last_post['post'].'<br /><br /><img src="http://ссылка на кртинку" /><br />'.$post['post'];
-
Ошибка при переходе по ссылке Администрация
При нажатии на кнопку Администрация на форуме ipb Может произойти такая ошибка Catchable fatal error: Object of class ipsRegistry could not be converted to string in /home/***/public_html/cache/skin_cache/cacheid_12/skin_stats.php on line 92 Или ошибка сервера 500 Для того чтобы исправить переходим в ACP - Внешний вид - Ваш стиль - Статистика - group_strip Найти: <li><a href="{parse url="showforum={$id}" base="public" template="showforum" seotitle="$this->registry->class_forums->forum_by_id[ $id ]['name_seo']"}">{$name}</a></li>Заменить на: <php>$seoName = $this->registry->class_forums->forum_by_id[$id]['name_seo'];</php>
-
Вставка цветных ников в Shoutbox чате
В данной статье, вы узнаете как сделать подсветку пользователей в чате Shoutbox. Переходим в Ваш шаблон > skin_shoutbox > shout_row и заменяем это: <a href="#" class="at_member" data-store="{$d['members_display_name']}" title="{$this->lang->words['insert_name']}">@</a>на это: <a href="#" class="at_member" data-store="[member={$d['members_display_name']}]" title="{$this->lang->words['insert_name']}">@</a>ББ-коды должны быть включены.