Current Path : /var/www/html/clients/nsmk.e-nk.ru/application/maxsite/common/ |
Current File : /var/www/html/clients/nsmk.e-nk.ru/application/maxsite/common/comments.php |
<?php if (!defined('BASEPATH')) exit('No direct script access allowed'); /** * Основные функции MaxSite CMS * (c) http://max-3000.com/ * Функции для комментариев */ # функция получения комментариев function mso_get_comments($page_id = 0, $r = array()) { global $MSO; if ( !isset($r['limit']) ) $r['limit'] = false; if ( !isset($r['order']) ) $r['order'] = 'asc'; if ( !isset($r['tags']) ) $r['tags'] = '<p><img><strong><em><i><b><u><s><font><pre><code><blockquote>'; if ( !isset($r['tags_users']) ) $r['tags_users'] = '<a><p><img><strong><em><i><b><u><s><font><pre><code><blockquote>'; if ( !isset($r['tags_comusers']) ) $r['tags_comusers'] = '<a><p><img><strong><em><i><b><u><s><font><pre><code><blockquote>'; if ( !isset($r['anonim_comments']) ) $r['anonim_comments'] = array(); if ( !isset($r['anonim_title']) ) $r['anonim_title'] = ' ('. t('анонимно'). ')'; // дописка к имени для анонимов // дописка к имени для комментаторов без ника if ( !isset($r['add_author_name']) ) $r['add_author_name'] = t('Комментатор'); $CI = & get_instance(); // вначале получим список всех комюзеров, чтобы посчитать их количество комментариев $cache_key = 'all_comusers'; $k = mso_get_cache($cache_key); if (!$k) // нет в кэше { $CI->db->select('comusers_id, comusers_count_comments, COUNT(comments_comusers_id) as comusers_count_comment_real'); $CI->db->from('comusers'); $CI->db->where('comments.comments_approved', '1'); $CI->db->join('comments', 'comusers.comusers_id = comments.comments_comusers_id', 'left'); $CI->db->group_by('comments_comusers_id'); $query = $CI->db->get(); $all_comusers = array(); if ($query->num_rows() > 0) { $comusers = $query->result_array(); foreach($comusers as $comuser) { $all_comusers[$comuser['comusers_id']] = $comuser['comusers_count_comment_real']; // сразу сверим количество кмментариев if ($comuser['comusers_count_comments'] != $comuser['comusers_count_comment_real']) // не равно mso_comuser_set_count_comment($comuser['comusers_id'], $comuser['comusers_count_comment_real']); } } mso_add_cache($cache_key, $all_comusers); // в кэше на 10 минут } else $all_comusers = $k; $CI->db->select('page.page_id, page.page_slug, page.page_title, comments.*, users.users_id, users.users_nik, users.users_count_comments, users.users_url, users.users_email, users.users_avatar_url, comusers.comusers_id, comusers.comusers_nik, comusers.comusers_count_comments, comusers.comusers_allow_publish, comusers.comusers_email, comusers.comusers_avatar_url '); if ($page_id) $CI->db->where('page.page_id', $page_id); // если нет анономого коммента, то вводим условие на comments_approved=1 - только разрешенные if (!$r['anonim_comments']) { $CI->db->where('comments.comments_approved', '1'); } else // есть массив с указанными комментариям - они выводятся отдельно { $CI->db->where('comments.comments_approved', '0'); $CI->db->where_in('comments.comments_id', $r['anonim_comments']); } // вот эти два join жутко валят мускуль... // пока решение не найдено, все запросы к комментам следует кэшировать на уровне плагина $CI->db->join('users', 'users.users_id = comments.comments_users_id', 'left'); $CI->db->join('comusers', 'comusers.comusers_id = comments.comments_comusers_id', 'left'); // вручную делаем этот where, потому что придурочный CodeIgniter его неверно экранирует $CI->db->where($CI->db->dbprefix . 'page.page_id', $CI->db->dbprefix . 'comments.comments_page_id', false); $CI->db->where('page.page_status', 'publish'); $CI->db->order_by('comments.comments_date', $r['order']); if ($r['limit']) $CI->db->limit($r['limit']); $CI->db->from('comments, page'); //pr(_sql()); $query = $CI->db->get(); //return array(); if ($query->num_rows() > 0) { $comments = $query->result_array(); //pr($comments); foreach ($comments as $key=>$comment) { //pr($comment); $commentator = 3; // комментатор: 1-комюзер 2-автор 3-аноним if ($comment['comusers_id']) // это комюзер { if ($comment['comusers_nik']) $comment['comments_author_name'] = $comment['comusers_nik']; else $comment['comments_author_name'] = $r['add_author_name'] . ' ' . $comment['comusers_id']; $comment['comments_url'] = '<a href="' . getinfo('siteurl') . 'users/' . $comment['comusers_id'] . '">' . $comment['comments_author_name'] . '</a>'; $commentator = 1; if (isset($all_comusers[$comment['comusers_id']])) $comments[$key]['comusers_count_comments'] = $all_comusers[$comment['comusers_id']]; } elseif ($comment['users_id']) // это автор { if ($comment['users_url']) $comment['comments_url'] = '<a href="' . $comment['users_url'] . '">' . $comment['users_nik'] . '</a>'; else $comment['comments_url'] = $comment['users_nik']; $commentator = 2; } else $comment['comments_url'] = $comment['comments_author_name'] . $r['anonim_title']; // просто аноним $comments_content = $comment['comments_content']; // защитим pre $t = $comments_content; $t = preg_replace_callback('!<pre>(.*?)</pre>!is', 'mso_clean_html_do', $t); $t = mso_xss_clean($t); $t = str_replace('[html_base64]', '<pre>[html_base64]', $t); // проставим pre $t = str_replace('[/html_base64]', '[/html_base64]</pre>', $t); // обратная замена $t = preg_replace_callback('!\[html_base64\](.*?)\[\/html_base64\]!is', 'mso_clean_html_posle', $t); $comments_content = $t; // сохраним как текст комментария $comments_content = mso_hook('comments_content', $comments_content); $comments_content = str_replace("\n", "<br>", $comments_content); $comments_content = str_replace('<p>', '<p>', $comments_content); $comments_content = str_replace('</p>', '</p>', $comments_content); $comments_content = str_replace('<P>', '<P>', $comments_content); $comments_content = str_replace('</P>', '</P>', $comments_content); if (mso_hook_present('comments_content_custom')) { $comments_content = mso_hook('comments_content_custom', $comments_content); } else { $comments_content = mso_auto_tag($comments_content, true); //$comments_content = mso_hook('content_auto_tag', $comments_content); $comments_content = mso_hook('content_balance_tags', $comments_content); // $comments_content = mso_balance_tags($comments_content); } if ($commentator==1) $comments_content = strip_tags($comments_content, $r['tags_comusers']); elseif ($commentator==2) $comments_content = strip_tags($comments_content, $r['tags_users']); else $comments_content = strip_tags($comments_content, $r['tags']); $comments_content = mso_hook('comments_content_out', $comments_content); $comments[$key]['comments_content'] = $comments_content; $comments[$key]['comments_url'] = $comment['comments_url']; } } else $comments = array(); return $comments; } # функция отправляет админу уведомление о новом комментарии # первый парметр id, второй данные текст и т.д. function mso_email_message_new_comment($id = 0, $data = array(), $page_title = '') { $CI = & get_instance(); $data['page_title'] = $page_title; // заголовок страницы $data['id'] = $id; // номер комментария $data['comments_content'] = mso_xss_clean($data['comments_content']); # хук на который можно повестить подписку на новые комментарии mso_hook('mso_email_message_new_comment', $data); # рассылаем комментарий всем, кто на него подписан mso_email_message_new_comment_subscribe($data); $email = mso_get_option('admin_email', 'general', false); // email куда приходят уведомления if (!$email) return false; if ($data['comments_approved'] == 0) // нужно промодерировать $subject = '[' . getinfo('name_site') . '] ' . '(-) '. t('Новый комментарий'). ' (' . $id . ') "' . $page_title . '"'; else $subject = '[' . getinfo('name_site') . '] ' . t('Новый комментарий'). ' (' . $id . ') "' . $page_title . '"'; $text = t('Новый комментарий на'). ' "' . $page_title . '"'. NR ; $text .= mso_get_permalink_page($data['comments_page_id']) . '#comment-' . $id . NR . NR; if ($data['comments_approved'] == 0) // нужно промодерировать { $text .= t('Комментарий требует модерации'). ': ' . NR . getinfo('site_admin_url') . 'comments/edit/' . $id . NR . NR; } $text .= 'Автор IP: ' . $data['comments_author_ip'] . NR; $text .= 'Referer: ' . $_SERVER['HTTP_REFERER'] . NR; $text .= 'Дата: ' . $data['comments_date'] . NR; if (isset($data['comments_users_id'])) $text .= t('Пользователь'). ': ' . $data['comments_users_id'] . NR; elseif (isset($data['comments_comusers_id'])) { $text .= t('Комюзер'). ': id=' . $data['comments_comusers_id']; $CI->db->select('comusers_nik, comusers_email'); $CI->db->from('comusers'); $CI->db->where('comusers_id', $data['comments_comusers_id']); $query = $CI->db->get(); if ($query->num_rows() > 0) { $comusers = $query->row(); $text .= ', ник: ' . $comusers->comusers_nik . ', email: ' . $comusers->comusers_email . NR; $text .= 'Профиль: ' . getinfo('siteurl') . 'users/' . $data['comments_comusers_id'] . NR; } } elseif (isset($data['comments_author_name'])) $text .= t('Аноним'). ': ' . $data['comments_author_name'] . NR; $text .= NR . 'Текст: ' . NR . $data['comments_content'] . NR; $text .= NR . t('Администрировать комментарий вы можете по ссылке'). ': ' . NR . getinfo('site_admin_url') . 'comments/edit/' . $id . NR; return mso_mail($email, $subject, $text); } # функция отправляет новому комюзеру уведомление о новой регистрации # первый парметр id, второй данные function mso_email_message_new_comuser($comusers_id = 0, $ins_data = array() ) { $email = $ins_data['comusers_email']; // email куда приходят уведомления if (!$email) return false; // comusers_password // comusers_activate_key $subject = 'Регистрация на ' . getinfo('title'); $text = 'Вы или кто-то еще зарегистрировал ваш адрес на сайте "' . getinfo('name_site') . '" - ' . getinfo('siteurl') . NR ; $text .= 'Если это действительно сделали вы, то вам нужно подтвердить эту регистрацию. Для этого следует пройти по ссылке: ' . NR; $text .= getinfo('siteurl') . 'users/' . $comusers_id . NR . NR; $text .= 'И ввести следующий код для активации: '. NR; $text .= $ins_data['comusers_activate_key'] . NR. NR; $text .= '(Сохраните это письмо, поскольку код активации может понадобиться для смены пароля.)' . NR . NR; $text .= 'Если же эту регистрацию выполнили не вы, то просто удалите это письмо.' . NR; return mso_mail($email, $subject, $text, $email); // поскольку это регистрация, то отправитель - тот же email } # функция добавляет новый коммент и выводит сообщение о результате function mso_get_new_comment($args = array()) { global $MSO; if ( $post = mso_check_post(array('comments_session', 'comments_submit', 'comments_page_id', 'comments_content')) ) { // mso_checkreferer(); // если нужно проверять на реферер $CI = & get_instance(); // заголовок страницы if ( !isset($args['page_title']) ) $args['page_title'] = ''; // стили if ( !isset($args['css_ok']) ) $args['css_ok'] = 'comment-ok'; if ( !isset($args['css_error']) ) $args['css_error'] = 'comment-error'; // разрешенные тэги if ( !isset($args['tags']) ) $args['tags'] = '<p><blockquote><br><span><strong><strong><em><i><b><u><s><pre><code>'; // обрабатывать текст на xss-атаку if ( !isset($args['xss_clean']) ) $args['xss_clean'] = true; // если найдена xss-атака, то не публиковать комментарий if ( !isset($args['xss_clean_die']) ) $args['xss_clean_die'] = false; if ( !isset($args['noword']) ) $args['noword'] = array('.com', '.ru', '.net', '.org', '.info', '.ua', '.su', '.name', '/', 'www.', 'http', ':', '-', '"', '«', '»', '%', '<', '>', '&', '*', '+', '\'' ); mso_hook('add_new_comment'); if (!mso_checksession($post['comments_session']) ) return '<div class="' . $args['css_error']. '">'. t('Ошибка сессии! Обновите страницу'). '</div>'; if (!$post['comments_page_id']) return '<div class="' . $args['css_error']. '">'. t('Ошибка!'). '</div>'; $comments_page_id = $post['comments_page_id']; $id = (int) $comments_page_id; if ( (string) $comments_page_id != (string) $id ) $id = false; // $comments_page_id не число if (!$id) return '<div class="' . $args['css_error']. '">'. t('Ошибка!'). '</div>'; // капчу проверим // если этот хук возвращает false, значит капча неверная if (!mso_hook('comments_new_captcha', true)) { // если определен хук на неверную капчу, отдаем его if (mso_hook_present('comments_new_captcha_error')) { return mso_hook('comments_new_captcha_error'); } else { return '<div class="' . $args['css_error']. '">'. t('Ошибка! Неверно введены нижние символы!'). '</div>'; } } // вычищаем от запрещенных тэгов if ($args['tags']) { // перед этим нужно все pre защитить $t = $post['comments_content']; $t = preg_replace_callback('!<pre>(.*?)</pre>!is', 'mso_clean_html_do', $t); $t = strip_tags($t, $args['tags']); // теперь оставим только разрешенные тэги $t = str_replace('[html_base64]', '<pre>[html_base64]', $t); // проставим pre $t = str_replace('[/html_base64]', '[/html_base64]</pre>', $t); // обратная замена $t = preg_replace_callback('!\[html_base64\](.*?)\[\/html_base64\]!is', 'mso_clean_html_posle', $t); $post['comments_content'] = $t; // сохраним как текст комментария } // если указано рубить коммент при обнаруженной xss-атаке if ($args['xss_clean_die'] and $mso_xss_clean($post['comments_content'], true, false) === true) { return '<div class="' . $args['css_error']. '">'. t('Обнаружена XSS-атака!'). '</div>'; } if (!trim($post['comments_content'])) return '<div class="' . $args['css_error']. '">'. t('Ошибка, нет текста!'). '</div>'; // возможно есть текст, но только из одних html - не пускаем if ( !trim(strip_tags(trim($post['comments_content']))) ) return '<div class="' . $args['css_error']. '">'. t('Ошибка, нет полезного текста!'). '</div>'; // вычищаем текст от xss if ($args['xss_clean']) { $post['comments_content'] = mso_xss_clean($post['comments_content']); } $comments_author_ip = $_SERVER['REMOTE_ADDR']; $comments_date = date('Y-m-d H:i:s'); $comments_content = mso_hook('new_comments_content', $post['comments_content']); // провека на спам - проверим через хук new_comments_check_spam $comments_check_spam = mso_hook('new_comments_check_spam', array( 'comments_content' => $comments_content, 'comments_date' => $comments_date, 'comments_author_ip' => $comments_author_ip, 'comments_page_id' => $comments_page_id, 'comments_server' => $_SERVER, ), false); // если есть спам, то возвращается что-то отличное от comments_content // если спама нет, то должно вернуться false // если есть подозрения, то возвращается массив с moderation (comments_approved) // если есть параметр check_spam=true, значит определен спам и он вообще не пускается // сообщение для вывода в парметре 'message' // разрешение антиспама moderation // -1 - не определено, 0 - можно разрешить, 1 - отдать на модерацию $moderation = -1; if ($comments_check_spam) { if (isset($comments_check_spam['check_spam']) and $comments_check_spam['check_spam']==true) { if ( isset($comments_check_spam['message']) and $comments_check_spam['message'] ) return '<div class="' . $args['css_error']. '">' . $comments_check_spam['message'] . '</div>'; else return '<div class="' . $args['css_error']. '">'. t('Ваш комментарий определен как спам и удален.'). '</div>'; } else { // спам не определен, но возможно стоит moderation - принудительная модерация if (isset($comments_check_spam['moderation'])) $moderation = $comments_check_spam['moderation']; } } // проверим есть ли уже такой комментарий // проверка по ip и тексту $CI->db->select('comments_id'); $CI->db->where(array ( 'comments_page_id' => $comments_page_id, 'comments_author_ip' => $comments_author_ip, 'comments_content' => $comments_content, )); $query = $CI->db->get('comments'); if ($query->num_rows()) // есть такой коммент { return '<div class="' . $args['css_error']. '">'. t('Похоже, вы уже отправили этот комментарий...'). '</div>'; } if (is_login()) // коммент от автора { $comments_users_id = $MSO->data['session']['users_id']; $ins_data = array ( 'comments_users_id' => $comments_users_id, 'comments_page_id' => $comments_page_id, 'comments_author_ip' => $comments_author_ip, 'comments_date' => $comments_date, 'comments_content' => $comments_content, 'comments_approved' => 1 // авторы могут сразу публиковать комменты без модерации ); $res = ($CI->db->insert('comments', $ins_data)) ? '1' : '0'; if ($res) { mso_email_message_new_comment($CI->db->insert_id(), $ins_data, $args['page_title']); mso_flush_cache(); $CI->db->cache_delete_all(); mso_hook('new_comment'); mso_redirect(mso_current_url() . '#comment-' . $CI->db->insert_id()); } else return '<div class="' . $args['css_error']. '">'. t('Ошибка добавления комментария'). '</div>'; } else { if ( isset($post['comments_reg']) ) // комюзер или аноном { if ($post['comments_reg'] == 'reg') // нужно зарегистрировать или уже есть регистрация { if ( !isset($post['comments_email']) or !$post['comments_email'] ) return '<div class="' . $args['css_error']. '">'. t('Нужно указать Email'). '</div>'; if ( !isset($post['comments_password']) or !$post['comments_password'] ) return '<div class="' . $args['css_error']. '">'. t('Нужно указать пароль'). '</div>'; $comments_email = mso_strip($post['comments_email']); $comments_password = mso_strip($post['comments_password']); if ( !mso_valid_email($comments_email) ) return '<div class="' . $args['css_error']. '">'. t('Ошибочный Email'). '</div>'; // вначале нужно зарегистрировать comюзера - получить его id и только после этого добавить сам коммент // но вначале есть смысл проверить есть ли такой ком-пользователь $comusers_id = false; $CI->db->select('comusers_id, comusers_password'); $CI->db->where('comusers_email', $comments_email); $query = $CI->db->get('comusers'); if ($query->num_rows()) // есть такой комюзер { $row = $query->row_array(1); // пароль не нужно шифровать mso_md5 if (isset($post['comments_password_md']) and $post['comments_password_md']) { if ($row['comusers_password'] != $comments_password) // пароль неверный return '<div class="' . $args['css_error']. '">'. t('Неверный пароль'). '</div>'; } else { if ($row['comusers_password'] != mso_md5($comments_password)) // пароль неверный return '<div class="' . $args['css_error']. '">'. t('Неверный пароль'). '</div>'; } $comusers_id = $row['comusers_id']; // получаем номер комюзера } else { // такого комюзера нет $ins_data = array ( 'comusers_email' => $comments_email, 'comusers_password' => mso_md5($comments_password) ); // генерируем случайный ключ активации $ins_data['comusers_activate_key'] = mso_md5(rand()); $ins_data['comusers_date_registr'] = date('Y-m-d H:i:s'); $ins_data['comusers_last_visit'] = date('Y-m-d H:i:s'); $ins_data['comusers_ip_register'] = $_SERVER['REMOTE_ADDR']; $res = ($CI->db->insert('comusers', $ins_data)) ? '1' : '0'; if ($res) { $comusers_id = $CI->db->insert_id(); // номер добавленной записи mso_email_message_new_comuser($comusers_id, $ins_data); // отправляем ему уведомление с кодом активации } else return '<div class="' . $args['css_error']. '">'. t('Ошибка регистрации'). '</div>'; } if ($comusers_id) { $comments_com_approved = mso_get_option('new_comment_comuser_moderate', 'general', 1); // но у нас в базе хранится значение наоборот - 1 разрешить 0 - запретить $comments_com_approved = !$comments_com_approved; if ($moderation == 1) $comments_com_approved = 0; // антиспам определил, что нужно премодерировать if ($comments_com_approved == 1) // если разрешено { $comments_com_approved = mso_hook('new_comments_check_spam_comusers', array( 'comments_page_id' => $comments_page_id, 'comments_comusers_id' => $comusers_id, 'comments_com_approved' => $comments_com_approved, ), 1); } // комюзер добавлен или есть // теперь сам коммент $ins_data = array ( 'comments_page_id' => $comments_page_id, 'comments_comusers_id' => $comusers_id, 'comments_author_ip' => $comments_author_ip, 'comments_date' => $comments_date, 'comments_content' => $comments_content, 'comments_approved' => $comments_com_approved ); $res = ($CI->db->insert('comments', $ins_data)) ? '1' : '0'; if ($res) { $id_comment_new = $CI->db->insert_id(); // посколько у нас идет редирект, то данные об отправленном комменте // сохраняем в сессии номер комментария if ( isset($MSO->data['session']) ) { $CI->session->set_userdata(array( 'comments' => array( // $CI->db->insert_id()=>$comments_page_id $id_comment_new ))); } mso_email_message_new_comment($id_comment_new, $ins_data, $args['page_title']); // mso_flush_cache(); $CI->db->cache_delete_all(); mso_hook('new_comment'); # если комюзер не залогинен, то сразу логиним его $CI->db->select('comusers_id, comusers_password, comusers_email, comusers_nik, comusers_url, comusers_avatar_url, comusers_last_visit'); $CI->db->where('comusers_email', $comments_email); $CI->db->where('comusers_password', mso_md5($comments_password)); $query = $CI->db->get('comusers'); if ($query->num_rows()) // есть такой комюзер { $comuser_info = $query->row_array(1); // вся инфа о комюзере // сразу же обновим поле последнего входа $CI->db->where('comusers_id', $comuser_info['comusers_id']); $CI->db->update('comusers', array('comusers_last_visit'=>date('Y-m-d H:i:s'))); $expire = time() + 60 * 60 * 24 * 30; // 30 дней = 2592000 секунд $name_cookies = 'maxsite_comuser'; $value = serialize($comuser_info); # ставим куку и редиректимся автоматом mso_add_to_cookie($name_cookies, $value, $expire, mso_current_url() . '#comment-' . $id_comment_new); exit; } mso_redirect(mso_current_url() . '#comment-' . $id_comment_new); } else return '<div class="' . $args['css_error']. '">'. t('Ошибка добавления комментария'). '</div>'; } } elseif ($post['comments_reg'] == 'noreg') { // комментарий от анонима if ( isset($post['comments_author']) ) { $comments_author_name = mso_strip($post['comments_author']); $comments_author_name = str_replace($args['noword'], '', $comments_author_name); $comments_author_name = trim($comments_author_name); if (!$comments_author_name) $comments_author_name = t('Аноним'); } else $comments_author_name = 'Аноним'; // можно ли публиковать без модерации? $comments_approved = mso_get_option('new_comment_anonim_moderate', 'general', 1); // но у нас в базе хранится значение наоборот - 1 разрешить 0 - запретить $comments_approved = !$comments_approved; if ($moderation==1) $comments_approved = 0; // антиспам определил, что нужно премодерировать $ins_data = array ( 'comments_page_id' => $comments_page_id, 'comments_author_name' => $comments_author_name, 'comments_author_ip' => $comments_author_ip, 'comments_date' => $comments_date, 'comments_content' => $comments_content, 'comments_approved' => $comments_approved ); $res = ($CI->db->insert('comments', $ins_data)) ? '1' : '0'; if ($res) { // посколько у нас идет редирект, то данные об отправленном комменте // сохраняем в сессии номер комментария if ( isset($MSO->data['session']) ) { $CI->session->set_userdata(array( 'comments' => array( // $CI->db->insert_id()=>$comments_page_id $CI->db->insert_id() ))); } mso_email_message_new_comment($CI->db->insert_id(), $ins_data, $args['page_title']); // mso_flush_cache(); $CI->db->cache_delete_all(); mso_hook('new_comment'); mso_redirect(mso_current_url() . '#comment-' . $CI->db->insert_id()); } else return '<div class="' . $args['css_error']. '">'. t('Ошибка добавления комментария'). '</div>'; } } } } // else return '<div class="comment-new">Комментарий добавлен и возможно ожидает модерации.</div>'; } # получаем данные комюзера. # если id = 0, то номер получаем из сессии или текущего сегмента (2) function mso_get_comuser($id = 0, $args = array()) { global $MSO; if (!$id) { // не указан id, получаем его из сессии if (isset($MSO->data['session']['comuser']) and $MSO->data['session']['comuser'] ) $id = $MSO->data['session']['comuser']['comusers_id']; else $id = mso_segment(2); // или сегмент в url } if (!$id) return array(); // нет номера, выходим if (!is_numeric($id)) return array(); // если id указан не номером, выходим if ( !isset($args['limit']) ) $args['limit'] = 20; if ( !isset($args['tags']) ) $args['tags'] = '<p><img><strong><em><i><b><u><s><font><pre><code><blockquote>'; if ( !isset($args['order']) ) $args['order'] = 'comments_date'; if ( !isset($args['asc']) ) $args['asc'] = 'desc'; $CI = & get_instance(); $CI->db->select('comusers.*, COUNT(comments_comusers_id) as comusers_count_comment_real'); $CI->db->from('comusers'); $CI->db->where('comusers_id', $id); $CI->db->limit(1); // отдавать все комменты, включая и неотмодерированные //$CI->db->where('comments.comments_approved', '1'); $CI->db->join('comments', 'comusers.comusers_id = comments.comments_comusers_id', 'left'); $CI->db->group_by('comments_comusers_id'); $query = $CI->db->get(); if ($query->num_rows() > 0) { $comuser = $query->result_array(); // данные комюзера // pr($comuser); $comuser_count_comment_first = $comuser[0]['comusers_count_comments']; // первоначальное значание колво комментариев // подсоединим к нему [comments] - все его комментарии $CI->db->select('comments.*, page.page_id, page.page_title, page.page_slug'); $CI->db->from('comments'); $CI->db->where('comments_comusers_id', $id); // $CI->db->where('page.page_status', 'publish'); // $CI->db->where('page_date_publish <', date('Y-m-d H:i:s')); $CI->db->where('comments.comments_approved', '1'); $CI->db->join('page', 'page.page_id = comments.comments_page_id'); $CI->db->order_by('comments_date', $args['asc']); if ($args['limit']) $CI->db->limit($args['limit']); $query = $CI->db->get(); $comments = array(); // все комменты if ($query->num_rows() > 0) { // нужно обработать тексты комментариев на предмет всяких хуков и лишних тэгов $comments = $query->result_array(); foreach ($comments as $key=>$comment) { $comments_content = $comment['comments_content']; $comments_content = mso_xss_clean($comments_content); $comments_content = mso_auto_tag($comments_content, true); $comments_content = strip_tags($comments_content, $args['tags']); $comments_content = mso_balance_tags($comments_content); $comments_content = mso_hook('comments_content', $comments_content); $comments[$key]['comments_content'] = $comments_content; } $comuser[0]['comments'] = $comments; // $comuser[0]['comments'] = $query->result_array(); $comuser[0]['comusers_count_comments'] = count($comments); } else $comuser[0]['comments'] = array(); if ($comuser_count_comment_first != count($comments)) // колво комментариев не совпадает с реальным - нужно обновить { mso_comuser_set_count_comment($id, count($comments)); } // в секцию meta добавим все метаполя данного юзера $CI->db->select('meta_key, meta_value'); $CI->db->from('meta'); $CI->db->where('meta_table', 'comusers'); $CI->db->where('meta_id_obj', $id); $query = $CI->db->get(); if ($query->num_rows() > 0) { // переделаем полученный массив в key = value foreach ($query->result_array() as $val) { $comuser[0]['comusers_meta'][$val['meta_key']] = $val['meta_value']; } } else { $comuser[0]['comusers_meta'] = array(); } // pr($comuser); return $comuser; } else return array(); } # устанавливаем колво комментариев у указаного комюзера function mso_comuser_set_count_comment($id = 0, $count = -1) { if (!$id) return; $CI = & get_instance(); if ($count == -1) // не указано кодичество - нужно его получить { $CI->db->select('COUNT(comments_comusers_id) as comusers_count_comment_real', false); $CI->db->from('comusers'); $CI->db->where('comusers_id', $id); $CI->db->where('comments.comments_approved', '1'); $CI->db->join('comments', 'comusers.comusers_id = comments.comments_comusers_id', 'left'); $CI->db->group_by('comments_comusers_id'); $query = $CI->db->get(); if ($query->num_rows() > 0) { $comuser = $query->result_array(); // данные комюзера $count = $comuser[0]['comusers_count_comment_real']; } else $count = 0; } $CI->db->where('comusers_id', $id); $CI->db->update('comusers', array ('comusers_count_comments' => $count ) ); $CI->db->cache_delete_all(); } # обработка POST из формы комюзера function mso_comuser_edit($args = array()) { global $MSO; if ( !isset($args['css_ok']) ) $args['css_ok'] = 'comment-ok'; if ( !isset($args['css_error']) ) $args['css_error'] = 'comment-error'; # id комюзера, который в сессии if ( isset($MSO->data['session']['comuser']) and $MSO->data['session']['comuser'] ) $id_session = $MSO->data['session']['comuser']['comusers_id']; else $id_session = false; if ( $post = mso_check_post(array('f_session_id', 'f_submit', 'f_comusers_activate_key')) ) // это активация { # защита рефера mso_checkreferer(); # защита сессии - если не нужно закомментировать строчку! if ($MSO->data['session']['session_id'] != $post['f_session_id']) mso_redirect(); // получаем номер юзера id из f_submit[] $id = (int) mso_array_get_key($post['f_submit']); if (!$id) return '<div class="' . $args['css_error']. '">'. t('Ошибочный номер пользователя'). '</div>'; # проверяем id в сессии с сабмитом // if ($id != $id_session) // return '<div class="' . $args['css_error']. '">'. t('Ошибочный номер пользователя'). '</div>'; $f_comusers_activate_key = trim($post['f_comusers_activate_key']); if (!$f_comusers_activate_key) return '<div class="' . $args['css_error']. '">'. t('Неверный (пустой) ключ'). '</div>'; // нужно проверить если у указанного комюзера не равные ключи // если они равны, то ничего не делаем $CI = & get_instance(); $CI->db->select('comusers_activate_string, comusers_activate_key'); $CI->db->from('comusers'); $CI->db->where('comusers_id', $id); $CI->db->limit(1); $query = $CI->db->get(); if ($query->num_rows() > 0) { $comuser = $query->result_array(); // данные комюзера if ($comuser[0]['comusers_activate_string'] == $comuser[0]['comusers_activate_key']) { // уже равны, активация не требуется return '<div class="' . $args['css_ok']. '">'. t('Активация уже выполнена'). '</div>'; } else { // ключи в базе не равны // сверяем с переданным ключом из формы if ($f_comusers_activate_key == $comuser[0]['comusers_activate_key']) { // верный ключ - обновляем в базе $CI->db->where('comusers_id', $id); $res = ($CI->db->update('comusers', array ('comusers_activate_string' => $f_comusers_activate_key ) )) ? '1' : '0'; $CI->db->cache_delete_all(); if ($res) return '<div class="' . $args['css_ok']. '">'. t('Активация выполнена!'). '</div>'; else return '<div class="' . $args['css_error']. '">'. t('Ошибка БД при добавления ключа активации'). '</div>'; } else { return '<div class="' . $args['css_error']. '">'. t('Ошибочный ключ активации'). '</div>'; } } } else // вообще нет такого комюзера return '<div class="' . $args['css_error']. '">'. t('Ошибочный номер пользователя'). '</div>'; } elseif ( $post = mso_check_post(array('flogin_session_id', 'flogin_submit', 'flogin_user', 'flogin_password', 'flogin_redirect')) ) { // логинимся через стандартную _mso_login() _mso_login(); return; } // это форма? elseif ( $post = mso_check_post(array('f_session_id', 'f_submit', 'f_comusers_email', 'f_comusers_password', 'f_comusers_nik', 'f_comusers_url', 'f_comusers_icq', 'f_comusers_msn', 'f_comusers_jaber', 'f_comusers_date_birth', 'f_comusers_description', 'f_comusers_avatar_url')) ) // это обновление формы { if (!is_login_comuser()) return '<div class="' . $args['css_error']. '">'. t('Ошибочные данные пользователя'). '</div>'; # защита рефера mso_checkreferer(); # защита сессии - если не нужно закомментировать строчку! if ($MSO->data['session']['session_id'] != $post['f_session_id']) mso_redirect(); // получаем номер юзера id из f_submit[] $id = (int) mso_array_get_key($post['f_submit']); if (!$id) return '<div class="' . $args['css_error']. '">'. t('Ошибочный номер пользователя'). '</div>'; # проверяем id в сессии с сабмитом if ($id != $id_session) return '<div class="' . $args['css_error']. '">'. t('Ошибочный номер пользователя'). '</div>'; $f_comusers_email = trim($post['f_comusers_email']); $f_comusers_password = trim($post['f_comusers_password']); if (!$f_comusers_email or !$f_comusers_password) return '<div class="' . $args['css_error']. '">'. t('Необходимо указать email и пароль'). '</div>'; // проверим есть ли такой комюзер $CI = & get_instance(); $CI->db->select('*'); $CI->db->from('comusers'); # CodeIgniter экранирует where, даже когда только условия в полях $CI->db->where('comusers_activate_string=comusers_activate_key', '', false); // активация должна уже быть $CI->db->where(array('comusers_id'=>$id, 'comusers_email'=>$f_comusers_email, 'comusers_password'=>$f_comusers_password )); $CI->db->limit(1); $query = $CI->db->get(); if ($query->num_rows() > 0) { // все ок - логин пароль верные $comuser = $query->result_array(); // данные комюзера $f_comusers_avatar_url = mso_strip($post['f_comusers_avatar_url'], false, array('\\', '|', '?', '%', '*', '`')); $allowed_ext = array('gif', 'jpg', 'jpeg', 'png'); // разрешенные типы $ext = strtolower(str_replace('.', '', strrchr($f_comusers_avatar_url, '.'))); // расширение файла if ( !in_array($ext, $allowed_ext) ) $f_comusers_avatar_url = ''; // запрещенный тип файла if (!isset($post['f_comusers_notify'])) $post['f_comusers_notify'] = 0; $upd_date = array ( 'comusers_nik' => strip_tags($post['f_comusers_nik']), 'comusers_url' => strip_tags($post['f_comusers_url']), 'comusers_icq' => strip_tags($post['f_comusers_icq']), 'comusers_msn' => strip_tags($post['f_comusers_msn']), 'comusers_jaber' => strip_tags($post['f_comusers_jaber']), 'comusers_date_birth' => strip_tags($post['f_comusers_date_birth']), 'comusers_description' => strip_tags($post['f_comusers_description']), 'comusers_avatar_url' => $f_comusers_avatar_url, 'comusers_notify' => $post['f_comusers_notify'], ); # pr($upd_date ); $CI->db->where('comusers_id', $id); $res = ($CI->db->update('comusers', $upd_date )) ? '1' : '0'; // если переданы метаполя, то обновляем и их if (isset($post['f_comusers_meta']) and $post['f_comusers_meta']) { //pr($post); foreach($post['f_comusers_meta'] as $key => $val) { // вначале грохаем если есть такой ключ $CI->db->where('meta_table', 'comusers'); $CI->db->where('meta_id_obj', $id); $CI->db->where('meta_key', $key); $CI->db->delete('meta'); // теперь добавляем как новый $ins_data = array( 'meta_table' => 'comusers', 'meta_id_obj' => $id, 'meta_key' => $key, 'meta_value' => $val ); $CI->db->insert('meta', $ins_data); } } $CI->db->cache_delete_all(); // mso_flush_cache(); // сбросим кэш if ($res) return '<div class="' . $args['css_ok']. '">'. t('Обновление выполнено!'). '</div>'; else return '<div class="' . $args['css_error']. '">'. t('Ошибка БД при обновлении'). '</div>'; } else return '<div class="' . $args['css_error']. '">'. t('Ошибочный email и пароль'). '</div>'; } // обновление формы } # восстановление паролья комюзера function mso_comuser_lost($args = array()) { global $MSO; if ( !isset($args['css_ok']) ) $args['css_ok'] = 'comment-ok'; if ( !isset($args['css_error']) ) $args['css_error'] = 'comment-error'; # id комюзера, который в сессии - какой комюзер # если комюзер залогинен, то будет $id_session # если нет, то залогиненности нет if ( isset($MSO->data['session']['comuser']) and $MSO->data['session']['comuser'] ) $id_session = $MSO->data['session']['comuser']['comusers_id']; else $id_session = false; if ( $post = mso_check_post(array('f_session_id', 'f_submit', 'f_comusers_email')) ) // это активация { # защита рефера mso_checkreferer(); # защита сессии - если не нужно закомментировать строчку! if ($MSO->data['session']['session_id'] != $post['f_session_id']) mso_redirect(); // получаем номер юзера id из f_submit[] $id = (int) mso_array_get_key($post['f_submit']); if (!$id) return '<div class="' . $args['css_error']. '">'. t('Ошибочный номер пользователя'). '!</div>'; # проверяем id в сессии с сабмитом if ($id_session and $id != $id_session) return '<div class="' . $args['css_error']. '">'. t('Ошибочный номер пользователя2'). '</div>'; $comusers_email = trim($post['f_comusers_email']); if (!$comusers_email) return '<div class="' . $args['css_error']. '">'. t('Нужно указать email'). '</div>'; if (!mso_valid_email($comusers_email)) return '<div class="' . $args['css_error']. '">'. t('Ошибочный email'). '</div>'; $CI = & get_instance(); // проверим есть ли вообще такой юзер $CI->db->select('comusers_id'); $CI->db->where('comusers_id', $id); $CI->db->where('comusers_email', $comusers_email); $query = $CI->db->get('comusers'); if ($query->num_rows() == 0) return '<div class="' . $args['css_error']. '">'. t('Неверный email или номер пользователя'). '!</div>'; $comusers_new_password = trim($post['f_comusers_password']); $comusers_activate_key = trim($post['f_comusers_activate_key']); if ($comusers_email and !$comusers_activate_key and !$comusers_new_password) // указан email без остального { $CI->db->select('comusers_id, comusers_activate_key'); $CI->db->where('comusers_id', $id); $CI->db->where('comusers_activate_string=comusers_activate_key', '', false); // $CI->db->where('comusers_activate_key=comusers_activate_string'); $CI->db->where('comusers_email', $comusers_email); $CI->db->limit(1); $query = $CI->db->get('comusers'); if ($query->num_rows() > 0) // все верно, можно установить новый пароль { $comuser = $query->result_array(); // данные комюзера mso_email_message_new_comuser($id, array('comusers_email'=>$comusers_email, 'comusers_activate_key'=>$comuser[0]['comusers_activate_key'])); return '<div class="' . $args['css_ok']. '">'. t('Код активации отправлен на ваш email'). '!</div>'; } else return '<div class="' . $args['css_error']. '">'. t('Данный email не зарегистрирован или не активирован'). '</div>'; } elseif ($comusers_email and $comusers_new_password and !$comusers_activate_key) // нет пароля, но есть код return '<div class="' . $args['css_error']. '">'. t('Для установки нового пароля нужно заполнить все поля!'). '</div>'; elseif ($comusers_email and !$comusers_new_password and $comusers_activate_key) // нет пароля, но есть код return '<div class="' . $args['css_error']. '">'. t('Для установки нового пароля нужно заполнить все поля!'). '</div>'; // если указано поле активации и новый пароль, то сверяем код активации с базой + email + id и если все верно, // то обновляем пароль // если же поле активации не указано, то высылаем его на указанный email $CI->db->select('comusers_id'); $CI->db->where('comusers_id', $id); $CI->db->where('comusers_activate_key', $comusers_activate_key); $CI->db->where('comusers_activate_string', $comusers_activate_key); $CI->db->where('comusers_email', $comusers_email); $CI->db->limit(1); $query = $CI->db->get('comusers'); if ($query->num_rows() > 0) // все верно, можно установить новый пароль { $CI->db->where('comusers_id', $id); $CI->db->where('comusers_email', $comusers_email); $res = ($CI->db->update('comusers', array ('comusers_password' => mso_md5($comusers_new_password)))) ? '1' : '0'; $CI->db->cache_delete_all(); if ($res) return '<div class="' . $args['css_ok']. '">'. t('Новый пароль установлен!'). '</div>'; else return '<div class="' . $args['css_error']. '">'. t('Ошибка БД при смене пароля...'). '</div>'; } else return '<div class="' . $args['css_error']. '">'. t('Данные указаны неверно!'). '</div>'; } } # список всех комюзеров function mso_get_comusers_all($args = array()) { $cache_key = mso_md5('mso_get_comusers_all'); $k = mso_get_cache($cache_key); if ($k) return $k; // да есть в кэше $comusers = array(); $CI = & get_instance(); $CI->db->select('*'); $CI->db->from('comusers'); $query = $CI->db->get(); if ($query->num_rows() > 0) { $comusers = $query->result_array(); mso_add_cache($cache_key, $comusers); } // получим все мета одним запросом $CI->db->select('meta_id_obj, meta_key, meta_value'); $CI->db->where('meta_table', 'comusers'); $CI->db->order_by('meta_id_obj'); $query = $CI->db->get('meta'); if ($query->num_rows() > 0) $all_meta = $query->result_array(); else $all_meta = array(); // переделываем формат массива, чтобы индекс был равен номеру комюзера $r_array = array(); foreach ($all_meta as $val) { $r_array[$val['meta_id_obj']][$val['meta_key']] = $val['meta_value']; } $all_meta = $r_array; // получить все номера страниц, где оставил комментарий комюзер $CI->db->select('comments_id, comments_page_id, comments_comusers_id'); $CI->db->where('comments_comusers_id >', '0'); $CI->db->order_by('comments_comusers_id, comments_page_id'); $query = $CI->db->get('comments'); if ($query->num_rows() > 0) $all_comments = $query->result_array(); else $all_comments = array(); // переделываем массив под удобный формат $r_array = array(); $all_comments_page_id = array(); // тут массив номеров страниц, где участвовал комюзер foreach ($all_comments as $val) { $r_array[ $val['comments_comusers_id'] ][ $val['comments_id'] ] = $val['comments_page_id']; $all_comments_page_id[ $val['comments_comusers_id'] ][ $val['comments_page_id'] ] = $val['comments_page_id']; } $all_comments = $r_array; // добавляем в каждого комюзера элемент массива meta, comments и comments_pages_id $r_array = array(); foreach ($comusers as $key=>$val) { $r_array[$key] = $val; if (isset($all_meta[$val['comusers_id']])) $r_array[$key]['meta'] = $all_meta[$val['comusers_id']]; else $r_array[$key]['meta'] = array(); if (isset($all_comments[$val['comusers_id']])) $r_array[$key]['comments'] = $all_comments[$val['comusers_id']]; else $r_array[$key]['comments'] = array(); if (isset($all_comments_page_id[$val['comusers_id']])) $r_array[$key]['comments_pages_id'] = $all_comments_page_id[$val['comusers_id']]; else $r_array[$key]['comments_pages_id'] = array(); } $comusers = $r_array; mso_add_cache($cache_key, $comusers); return $comusers; } function mso_comments_content($text = '') { return $text; } # рассылаем по email уведомление о новом комментарии function mso_email_message_new_comment_subscribe($data) { /* Array ( [comments_page_id] => 153 - id страницы [comments_content] => sdafsadfsdaf - текст комментария [comments_approved] => - если 0, то отправки нет [page_title] => тест - заголовок страницы [id] => 607 - id комментария -- [comments_comusers_id] => 1 - номер комюзера - пока не используется -- [comments_date] => 2009-12-10 20:45:39 - дата - пока не используется -- [comments_author_ip] => 127.0.0.1 - ip - пока не используется ) */ // комментарий не одобрен, не отсылаем if ($data['comments_approved'] == 0) return; // разослать нужно всем комюзерам у которых стоит получение уведомления о новом комментарии $CI = & get_instance(); $comusers_all = mso_get_comusers_all(); // все комюзеры $from = mso_get_option('admin_email_server', 'general', ''); $subject = '[' . getinfo('name_site') . '] ' . t('Новый комментарий к') . ' "'. $data['page_title'] . '"'; $message = t('Новый комментарий к') . ' "' . $data['page_title'] . '"' . NR . NR; $message .= t('Текст:') . NR . mso_xss_clean($data['comments_content']); $message .= NR . NR . t('Перейти к комментарию на сайте:') . NR . mso_get_permalink_page($data['comments_page_id']) . '#comment-' . $data['id'] . NR; foreach($comusers_all as $comuser) { // отправлять на все комментарии сайта $subscribe_other_comments = (isset($comuser['meta']['subscribe_other_comments']) and $comuser['meta']['subscribe_other_comments']) ? true : false; // только на свой $subscribe_my_comments = (isset($comuser['meta']['subscribe_my_comments']) and $comuser['meta']['subscribe_my_comments']) ? true : false; if ( $subscribe_other_comments // на любой коммент or ( $subscribe_my_comments // только свой and isset($comuser['comments_pages_id'][$data['comments_page_id']]) ) ) { // можно отправлять if (mso_valid_email($comuser['comusers_email'])) { $res = mso_mail($comuser['comusers_email'], $subject, $message, $from); if (!$res) break; // ошибка отправки почты - рубим цикл } } } } # end file