OsClass — как поднять объявление вверх из личного кабинета?

Недавно пришлось заново сделать кнопку в OsClass «поднять объявление». Долго искал запись о том, как это делается на форуме, и чтоб не потерять выложу более подробно у себя в блоге.

Спасибо пользователю drakon с форума os-class, который выложил данный код («с буржуйского форума»). Пример кнопки «Поднять объявление» вы можете наблюдать на сайте http://board.ppstore.me

112342

1) Перед тем, как исправлять файлы конфигурации делайте резервные копии!!!

2) Находим файл oc-includes/osclass/ItemActions.php

Открываем его для исправления и находим строки

}
 return $spam;
 }

После них вставляем наш код — это приблизительно строка 56

 

/**
*UP ad
*/
 public function renew( $id, $secret = NULL )
 {
 $aWhere = array();
 if( $secret == NULL ) {
 $item[0] = $this->manager->findByPrimaryKey( $id );
 $aWhere = array('pk_i_id' => $id);
 } else {
 $item = $this->manager->listWhere("i.s_secret = '%s' AND i.pk_i_id = '%s' ", $secret, $id);
 $aWhere = array('s_secret' => $secret, 'pk_i_id' => $id);
 }
 if( count($item) == 0 ) {
 return false;
 }
 if($item[0]['b_enabled']==0 || $item[0]['b_active']==0 || $item[0]['b_spam']!=0) {
 return false;
 }
 osc_run_hook('pre_item_renew', $item[0]);
 $_category = Category::newInstance()->findByPrimaryKey($item[0]['fk_i_category_id']);
 $expdate = date('Y-m-d H:i:s', time() + 86400*$_category['i_expiration_days']);
 
 
 
 
 $result = $this->manager->update(
 array('dt_pub_date' => date('Y-m-d H:i:s'), 'dt_expiration' => $expdate),
 $aWhere
 );
 
 
 
 
 // updated correctly
 if($result == 1) {
 $_locale = reset($item[0]['locale']);
 $locale_code = $_locale['fk_c_locale_code'];
 $this->manager->updateLocaleForce($item[0]['pk_i_id'] , $locale_code,
 $item[0]['s_title'], $item[0]['s_description']);
 osc_run_hook('item_renewed', $item[0]);
 if (osc_isExpired($item[0]['dt_expiration'])) {
 if($item[0]['fk_i_user_id']!=null) {
 User::newInstance()->increaseNumItems($item[0]['fk_i_user_id']);
 }
 CategoryStats::newInstance()->increaseNumItems($item[0]['fk_i_category_id']);
 CountryStats::newInstance()->increaseNumItems($item[0]['fk_c_country_code']);
 RegionStats::newInstance()->increaseNumItems($item[0]['fk_i_region_id']);
 CityStats::newInstance()->increaseNumItems($item[0]['fk_i_city_id']);
 } 
 return true;
 }
 }

3) Находим файл oc-includes/osclass/controller/item.php

Открываем его для редактирования и находим строки

$this->_exportVariableToView('user', $this->user);
osc_run_hook('post_item');
$this->doView('item-post.php');
break;

После них и будем вставлять наш код — приблизительно 97, 98 строка

case 'item_renew':
 $secret = Params::getParam('secret');
 $id = Params::getParam('id');
 if (osc_is_admin_user_logged_in()) {
 $item = $this->itemManager->listWhere("i.pk_i_id = '%s'", addslashes($id));
 if( count($item) == 0 ) {
 $this->do404();
 return;
 }
 } else { 
 $item = $this->itemManager->listWhere("i.pk_i_id = '%s' AND ((i.s_secret = '%s')
 OR (i.fk_i_user_id = '%d'))",
 addslashes($id), addslashes($secret), addslashes($this->userId));
 
 
 
 
 // item doesn't exist
 if( count($item) == 0 ) {
 $this->do404();
 return;
 }
 $datenow = new DateTime('NOW');
 $itemdate = new DateTime(substr($item[0]['dt_pub_date'],0,10));
 $ddate = date_diff($itemdate,$datenow)->days; 
 
 
 
 
 // TODO: SET PREF. NUMBER OF DAYS BEFORE ITEM CAN BE RENEWED.
 //wait 2 days before item can be renewed
 if ($ddate < 2) { 
 osc_add_flash_warning_message( _m("Can't renew this item yet") );
 $this->redirectTo(osc_user_list_items_url());
 }
 } 
 $mItems = new ItemActions(false);
 $success = $mItems->renew( $item[0]['pk_i_id'], $item[0]['s_secret']);
 if( $success ) {
 osc_run_hook('item_renewed', $item[0]);
 osc_add_flash_ok_message( _m("The listing has been renewed") );
 } else {
 osc_add_flash_error_message( _m("The listing can't be renewed") );
 }
 if (osc_is_admin_user_logged_in()) {
 $this->redirectTo(osc_get_http_referer());
 } else {
 $this->redirectTo(osc_user_list_items_url());
 } 
 break;

4) Находим файл oc-includes/osclass/helpers/hDefines.php

Тут мы можем вставить наш код в самом начале файла, сразу после строк

/**
 * Gets the root url for your installation
 *
 * @param boolean $with_index true if index.php in the url is needed
 * @return string
 */

Наш код следующий

function osc_item_renew_url($secret = '', $id = '') {
 if ($id == '') { $id = osc_item_id(); };
 return osc_base_url(true) . '?page=item&action=item_renew&id=' . $id . ($secret != '' ? '&secret=' . $secret : '');
 }

5) Теперь осталось добавить ссылку на поднятие объявления в шаблоне, у кого-то это файл user-dashboard.php,

<a href="<?php echo osc_item_renew_url( $item['s_secret'], $item['pk_i_id']); ?>">Подъем</a>

у меня установлена темя Bender, поэтому вставлять строки с кодом будем в следующие файлы

loop-single.php и loop-single-premium.php

Находим часть кода (в обоих файлах), которая представлена ниже

 <span class="admin-options">
 <a href="<?php echo osc_item_edit_url(); ?>" rel="nofollow"><?php _e('Edit item', 'bender'); ?></a>
 <span>|</span>
 <a class="delete" onclick="javascript:return confirm('<?php echo osc_esc_js(__('This action can not be undone. Are you sure you want to continue?', 'bender')); ?>')" href="<?php echo osc_item_delete_url();?>" ><?php _e('Delete', 'bender'); ?></a>
 <?php if(osc_item_is_inactive()) {?>
 <span>|</span>
 <a href="<?php echo osc_item_activate_url();?>" ><?php _e('Activate', 'bender'); ?></a>
 <?php } ?>

и после неё вставляем наш кусок кода

<span>|</span>
 <a href="<?php echo osc_item_renew_url( $item['s_secret'], $item['pk_i_id']); ?>"><?php _e('Raise ad', 'bender') ; ?></a>

Таким образом мы получим кнопку «Raise ad», которую можно перевести в языковых файлах темы, а вместе с ней и все остальные фразы для данного модуля

oc-content/themes/bender/languages/ru_RU/theme.po (затем преобразовать в theme.mo)

#: functions.php:553
msgid "Forever Ad"
msgstr "Нет срока завершения"
#: item.php:67 loop-single.php:20 loop-single-premium.php:21
msgid "Date of ending"
msgstr "Дата завершения"
#: loop-single.php:36 loop-single-premium.php:35
msgid "Raise ad"
msgstr "Поднять объявление"

oc-content/themes/bender/languages/ru_RU/messages.po (затем преобразовать в messages.mo)

#: oc-includes/osclass/controller/item.php:128
msgid "Can't renew this item yet"
msgstr "Это объявление новое"
#: oc-includes/osclass/controller/item.php:136
msgid "The listing has been renewed"
msgstr "Объявление обновлено"
#: oc-includes/osclass/controller/item.php:138
msgid "The listing can't be renewed"
msgstr "Объявление не может быть обновлено"

На этом всё. Подписывайтесь на новости, рассказывайте друзьям в социальных сетях и читайте блог.

end

  • Добрый день! Не работает способ! Все сделал в точности! Даже область не появляется, где должна появиться кнопка. Где-то появилось обновление, увязка с js-файлами… Подскажите, если можно!

  • Добрый день. Не может быть, чтобы ничего не появилось. Значит вы что-то сделали не так. Должна появиться как минимум ссылка для поднятия объявления.

  • Справедливо … одну ошибку нашел !
    Но теперь при нажатии на кнопку — говорит:
    Извините, но такая страница не найдена
    Может ли эта ошибка может возникнуть из-за того, что я добавил допполя для объявлений при помощи плагина Custom Attrubutes?

  • Не думаю, хотя всё может быть.

  • Два раза перепроверил досконально… не знаю в какую сторону копать…..

  • Александр Крахмалев

    Здравствуйте,
    сможете помочь, где искать?
    после установки кода ошибка, страница с таким id не найдена
    с уважением Александр

  • Alexey Blogoodf

    Это значит, что вы где-то вставили код не правильно. Проверьте, может символы где пропустили или лишние отставили.

  • Александр Крахмалев

    Спасибо, буду искать

  • Alexey Blogoodf

    Для создания рассылки пользователям нужен плагин OsClass Mail.
    Более подробно можно ознакомиться тут http://mywwweb.ru/otpravka-html-shablona-pisma/

  • сергей руденко

    Не работает, возможно из-за чпу , но не работате

  • Денис Янушкевич

    Приветствую. Не работает ваш код, кидает на страницу с ошибкой 404. Версия движка у меня: 3.5.6 Помогите разобраться.