Определение ОС и браузера пользователя

#16 6 октября 2011 в 17:55

Представь страницу с сотней комментов.
Для каждого коммента, при каждом просмотре придется вычислять то что можно получить 1 раз и потом просто брать с базы. Зачем же делать 100 разборов строки если можно сделать 1 ?

Max
А если захочешь в будущем изменить стиль вывода или картинку заменить, всю базу будешь перелопачивать? Тем более, что там уже давно ведется запись именно строки юзерагента. В Wordpress плагин брал данные из БД, нормально.
P.S. Может, я все-таки не там пытаюсь делать? Может, в компоненте надо, а не в модуле?

UPD1: Я дурак. {$comment.useragent} в шаблоне как раз берет данные сразу из БД, и то, что там в модуле понаписано, его вообще не волнует, из модуля правки убрал, они не нужны. Буду копать компонент.

UPD2: При изменении компонента, в шаблоне ничего не изменяется, хотя кеш чистил. Вообще без понятия, что я не так делаю, но структура Инстанта для меня — это темный лес.

UPD3: Нашел, что нужно править функцию public function getComments($target, $target_id, $cfg) в /components/comments/model.php. В цикле while($comment = $this->inDB->fetch_assoc($result)) если вставить $comment['useragent'] = "123", то во всех комментариях будет выводиться уже не строка юзерагента, а 123. Вот только не могу подключить useragent.php так, чтобы потом вызывалась функция из него, хотя бы detect_browser_version($comment['useragent']).
#17 6 октября 2011 в 20:18

P.S. Может, я все-таки не там пытаюсь делать? Может, в компоненте надо, а не в модуле?

del
Конечно нужен компонент, модуль всего лишь занимается выводом последних сообщений в боковом окошке… Впрочем, ты это вроде уже понял...

Раздели проблемы на части и решай постепенно, а то одновременно пытаешься узнать как работает смарти, как подключить сторонний скрипт, и др.
Я уже потерял суть, что конкретно не получается.

Нашел, что нужно править функцию public function getComments($target, $target_id, $cfg) в /components/comments/model.php.

del
Возможно лучше править не model.php а frontend.php там где формируются массивы для передачи шаблону.

Вот только не могу подключить useragent.php так, чтобы потом вызывалась функция из него, хотя бы detect_browser_version($comment['useragent']).

del
detect_browser_version — это не та функция что нужна(она стоит в общей цепочке в середине и всего-лишь определят номер версии браузера.
Тебе нужна display_useragent
#18 6 октября 2011 в 20:39

Возможно лучше править не model.php а frontend.php там где формируются массивы для передачи шаблону.

Max
Там я пытался править, но правки не вносят никаких изменений, не знаю почему.

detect_browser_version — это не та функция что нужна(она стоит в общей цепочке в середине и всего-лишь определят номер версии браузера.
Тебе нужна display_useragent

Max
Да я в курсе, я же и писал, что "хотя бы" эту функцию, если уж в другой, возможно, присутствует ошибка. Я даже пытался в model.php воткнуть тупо функцию test(), возвращающую "123", и в фукнции getComments вызвать функцию test(). Не получается.

Я уже потерял суть, что конкретно не получается.

Max
Смотри. Мне нужно сейчас подключить useragent.php и прогнать через него $comment['useragent']. Вот, что я делаю:

  1. public function getComments($target, $target_id, $cfg){
  2.  
  3. $comments = array();
  4.  
  5. if (!$cfg['edit_minutes']) { $cfg['edit_minutes'] = 0; }
  6.  
  7. $sql = "SELECT c.*,
  8. IFNULL(v.total_rating, 0) as votes,
  9. IFNULL(u.nickname, 0) as nickname,
  10. IFNULL(u.login, 0) as login,
  11. IFNULL(c.useragent, 0) as useragent,
  12. IFNULL(u.is_deleted, 0) as is_deleted,
  13. IFNULL(p.imageurl, 0) as imageurl,
  14. (NOW() < DATE_ADD(c.pubdate, INTERVAL {$cfg['edit_minutes']} MINUTE)) as is_editable
  15. FROM cms_comments c
  16. LEFT JOIN cms_ratings_total v ON v.item_id = c.id AND v.target = 'comment'
  17. LEFT JOIN cms_users u ON u.id = c.user_id
  18. LEFT JOIN cms_user_profiles p ON p.user_id = u.id
  19. WHERE c.target='$target' AND c.target_id=$target_id AND c.published=1
  20. ORDER BY c.pubdate ASC";
  21.  
  22. $result = $this->inDB->query($sql);
  23.  
  24. if (!$this->inDB->num_rows($result)) { return false; }
  25.  
  26. while($comment = $this->inDB->fetch_assoc($result)){
  27. $comment['fpubdate'] = cmsCore::dateFormat($comment['pubdate'], true, true);
  28.  
  29. // include('/useragent/useragent.php');
  30. // $comment['useragent'] = detect_browser_version($comment['useragent']);
  31.  
  32.  
  33. $comments[] = $comment;
  34. }
  35.  
  36. $comments = cmsCore::callEvent('GET_COMMENTS', $comments);
  37.  
  38. return $comments;
  39.  
  40. }
Смотри закомментированные строчки. Заинклудить пытался и вне описания функции, толку 0. ЧЯДНТ?
#19 6 октября 2011 в 21:10

Смотри закомментированные строчки. Заинклудить пытался и вне описания функции, толку 0. ЧЯДНТ?

del
Тут все норм. Надо править саму функцию к которой обращаешься:
— получить аргумент в начале
— вернуть результат в конце
#20 6 октября 2011 в 21:12

Тут все норм. Надо править саму функцию к которой обращаешься:
— получить аргумент в начале
— вернуть результат в конце

Max
Не понял. У меня же аргумент передается в скобках. И значение функции возвращается.
#21 6 октября 2011 в 21:23
В вызове функции ты его передаешь, а вот сама функция его не принимает.
Надо подредактировать функцию
— в скобках назначить имя переменной которую примет.
— в конце передать результат — конструкцией return
#22 6 октября 2011 в 21:33

Надо подредактировать функцию

Max
Не понял. Какую функцию то? У меня их куча. getComments или display_useragent()? return у меня и так присутствует везде.
Я нашел еще косяк в инклуде… Как-то не догадался сразу выставить php_flag display_errors On, инклуд работает, если убрать в начале "/", иначе выдает, что вызвана не объявленная функция. Но тогда другая проблема:

Fatal error: Cannot redeclare detect_browser_version() (previously declared in /var/www/home/.../useragent/useragent.php:7) in /var/www/home/.../useragent/useragent.php on line 60

Что он пытается переназначить, я не понял, т.к. 7 строка — это начало функции, а 60 — как раз-таки ее конец.
#23 6 октября 2011 в 21:55

Какую функцию то? У меня их куча. getComments или display_useragent()? return у меня и так присутствует везде.

del
Той которой передаешь аргумент. В твоем примере кода — display_useragent, она же и должна вернуть значение.
#24 6 октября 2011 в 22:11

Той которой передаешь аргумент. В твоем примере кода — display_useragent, она же и должна вернуть значение.

Max
Понял. Только все равно ничего не получается. Тем более, что иногда обновление страницы происходит нормально, а иногда выдается Fatal error, описанная выше. Что за бред, вообще не понятно. Ладно, гиблое это дело. Для меня Ruby on Rails куда проще, чем это, уж не знаю почему…
#25 6 октября 2011 в 22:44
Ну может кто-нибудь потом переделает и под инстант…
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.