Доработка тем, плагинов, ядра

Тема в разделе "Osclass", создана пользователем _kot, 22 июн 2019.

Метки:
Модераторы: _kot
  1. _kot

    _kot

    Moderator
    Регистр.:
    16 ноя 2018
    Сообщения:
    171
    Симпатии:
    205
    Делимся полезностями для OSCLASS, темы + плагины
    Только код с решением + описание, без вопросов и флуда!

    Например

    Реализация поиска по части слова, а не целиком + поиск объявлений используя юзера по имени
    В файл темы function.php в самом низу добавим код
    Код:
    function search_wildcard_usrname($params) {
    
        if (@$params['sPattern']) {
            $mSearch =  Search::newInstance();
            $query_elements = (array) json_decode($mSearch->toJson());
            $pattern = $query_elements['sPattern'];
            $query_elements['sPattern'] = str_replace(' ', '* ', $pattern) . '*';
            $mSearch->setJsonAlert($query_elements);
    
            // username search
            $aPattern = explode(' ', $pattern);
            $userNameCond = '';
    
            foreach ($aPattern as $word) {
                if ($word) $userNameCond .= sprintf(" || %st_item.s_contact_name LIKE '%s%%'", DB_TABLE_PREFIX, $word);
            }
    
            $mSearch->addConditions("1 = 1 " . $userNameCond);
            $mSearch->addGroupBy(DB_TABLE_PREFIX.'t_item.pk_i_id');
        }
    }
    
    osc_add_hook('search_conditions', 'search_wildcard_usrname', 1); 
    1. Теперь если искомое слово в объявлении ПРИВЕТ search engine будет находить слово ПРИ (ПРИвет, ПРИтирка и т.д.)
    2. Можно найти все объявления юзера в котором содержится username ЕЛЕНА
     
    Последнее редактирование: 5 сен 2020
    imbo, service240, djodofin и ещё 1-му нравится это.
  2. _kot

    _kot

    Moderator
    Регистр.:
    16 ноя 2018
    Сообщения:
    171
    Симпатии:
    205
    Plugin User Rating Plugin 1.1.1 (mb-themes)
    в админке:
    1. добавим последний IP юзера
    2. e-mail кому конкретно была дана оценка
    3. линк на е-mail - a вдруг это злостный продавец и обманщик ? ) (сразу в бан)

    до
    Screenshot 2019-06-22 at 14.32.51.png
    после
    Screenshot 2019-06-22 at 15.52.37.png

    1. user_rating/style/admin.css //уменьшим размер столбца, что бы оставить место для столбика e-mail
    найдем
    Код:
    .mb-col-8 {width:33.33333%}
    Код:
    .mb-col-8 {width:16.66665%}

    2. user_rating/admin/rating.php
    меняем на
    rating.php
    Код:
    <?php
      // Create menu
      $title = __('Ratings', 'user_rating');
      ur_menu($title);
    
      $validate = osc_get_preference('validate', 'plugin-user_rating');
    
    
      // VALIDATE LISTINGS
      if( Params::getParam('plugin_action') == 'validate' ) {
    
        // APPROVE SINGLE
        $params_array = Params::getParamsAsArray();
    
        $approved = '';
        foreach($params_array as $key => $value){
          $exp_key = explode('_', $key);
          if($exp_key[0] == 'approve-single'){
            // ID of prompted rating stored in $value
            $approved .= $exp_key[1] . ', ';
            message_ok( __('Rating(s) with following IDs were approved:', 'user_rating') . ' ' .  substr($approved, 0, strlen($approved)-2));
    
            ModelUR::newInstance()->validateRatingById( $exp_key[1] );
          }
        }
    
    
    
        // REMOVE SINGLE
        $params_array = Params::getParamsAsArray();
    
        $removed = '';
        foreach($params_array as $key => $value){
          $exp_key = explode('_', $key);
          if($exp_key[0] == 'remove-single'){
            // ID of prompted rating stored in $value
            $removed .= $exp_key[1] . ', ';
            message_ok( __('Rating(s) with following IDs were removed:', 'user_rating') . ' ' .  substr($removed, 0, strlen($removed)-2));
    
            ModelUR::newInstance()->removeRatingById( $exp_key[1] );
          }
        }
    
    
    
        // APPROVE SELECTED
        if( Params::getParam('item_action') == __('Approve Selected', 'user_rating') ) {
          $params_array = Params::getParamsAsArray();
    
          if( is_array($params_array) && !empty($params_array) ) {
            $approved = '';
            foreach($params_array as $key => $value){
              $exp_key = explode('_', $key);
              if($exp_key[0] == 'valid'){
                // ID of prompted ratings stored in $value
                $approved .= $value . ', ';
    
                ModelUR::newInstance()->validateRatingById( $exp_key[1] );
    
              }
            }
          }
    
          message_ok( __('Rating(s) with following IDs were approved:', 'user_rating') . ' ' .  substr($approved, 0, strlen($approved)-2));
        }
    
    
    
        // REMOVE SELECTED
        if( Params::getParam('item_action') == __('Remove Selected', 'user_rating') ) {
          $params_array = Params::getParamsAsArray();
    
          if( is_array($params_array) && !empty($params_array) ) {
            $removed = '';
            foreach($params_array as $key => $value){
              $exp_key = explode('_', $key);
              if($exp_key[0] == 'valid'){
                // ID of prompted ratings stored in $value
                $removed .= $value . ', ';
    
                ModelUR::newInstance()->removeRatingById( $exp_key[1] );
              }
            }
          }
    
          message_ok( __('Rating(s) with following IDs were removed:', 'user_rating') . ' ' .  substr($removed, 0, strlen($removed)-2));
        }
      }
    ?>
    
    
    
    <div class="mb-body">
    
      <!-- TO BE VALIDATED SECTION -->
      <?php if($validate == 1) { ?>
        <div class="mb-box">
          <div class="mb-head"><i class="fa fa-stack-overflow"></i> <?php _e('Ratings to be Validated', 'user_rating'); ?></div>
    
          <div class="mb-inside">
            <form name="promo_form" id="promo_form" action="<?php echo osc_admin_base_url(true); ?>" method="POST" enctype="multipart/form-data" >
              <input type="hidden" name="page" value="plugins" />
              <input type="hidden" name="action" value="renderplugin" />
              <input type="hidden" name="file" value="<?php echo osc_plugin_folder(__FILE__); ?>rating.php" />
              <input type="hidden" name="plugin_action" value="validate" />
    
    
              <?php $ratings = ModelUR::newInstance()->getAllRatings(2, 100); ?>
    
    
              <?php if(count($ratings) > 0) { ?>
                <div class="mb-info-box" style="margin-top:20px;margin-bottom:25px;">
                  <div class="mb-line"><?php _e('Only latest 100 ratings are shown!', 'user_rating'); ?></div>
                </div>
    
                <div class="mb-table" style="margin-bottom:30px;">
                  <div class="mb-table-head">
                    <div class="mb-col-1"><input type="checkbox" class="mb_mark_all" name="mb_mark_all" id="mb_mark_all" value="valid_" /></div>
                    <div class="mb-col-1"><?php _e('ID', 'user_rating'); ?></div>
                    <div class="mb-col-3"><?php _e('Rating', 'user_rating'); ?></div>
                    <div class="mb-col-2"><?php _e('User', 'user_rating'); ?></div>
                    <div class="mb-col-3"><?php _e('Type', 'user_rating'); ?></div>
                    <div class="mb-col-8 mb-align-left"><?php _e('Comment', 'user_rating'); ?></div>
                    <div class="mb-col-2"><?php _e('Status', 'user_rating'); ?></div>
                    <div class="mb-col-4 mb-align-left">&nbsp;</div>
                  </div>
    
    
                  <?php foreach( $ratings as $r ) { ?>
                    <?php
                      if($r['fk_i_user_id'] <> 0 && $r['fk_i_user_id'] <> '') {
    
                        $user = User::newInstance()->findByPrimaryKey($r['fk_i_user_id']);
                        $user_name = $user['s_name'] . ' (' . $user['s_email'] . ')';
                        $user_type = __('Registered', 'user_rating');
                      } else {
                        $user_name = $r['s_user_email'];
                        $user_type = __('Unregistered', 'user_rating');
                      }
    
                      if($r['fk_i_from_user_id'] <> 0 && $r['fk_i_from_user_id'] <> '') {
                        $from_user = User::newInstance()->findByPrimaryKey($r['fk_i_from_user_id']);
                        $from_user_name = $from_user['s_name'] . ' (' . $from_user['s_email'] . ')';
                        $from_user_type = __('Registered', 'user_rating');
                      } else {
                        $from_user_name = __('Unknown', 'user_rating');
                        $from_user_type = __('Unregistered', 'user_rating');
                      }
    
                      $user_title = __('Rated user', 'user_rating') . '<br />';
                      $user_title .= __('Name', 'user_rating') . ': ' . $user_name . '<br />';
                      $user_title .= __('Type', 'user_rating') . ': ' . $user_type . '<br /><br />';
                      $user_title .= __('Rating left by', 'user_rating') . '<br />';
                      $user_title .= __('Name', 'user_rating') . ': ' . $from_user_name . '<br />';
                      $user_title .= __('Type', 'user_rating') . ': ' . $from_user_type . '<br /><br />';
                      $user_title .= __('Date', 'user_rating') . ': ' . $r['d_datetime'];
    
                      $status = $r['i_validate'];
                      $status_name = '';
                      $status_class = '';
    
                      if($status == 0) {
                        $status_name = __('Pending', 'user_rating');
                        $status_class = 'mb-blue';
                      } else if ($status == 1) {
                        $status_name = __('Valid', 'user_rating');
                        $status_class = 'mb-green';
                      }
    
                      $empty = '<span class="mb-i mb-gray">' . __('No comment', 'user_rating') . '</span>';
    
                      $avg = ModelUR::newInstance()->getRatingAverageByRatingId($r['i_rating_id']);
                      $color = ur_user_color($avg);
                    ?>
    
                    <div class="mb-table-row">
                      <div class="mb-col-1 <?php echo osc_esc_html($status_class); ?>" title="<?php echo osc_esc_html($status_name); ?>"><input type="checkbox" name="valid_<?php echo $r['i_rating_id']; ?>" id="valid_<?php echo $r['i_rating_id']; ?>" value="<?php echo $r['i_rating_id']; ?>" /></div>
                      <div class="mb-col-1"><?php echo $r['i_rating_id']; ?></div>
                      <div class="mb-col-3 mb-stars <?php echo $color; ?>"><?php echo ur_get_stars($avg); ?></div>
                      <div class="mb-col-2 mb-has-tooltip-user" title="<?php echo osc_esc_html($user_title); ?>"><i class="fa fa-user from"></i> <i class="fa fa-long-arrow-right"></i> <i class="fa fa-user to"></i></div>
                      <div class="mb-col-3"><?php echo $r['i_type'] == 0 ? __('Buyer rated Seller', 'user_rating') : __('Seller rated Buyer', 'user_rating'); ?></div>
                      <div class="mb-col-8 mb-align-left mb-no-wrap" title="<?php echo osc_esc_html($r['s_comment']); ?>"><?php echo trim($r['s_comment']) <> '' ? $r['s_comment'] : $empty; ?></div>
                      <div class="mb-col-2"><?php echo $status_name; ?></div>
                      <div class="mb-col-4 mb-align-left">
                        <input type="submit" name="approve-single_<?php echo $r['i_rating_id']; ?>" class="mb-button-green" style="float:left;margin: -3px 0; height: 27px; line-height: 13px;" value="<?php echo osc_esc_html(__('Approve', 'user_rating')); ?>"/>
                        <input type="submit" name="remove-single_<?php echo $r['i_rating_id']; ?>" class="mb-button-red" style="float:left;margin: -3px 0 -3px 6px; height: 27px; line-height: 13px;" value="<?php echo osc_esc_html(__('Remove', 'user_rating')); ?>" onclick="return confirm('<?php echo osc_esc_js(__('Are you sure you want to remove this rating? Action cannot be undone', 'user_rating')); ?>?')" />
                      </div>
                    </div>
                  <?php } ?>
                </div>
    
                <div class="mb-foot">
                  <input type="submit" name="item_action" class="mb-button-white" style="float:left;margin-right:10px;" value="<?php echo osc_esc_html(__('Approve Selected', 'user_rating')); ?>" />
                  <input type="submit" name="item_action" class="mb-button-white" style="float:left" value="<?php echo osc_esc_html(__('Remove Selected', 'user_rating')); ?>" onclick="return confirm('<?php echo osc_esc_js(__('Are you sure you want to remove selected ratings? Action cannot be undone', 'user_rating')); ?>?')" />
                </div>
    
              <?php } else { ?>
                <div class="mb-info-box" style="margin-top:20px;margin-bottom:25px;">
                  <div class="mb-line"><?php _e('No ratings waiting for validation', 'user_rating'); ?></div>
                </div>
              <?php } ?>
            </div>
          </form>
        </div>
      <?php } ?>
    
    
    
      <!-- VALIDATED SECTION -->
      <div class="mb-box">
        <div class="mb-head"><i class="fa fa-check-circle"></i> <?php _e('Validated Ratings', 'user_rating'); ?></div>
    
        <div class="mb-inside">
          <form name="promo_form" id="promo_form" action="<?php echo osc_admin_base_url(true); ?>" method="POST" enctype="multipart/form-data" >
            <input type="hidden" name="page" value="plugins" />
            <input type="hidden" name="action" value="renderplugin" />
            <input type="hidden" name="file" value="<?php echo osc_plugin_folder(__FILE__); ?>rating.php" />
            <input type="hidden" name="plugin_action" value="validate" />
    
    
            <?php $ratings = ModelUR::newInstance()->getAllRatings($validate, 100); ?>
    
    
            <?php if(count($ratings) > 0) { ?>
              <div class="mb-info-box" style="margin-top:20px;margin-bottom:25px;">
                <div class="mb-line"><?php _e('Only latest 100 ratings are shown!', 'user_rating'); ?></div>
              </div>
    
              <div class="mb-table" style="margin-bottom:30px;">
                <div class="mb-table-head">
                  <div class="mb-col-1"><input type="checkbox" class="mb_mark_all" name="mb_mark_all" id="mb_mark_all" value="valid_" /></div>
                  <div class="mb-col-1"><?php _e('ID', 'user_rating'); ?></div>
                  <div class="mb-col-3"><?php _e('Rating', 'user_rating'); ?></div>
                  <div class="mb-col-2"><?php _e('User', 'user_rating'); ?></div>
                  <div class="mb-col-3"><?php _e('Type', 'user_rating'); ?></div>
                  <div class="mb-col-8 mb-align-left"><?php _e('Comment', 'user_rating'); ?></div>
                  <!--mod sz add e-mail title -->
                  <div class="mb-col-8 mb-align-left"><?php _e('e-mail', 'user_rating'); ?></div>
                  <!--mod sz add e-mail title -->
                  <div class="mb-col-2"><?php _e('Status', 'user_rating'); ?></div>
                  <div class="mb-col-4 mb-align-left">&nbsp;</div>
                </div>
    
    
                <?php foreach( $ratings as $r ) { ?>
                  <?php
            
          
                    if($r['fk_i_user_id'] <> 0 && $r['fk_i_user_id'] <> '') {
                      $user = User::newInstance()->findByPrimaryKey($r['fk_i_user_id']);
                  
                  
                      $user_name = $user['s_name'] . ' (' . $user['s_email'] . ')';
                      $user_type = __('Registered', 'user_rating');
                    } else {
                      $user_name = $r['s_user_email'];
                      $user_type = __('Unregistered', 'user_rating');
                    }
    
                    if($r['fk_i_from_user_id'] <> 0 && $r['fk_i_from_user_id'] <> '') {
                      $from_user = User::newInstance()->findByPrimaryKey($r['fk_i_from_user_id']);
                      $from_user_name = $user['s_name'] . ' (' . $user['s_email'] . ')';
                      $from_user_type = __('Registered', 'user_rating');
                    } else {
                      $from_user_name = __('Unknown', 'user_rating');
                      $from_user_type = __('Unregistered', 'user_rating');
                    }
    
                    $user_title = __('Rated user', 'user_rating') . '<br />';
                    $user_title .= __('Name', 'user_rating') . ': ' . $user_name . '<br />';
                    $user_title .= __('Type', 'user_rating') . ': ' . $user_type . '<br /><br />';
                    $user_title .= __('Rating left by', 'user_rating') . '<br />';
                    $user_title .= __('Name', 'user_rating') . ': ' . $from_user_name . '<br />';
                    $user_title .= __('Type', 'user_rating') . ': ' . $from_user_type . '<br /><br />';
                    $user_title .= __('Date', 'user_rating') . ': ' . $r['d_datetime'];
    
    
                    $status = $r['i_validate'];
                    $status_name = '';
                    $status_class = '';
    
                    if($status == 0) {
                      if($validate == 1) {
                        $status_name = __('Pending', 'user_rating');
                        $status_class = 'mb-blue';
                      } else {
                        $status_name = __('Valid', 'user_rating');
                        $status_class = 'mb-green';
                      }
                    } else if ($status == 1) {
                      $status_name = __('Valid', 'user_rating');
                      $status_class = 'mb-green';
                    }
    
                    $empty = '<span class="mb-i mb-gray">' . __('No comment', 'user_rating') . '</span>';
    
                    $avg = ModelUR::newInstance()->getRatingAverageByRatingId($r['i_rating_id']);
                    $color = ur_user_color($avg);
                  ?>
    
                  <div class="mb-table-row">
                    <div class="mb-col-1 <?php echo osc_esc_html($status_class); ?>" title="<?php echo osc_esc_html($status_name); ?>"><input type="checkbox" name="valid_<?php echo $r['i_rating_id']; ?>" id="valid_<?php echo $r['i_rating_id']; ?>" value="<?php echo $r['i_rating_id']; ?>" /></div>
    
                    <div class="mb-col-1"><?php echo $r['i_rating_id']; ?></div>
                    <div class="mb-col-3 mb-stars <?php echo $color; ?>"><?php echo ur_get_stars($avg); ?></div>
                    <div class="mb-col-2 mb-has-tooltip-user" title="<?php echo $user_title; ?>"><i class="fa fa-user from"></i> <i class="fa fa-long-arrow-right"></i> <i class="fa fa-user to"></i>
                      <!--mod sz add IP -->
                    <div><?php echo $user['s_access_ip']; ?></div>
                      <!--mod sz add IP -->
                    </div>
                    <div class="mb-col-3"><?php echo $r['i_type'] == 0 ? __('Buyer rated Seller', 'user_rating') : __('Seller rated Buyer', 'user_rating'); ?></div>
                    <div class="mb-col-8 mb-align-left mb-no-wrap" title="<?php echo $r['s_comment']; ?>""><?php echo trim($r['s_comment']) <> '' ? $r['s_comment'] : $empty; ?></div>
                   <!--mod sz add column with mail -->
                   <div class="mb-col-8 mb-align-left mb-no-wrap">
                    <a href="<?php echo osc_admin_base_url(true); ?>?page=users&action=edit&id=<?php echo $r['fk_i_user_id']; ?>"> <?php echo $user['s_email'] ?></a></div>
                   <!--mod sz add column with mail -->
    
                    <div class="mb-col-2"><?php echo $status_name; ?></div>
                    <div class="mb-col-4 mb-align-left">
                      <input type="submit" name="remove-single_<?php echo $r['i_rating_id']; ?>" class="mb-button-red" style="float:left;margin: -3px 0; height: 27px; line-height: 13px;" value="<?php echo osc_esc_html(__('Remove', 'user_rating')); ?>" onclick="return confirm('<?php echo osc_esc_js(__('Are you sure you want to remove this rating? Action cannot be undone', 'user_rating')); ?>?')" />
                    </div>
                  </div>
                <?php } ?>
              </div>
    
              <div class="mb-foot">
                <input type="submit" name="item_action" class="mb-button-white" style="float:left" value="<?php echo osc_esc_html(__('Remove Selected', 'user_rating')); ?>" onclick="return confirm('<?php echo osc_esc_js(__('Are you sure you want to remove selected ratings? Action cannot be undone', 'user_rating')); ?>?')" />
              </div>
    
            <?php } else { ?>
              <div class="mb-info-box" style="margin-top:20px;margin-bottom:25px;">
                <div class="mb-line"><?php _e('No validated ratings yet', 'user_rating'); ?></div>
              </div>
            <?php } ?>
          </div>
        </form>
      </div>
    </div>
    
    <?php echo ur_footer(); ?>
    все изменения помечены
    Код:
      <!--mod sz ... -->
     
    Последнее редактирование: 22 июн 2019
    ilussion, jack0005 и HunterWT нравится это.
  3. djodofin

    djodofin

    Регистр.:
    6 июл 2017
    Сообщения:
    302
    Симпатии:
    123
    osclass Не работает мультиязычный поиск!

    Я уже выкладывал это где-то на форуме. Но на всякий кину в этой ветке так как это по теме!

    В теме veronika Не работает мультиязычный поиск, зависит от самой темы.

    Суть.

    Сайт мультиязычный (русский и английский)

    1.
    Если при добавлении объявления заполнить на русском (к примеру "Двери") а английский не заполнять то в фронтенде на сайте при английской локализации выполняя поисковой запрос "Двери" будет со значением "0".

    2.
    Если при добавлении объявления заполнить на русском и на английском (к примеру на русском "Двери" а на английском "Doors") то в фронтенде на сайте при английской локализации выполняя поисковой запрос "Двери" будет со значением "0".

    Что есть не очень хорошо!!!

    Делаем чтобы если при добавлении объявления заполнить на русском (к примеру "Двери") а английский не заполнять, или русском и на английском (к примеру на русском "Двери" а на английском "Doors") то в фронтенде на сайте при английской локализации выполняя поисковой запрос "Двери" будет со значением на русском "Двери" а на английском "Doors".

    Тоисть независимо от выбранной локализации сайта объявление будет найдено пользователем.

    Решение:

    По пути oc-content/themes/ВАША-ТЕМА/functions.php

    в самый конец после "?>" добавляем ниже выложеный код. В конце Не должно быть пустых строк!
    Код:
    <?php
    function cust_refined_pattern_search($params) {
        if (@$params['sPattern'] != '') {
            $mSearch = Search::newInstance();
            $query_elements = (array) json_decode($mSearch->toJson());
           
            $mSearch->addLocale('%');
            $mSearch->addGroupBy(DB_TABLE_PREFIX.'t_item.pk_i_id');
            if (@$params['sOrder'] != 'i_price') {
                $mSearch->addJoinTable(count($query_elements['tables_join']), sprintf("(SELECT fk_i_item_id, MATCH(s_title, s_description) AGAINST('%s') AS relevance FROM %st_item_description) des", $params['sPattern'], DB_TABLE_PREFIX), 'des.fk_i_item_id = '.DB_TABLE_PREFIX.'t_item.pk_i_id', 'INNER' );
                $mSearch->order("des.relevance DESC, dt_pub_date", "DESC");
            }       
        }
    }
    
    osc_add_hook('search_conditions', 'cust_refined_pattern_search');
    
    function cust_alerts_user_dashboard() {
        if (Params::getParam('page') == "user" && Params::getParam('action') == "alerts") {
            $webUser = new CWebUser;
    
            $aAlerts = Alerts::newInstance()->findByUser( Session::newInstance()->_get('userId'), false );
            $user = User::newInstance()->findByPrimaryKey( Session::newInstance()->_get('userId'));
            foreach($aAlerts as $k => $a) {
                $array_conditions   = (array)json_decode($a['s_search']);
    
                $search = new Search();
                $search->setJsonAlert($array_conditions);
                if (osc_version() > 361) $search->notFromUser(Session::newInstance()->_get('userId'));
                $search->addLocale('%');
                $search->addGroupBy(DB_TABLE_PREFIX.'t_item.pk_i_id');
                $search->limit(0, 3);
    
                $aAlerts[$k]['items'] = $search->doSearch();
            }
    
            $webUser->_exportVariableToView('alerts', $aAlerts);
            View::newInstance()->_reset('alerts');
            $webUser->_exportVariableToView('user', $user);
        }
    }
    
    osc_add_hook('before_html', 'cust_alerts_user_dashboard');
    ?>
     
    Последнее редактирование: 22 июн 2019
    HunterWT и _kot нравится это.
  4. _kot

    _kot

    Moderator
    Регистр.:
    16 ноя 2018
    Сообщения:
    171
    Симпатии:
    205
    Проявился еще один плагин, который помогает реализовать турбо страницы у яндекса.:)
    Для чего нужны турбо страницы, объяснять не стоит.
    Индексация каждый час, с удивительным выводом в поисковике.:cool:
    Хотелось бы увидеть что-то подобное у гугла

    https://osc4u.com/plugins/seo/rss-for-yandex-turbo-pages_i178

    Проверено яндексом.
    https://yandex.ru/dev/turbo/#plagins

    Ну и сама ссылка в поиске яндекс, и как oн отдает в поисковике.
     
    Последнее редактирование: 13 май 2020
    leha128, Anastasiya96, service240 и ещё 1-му нравится это.
  5. _kot

    _kot

    Moderator
    Регистр.:
    16 ноя 2018
    Сообщения:
    171
    Симпатии:
    205
    Реализация push notification для вашего андроида
    используем гугля конечно, доки тут :
    https://firebase.google.com/docs/cloud-messaging/

    PHP функция
    Код:
    function sz_push_notification(){
    
        $token = ''; // Topic or Token devices here
        $serverKey = ''; // add api key here
    
    
        $url = "https://fcm.googleapis.com/fcm/send";
        //item details
        $item_title = osc_highlight(strip_tags(osc_item_title()), 50);
        $item_description = osc_highlight(strip_tags(osc_item_description()), 100);
        if(osc_count_item_resources() > 0) {
            $image = osc_resource_thumbnail_url();
        } else {
            $image = osc_current_web_theme_url('images/mob_logo.png');
        }
    
        $notification = array('title' => $item_title , 'body' => $item_description, 'sound' => 'default', 'badge' => '1', 'image' =>$image);
        $itemUrl = array('extra_information'=>osc_item_url());
        $arrayToSend = array('to' => $token,'data'=>$itemUrl, 'notification' => $notification, 'priority'=>'high');
        $json = json_encode($arrayToSend);
        $headers = array();
        $headers[] = 'Content-Type: application/json';
        $headers[] = 'Authorization: key='. $serverKey;
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST,"POST");
        curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
        curl_setopt($ch, CURLOPT_HTTPHEADER,$headers);
    
        //Send the request
        $response = curl_exec($ch);
        //Close request
        if ($response === FALSE) {
            die('FCM Send Error: ' . curl_error($ch));
        }
        curl_close($ch);
    }
    osc_add_hook("posted_item","sz_push_notification");
    Class для Андройда
    Код:
    public class FcmMessagingService extends FirebaseMessagingService {
    
        String type = "", remoteURLpassedJson;
        SharedPreferences sharedpreferences;
        public static final String NOTIFICATION_CHANNEL_ID = "10001";
    
    
        @Override
        public void onMessageReceived(RemoteMessage remoteMessage) {
    
            //Topic string from curl request (/topics/news)
            Map<String, String> data = remoteMessage.getData();
            //pass URL from json - extra_information
            remoteURLpassedJson = data.get("extra_information");
            Log.d(TAG, "jsonURLremoteMesg: " + remoteURLpassedJson);
     
            if (remoteMessage.getData().size() > 0) {
                type = "json";
                sendNotification(remoteMessage.getData().toString());
                Log.d(TAG, "FromSZ: " + remoteMessage.getData());
    
            }
            if (remoteMessage.getNotification() !=null) {
                type = "message";
                sendNotification(remoteMessage.getNotification().getBody());
                Log.d("getData", "onMessageReceived: " +  remoteMessage.getData());
            }
        }
        private void sendNotification(String messageBody){
    
            String id="",message="",title="";
    
            if(type.equals("json")) {
                try {
                    JSONObject jsonObject = new JSONObject(messageBody);
                    id = jsonObject.getString("id");
                    Log.d("id", "message " + id.toString());
                    message = jsonObject.getString("message");
                    Log.d("message", "message " + message.toString());
                    title = jsonObject.getString("title");
    
                } catch (JSONException e) {
                    //            }
                }
            }
            else if(type.equals("message"))
            {
                message = messageBody;
    
            }
    
            Intent intent=new Intent(this,MainActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            intent.putExtra("message", message);// Add more data as per need
            //pass message via broadcast
            Intent intent2 = new Intent("com.push.message.received");
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            intent2.putExtra("remoteURLpassedJson", remoteURLpassedJson);// Add more data as per need passed DATA URL
            sendBroadcast(intent2);
            sharedpreferences = getApplicationContext().getSharedPreferences("mypref", 0); // 0 - for private mode
            SharedPreferences.Editor editor = sharedpreferences.edit();
            editor.clear();
            editor.putString("mypref", message);
            editor.commit();
    
            PendingIntent pendingIntent=PendingIntent.getActivity(this,0,intent,PendingIntent.FLAG_ONE_SHOT);
            NotificationCompat.Builder notificationBuilder=new NotificationCompat.Builder(this);
            notificationBuilder.setContentTitle(getString(R.string.app_name));
            notificationBuilder.setContentText(message);
            Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
            notificationBuilder.setSound(soundUri);
            notificationBuilder.setSmallIcon(R.mipmap.ic_launcher);
            notificationBuilder.setLargeIcon(BitmapFactory.decodeResource(this.getResources(),R.mipmap.ic_launcher));
            notificationBuilder.setAutoCancel(true);
            Vibrator v = (Vibrator) this.getSystemService(Context.VIBRATOR_SERVICE);
            v.vibrate(1000);
            notificationBuilder.setContentIntent(pendingIntent);
            NotificationManager notificationManager=(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    
            Log.d("Hi", "Passed data " );
            Log.d("getData", "onMessageReceived: " );
    
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O)
            {
                int importance = NotificationManager.IMPORTANCE_HIGH;
                NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "NOTIFICATION_CHANNEL_NAME", importance);
    
                notificationBuilder.setChannelId(NOTIFICATION_CHANNEL_ID);
                notificationManager.createNotificationChannel(notificationChannel);
            }
    
    
            Log.d("biuld", "build" );
           notificationManager.notify(0,notificationBuilder.build());
        }
    
    
    }

     
    Последнее редактирование: 30 май 2020
    Anastasiya96 нравится это.
  6. LevikV

    LevikV Создатель

    Регистр.:
    8 июн 2017
    Сообщения:
    15
    Симпатии:
    15
    Отображение аватарок из плагина Profile Picture в переписке плагина сообщений Ultimate Messaging

    Чтобы в сообщениях отображались картинки (аватарки) профиля, загруженные плагином Profile Picture, который идет в комплекте с темой Veronika, необходимо в файле /oc-content/plugins/uMessages/user/messages-view.php найти код (у меня это 58 строка)
    Код:
    <a href="<?php echo osc_user_public_profile_url($message['fk_i_user_id']); ?>" title=""><img src="<?php echo osc_base_url() . 'oc-content/plugins/uMessages/assets/images/user_default.gif'; ?>" alt="<?php echo osc_esc_html($message['s_name']); ?>"></a>
    и заменить на следующий код:
    Код:
    <a class="picture tr1" href="<?php echo osc_user_public_profile_url($message['fk_i_user_id']); ?>"><?php profile_picture_show(null, null, 40, null, $message['fk_i_user_id']); ?></a>
     
    leha128 нравится это.
  7. _kot

    _kot

    Moderator
    Регистр.:
    16 ноя 2018
    Сообщения:
    171
    Симпатии:
    205
    Автозаполнение категории
    Допустим, юзер что-то ищет в определенной категории, или зашел в объявление и решил подать новое объявление, давайте поможем ему автозаполнить категорию в которой он находится:eek::)

    1. добавим код в function.php вашей темы
    Код:
    function sz_item_post_url_in_category() {
    
        $search_cat_id = osc_search_category_id();
        $search_cat_id = isset($search_cat_id[0]) ? $search_cat_id[0] : 0;
        $search_cat_parent = Category::newInstance()->findByPrimaryKey($search_cat_id);
        $search_cat_parent =   $search_cat_parent['fk_i_parent_id'];
        //check if user can post to parent category
        osc_selectable_parent_categories() ? $allow_cat_parent = true :  $allow_cat_parent  = false;
    
        if ($search_cat_id && $search_cat_parent  || osc_is_ad_page()  || $allow_cat_parent) {
    
            if ( osc_rewrite_enabled() ) {
                osc_is_ad_page()   ?   $path = osc_base_url() . osc_get_preference('rewrite_item_new') . '/' . osc_item_category_id()
                                :   $path = osc_base_url() . osc_get_preference('rewrite_item_new') . '/' . osc_search_category_id()[0];
            } else {
                osc_is_ad_page()   ?   $path = sprintf(osc_base_url(true) . '?page=item&action=item_add&catId=%d', osc_item_category_id())
                                :   $path = sprintf(osc_base_url(true) . '?page=item&action=item_add&catId=%d', osc_search_category_id()[0]);
            }
        } else {
                //default osc post url
                $path = osc_item_post_url();
    
        }
        return $path;
    }

    2. меняем функцию для кнопки подачи объявления osc_item_post_url(); на sz_item_post_url_in_category();

    если включен live search с использованием ajax, то придется дописать еще JS, в зависимости от темы :wtf:, но принцип ясен:)
     
    Последнее редактирование: 28 июн 2020
    leha128, Vlad444 и gorsgr нравится это.
  8. _kot

    _kot

    Moderator
    Регистр.:
    16 ноя 2018
    Сообщения:
    171
    Симпатии:
    205
    whatsapp.png Screenshot 2020-08-02 at 22.17.02.png Screenshot 2020-08-02 at 22.19.09.png
    WhatsApp Chat кнопка на странице объявления:

    1. Для реализации понадобится 2 файла, библиотеки, загруженные в тему
    ../yourTheme/css/floating-wpp.min.css
    ../yourTheme/js/floating-wpp.js

    2. Подключим библиотеку через head.php вашей темы
    Код:
        <!--mod sz whatsApp library-->
    <?php if (osc_is_ad_page()) { ?>
        <link rel="stylesheet" href="<?php echo osc_current_web_theme_url('css/floating-wpp.min.css'); ?>">
        <?php
        osc_register_script('sz_whatsApp', osc_current_web_theme_js_url('floating-wpp.min.js'));
        osc_enqueue_script('sz_whatsApp');
    } ?>

    3. В item.php закинем кнопочку (любое место)
    Код:
    <div id="kot_whatsAppBtn"></div>
    4. В item.php в самом низу инициализируем и вызовем функцию JS (все доступные свойства библиотеки указанные в комментарии)
    <script>
    $(document).ready(function(){
    $(function() {
    $('#kot_whatsAppBtn').floatingWhatsApp({
    phone: sz_whatsAppPhone,
    size:"50px",
    headerTitle:'<?php osc_esc_js(_e('Write to author via WhatsApp', 'violet')); ?>',
    popupMessage: '<?php osc_esc_js(_e('Please inform the author that classified has been found on osc4u.com', 'violet')); ?>',
    showPopup: true,
    zIndex: 777,
    position: "right"
    //available pre-set js properties
    //size: "72px", backgroundColor: "#25D366", position: "left", popupMessage: "", showPopup: !1, showOnIE: !0, autoOpenTimeout: 0, headerColor: "#128C7E", headerTitle: "WhatsApp Chat", zIndex: 0,
    });
    });

    });

    </script>
    5. Обратим на вышеуказанную строчку и переменную sz_whatsAppPhone в JS коде
    Код:
    phone: sz_whatsAppPhone,
    тут вам надо присвоить телефон из объявления через PHP, как пример это можно объявить в item.php
    Код:
    <script>
    let sz_whatsAppPhone = '<?php echo osc_esc_js(ITEM_PHONE_HERE); ?>';
    </script>

    6. Наслаждаемся :eek::)
     

    Вложения:

    leha128 нравится это.