Как передать значение переменной из js в php

Проблемы с яваскриптом

#1 25 ноября 2015 в 22:36
Потребовалось для одного из типов контента несколько расширить функцию рейтинга. Вместо "нравится-не нравится" нужно сделать голосование по шестибалльной системе. +5 +3 +1 -1 -3 -5
Как сделать шесть кнопок, вроде разобрался.

  1. <?php if ($target_subject == 'anec'){ ?>
  2. <div class="arrow up">
  3. <?php if ($is_enabled){ ?>
  4. <a href="#vote-up" class="vote-up" title="<?php echo LANG_RATING_VOTE_UP; ?>"></a>
  5. <?php } else { ?>
  6. <span class="disabled" title="<?php html( $is_voted ? LANG_RATING_VOTED : LANG_RATING_DISABLED ); ?>">+5</span>
  7. <?php } ?>
  8. </div>
  9. <div class="arrow up">
  10. <?php if ($is_enabled){ ?>
  11. <a href="#vote-up" class="vote-up" title="<?php echo LANG_RATING_VOTE_UP; ?>"></a>
  12. <?php } else { ?>
  13. <span class="disabled" title="<?php html( $is_voted ? LANG_RATING_VOTED : LANG_RATING_DISABLED ); ?>">+3</span>
  14. <?php } ?>
  15. <?php } ?>
  16. </div>
  17. <div class="arrow up">
  18. <?php if ($is_enabled){ ?>
  19. <a href="#vote-up" class="vote-up" title="<?php echo LANG_RATING_VOTE_UP; ?>"></a>
  20. <?php } else { ?>
  21. <span class="disabled" title="<?php html( $is_voted ? LANG_RATING_VOTED : LANG_RATING_DISABLED ); ?>">+1</span>
  22. <?php } ?>
  23. </div>
  24.  
  25. <div class="score" title="<?php echo LANG_RATING; ?>">
  26. <?php if ($options['is_hidden'] && !$is_voted && ($is_enabled || $is_guest)){ ?>
  27. <span>&mdash;</span>
  28. <?php } else { ?>
  29. <span class="<?php echo html_signed_class($current_rating); ?><?php if ($options['is_show']) { ?> clickable<?php } ?>">
  30. <?php echo html_signed_num($current_rating); ?>
  31. </span>
  32. <?php } ?>
  33. </div>
  34.  
  35. <div class="arrow down <?php if (!$is_enabled){ ?>disabled<?php } ?>">
  36. <?php if ($is_enabled){ ?>
  37. <a href="#vote-down" class="vote-down" title="<?php echo LANG_RATING_VOTE_DOWN; ?>"></a>
  38. <?php } else { ?>
  39. <span class="disabled" title="<?php html( $is_voted ? LANG_RATING_VOTED : LANG_RATING_DISABLED ); ?>">-1</span>
  40. <?php } ?>
  41. </div>
  42. <?php if ($target_subject == 'anec'){ ?>
  43. <div class="arrow down <?php if (!$is_enabled){ ?>disabled<?php } ?>">
  44. <?php if ($is_enabled){ ?>
  45. <a href="#vote-down" class="vote-down" title="<?php echo LANG_RATING_VOTE_DOWN; ?>"></a>
  46. <?php } else { ?>
  47. <span class="disabled" title="<?php html( $is_voted ? LANG_RATING_VOTED : LANG_RATING_DISABLED ); ?>">-3</span>
  48. <?php } ?>
  49. </div>
  50. <div class="arrow down <?php if (!$is_enabled){ ?>disabled<?php } ?>">
  51. <?php if ($is_enabled){ ?>
  52. <a href="#vote-down" class="vote-down" title="<?php echo LANG_RATING_VOTE_DOWN; ?>"></a>
  53. <?php } else { ?>
  54. <span class="disabled" title="<?php html( $is_voted ? LANG_RATING_VOTED : LANG_RATING_DISABLED ); ?>">-5</span>
  55. <?php } ?>
  56. </div>
  57. <?php } ?>
Как это всё украсить — потом разберусь. Пока не работает сам функционал.

Но теперь не знаю, как передать из \templates\tseso\js\rating.js значение балла рейтинга в \system\controllers\rating\actions\vote.php

Даже если просто объявить переменную в js файле


  1. this.onDocumentReady = function(){
  2.  
  3. $('.rating_widget').each(function(){
  4.  
  5. var widget = $(this);
  6.  
  7. var controller = widget.data('target-controller');
  8. var subject = widget.data('target-subject');
  9. var id = widget.data('target-id');
  10. var points = 5;
  11.  
  12.  
  13. $('a.vote-up', widget).click(function(){
  14. icms.rating.vote('up', controller, subject, id, points);
  15. });
  16.  
  17. $('a.vote-down', widget).click(function(){
  18. icms.rating.vote('down', controller, subject, id, points);
  19. });
Все равно vote.php это значение не подхватывает и даже если отменить проверку на is_numeric($points) — все равно в базу пишется NULL

  1. public function run(){
  2.  
  3. if (!$this->request->isAjax()){ cmsCore::error404(); }
  4.  
  5. // Получаем параметры
  6. $direction = $this->request->get('direction');
  7. $target_controller = $this->request->get('controller');
  8. $target_subject = $this->request->get('subject');
  9. $target_id = $this->request->get('id');
  10. $points = $this->request->get('points');
  11. $template = cmsTemplate::getInstance();
  12.  
  13. $is_valid = ($this->validate_sysname($target_controller)===true) &&
  14. ($this->validate_sysname($target_subject)===true) &&
  15. is_numeric($target_id) &&
  16. is_numeric($points) &&
  17. in_array($direction, array('up', 'down'));
  18.  
  19. if (!$is_valid){ $template->renderJSON(array('success' => false)); }
  20.  
  21. $user = cmsUser::getInstance();
  22.  
  23. // Объединяем всю информацию о голосе
  24. $vote = array(
  25. 'user_id' => $user->id,
  26. 'target_controller' => $target_controller,
  27. 'target_subject' => $target_subject,
  28. 'target_id' => $target_id,
  29. 'score' => $direction=='up' ? $points : -$points
  30. );
Кто из понимающих людей поможет разобраться?
Заранее признателен.
#2 25 ноября 2015 в 22:55
Ну так у вас же написано:
  1. // Получаем параметры
  2. $direction = $this->request->get('direction');
  3. $target_controller = $this->request->get('controller');
  4. $target_subject = $this->request->get('subject');
  5. $target_id = $this->request->get('id');
а выше
  1. if (!$this->request->isAjax()){ cmsCore::error404(); }
Значит данные приходят через ajax.
соответственно смотрим например здесь (вот тут реализация аякса с post запросом).

Для участка выше код будет примерно такой:
  1. $.post(
  2. "/ajaxtest.php", // ваш php скрипт который ждет данные
  3. {
  4. direction: 'up', // сами данные
  5. controller: 'content',
  6. subject: 'posts',
  7. id: 2,
  8. },
  9. function(result){ alert('Пришел ответ: '+result); }, // callback-функция с ответом
  10. 'json' // тип данных ответа
  11. );
#3 25 ноября 2015 в 23:17
Val,
Но значение остальных 4 переменных передаются из rating.js в vote.php без проблем.
Вписываю пятую переменную — она не передается.

Вот же функция .click(function(){ icms.rating.vote('up', controller, subject, id, points); });
Вот первые четыре переменные отлично передаются, а points — нет. Почему такое может быть?

Потом разберусь с методом post.
Пока задача стоит явно объявленную переменную var points = 5; отправить в php скрипт vote.php.
Или нельзя прямо в яваскрипте задать значение переменной?
#4 26 ноября 2015 в 00:14
Виктор,
Идея отличная! Я что-то и внимания не обратил на эту функцию.
Спасибо, Виктор!

Но увы… почему-то не заработало. Буду искать…
#5 26 ноября 2015 в 01:11

Но теперь не знаю, как передать из \templates\tseso\js\rating.js значение балла рейтинга в \system\controllers\rating\actions\vote.php

HiAndy

смотрим например здесь (вот тут реализация аякса с post запросом).

Val

Вот же функция .click(function(){ icms.rating.vote('up', controller, subject, id, points); });
Вот первые четыре переменные отлично передаются, а points — нет.

HiAndy
Передаются куда?

JS передал управление функции icms.rating.vote(..., которая отправляет данные POST в vote.php.

Виктор

Потом разберусь с методом post.

HiAndy

Но увы… почему-то не заработало. Буду искать...

HiAndy
Самое время разобраться как работает ajax joke
Удачи!
#7 26 ноября 2015 в 12:29
В общем разобраться с шаблоном в двойке — перелом мозга.

Сделал вот так:

widget.tpl.php
  1. <?php $is_first_widget = $this->addJS('templates/default/js/rating.js'); ?>
  2.  
  3. <div class="rating_widget" id="rating-<?php echo $target_subject; ?>-<?php echo $target_id; ?>"
  4. <?php if ($is_enabled || $options['is_show']){ ?>
  5. data-target-controller="<?php echo $target_controller; ?>"
  6. data-target-subject="<?php echo $target_subject; ?>"
  7. data-target-id="<?php echo $target_id; ?>"
  8. <?php if ($options['is_show']){ ?>
  9. data-info-url="<?php echo $this->href_to('info'); ?>"
  10. <?php } ?>
  11. <?php } ?>
  12. >
  13. <?php if ($target_subject == 'anec'){ ?>
  14. <div class="arrow up">
  15. <?php if ($is_enabled){ ?>
  16. <b><a href="#vote-up" class="vote-up5" style = "color:green"; title="<?php echo LANG_RATING_VOTE_UP; ?>">+5</a></b>
  17. <?php } else { ?>
  18. <span class="disabled" style = "color:silver"; title="<?php html( $is_voted ? LANG_RATING_VOTED : LANG_RATING_DISABLED ); ?>">+5</span>
  19. <?php } ?>
  20. </div>
  21. <div class="arrow up">
  22. <?php if ($is_enabled){ ?>
  23. <b><a href="#vote-up" class="vote-up3" style = "color:green"; title="<?php echo LANG_RATING_VOTE_UP; ?>">+3</a></b>
  24. <?php } else { ?>
  25. <span class="disabled" style = "color:silver"; title="<?php html( $is_voted ? LANG_RATING_VOTED : LANG_RATING_DISABLED ); ?>">+3</span>
  26. <?php } ?>
  27. </div>
  28. <?php } ?>
  29. <div class="arrow up">
  30. <?php if ($is_enabled){ ?>
  31. <b><a href="#vote-up" class="vote-up1" style = "color:green"; title="<?php echo LANG_RATING_VOTE_UP; ?>">+1</a></b>
  32. <?php } else { ?>
  33. <span class="disabled" style = "color:silver"; title="<?php html( $is_voted ? LANG_RATING_VOTED : LANG_RATING_DISABLED ); ?>">+1</span>
  34. <?php } ?>
  35. </div>
  36.  
  37. <div class="score" title="<?php echo LANG_RATING; ?>">
  38. <?php if ($options['is_hidden'] && !$is_voted && ($is_enabled || $is_guest)){ ?>
  39. <span>&mdash;</span>
  40. <?php } else { ?>
  41. <span class="<?php echo html_signed_class($current_rating); ?><?php if ($options['is_show']) { ?> clickable<?php } ?>">
  42. <?php echo html_signed_num($current_rating); ?>
  43. </span>
  44. <?php } ?>
  45. </div>
  46.  
  47. <div class="arrow down <?php if (!$is_enabled){ ?>disabled<?php } ?>">
  48. <?php if ($is_enabled){ ?>
  49. <b> <a href="#vote-down" class="vote-down1" style = "color:red"; title="<?php echo LANG_RATING_VOTE_DOWN; ?>">-1</a></b>
  50. <?php } else { ?>
  51. <span class="disabled" style = "color:silver"; title="<?php html( $is_voted ? LANG_RATING_VOTED : LANG_RATING_DISABLED ); ?>">-1</span>
  52. <?php } ?>
  53. </div>
  54. <?php if ($target_subject == 'anec'){ ?>
  55. <div class="arrow down <?php if (!$is_enabled){ ?>disabled<?php } ?>">
  56. <?php if ($is_enabled){ ?>
  57. <b><a href="#vote-down" class="vote-down3" style = "color:red"; title="<?php echo LANG_RATING_VOTE_DOWN; ?>">-3</a></b>
  58. <?php } else { ?>
  59. <span class="disabled" style = "color:silver"; title="<?php html( $is_voted ? LANG_RATING_VOTED : LANG_RATING_DISABLED ); ?>">-3</span>
  60. <?php } ?>
  61. </div>
  62. <div class="arrow down <?php if (!$is_enabled){ ?>disabled<?php } ?>">
  63. <?php if ($is_enabled){ ?>
  64. <b><a href="#vote-down" class="vote-down5" style = "color:red"; title="<?php echo LANG_RATING_VOTE_DOWN; ?>">-5</a></b>
  65. <?php } else { ?>
  66. <span class="disabled" style = "color:silver"; title="<?php html( $is_voted ? LANG_RATING_VOTED : LANG_RATING_DISABLED ); ?>">-5</span>
  67. <?php } ?>
  68. </div>
  69. <?php } ?>
  70.  
  71. </div>
rating.js

  1.  
  2. this.onDocumentReady = function(){
  3.  
  4. $('.rating_widget').each(function(){
  5.  
  6. var widget = $(this);
  7.  
  8. var controller = widget.data('target-controller');
  9. var subject = widget.data('target-subject');
  10. var id = widget.data('target-id');
  11.  
  12. $('a.vote-up1', widget).click(function(){var points =1;
  13. icms.rating.vote('up', controller, subject, id, points);
  14. });
  15.  
  16. $('a.vote-down1', widget).click(function(){var points =1;
  17. icms.rating.vote('down', controller, subject, id, points);
  18. });
  19. $('a.vote-up3', widget).click(function(){var points =3;
  20. icms.rating.vote('up', controller, subject, id, points);
  21. });
  22.  
  23. $('a.vote-down3', widget).click(function(){var points =3;
  24. icms.rating.vote('down', controller, subject, id, points);
  25. });
  26. $('a.vote-up5', widget).click(function(){var points =5;
  27. icms.rating.vote('up', controller, subject, id, points);
  28. });
  29.  
  30. $('a.vote-down5', widget).click(function(){var points =5;
  31. icms.rating.vote('down', controller, subject, id, points);
  32. });
  33.  
  34. $('.score span.clickable', widget).on("click", function(){
  35. var url = widget.data('info-url');
  36. icms.modal.openAjax(url, {
  37. controller: controller,
  38. subject: subject,
  39. id: id
  40. });
  41. });
  42.  
  43. });
  44.  
  45. }
  46.  
  47. //====================================================================//
  48.  
  49. this.vote = function(direction, controller, subject, id, points){
  50.  
  51. var widget_id = 'rating-' + subject + '-' + id;
  52. var widget = $('#'+widget_id);
  53.  
  54. $('.arrow', widget).html('<span class="disabled"></span>');
  55. $('.score', widget).html('<div class="loading-icon"></div>');
  56.  
  57. $.post(this.options.url, {
  58.  
  59. direction: direction,
  60. controller: controller,
  61. subject: subject,
  62. id: id,
  63. points: points
  64.  
  65. }, function(result){
  66.  
  67. if (!result.success){
  68. $('.score', widget).html('<span class="zero">&mdash;</span>');
  69. return;
  70. }
  71.  
  72. $('.score', widget).html('<span class="'+result.css_class+'">'+result.rating+'</span>');
  73. $('.disabled', widget).attr('title', result.message);
  74.  
  75. }, "json");
  76.  
  77. }
  78.  

vote.php

  1. class actionRatingVote extends cmsAction{
  2.  
  3. public
#8 5 декабря 2015 в 20:25

проблема, как: невозможность просмотра списка голосовавших, после голосования, и до перезагрузки страницы?

Виктор

А это проблема? Это вроде изначально так было задумано.
Сразу после голосования список голосовавших недоступен до перезагрузки. Проверьте на заново установленном тестовом сайте — там точно также.
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.