Ris

Ris

+657
Репутация
3768
Рейтинг
#1 Проблемы с большими таблицами. 10 октября 2015 в 19:33

Как я понимаю в $comment_id у вас id комментария или сам комментарий?

Lora

Хотелось бы, чтобы $comment_id был цифрой соответствующей id камента в таблице. Как это сделать, я к сожалению, пока не понимаю.

Пока вот так:
Parse error: syntax error, unexpected T_VARIABLE in D:\open\OpenServer\domains\new.ru\components\comments\model.php on line 256

Вот 256 строка:
public function getComments($comment_id= $id, $only_published=true, $is_tree=false, $from_module = false) {


Можно так
Код PHP:
public function getComments($comment_id, $only_published=true, $is_tree=false, $from_module = false)

Lora

Теперь не ругается, но каментов так и не выводит.
#2 Проблемы с большими таблицами. 10 октября 2015 в 19:13
Lora,
О! Вот именно в этом и вопрос!
Как передать значение в функцию?

Так?
public function getComments($comment_id=$id, $only_published=true, $is_tree=false, $from_module = false)

Я в пыхе не очень компетентен.
#3 Проблемы с большими таблицами. 10 октября 2015 в 19:05

, нужно
Код PHP:
{$comtable}

Lora

Вы имеете в виду FROM {$comtable} ?

Нет, проблема не в этом. Оно $comment_id на входе в функцию не подхватывает.
#4 Проблемы с большими таблицами. 10 октября 2015 в 18:52

В вашем случае в каждую ф-цию где есть cms_comments

Lora

Увы, не работает.
Возможно, я что-то неправильно делаю. Вот моя функция public function getComments


  1. public function getComments($only_published=true, $is_tree=false, $from_module = false) {
  2.  
  3. if ($comment_id > 15) {$comtable = 'cms_comments';}
  4. else {$comtable = 'cms_comments_old';}
  5.  
  6. $inUser = cmsUser::getInstance();
  7.  
  8. $comments = array();
  9.  
  10. global $_LANG;
  11.  
  12. $published = $only_published ? 'c.published = 1' : '1=1';
  13.  
  14. $sql = "SELECT c.*,
  15. IFNULL(u.nickname, 0) as nickname,
  16. IFNULL(u.login, 0) as login,
  17. IFNULL(u.is_deleted, 0) as is_deleted,
  18. IFNULL(p.imageurl, 0) as imageurl,
  19. IFNULL(p.gender, 0) as gender
  20. FROM $comtable c
  21. LEFT JOIN cms_users u ON u.id = c.user_id
  22. LEFT JOIN cms_user_profiles p ON p.user_id = u.id
  23. WHERE {$published}
  24. {$this->inDB->where}
  25.  
  26. {$this->inDB->group_by}
  27.  
  28. {$this->inDB->order_by}\n";
  29.  
  30. if ($this->inDB->limit){
  31. $sql .= "LIMIT {$this->inDB->limit}";
  32. }
  33.  
  34. $result = $this->inDB->query($sql);
  35.  
  36. $this->inDB->resetConditions();
  37.  
  38. if (!$this->inDB->num_rows($result)) { return array(); }
  39.  
  40. while($comment = $this->inDB->fetch_assoc($result)){
  41.  
  42. $comment['level'] = 0;
  43. $comment['is_editable'] = $this->isEditable($comment['pubdate']);
  44. $comment['fpubdate'] = cmsCore::dateFormat($comment['pubdate'], true, true);
  45.  
  46. if ($comment['guestname']){
  47. $comment['author'] = $comment['guestname'];
  48. $comment['is_profile'] = false;
  49. $comment['ip'] = in_array($this->config['cmm_ip'], array(1,2)) ? $comment['ip'] : '';
  50. } else {
  51. $comment['author']['nickname'] = $comment['nickname'];
  52. $comment['author']['login'] = $comment['login'];
  53. $comment['is_profile'] = true;
  54. $comment['user_image'] = cmsUser::getUserAvatarUrl($comment['user_id'], 'small', $comment['imageurl'], $comment['is_deleted']);
  55. $comment['ip'] = ($this->config['cmm_ip'] == 2 && $comment['ip']) ? $comment['ip'] : '';
  56. }
  57.  
  58. switch ($comment['gender']){
  59. case 'm': $comment['gender'] = $_LANG['COMMENTS_MALE'];
  60. break;
  61. case 'f': $comment['gender'] = $_LANG['COMMENTS_FEMALE'];
  62. break;
  63. default: $comment['gender'] = $_LANG['COMMENTS_GENDER'];
  64. }
  65.  
  66. $comment['show'] = (!$this->config['min_karma'] || $comment['rating'] >= $this->config['min_karma_show']) || cmsUser::userIsAdmin($comment['user_id']);
  67. $comment['is_my'] = ($inUser->id == $comment['user_id']);
  68. if ($inUser->id){
  69. $comment['is_voted'] = $comment['is_my'] ? true : cmsUser::isRateUser('comment', $inUser->id, $comment['id']);
  70. } else {
  71. $comment['is_voted'] = true;
  72. }
  73. if ($inUser->id){
  74. $quest['is_voted'] = $quest['is_my'] ? true : cmsUser::isRateUser('quest', $inUser->id, $quest['id']);
  75. } else {
  76. $quest['is_voted'] = true;
  77. }
  78.  
  79. $comments[] = $comment;
  80.  
  81. }
  82.  
  83. if($is_tree){
  84. $comments = $this->buildTree(0, 0, $comments);
  85. }
  86.  
  87. return $from_module ? cmsCore::callEvent('GET_COMMENTS_MODULE', $comments) : cmsCore::callEvent('GET_COMMENTS', $comments);
  88.  
  89. }
#5 Проблемы с большими таблицами. 10 октября 2015 в 18:32
Lora,
Да, мне что-то тоже это подсказывает.
Уже столкнулся с проблемой, что не знаю, куда вставить это if .
Пишу в модели просто $comtable = 'cms_comments' — всё работает.
Пытаюсь задать условие
if ($comment_id > 15) {$comtable = 'cms_comments';}
else {$comtable = 'cms_comments_old';}
И всё, каменты не выводятся.

Собственно вопрос в том, как заставить движок обращаться к той или иной таблице в зависимости от id комментария.
#6 Проблемы с большими таблицами. 10 октября 2015 в 17:49
Хочу получить обращение к свежей таблице (содержащей только свежие комментарии) при обычной работе сайта и обращение к таблице со стариной, если кто решит вспомнить старое и полезет в прошлогодние каменты.
#7 Проблемы с большими таблицами. 10 октября 2015 в 15:59
Lora,
Это программа максимум. Пока достаточно просто один раз выкинуть старьё в отдельную таблицу.

Думаю заменить везде в comments/model.php cms_comments на переменную $comtable и где-нибудь вначале задавать её значение

  1. if (comment_id > (какое-то значение)) { $comtable = 'cms_comments';}
  2. else { $comtable = 'cms_comments_old';}
#1 Проблемы с большими таблицами. 10 октября 2015 в 14:54
Вот уже почти неделю бьюсь с техподдержкой хостера.
Вдруг, неожиданно, сайт, который стабильно работал (практически летал) на этом хостинге больше года, начал открываться по три минуты.
Техподдержка заявляет "проблемы на Вашей стороне", хотя иногда сайт практически летает.

Можем сменить вам тариф, если считаете это необходимым.
Маловероятно, что смена тарифа вам поможет. У вас некачественные php-скрипты или сайты созданные без какого-либо учёта нагрузки на сервер. Запросы mysql-серверу отправляются вашими php-скриптами. У вас есть sql-запросы которые зависают более чем на 2 минуты. Эту проблему нужно решать с разработчиками сайтов.
Реселлят, конечно же, но факт остается фактом, имеется несколько таблиц, которые содержат по миллиону строк и весят по 400 мегабайт.

Отсюда возникает вопрос. А нельзя ли комментарии, возрастом более полугода, например, вынести в отдельную таблицу cms_comments_old? чтобы не мешали. Ведь в глубины сайта редко кто лазит, в основном работа ведется с комментариями возрастом не более месяца, но каждый раз вся таблица в 700000 строк вытаскивается в оперативку сервера.

Мне пока представляется реализация этого так: все комментарии с id меньше определенного значения вручную перенести в другую таблицу, а все запросы браузера к этим комментариям направлять в ту таблицу. Вопрос, как это сделать в /comments/model.php ?

Кто что думает, как это можно реализовать?
#8 Комментарии, улучшение? 16 сентября 2015 в 23:44
Nemoi,

Спасибо, отличная инструкция!
Вы, правда, позабыли упомянуть, что нужно еще добавить в \components\comments\addform.php строку
  1. $nickname = cmsCore::request('nickname', 'str', '');
Я еще немного доработал com_comments_list.tpl

  1. <span class="cmm_author"><a href="javascript:void(0)" onclick="addComment('{$target|escape:'html'}', '{$target_id}', {$comment.id}, '[b]{$comment.author.nickname}[/b],')" title="{$LANG.ADD_NICKNAME}" class="ajaxlink">{$comment.author.nickname}</a> {if $is_admin && $comment.ip}({$comment.ip}){/if}</span>
Теперь никнейм вставляется болдовый и при наведении подсвечивается тайтл.

Но! Есть одно большое но.
При открытии формы добавления комментария курсор оказывается перед никнеймом.
Кто подскажет, как доработать \components\comments\js\comments.js, чтобы оно переводила курсор в конец строки, а еще лучше на новый абзац.

-------------------------------------------

Разобрался сам:


  1. function addComment(target, target_id, parent_id, nickname){
  2. $('.cm_addentry').remove();
  3. $('.cm_add_link').show();
  4. $link_span = $('#cm_add_link'+parent_id);
  5. old_html = $link_span.html();
  6. loading_img = '<img src="/images/ajax-loader.gif"/>';
  7. $link_span.html(loading_img);
  8. $.post('/components/comments/addform.php', {target: target, target_id: target_id, parent_id: parent_id, nickname: nickname}, function(data) {
  9.  
  10. if(data){
  11.  
  12. $("#cm_addentry"+parent_id).html(data).fadeIn();
  13. $('#content').focusToEnd();
  14. $().br;
  15. $link_span.html(old_html).hide();
  16. $('#submit_cmm').click(function() {
  17. $('#submit_cmm').prop('disabled', true);
  18. $('#cancel_cmm').hide();
  19. $('.submit_cmm').append(loading_img);
  20. var options = {
  21. success: showResponseAdd,
  22. dataType: 'json'
  23. };
  24. $('#msgform').ajaxSubmit(options);
  25. });
  26.  
  27. }
  28. });
  29.  
  30. }
  31. $.fn.focusToEnd = function() {
  32. return this.each(function() {
  33. var v = $(this).val();
  34. $(this).focus().val("").val(v);
  35. });
  36. };

  1. cmsPage::initTemplate('components', 'com_comments_add')->
  2. assign('user_can_add', $model->is_can_add)->
  3. assign('is_can_bbcode', $model->is_can_bbcode)->
  4. assign('do', $do)->
  5. assign('comment', isset($comment) ? $comment : array())->
  6. assign('is_user', $inUser->id)->
  7. assign('nickname', $nickname."
  8. ")->
  9. assign('cfg', $model->config)->
  10. assign('target', $target)->
  11. assign('target_id', $target_id)->
  12. assign('parent_id', $parent_id)->
  13. assign('user_subscribed', cmsUser::isSubscribed($inUser->id, $target, $target_id))->
  14. assign('can_by_karma', $can_by_karma)->
  15. assign('karma_need', $karma_need)->
  16. assign('karma_has', $inUser->karma)->
  17. assign('need_captcha', $need_captcha)->
  18. assign('bb_toolbar', isset($bb_toolbar) ? $bb_toolbar :'')->
  19. assign('smilies', isset($smilies) ? $smilies : '')->
  20. assign('notice', isset($notice) ? $notice : '')->
  21. display('com_comments_add.tpl');
  22.  
#9 Как 1.10.6 изменить карму 26 августа 2015 в 08:57
У меня установлено что-то этакое:

instantcms.ru/blogs/zapiski-studenta/karma-iz-adminki-dlja-versi-instantcms-1-9.html
#10 Налетай - домены .online 22 августа 2015 в 17:13

Что интересно 2 значные домены не хочет регистрировать, например nn.online

eoleg

nn.online наверное уже Иосилевич прикупил по блату…
#11 Админам стоит знать 31 июля 2015 в 09:37

Тоталкомандер может скачивать файлы по http?

Fuze

При скачивании установщика тоталкомандера хром отказывается его скачивать. Приходится запускать IE.
#12 Админам стоит знать 31 июля 2015 в 09:00
Тоталкомандер тоже нивкакую не хочет скачивать…
#13 виджет Мини чат для instantcms 2 28 июля 2015 в 21:20
Хорошая вешь!
А как обстоит дело с пожиранием ресурсов? Всмысле оно обновляется без обновления страницы или нет?
Я от подобной фичи на первом движке отказался. Ело всю оперативку сервера.
#14 301 редирект для InstantMaps 26 июля 2015 в 00:55
qvaro,
При добавлении нового объекта куда?
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.