Ris

Ris

+657
Репутация
3768
Рейтинг
#1 [ЕСТЬ РЕШЕНИЕ] Белая страница, регистрация и авторизация! 2 мая 2015 в 15:48
vsemkrot,

Даже если войду так, то это проблему нерешит

vsemkrot

Ну а отладку хотя-бы позволит включить из админки?

Вообще траблшутинг вещь такая, что надо сначала локализовать место трабла.
Что бы я сделал в такой ситуации:
1. Установил на локальном компе денвер, установил бы дефолтный сайт и подключил бы базу от рабочего сайта. База подключается в файле
\system\config\config.php там прописывается db_host, db_base и db_user. Можно просто скопировать этот файл с рабочего сайта и изменить db_host на айпи сайта.
2. Проверить, работает ли в таком виде. Если работает — проблема в файлах на сайте. Если нет — что-то не так настроено в админке.
3. Подбросить шаблон с рабочего сайта, проверить повторится ли проблема. Если проблема в шаблоне — подкинуть стили из дефолтного, убедиться не в этом ли проблема.

Ну и так далее, пока не выяснится в каком файле трабла.
#2 [ЕСТЬ РЕШЕНИЕ] Белая страница, регистрация и авторизация! 2 мая 2015 в 14:22
vsemkrot,
А если зарегистрировать нового юзера, назначить его админом прямо через phpmyadmin (поставить ему 1 в колонке is_admin) и войти под ним в админку? Тоже белое поле?
#3 Авторизация по nickname в Instant2 2 мая 2015 в 14:02
Raiden,
Туда, с кем совпадет пароль. Уже проверил. laugh

Собственно, сама неуникальность ников — не очень правильное явление. На нашем сайте наш разработчик запретил этот волюнтаризьм.
#4 Авторизация по nickname в Instant2 2 мая 2015 в 13:55
PIN,
Регистрация с существующим ником возможна изначально. И я тут совершенно не при чем. laugh

По поводу двойной авторизации не понял. Задайте вопрос более развернуто.
#5 Авторизация по nickname в Instant2 2 мая 2015 в 13:42
PIN,
Если не проходит авторизация по нику — if(!$user) — предпринимается попытка авторизации по мылу.
Я проверял на чистом, свежеустановленном сайте. Все работает. Авторизует как по нику, так и по мылу.
#1 Авторизация по nickname в Instant2 2 мая 2015 в 13:18
Возможно, некоторым пользователям не очень удобно авторизовываться по имейл/пароль. На нашем сайте некоторые юзеры вообще не помнят, с какого мыла они регистрировались и спрашивают об этом у администратора сайта. shock

Поэтому сделал небольшой хак, добавляющий возможность авторизации по нику.
Делать особо ничего не надо, просто изменить public static function login в файле \system\core\user.php

Убираем проверку мыла на мыльность и меняем местами слово email на nickname:

  1. public static function login($nickname, $password, $remember=false) {
  2.  
  3.  
  4.  
  5. $model = cmsCore::getModel('users');
  6.  
  7. $model->filterEqual('nickname', $nickname);
  8. $model->filterFunc('password', "MD5(CONCAT(MD5('{$password}'), i.password_salt))");
  9.  
  10. $user = $model->getUser();
  11.  
  12. if(!$user) {
  13. $model->filterEqual(('email'), $nickname);
  14. $model->filterFunc('password', "MD5(CONCAT(MD5('{$password}'), i.password_salt))");
  15.  
  16. $user = $model->getUser();
  17. }
  18.  
  19. if(!$user) {
  20. $user = cmsEventsManager::hook('user_auth_error', array('email'=>$email,'password'=>$password));
  21. }
  22.  
  23. if (empty($user['id'])) { return false; }
  24.  
  25. $user = cmsEventsManager::hook('user_login', $user);
  26.  
  27. self::sessionSet('user', array(
  28. 'id' => $user['id'],
  29. 'groups' => $user['groups'],
  30. 'time_zone' => $user['time_zone'],
  31. 'perms' => self::getPermissions($user['groups'], $user['id']),
  32. 'is_admin' => $user['is_admin'],
  33. ));
  34.  
  35. if ($remember){
  36.  
  37. $auth_token = string_random(32, $email);
  38. self::setCookie('auth', $auth_token, 8640000); //100 дней
  39.  
  40. $model->update('cms_users', $user['id'], array('auth_token'=>$auth_token));
  41.  
  42. }
  43.  
  44. $model->update('cms_users', $user['id'], array(
  45. 'ip' => self::getIp()
  46. ));
  47.  
  48. return $user['id'];
  49.  
  50. }
При неудаче авторизации по нику, функция предпринимает попытку авторизации по мылу. Поэтому авторизация по email тоже остается возможной.

Если это как-то нарушает безопасность или еще что — знатокам просьба сообщить.
#6 Уведомления об ответе на ваш комментарий на сайте. 20 марта 2015 в 20:38
PIN,
Если честно, я тоже не люблю различных доработок кода не от создателя CMS. При любом обновлении именно в месте хака, как правило, возникают проблемы. Но уведомления на сайте — вещь нужная.
Матроскин интересовался по этому поводу — ему никто ничего не ответил.
Если разработчики озаботятся этим вопросом — огромный им респект!
#1 Уведомления об ответе на ваш комментарий на сайте. 20 марта 2015 в 16:47
Сколько тут люди не просили сделать уведомления об ответе в PM — решения так и не нашел. Поэтому пришлось допилить самому.
Итак, нам потребуется доработать всего три файла:
\system\controllers\comments\hooks\user_notify_types.php
\system\controllers\comments\frontend.php
\system\languages\ru\controllers\comments\comments.php

В файле \system\controllers\comments\hooks\user_notify_types.php просто стираем строку 'options'. Получается так:
  1. <?php
  2.  
  3. class onCommentsUserNotifyTypes extends cmsAction {
  4.  
  5. public function run(){
  6.  
  7. return array(
  8. 'comments_new' => array(
  9. 'title'=>LANG_COMMENTS_NOTIFY_NEW
  10. ),
  11. 'comments_reply' => array(
  12. 'title'=>LANG_COMMENTS_NOTIFY_REPLY,
  13.  
  14. )
  15. );
  16.  
  17. }
  18.  
  19. }
  20.  
В файле \system\controllers\comments\frontend.php изменяем функцию notifyParent.

  1.  
  2. public function notifyParent($comment, $parent_comment){
  3.  
  4. if ($comment['user_id'] && ($comment['user_id'] == $parent_comment['user_id'])) { return; }
  5.  
  6. $messenger = cmsCore::getController('messages');
  7.  
  8. $page_url = href_to($comment['target_url']) . "#comment_{$comment['id']}";
  9.  
  10. $notice = array(
  11.  
  12. 'content' => sprintf(LANG_COMMENTS_REPLY),
  13. 'actions' => array(
  14. 'view' => array(
  15. 'title' => LANG_SHOW,
  16. 'href' => href_to( $page_url )
  17. ),));
  18.  
  19. if (!$is_guest_parent){
  20. $messenger->addRecipient($parent_comment['user_id']);
  21. $messenger->sendNoticePM($notice,'comments_reply');
  22. }
  23.  
  24. if ($is_guest_parent){
  25. $letter_data['nickname'] = $parent_comment['author_name'];
  26. $to = array('name' => $parent_comment['author_name'], 'email' => $parent_comment['author_email']);
  27. $letter = array('name' => 'comments_reply');
  28. $messenger->sendEmail($to, $letter, $notice);
  29. }
  30.  
  31. }
  32.  
В файле \system\languages\ru\controllers\comments\comments.php добавляем строку
  1. define('LANG_COMMENTS_REPLY', 'На ваш комментарий ответили. Ответ выделен рамкой');
Потом идем в настройки профиля на сайте и выставляем получение уведомлений об ответак на комментарии "на сайте", вот так:
В результате приходят вот такие уведомления:

__________________________________

Если кому-нибудь в окне уведомления недостаточно маленького крестика в углу, а нужна глобальная кнопка "Закрыть" — в файл \system\languages\ru\controllers\comments\comments.php добавляем строку:

  1. define('LANG_TRACK_STOP', 'Закрыть');
а функцию notifyParent дополняем так:
  1. public function notifyParent($comment, $parent_comment){
  2.  
  3. if ($comment['user_id'] && ($comment['user_id'] == $parent_comment['user_id'])) { return; }
  4.  
  5. $messenger = cmsCore::getController('messages');
  6.  
  7. $page_url = href_to($comment['target_url']) . "#comment_{$comment['id']}";
  8.  
  9. $notice = array(
  10.  
  11. 'content' => sprintf(LANG_COMMENTS_REPLY),
  12. 'actions' => array(
  13. 'view' => array(
  14. 'title' => LANG_SHOW,
  15. 'href' => href_to( $page_url )
  16. ),
  17. 'stop' => array(
  18. 'title' => LANG_TRACK_STOP,
  19. 'controller' => $this->name,
  20. 'action' => 'track_stop',
  21. 'params' => array($data['target_controller'], $data['target_subject'], $data['target_id']),
  22. ));
  23.  
  24. if (!$is_guest_parent){
  25. $messenger->addRecipient($parent_comment['user_id']);
  26. $messenger->sendNoticePM($notice,'comments_reply');
  27. }
  28.  
  29. if ($is_guest_parent){
  30. $letter_data['nickname'] = $parent_comment['author_name'];
  31. $to = array('name' => $parent_comment['author_name'], 'email' => $parent_comment['author_email']);
  32. $letter = array('name' => 'comments_reply');
  33. $messenger->sendEmail($to, $letter, $notice);
  34. }
  35.  
  36. }
В результате получается такое уведомление:


В пыхе не понимаю совершенно ничего, поэтому функция получилась примитивной, не содержит никакой информации и просто отправляет на ответ.
Если кто сможет добавить в окно уведомления ник ответившего и информацию на какой странице (заголовок страницы) — буду очень признателен.
#7 Нагрузка на базу выросла при переходе на 1.10.6 10 марта 2015 в 19:32
Такое чуйство, что надо в админке включить дебаг (даже на продакшене) и хотя бы час помониторить что оно там пишет.
Результаты сохранить и проанализировать.
#8 IS_VOTED? 6 февраля 2015 в 23:23
Rossoman,
Меня интересует, как оно определяет is_voted?
И почему у меня не получается переделать данную процедуру просто скопировав функцию в модель моего компонента и переименовав все слова "comment" в "faq".
#9 IS_VOTED? 6 февраля 2015 в 23:07
Rossoman,
Спасибо за совет, но боюсь при моем знании пехапе я пока не готов к реализации данного метода.
Пока попробую изучить, что написали умные люди в файле components/comments/model.php

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

Скажите, каким образом у Вас запоминаются в базе юзеры которые проголосовали? Как называется столбец с проголосовавшими юзерами?

Rossoman
Также, как и юзеры проголосовавшие за комментарии.
В Таблице cms_faq_quests добавлен столбец rating. В этом столбце указывается рейтинг вопроса в соотношении к id вопроса. user_id там не учитывается никак.


Но, в таблице cms_ratings голоса учитываются.

Нужно просто изъять соответствие item_id и user_id из таблицы cms_ratings и в случае совпадения не показывать юзеру голосовалку.
В комментариях это как-то же работает.

Причем видно в каких файлах производится выборка из cms_ratings

И, что интересно в форумах нигде выборка из cms_ratings не используется, хотя там тоже есть голосование за посты!
Следовательно, различение голосовавших от неголосовавших происходит где-то в файле \core\lib_karma.php

Вопрос, как эти данные оттуда выцарапать?
#12 IS_VOTED? 6 февраля 2015 в 20:36

И как вы вообще написали компонент, если не можете вытащить значение из базы?

Rossoman
Я не написал компонент, а создал новый компонент из компонента faq. Тупо переименовал все переменные из faq в anec. И это всё работает, как ни странно. То есть вместо вопросов теперь можно размещать шутки\анекдоты\афоризмы\истории и голосовать за это по десятибалльной (да хоть сколькоугоднобалльной) шкале. Голосовалка тупо взята из comments и дополнена. Единственно, что не работает — различение голосовавших юзеров от неголосовавших.

Не зная структуры базы, никто вам не поможет.

Rossoman
В таблицу cms_faq_quests был тупо добавлен столбец rating. А в таблицу cms_rating_targets тупо добавлен столбец quests.

У вас проблема заключается в написании кода? Вам нужно предоставить готовое решение, то есть написать код?

Rossoman
Еще раз переосмыслил всё сказанное.
На самом деле, мне нужно просто разъяснить, как различаются проголосовавшие и неголосовавшие юзеры в компонентах comments и forum.
#13 IS_VOTED? 6 февраля 2015 в 20:25

Вам нужно предоставить готовое решение, то есть написать код?

Rossoman
Да.
Мне нужно написать код, как отличить голосовавшего юзера от неголосовавшего.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.