Награда за определенное кол-во друзей i1.10.4

Выдача автоматически награды за определенное кол-во друзей

#1 11 мая 2015 в 23:44
Всем здравствуйте. Возможно кому-то пригодится инструкция по добавлению в компонент награды функции выдачи награды за
определенное количество друзей.
За основу взял инструкцию instantcms.ru/forum/thread4625.html
Но для Instantcms 1.10.4 она определенно немного устарела.
Начнем:
1) Делаем запрос в базу(добавляем поле друзей).
  1. ALTER TABLE cms_user_autoawards ADD p_friends int(11) AFTER p_karma
2) Открываем файл

admin\components\autoawards\backend.php

Находим код:
  1. if ($opt == 'submit' || $opt == 'update'){
  2.  
  3. if (!cmsCore::validateForm()) { cmsCore::error404(); }
  4.  
  5. $title = cmsCore::request('title', 'str', $_LANG['AD_AWARD']);
  6. $description = cmsCore::request('description', 'str', '');
  7. $published = cmsCore::request('published', 'int', 0);
  8. $imageurl = preg_replace('/[^a-zA-Z0-9_\.\-]/iu', '', cmsCore::request('imageurl', 'str', ''));
  9. $p_comment = cmsCore::request('p_comment', 'int', 0);
  10. $p_forum = cmsCore::request('p_forum', 'int', 0);
  11. $p_content = cmsCore::request('p_content', 'int', 0);
  12. $p_blog = cmsCore::request('p_blog', 'int', 0);
  13. $p_karma = cmsCore::request('p_karma', 'int', 0);
  14. $p_photo = cmsCore::request('p_photo', 'int', 0);
  15. $p_privphoto = cmsCore::request('p_privphoto', 'int', 0);
Сразу после строки
  1. $p_privphoto = cmsCore::request('p_privphoto', 'int', 0);
вставляем следующий код:
  1. $p_friends = cmsCore::request('p_friends', 'int', 0);
Ищем далее такой вот код:
  1. $sql = "INSERT INTO cms_user_autoawards (title, description, imageurl, p_comment, p_blog, p_forum, p_photo, p_privphoto, p_content, p_karma, published)
  2. VALUES ('$title', '$description', '$imageurl', $p_comment, $p_blog, $p_forum, $p_photo, $p_privphoto, $p_content, $p_karma, $published)";
  3. $inDB->query($sql);
Заменяем его на следующий:
  1. $sql = "INSERT INTO cms_user_autoawards (title, description, imageurl, p_comment, p_blog, p_forum, p_photo, p_privphoto, p_content, p_karma, p_friends, published)
  2. VALUES ('$title', '$description', '$imageurl', $p_comment, $p_blog, $p_forum, $p_photo, $p_privphoto, $p_content, $p_karma, $p_friends, $published)";
  3. $inDB->query($sql);
Далее ищем код:
  1. $sql = "UPDATE cms_user_autoawards
  2. SET title='$title',
  3. description='$description',
  4. imageurl='$imageurl',
  5. p_comment=$p_comment,
  6. p_blog=$p_blog,
  7. p_forum=$p_forum,
  8. p_photo=$p_photo,
  9. p_privphoto=$p_privphoto,
  10. p_content=$p_content,
  11. p_karma=$p_karma,
  12. published=$published
  13. WHERE id = '$item_id'";
Заменяем на код:
  1. $sql = "UPDATE cms_user_autoawards
  2. SET title='$title',
  3. description='$description',
  4. imageurl='$imageurl',
  5. p_comment=$p_comment,
  6. p_blog=$p_blog,
  7. p_forum=$p_forum,
  8. p_photo=$p_photo,
  9. p_privphoto=$p_privphoto,
  10. p_content=$p_content,
  11. p_karma=$p_karma,
  12. p_friends=$p_friends,
  13. published=$published
  14. WHERE id = '$item_id'";
Далее ищем:
  1. if ($opt=='add'){
  2. cpAddPathway($_LANG['AD_NEW_AWARD']);
  3. echo '<h3>'.$_LANG['AD_NEW_AWARD'].'</h3>';
  4. $mod['p_comment'] = 0;
  5. $mod['p_content'] = 0;
  6. $mod['p_blog'] = 0;
  7. $mod['p_karma'] = 0;
  8. $mod['p_forum'] = 0;
  9. $mod['p_photo'] = 0;
  10. $mod['p_privphoto'] = 0;
Добавляем после строки:
  1. $mod['p_privphoto'] = 0;
строку:
  1. $mod['p_friends'] = 0;
Дальше ищем код:
  1. <tr>
  2. <td><img src="/admin/components/autoawards/images/p_privphoto.gif" width="16" height="16" /></td>
  3. <td><input name="p_privphoto" type="text" id="p_input" size="5" value="<?php echo @$mod['p_privphoto'];?>" /></td>
  4. <td><?php echo $_LANG['AD_PRIVATE_PHOTOS']; ?></td>
  5. </tr>
После него добавляем:
  1. <tr>
  2. <td><img src="/admin/components/autoawards/images/p_friends.gif" width="16" height="16" /></td>
  3. <td><input name="p_friends" type="text" id="p_input" size="5" value="<?php echo @$mod['p_friends'];?>" /></td>
  4. <td><?php echo $_LANG['AD_FRIENDS_AUTOAW']; ?></td>
  5. </tr>
3) В папку находящуюся по адресу

/admin/components/autoawards/images/

закидываем картинку с названием p_friends.gif(иконка друзья 16*16 изображение человечка Иллюстрация😂)

4) В файлике по адресу

/languages/ru/admin/components/autoawards.php

добавляем код:
  1. $_LANG['AD_FRIENDS_AUTOAW'] ='друзей на сайте';
Теперь правим файл

core\classes\user.class.php

Ищем код:
  1. if (!$awards){ return false; }
  2.  
  3. $p_content = $inDB->rows_count('cms_content', "user_id='$user_id' AND published = 1");
  4. $p_comment = $inDB->rows_count('cms_comments', "user_id='$user_id' AND published = 1");
  5. $p_blog = $inDB->rows_count('cms_blog_posts', "user_id='$user_id' AND published = 1");
  6. $p_forum = $inDB->rows_count('cms_forum_posts', "user_id='$user_id'");
  7. $p_photo = $inDB->rows_count('cms_photo_files', "user_id='$user_id' AND published = 1");
  8. $p_privphoto = $inDB->rows_count('cms_user_photos', "user_id='$user_id'");
  9. $p_karma = $inDB->get_field('cms_user_profiles', "user_id='$user_id'", 'karma');
  10.  
Дописываем строку:
  1. $p_friends = $inDB->rows_count('cms_user_friends', "(from_id = '$user_id' OR to_id = '$user_id') AND is_accepted =1");
Далее ищем код:
  1. $granted = ($award['p_content'] <= $p_content) &&
  2. ($award['p_comment'] <= $p_comment) &&
  3. ($award['p_blog'] <= $p_blog) &&
  4. ($award['p_forum'] <= $p_forum) &&
  5. ($award['p_photo'] <= $p_photo) &&
  6. ($award['p_privphoto'] <= $p_privphoto) &&
  7. ($award['p_karma'] <= $p_karma);
Заменяем его на:
  1. $granted = ($award['p_content'] <= $p_content) &&
  2. ($award['p_comment'] <= $p_comment) &&
  3. ($award['p_blog'] <= $p_blog) &&
  4. ($award['p_forum'] <= $p_forum) &&
  5. ($award['p_photo'] <= $p_photo) &&
  6. ($award['p_privphoto'] <= $p_privphoto) &&
  7. ($award['p_karma'] <= $p_karma) &&
  8. ($award['p_friends'] <= $p_friends);
С этим файлом закончили.

5) Открываем следующий файл по адресу

\components\users\frontend.php

Ищем код:
  1. $inDB->query("UPDATE cms_user_friends SET is_accepted = 1 WHERE id = '{$is_need_accept_id}'");
  2. //регистрируем событие
  3. cmsActions::log('add_friend', array(
  4. 'object' => $inUser->nickname,
  5. 'user_id' => $usr['id'],
  6. 'object_url' => cmsUser::getProfileURL($inUser->login),
  7. 'object_id' => $is_need_accept_id,
  8. 'target' => '',
  9. 'target_url' => '',
  10. 'target_id' => 0,
  11. 'description' => ''
  12. ));
Сразу после него добавляем:
  1. //проверяем и выдаем награду если нужно
  2. cmsUser::checkAwards($inUser->id);
  3. cmsUser::checkAwards($id);
6) Далее открываем файл по адресу

/templates/_default_/components/com_users_awards_site.tpl

Находим код:
  1. {if $aw.p_privphoto}
  2. <tr>
  3. <td><img src="/images/autoawards/p_privphoto.gif" width="16" height="16" /></td>
  4. <td>
  5. {$aw.p_privphoto}
  6. {$LANG.PHOTOS_IN_PRIVATE_ALBUM}</td>
  7. </tr>
  8. {/if}
После добавляем код:
  1. {if $aw.p_friends}
  2. <tr>
#2 12 мая 2015 в 11:39
Дружище web4ik, зачем вы добавляете дополнительное поле в таблицу cms_user_autoawards, если в таблице cms_user_friends уже лежит вся инфа по друзьям?
#3 12 мая 2015 в 11:52

Дружище web4ik, зачем вы добавляете дополнительное поле в таблицу cms_user_autoawards, если в таблице cms_user_friends уже лежит вся инфа по друзьям?

Странник
День добрый, в таблицу добавляется дополнительное поле для настройки компонента, добавляется данное поле для того чтобы выставлять кол-во друзей по достижению которого выдавалась бы награда.
#4 12 мая 2015 в 11:57
Это делается в конфиге компонента. Конечно, вы автор хака и так тоже работает. Но все-таки следует придерживаться стандартов Инстанта. Потому что другие программеры, после применения вашего хака, голову свернут, разыскивая где что.
#5 12 мая 2015 в 12:02
Я делал по аналогии с приведенной выше ссылкой.
instantcms.ru/forum/thread4625.html
Как я понял это поле и отвечает за, то что мы в него записываем(из админки инстанта) кол-во друзей по достижению которого выдавалась бы награда.
Я могу и ошибаться, поправьте меня, если не прав, поправлю пост.
#6 12 мая 2015 в 12:07

поправьте меня, если не прав

web4ik
Даа, Странник, будьте так любезны popcorn
#7 12 мая 2015 в 12:10
Одно из следствий закона Мерфи: неудачный пример становится новым бранчем, и приводит к холливарам "как делать кошерно" )))
#8 12 мая 2015 в 12:16
Я вижу, уже локанафт попкорном запасся. Облом, дружище локанафт, я в холливарах стараюсь не участвовать. Я свое мнение сказал, а новичок пусть дальше своей головой думает. Мое мнение НЕ является окончательным, абсолютным и не подлежащим обжалованию.
#9 12 мая 2015 в 12:28
Странник, сказав А, говори и Б, зачем линять то сразу joke
#10 12 мая 2015 в 12:37
Потому что, дорогой друг локанафт, ты известный холливарщик и любитель переходить на личности. Обрати внимание, у тебя нет никаких высказываний но поводу заметки ТС, зато ты пытаешься заставить писать меня бесполезные посты, отнимающие мое время. Гуд бай, май лав, твоя любовь ко мне останется безответной.
#11 12 мая 2015 в 12:48
Странник, нет нет, ты сказал, что web4ik всё сделал совсем неправильно и поле ненужное добавил.
Даже код никакой не приводи, словами объясни, как сделать иначе — правильнее.
#12 12 мая 2015 в 13:21

Дружище web4ik, зачем вы добавляете дополнительное поле в таблицу cms_user_autoawards, если в таблице cms_user_friends уже лежит вся инфа по друзьям?

Странник
Я понимаю что тут лежит информация о кол-ве друзей у пользователей. Но запись происходит из компонента именно его настройки в данную базу данных cms_user_autoawards, причем не только настройка юзверей.
Вобщем если будет желание объясни что не так можешь и в л.с. Просто тут сделано даже не по аналогии с предыдущей версией а по аналогии с уже написанным компонентом.
#13 12 мая 2015 в 13:30
Это один из «старейших» компонентов системы, поэтому всё так, как и описывает ТС, а, именно, через «танцы с бубном»…
Просто он достаточно редко используется в реальных проектах и в основном не особо «популярен»…
#14 12 мая 2015 в 13:47
web4ik, естественно, вы можете делать так, как считаете нужным, то есть хранить настройки компонента в отдельном поле. Однако это явно избыточно, поскольку у Инстанта существует таблица cms_components с полем config, где в упакованном виде хранятся все конфиги компонента. То есть для добавления нового значения нет смысла курочить базу. Достаточно отредактировать админку — добавить туда еще один инпут по аналогии с существующими. Те, компоненты, которые регулируются, имеют в бакэнде строчку
  1. $inCore->saveComponentConfig('имя компонента', $cfg);
Вам достаточно передать перед этой строкой значение нового параметра, например
  1. $cfg['new_param'] = cmsCore::request('new_param', 'int', 0);
и дело сделано.

Любой компонент в своем фронтэнде обычно получает значение своего конфига в виде массива строчкой вроде
  1. $cfg = $model->config;
. Вы легко получите значение своего параметра строкой
  1. $new_param = $cfg['new_param'];
.
#15 12 мая 2015 в 14:05
Я еще раз повторюсь, это старый компонент, он только для админки и в БД (cms_components) он не имеет и не хранит конфига
Странник, не надо утверждать под влиянием собственных впечатлений, вы сами призывали оперировать фактами…
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.