// pr($post); $f_check_comments = $post['f_check_comments']; // номера отмеченных // на всякий случай пройдемся по массиву и составим массив из ID $arr_ids = array(); // список всех где ON foreach ($f_check_comments as $id_com => $val) { if ($val) { $arr_ids[] = $id_com; } } $CI->db->where_in('comments_id', $arr_ids); if ($CI->db->delete('comments')) { mso_flush_cache(); // синхронизация количества комментариев у комюзеров mso_comuser_update_count_comment(); echo '<div class="update">' . t('Удалено!') . '</div>'; } else { echo '<div class="error">' . t('Ошибка удаления') . '</div>'; } } ?> <h1><?php echo t('Комментарии'); ?> </h1> <p class="info"><?php echo t('Последние комментарии'); ?> </p>
function mso_get_new_comment($args = array()) { global $MSO; $args = mso_hook('mso_get_new_comment_args', $args); 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'] . '">' . tf('Ошибка сессии! Обновите страницу') . '</div>'; } if (!$post['comments_page_id']) { return '<div class="' . $args['css_error'] . '">' . tf('Ошибка!') . '</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'] . '">' . tf('Ошибка!') . '</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'] . '">' . tf('Ошибка! Неверно введены нижние символы!') . '</div>'; } } // вычищаем от запрещенных тэгов if ($args['tags']) { $t = $post['comments_content']; $t = strip_tags($t, $args['tags']); // оставим только разрешенные тэги $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'] . '">' . tf('Обнаружена XSS-атака!') . '</div>'; } if (!trim($post['comments_content'])) { return '<div class="' . $args['css_error'] . '">' . tf('Ошибка, нет текста!') . '</div>'; } // возможно есть текст, но только из одних html - не пускаем if (!trim(strip_tags(trim($post['comments_content'])))) { return '<div class="' . $args['css_error'] . '">' . tf('Ошибка, нет полезного текста!') . '</div>'; } // вычищаем текст от xss if ($args['xss_clean']) { $post['comments_content'] = mso_xss_clean($post['comments_content']); // проставим pre исправление ошибки CodeIgniter $post['comments_content'] = str_replace('</pre>', '</pre>', $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']); // есть дли родитель у комментария $comments_parent_id = isset($post['comments_parent_id']) ? $post['comments_parent_id'] : '0'; // провека на спам - проверим через хук 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, 'comments_parent_id' => $comments_parent_id, 'comments_author' => isset($post['comments_author']) ? $post['comments_author'] : false, 'comments_email' => isset($post['comments_email']) ? $post['comments_email'] : false, 'comusers_email' => isset($post['comusers_email']) ? $post['comusers_email'] : false, 'comments_user_id' => isset($post['comments_user_id']) ? $post['comments_user_id'] : false, 'comments_comusers_nik' => isset($post['comments_comusers_nik']) ? $post['comments_comusers_nik'] : false, 'comments_comusers_url' => isset($post['comments_comusers_url']) ? $post['comments_comusers_url'] : false), 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'] . '">' . tf('Ваш комментарий определен как спам и удален.') . '</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'] . '">' . tf('Похоже, вы уже отправили этот комментарий...') . '</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_parent_id' => $comments_parent_id, 'comments_approved' => 1); $res = $CI->db->insert('comments', $ins_data) ? '1' : '0'; if ($res) { $id_comment_new = $CI->db->insert_id(); 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'); mso_redirect(mso_current_url() . '#comment-' . $id_comment_new); } else { return '<div class="' . $args['css_error'] . '">' . tf('Ошибка добавления комментария') . '</div>'; } } else { if (isset($post['comments_reg'])) { if ($post['comments_reg'] == 'reg') { // проверим есть ли разршение на комментарии от комюзеров // для случаев подделки post-запроса if (!mso_get_option('allow_comment_comusers', 'general', '1')) { return '<div class="' . $args['css_error'] . '">' . tf('Error allow_comment_comusers') . '</div>'; } if (!isset($post['comments_email']) or !$post['comments_email']) { return '<div class="' . $args['css_error'] . '">' . tf('Нужно указать Email') . '</div>'; } if (!isset($post['comments_password']) or !$post['comments_password']) { return '<div class="' . $args['css_error'] . '">' . tf('Нужно указать пароль') . '</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'] . '">' . tf('Ошибочный Email') . '</div>'; } // проверим время последнего комментария чтобы не очень часто if (!mso_last_activity_comment()) { return '<div class="' . $args['css_error'] . '">' . tf('Слишком частые комментарии. Попробуйте позже.') . '</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'] . '">' . tf('Неверный пароль') . '</div>'; } } else { if ($row['comusers_password'] != mso_md5($comments_password)) { // пароль неверный return '<div class="' . $args['css_error'] . '">' . tf('Неверный пароль') . '</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']; $ins_data['comusers_notify'] = '1'; // сразу включаем подписку на уведомления // если сразу отправлен адрес ссайта if (isset($post['comments_comusers_url']) and $post['comments_comusers_url']) { $comusers_url = htmlspecialchars(mso_xss_clean(strip_tags($post['comments_comusers_url']))); if (strpos($comusers_url, 'http://') === false) { $comusers_url = 'http://' . $comusers_url; } if ($comusers_url) { $ins_data['comusers_url'] = $comusers_url; } } // если сразу отправлен ник if (isset($post['comments_comusers_nik']) and $post['comments_comusers_nik']) { $ins_data['comusers_nik'] = htmlspecialchars(mso_xss_clean(strip_tags($post['comments_comusers_nik']))); } // Автоматическая активация новых комюзеров // если активация стоит автоматом, то сразу её и прописываем if (mso_get_option('comusers_activate_auto', 'general', '0')) { $ins_data['comusers_activate_string'] = $ins_data['comusers_activate_key']; } $res = $CI->db->insert('comusers', $ins_data) ? '1' : '0'; if ($res) { // сохраним в сессии время отправления комментария - используется в mso_last_activity_comment $CI->session->set_userdata('last_activity_comment', time()); $comusers_id = $CI->db->insert_id(); // номер добавленной записи // нужно добавить опцию в мета «новые комментарии, где я участвую» subscribe_my_comments // вначале грохаем если есть такой ключ $CI->db->where('meta_table', 'comusers'); $CI->db->where('meta_id_obj', $comusers_id); $CI->db->where('meta_key', 'subscribe_my_comments'); $CI->db->delete('meta'); // теперь добавляем как новый $ins_data2 = array('meta_table' => 'comusers', 'meta_id_obj' => $comusers_id, 'meta_key' => 'subscribe_my_comments', 'meta_value' => '1'); $CI->db->insert('meta', $ins_data2); // почему CodeIgniter не может так? // INSERT INTO table SET column = 1, id=1 ON DUPLICATE KEY UPDATE column = 2 // отправляем ему уведомление с кодом активации mso_email_message_new_comuser($comusers_id, $ins_data, mso_get_option('comusers_activate_auto', 'general', '0')); mso_flush_cache(); $CI->db->cache_delete_all(); } else { return '<div class="' . $args['css_error'] . '">' . tf('Ошибка регистрации') . '</div>'; } } if ($comusers_id) { // Модерация комюзеров 1 - модерировать $comments_com_approved = mso_get_option('new_comment_comuser_moderate', 'general', 1); // если включена модерация комюзеров // и включена опция только первого комментария // то получаем кол-во комментариев комюзера if ($comments_com_approved and mso_get_option('new_comment_comuser_moderate_first_comment', 'general', 0)) { $all_comusers = mso_comuser_update_count_comment(); // список комюзер => колво комментов // есть такой комюзер и у него более 1 комментария if (isset($all_comusers[$comusers_id]) and $all_comusers[$comusers_id] > 0) { $comments_com_approved = 0; } // разрешаем публикацию } // но у нас в базе хранится значение наоборот - 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, 'comments_parent_id' => $comments_parent_id); // проверим время последнего комментария чтобы не очень часто if (!mso_last_activity_comment()) { return '<div class="' . $args['css_error'] . '">' . tf('Слишком частые комментарии. Попробуйте позже.') . '</div>'; } $res = $CI->db->insert('comments', $ins_data) ? '1' : '0'; if ($res) { // сохраним в сессии время отправления комментария - используется в mso_last_activity_comment $CI->session->set_userdata('last_activity_comment', time()); $id_comment_new = $CI->db->insert_id(); // посколько у нас идет редирект, то данные об отправленном комменте // сохраняем в сессии номер комментария if (isset($MSO->data['session'])) { $CI->session->set_userdata(array('comments' => array($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(true) . '#comment-' . $id_comment_new); exit; } mso_redirect(mso_current_url() . '#comment-' . $id_comment_new); } else { return '<div class="' . $args['css_error'] . '">' . tf('Ошибка добавления комментария') . '</div>'; } } } elseif ($post['comments_reg'] == 'noreg') { // комментарий от анонима // проверим есть ли разрешение на комментарии от анонимов // для случаев подделки post-запроса if (!mso_get_option('allow_comment_anonim', 'general', '1')) { return '<div class="' . $args['css_error'] . '">' . tf('Error allow_comment_anonim') . '</div>'; } // проверим время последнего комментария чтобы не очень часто if (!mso_last_activity_comment()) { return '<div class="' . $args['css_error'] . '">' . tf('Слишком частые комментарии. Попробуйте позже.') . '</div>'; } 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 = htmlspecialchars(trim($comments_author_name)); if (!$comments_author_name) { $comments_author_name = tf('Аноним'); } } 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, 'comments_parent_id' => $comments_parent_id); $res = $CI->db->insert('comments', $ins_data) ? '1' : '0'; if ($res) { $id_comment_new = $CI->db->insert_id(); // сохраним в сессии время отправления комментария - используется в mso_last_activity_comment $CI->session->set_userdata('last_activity_comment', time()); // посколько у нас идет редирект, то данные об отправленном комменте // сохраняем в сессии номер комментария if (isset($MSO->data['session'])) { $CI->session->set_userdata(array('comments' => array($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'); mso_redirect(mso_current_url() . '#comment-' . $id_comment_new); } else { return '<div class="' . $args['css_error'] . '">' . tf('Ошибка добавления комментария') . '</div>'; } } } } } }