на модерации Пожелания zxc

sхс

Легенда
Это будет моя личная тема для пожеланий. Время от времени буду делиться

Первое:
Определять язык пользователя, которому отправляется сообщение/уведомление и подключать языковые переменные удобные ему (например актуально для мода позвать скачавших).
Перед send_pm(), send_notice()
Добавляем (если у вас два языка на сайте)
Код:
if(get_userdata($topic_poster)["user_lang"] =='english'){
            include(LANG_ROOT_DIR .'lang_english/lang_main.php');
        }
        else{
            include(LANG_ROOT_DIR .'lang_russian/lang_main.php');
        }
По тому же принципу я отображаю язык сайта для гостей в зависимости от языка браузера
 
Последнее редактирование:

sхс

Легенда
Второе пожалание это мультикатегории. У меня на форуме длится вечная борьба модераторов: какой релиз правильнее где разместить. Иногда он переносится несколько раз туда обратно.

2024-08-29_07-56-06.jpg
Решил добавить в `bb_topics` 3 дополнительных поля forum_id_ext1,forum_id_ext2,forum_id_ext3 и дополнительный select в форму добавления/редактирования релиза.
posting.tpl
Код:
<!-- IF CATS -->
<tr>
   <td colspan="2">{CATS}</td>
</tr>
<!-- ENDIF -->

posting.php
Код:
if (!$forums_ext = $datastore->get('cat_forums')){
    $datastore->update('cat_forums');
    $forums_ext = $datastore->get('cat_forums');
}

    $selected = [];
    if(!empty($post_info['forum_id_ext1'])){
        $selected[$post_info['forum_id_ext1']]=$post_info['forum_id_ext1'];
    }
    if(!empty($post_info['forum_id_ext2'])){
        $selected[$post_info['forum_id_ext2']]=$post_info['forum_id_ext2'];
    }
    if(!empty($post_info['forum_id_ext3'])){
        $selected[$post_info['forum_id_ext3']]=$post_info['forum_id_ext3'];
    }


    //var_dump($selected_);
    $params = [];
    foreach($forums_ext['c'] as $c){

        if($c["cat_id"]!=$post_info['cat_id'])continue;

        $fparams = [];
        foreach($forums_ext['f'] as $f){
            if($f["forum_id"]==$forum_id) continue;
            if(in_array($f["forum_id"], $bb_cfg['multicategories_not_allow_arr'])) continue;

            if($f["cat_id"]==$c["cat_id"]) {
                //$key = $f["forum_name"].'<|||>'.strip_tags(bbcode2html($f['text']));
                $fparams[(($f["forum_parent"]!=0)?"&nbsp;&nbsp;&nbsp;&nbsp;":'').fc_name_lang($f["forum_name"],$userdata["user_lang"])] = $f["forum_id"];
            }
        }
        $params[$c["cat_title"]] = $fparams;

    }
    //var_dump($params);



$extra_forums = build_bootstrap_select ('extra_forums[]', $params, $selected, HTML_SELECT_MAX_LENGTH, 10, '',false,true, $lang['EXTRA_CATEGORIES'],3);
//vdn($post_info);


$template->assign_vars(array(
        'FORUM_NAME' => htmlCHR($forum_name),
      //'FORUM_ID'           => $forum_id,
        'PAGE_TITLE' => $page_title,
        'CATS' => (!in_array($forum_id, $bb_cfg['multicategories_not_allow_arr']))? $extra_forums : false,
......


functions.php
Код:
function build_bootstrap_select ($name, $params, $selected = null, $max_length = HTML_SELECT_MAX_LENGTH, $multiple_size = false, $js = '',$data_images = false,$search=false,$label_text=false,$max_options=false)
{
    global $lang;
   if (empty($params)) return '';
 
   //vdn($data_images);

   $this->options = '';
   $this->selected = array_flip((array) $selected);
   $this->max_length = $max_length;

   $this->attr = array();
   $this->cur_attr =& $this->attr;

   if (isset($params['__attributes']))
   {
      $this->attr = $params['__attributes'];
      unset($params['__attributes']);
   }

   $this->_build_bootstrap_select_rec($params,$data_images);

   $select_params  = ($js) ? " $js" : '';
   $select_params .= ($multiple_size) ? ' multiple="multiple" data-size="'. $multiple_size .'" size="'. $multiple_size .'"' : '';
   $select_params .= ($search) ? ' data-live-search="true"' : '';
       $select_params .= ($max_options) ? ' data-max-options="'. (int)$max_options .'"' : '';
       $select_params .= ($max_options) ? ' data-max-options-text="'. sprintf($lang['SLECTPICKER_MULTIPLE_MAX'], $max_options) .'"' : '';
       //
   $select_params .= ' name="'. htmlCHR($name) .'"';
   $select_params .= ' id="'. htmlCHR($name) .'"';
   $select_params .= ' class="form-control selectpicker"';
   $label_text = ($label_text) ? '<label for="'. htmlCHR($name) .'">'.$label_text.'</label>' : '';
 

return "\n{$label_text}\n<select {$select_params}>\n". $this->options ."</select>\n";
}

function _build_bootstrap_select_rec ($params,$data_images=false)
{
 
   //var_dump($params);
   foreach ($params as $opt_name => $opt_val)
   {
  
      $opt_name = rtrim($opt_name);
  
      //vdn($data_images);

      if (is_array($opt_val))
      {
         $this->cur_attr =& $this->cur_attr[$opt_name];

         $label = htmlCHR(str_short($opt_name, $this->max_length));

         $this->options .= "\t<optgroup label=\"". $label ."\">\n";
         $this->_build_bootstrap_select_rec($opt_val);
         $this->options .= "\t</optgroup>\n";

         $this->cur_attr =& $this->attr;
      }
      else
      {

    
    
         $text  = htmlCHR(str_short($opt_name, $this->max_length));
    
    
         if(stristr($opt_name,'<|||>')){
            $tmp_arr = explode('<|||>',$opt_name);
            $text  = (!empty($tmp_arr[0])) ? htmlCHR(str_short($tmp_arr[0], $this->max_length)) : $text;
            $data_subtext  = (!empty($tmp_arr[1])) ? ' data-subtext="'. htmlCHR($tmp_arr[1]) .'"' : $text;

         }
         else{
            $data_subtext = '';
         }
    
    
         $value = ' value="'. htmlCHR($opt_val) .'"';

         $class = isset($this->cur_attr[$opt_name]['class']) ? ' class="'. $this->cur_attr[$opt_name]['class'] .'"' : '';
         $style = isset($this->cur_attr[$opt_name]['style']) ? ' style="'. $this->cur_attr[$opt_name]['style'] .'"' : '';

         $selected = isset($this->selected[$opt_val]) ? HTML_SELECTED : '';
         $disabled = isset($this->cur_attr[$opt_name]['disabled']) ? HTML_DISABLED : '';
    
    
    
         $images = ($data_images AND @getimagesize("images/position/".$opt_val.".png")) ?  ' data-image="images/position/'.$opt_val.'.png?2"':"";

         $this->options .= "\t\t<option".$class . $style . $selected . $disabled . $data_subtext . $value. $images. '>'. $text ."</option>\n";
      }
   }
}

Это позволят пользователю выбрать 3 дополнительных категории для релиза. Если он отметит доп категории, то во vieforum.php выборка будет проходить по условию
Код:
SELECT t.topic_id
FROM ". BB_TOPICS ." t
WHERE t.forum_id = $forum_id OR ((t.forum_id_ext1 = $forum_id OR t.forum_id_ext2 = $forum_id OR t.forum_id_ext3 = $forum_id) AND t.forum_id NOT IN(".$bb_cfg['multicategories_not_allow']."))
   $only_new_sql
   $title_match_sql
   $limit_topics_time_sql
$order_sql
LIMIT $start, $topics_per_page
Где $bb_cfg['multicategories_not_allow'] это список категорий в которых запрещены мультикатегории (архив, приватное итд)

Сделано довольно костыльно, изначально вообще думал создать одно поле с указанием форумов зерез запятую наплевав на всякие "нормальные формы"

Раздачи в других форумах буду помечаться другим цветом с указанием главной категории под ними


Please Login or Register to view hidden text.

друзья и мои правки покажутся вам полезными и легкими 😉
 
Последнее редактирование:

sхс

Легенда
Заметил в разных местах типа viewforum, viewtopic, download код типа:
Код:
unset($forums);
$datastore->rm('cat_forums');

С $forums понятно, но зачем мы постоянно удаляем cat_forums? Если достаточно просто делать update при добавлении нового форума через админку.
 
Последнее редактирование:

belomaxorka

Разработчик
Администратор
Заметил в разных местах типа viewforum, viewtopic, download код типа:
Код:
unset($forums);
$datastore->rm('cat_forums');

С $forums понятно, но зачем мы постоянно удаляем cat_forums? Если достаточно просто делать update при добавлении нового форума через админку.
Да, делать update будет логичнее. Поменяю на update :)
 

sхс

Легенда
Да, делать update будет логичнее. Поменяю на update :)
Вообще удалить эту строку. В lts по крайней мере. Зачем нам очищать/обновлять кэш списка форумов при просмотре общедоступных страниц если список форумов постоянный до того как админ не добавит что-то новое через админку...
 
Последнее редактирование:

sхс

Легенда
2024-09-02_10-45-46.jpg
Не знаю, есть ли сейчас в движке. Но я добавил отправку пользователю уведомления в лс при изменении статуса его релиза

change_tor_status.php
Код:
...
change_tor_status($attach_id, $new_status);

$this->response['status'] = $bb_cfg['tor_icons'][$new_status] .' <b> '. $lang['TOR_STATUS_NAME'][$new_status]. '</b> &middot; '. profile_url($userdata) .' &middot; <i>'. delta_time(TIMENOW) . $lang['BACK']. '</i>';


if($tor['poster_id'] > 0 AND $tor['poster_id']!=$userdata['user_id'] AND !bf(get_userdata ($tor['poster_id'])['user_opt'], 'user_opt', 'rel_status_notice')){
          if(get_userdata($tor['poster_id'])["user_lang"] =='english'){
              include(LANG_ROOT_DIR .'lang_english/lang_main.php');
          }
          else{
              include(LANG_ROOT_DIR .'lang_russian/lang_main.php');
          }

   $subject = sprintf($lang['TOR_MOD_TITLE'], $tor['topic_title']);
   $message = sprintf($lang['TOR_MOD_MSG'], get_username($tor['poster_id']), make_url(TOPIC_URL . $tor['topic_id']), $bb_cfg['tor_icons'][$new_status] .' '.$lang['TOR_STATUS_NAME'][$new_status]);
          if($comment) $message .= "\n\n[b]". $lang['COMMENT'] .'[/b]: '. $comment;

   send_notice($tor['poster_id'], $subject, $message, $userdata['user_id']);
   cache_rm_user_sessions($tor['poster_id']);
}
...

lang
Код:
$lang['TOR_MOD_MSG'] = "Здравствуйте, %s.\n\n Статус [url=%s]Вашей раздачи[/url] был изменен на [b]%s[/b].[br][br] Вы можете отключить эти уведомления в [url=https://".$bb_cfg['domain_name']."/profile.php?mode=editprofile#disable_status_notice]настройках профиля[/url]";

в editprofile добавил radio button 'rel_status_notice'
 
Последнее редактирование:

belomaxorka

Разработчик
Администратор
Посмотреть вложение 6166
Не знаю, есть ли сейчас в движке. Но я добавил отправку пользователю уведомления в лс при изменении статуса его релиза

change_tor_status.php
Код:
...
change_tor_status($attach_id, $new_status);

$this->response['status'] = $bb_cfg['tor_icons'][$new_status] .' <b> '. $lang['TOR_STATUS_NAME'][$new_status]. '</b> &middot; '. profile_url($userdata) .' &middot; <i>'. delta_time(TIMENOW) . $lang['BACK']. '</i>';


if($tor['poster_id'] > 0 AND $tor['poster_id']!=$userdata['user_id'] AND !bf(get_userdata ($tor['poster_id'])['user_opt'], 'user_opt', 'rel_status_notice')){
          if(get_userdata($tor['poster_id'])["user_lang"] =='english'){
              include(LANG_ROOT_DIR .'lang_english/lang_main.php');
          }
          else{
              include(LANG_ROOT_DIR .'lang_russian/lang_main.php');
          }

   $subject = sprintf($lang['TOR_MOD_TITLE'], $tor['topic_title']);
   $message = sprintf($lang['TOR_MOD_MSG'], get_username($tor['poster_id']), make_url(TOPIC_URL . $tor['topic_id']), $bb_cfg['tor_icons'][$new_status] .' '.$lang['TOR_STATUS_NAME'][$new_status]);
          if($comment) $message .= "\n\n[b]". $lang['COMMENT'] .'[/b]: '. $comment;

   send_notice($tor['poster_id'], $subject, $message, $userdata['user_id']);
   cache_rm_user_sessions($tor['poster_id']);
}
...

lang
Код:
$lang['TOR_MOD_MSG'] = "Здравствуйте, %s.\n\n Статус [url=%s]Вашей раздачи[/url] был изменен на [b]%s[/b].[br][br] Вы можете отключить эти уведомления в [url=https://".$bb_cfg['domain_name']."/profile.php?mode=editprofile#disable_status_notice]настройках профиля[/url]";

в editprofile добавил radio button 'rel_status_notice'
Подобное уже есть в движке, не знаю с какой версии, но уже давно.
 

belomaxorka

Разработчик
Администратор
Это будет моя личная тема для пожеланий. Время от времени буду делиться

Первое:
Определять язык пользователя, которому отправляется сообщение/уведомление и подключать языковые переменные удобные ему (например актуально для мода позвать скачавших).
Перед send_pm(), send_notice()
Добавляем (если у вас два языка на сайте)
Код:
if(get_userdata($topic_poster)["user_lang"] =='english'){
            include(LANG_ROOT_DIR .'lang_english/lang_main.php');
        }
        else{
            include(LANG_ROOT_DIR .'lang_russian/lang_main.php');
        }
По тому же принципу я отображаю язык сайта для гостей в зависимости от языка браузера
Очень хорошая идея с подстраиванием под язык пользователя. По поводу языка для гостей в зависимости от языка браузера - уже есть начиная с версии v2.4.1 вроде.
 

sхс

Легенда
Еще одна идея по языкам. Допустим, если на сайт заходят помимо русскоязычных пользователей, немало англоязычных, то им русское оформление раздачи бесполезно (особенно если в релизе файлы исключительно на иностранном языке).

При оформлении раздачи я определяю какой язык раздачи установлен ( по name="msg[lang][]) и тогда подкидываю соответсвующие переменные.

Либо определяю какой язык преобладает в тексте с помощью

Please Login or Register to view hidden text.

 
Сверху