Страница 1 из 1

[JS] звёздочки, оценки сообщений...

Добавлено: 2012-01-30 22:31:04
Alex Keda
есть такой вот код, рождённый в муках - большей частью до меня, я тока сделал что работало как мне надо, и немного скривил =)

Код: Выделить всё

<img style="cursor: pointer;" onclick="AjaxCall('/API/TicketVote',{MessageID:67122,VoteBall:1},'Оценка сообщения','ShowTick("Ваша оценка \'Совсем плохо\' успешно сохранена");');" onmouseover="selectStars(event, 67122, 0);PromptShow(event,'Совсем плохо',this);" src="/styles/billing/Images/Icons/EnableStar.png" id="star_67122_0"/>
<img style="cursor: pointer;" onclick="AjaxCall('/API/TicketVote',{MessageID:67122,VoteBall:2},'Оценка сообщения','ShowTick("Ваша оценка \'Очень плохо\' успешно сохранена");');" onmouseover="selectStars(event, 67122, 1);PromptShow(event,'Очень плохо',this);" src="/styles/billing/Images/Icons/EnableStar.png" id="star_67122_1"/>
<img style="cursor: pointer;" onclick="AjaxCall('/API/TicketVote',{MessageID:67122,VoteBall:3},'Оценка сообщения','ShowTick("Ваша оценка \'Плохо\' успешно сохранена");');" onmouseover="selectStars(event, 67122, 2);PromptShow(event,'Плохо',this);" src="/styles/billing/Images/Icons/EnableStar.png" id="star_67122_2"/>
<img style="cursor: pointer;" onclick="AjaxCall('/API/TicketVote',{MessageID:67122,VoteBall:4},'Оценка сообщения','ShowTick("Ваша оценка \'Не очень хорошо\' успешно сохранена");');" onmouseover="selectStars(event, 67122, 3);PromptShow(event,'Не очень хорошо',this);" src="/styles/billing/Images/Icons/EnableStar.png" id="star_67122_3"/>
<img style="cursor: pointer;" onclick="AjaxCall('/API/TicketVote',{MessageID:67122,VoteBall:5},'Оценка сообщения','ShowTick("Ваша оценка \'Нейтрально\' успешно сохранена");');" onmouseover="selectStars(event, 67122, 4);PromptShow(event,'Нейтрально',this);" src="/styles/billing/Images/Icons/EnableStar.png" id="star_67122_4"/>
<img style="cursor: pointer;" onclick="AjaxCall('/API/TicketVote',{MessageID:67122,VoteBall:6},'Оценка сообщения','ShowTick("Ваша оценка \'Удовлетворительно\' успешно сохранена");');" onmouseover="selectStars(event, 67122, 5);PromptShow(event,'Удовлетворительно',this);" src="/styles/billing/Images/Icons/EnableStar.png" id="star_67122_5"/>
<img style="cursor: pointer;" onclick="AjaxCall('/API/TicketVote',{MessageID:67122,VoteBall:7},'Оценка сообщения','ShowTick("Ваша оценка \'Хорошо\' успешно сохранена");');" onmouseover="selectStars(event, 67122, 6);PromptShow(event,'Хорошо',this);" src="/styles/billing/Images/Icons/EnableStar.png" id="star_67122_6"/>
<img style="cursor: pointer;" onclick="AjaxCall('/API/TicketVote',{MessageID:67122,VoteBall:8},'Оценка сообщения','ShowTick("Ваша оценка \'Очень хорошо\' успешно сохранена");');" onmouseover="selectStars(event, 67122, 7);PromptShow(event,'Очень хорошо',this);" src="/styles/billing/Images/Icons/DisableStar.png" id="star_67122_7"/>
<img style="cursor: pointer;" onclick="AjaxCall('/API/TicketVote',{MessageID:67122,VoteBall:9},'Оценка сообщения','ShowTick("Ваша оценка \'Отлично\' успешно сохранена");');" onmouseover="selectStars(event, 67122, 8);PromptShow(event,'Отлично',this);" src="/styles/billing/Images/Icons/DisableStar.png" id="star_67122_8"/>

Код: Выделить всё

function selectStars(e, $ticketId, $starId) {
  for(var $i = 0; $i < 9; $i++) {
    document.getElementById('star_'+$ticketId+'_'+$i).src = '/styles/billing/Images/Icons/DisableStar.png';
  }

  for(var $i = 0; $i <= $starId; $i++) {
    document.getElementById('star_'+$ticketId+'_'+$i).src = '/styles/billing/Images/Icons/EnableStar.png';
  }
}
собсно эффект - когда наводишь - получается полоса звёдочек другого цвета (дефолт серые, когда наводит мышь - красные - слева и до мыши)

хочется показать юзеру результат его предыдущего голосования.
голос известен, он есть при построении этого кода.
соответстенно, надо ввести третий цвет звёзд, и ими отобразить текущий голос юзера.

саму возможность голосвания надо оставить - т.к. юзер может передумать.

пните в ту сторону, откуда начать.
JS не знаю совсем =((

Re: [JS] звёздочки, оценки сообщений...

Добавлено: 2012-02-06 23:06:45
Overseer
если еще актуально, то вот мои мысли.

1) здесь я заменил цикл, т.к. в лишнем обходе нет смысла:

Код: Выделить всё

function selectStars(e, $ticketId, $starId) {
  for(var $i = 0; $i <= $starId; $i++) {
    document.getElementById('star_'+$ticketId+'_'+$i).src = '/styles/billing/Images/Icons/EnableStar.png';
  }
  for(var $i = $starId+1; $i < 9; $i++) {
    document.getElementById('star_'+$ticketId+'_'+$i).src = '/styles/billing/Images/Icons/DisableStar.png';
  }
}
2) функция подцветки:

Код: Выделить всё

function selectVotedStars(e, $ticketId, $starId) {
  if ($IsVoted != 777) {
    for(var $i = 0; $i <= $starId; $i++) {
      document.getElementById('star_'+$ticketId+'_'+$i).src = '/styles/billing/Images/Icons/EnableVotedStar.png';
    }
    for(var $i = $starId+1; $i < 9; $i++) {
      document.getElementById('star_'+$ticketId+'_'+$i).src = '/styles/billing/Images/Icons/DisableVotedStar.png';
    }
  }
}
selectVotedStars вызывать по событию onmouseout. $IsVoted нужно объявить/задекларировать где-то выше, как глобальную переменную, и держать в ней значение голоса (только не провтыкать с размерностью, 0-8 или 1-9) или левое значение, например, 777, если не голосовал еще.

Re: [JS] звёздочки, оценки сообщений...

Добавлено: 2012-02-07 8:26:43
Alex Keda
не фурычит =((
ошибок никаких нет, ни на что не ругается, просто не пашет =(
может не так задал

Код: Выделить всё

                                'onMouseOver'   => SPrintF('selectStars(event, %d, %d);PromptShow(event,\'%s\',this);',$MessageID, $i, $VoteTitle[$i]),
                                'onMouseOut'    => SPrintF('selectVotedStars(event, %d, %d);',$MessageID, $i),
?
и про глобальную переменную - я непонял.
сообщений в одном открытом окне может быть несколько.
и у каждого своя оценка...

Re: [JS] звёздочки, оценки сообщений...

Добавлено: 2012-02-07 13:22:45
FreeBSP
три цвета мне кажется это слишком..
может лучше сделать какую нить княпочку при наведении на которую в лотке голосования показывались бы предыдущие результаты
нашел плагин к жиквери, ща попробую что нить настругать

Re: [JS] звёздочки, оценки сообщений...

Добавлено: 2012-02-07 13:31:31
Overseer
Alex Keda писал(а):не фурычит =((
ошибок никаких нет, ни на что не ругается, просто не пашет =(

и про глобальную переменную - я непонял.
в самом коде страницы появляется onmouseout="selectVotedStars...?

Код: Выделить всё

<img style="cursor: pointer;" onclick="AjaxCall('/API/TicketVote',{MessageID:67122,VoteBall:2},'Оценка сообщения','ShowTick("Ваша оценка \'Очень плохо\' успешно сохранена");');" onmouseover="selectStars(event, 67122, 1);PromptShow(event,'Очень плохо',this);" onmouseout="selectVotedStars(event, 67122);" src="/styles/billing/Images/Icons/EnableStar.png" id="star_67122_1"/>
картинки *VotedStar.png есть?

нужна глобальная переменная (массив), куда бы втягивались результаты голосования этого конкретного пользователя, они где-то записаны или надо составлять Ajax-запрос для их вытягивания?

> три цвета мне кажется это слишком..
как вариант, можно оставлять цвет подсветки как цвет сделанного выбора, так на многих сайтах.

Re: [JS] звёздочки, оценки сообщений...

Добавлено: 2012-02-07 13:39:27
Alex Keda
да.

Код: Выделить всё

<img style="cursor: pointer;" onclick="AjaxCall('/API/TicketVote',{MessageID:69949,VoteBall:1},'Оценка сообщения','ShowTick("Ваша оценка \'Совсем плохо\' успешно сохранена");');" onmouseout="selectVotedStars(event, 69949, 0);" onmouseover="selectStars(event, 69949, 0);PromptShow(event,'Совсем плохо',this);" src="/styles/billing/Images/Icons/EnableStar.png" id="star_69949_0"/>
<img style="cursor: pointer;" onclick="AjaxCall('/API/TicketVote',{MessageID:69949,VoteBall:2},'Оценка сообщения','ShowTick("Ваша оценка \'Очень плохо\' успешно сохранена");');" onmouseout="selectVotedStars(event, 69949, 1);" onmouseover="selectStars(event, 69949, 1);PromptShow(event,'Очень плохо',this);" src="/styles/billing/Images/Icons/DisableStar.png" id="star_69949_1"/>
картинок - нету. но я смотрел веб-консоль в FF - туда вообще ничё не пишется когда мышь выводишь.
тыкалось бы к картинке - писал бы запрос и ответ - 404

Re: [JS] звёздочки, оценки сообщений...

Добавлено: 2012-02-07 13:42:04
Alex Keda
про переменные и ajax - снова непонял.
могу в html всунуть тег

Код: Выделить всё

<script>...</script>
но как там прописать?

Re: [JS] звёздочки, оценки сообщений...

Добавлено: 2012-02-07 13:46:30
Overseer
Alex Keda писал(а):про переменные и ajax - снова непонял.
> голос известен, он есть при построении этого кода.
где он хранится?

Re: [JS] звёздочки, оценки сообщений...

Добавлено: 2012-02-07 14:51:53
Alex Keda
в БД.
в той же строке что и само сообщение, к которому относится
т.е. в процессе построения этого куска - он доступен из php

Re: [JS] звёздочки, оценки сообщений...

Добавлено: 2012-02-07 15:00:19
Overseer
я так понимаю, там содержится итоговое число голосов, а не поименное? тогда не получится показать пользователю *его голос*.
непосредственно после голосования показать можно, просто запомнив в js-переменную или js-массив, что за такое-то сообщение отдан голос.

Re: [JS] звёздочки, оценки сообщений...

Добавлено: 2012-02-07 15:05:40
Alex Keda
нет. там содержится именно его голос, именно для этого сообщения.
это тикетница. там нет массовости - там клиенты оценивают ответы сотрудников

Re: [JS] звёздочки, оценки сообщений...

Добавлено: 2012-02-07 15:28:42
Overseer
замечательно. при построении страницы формируется блок с java-скриптами или они в отдельном файле?
в любом случае, при формировании страницы где-то в начале страницы нужно "запомнить" имеющиеся данные в js-массив, например так:

Код: Выделить всё

var dVoteArr = [];
dVoteArr[67122] = 0; // 67122 - номер топика ака MessageID
dVoteArr[67123] = 1;
dVoteArr[67124] = 9;
dVoteArr[67125] = 3; // значение - оценка, 0 - не голосовал (оценки ведь от 1 до 9?)
// (и так столько раз, сколько топиков на странице)
// в массиве нет элементов с 1 по 67121-й, они память не занимают. так проще идентифицировать "голос", без лишних приседаний

var msgs = [67122, 67123, 67124, 67125]; // номера топиков

function ShowUserVotes {
  for (i = 0; i < msgs.length; i++) {
    selectVotedStars(e, msgs[i], dVoteArr[msgs[i]]);
  }
}
этот массив нужно формировать на уровне PHP-страницы, там же из базы вытягиваются сами топики, добавить только голоса.
дальше нужно на ивент загрузки страницы вызвать функцию, которая проставит эти самые "голоса".

Код: Выделить всё

<BODY onLoad="ShowUserVotes();">
кстати, зачем в функции selectStars переменные с $? в js он же не используется.
и в циклах var не нужен

Код: Выделить всё

for(var $i = 0; $i < 9; $i++) {
// нужно:
for(i = 0; i < 9; i++) {

Re: [JS] звёздочки, оценки сообщений...

Добавлено: 2012-02-08 8:05:57
Alex Keda
Overseer писал(а):замечательно. при построении страницы формируется блок с java-скриптами или они в отдельном файле?

Код: Выделить всё

function selectVotedStars
в отдельном файле
Overseer писал(а):

Код: Выделить всё

<BODY onLoad="ShowUserVotes();">
а вот с этим могут быть проблемы =))
там не совсем страницы, какбе...
я даже не знаю как это правильно называется... это "отростки" от страницы, чтоли... незнаю как сказать.
зайдите в тикетницу - посмотрите - http://demo.joonte.com/Administrator/Ti ... ReOpen=yes
Overseer писал(а): кстати, зачем в функции selectStars переменные с $? в js он же не используется.
и в циклах var не нужен
тот кто начинал писать - писал в таком стиле. я просто стараюсь его придерживаться.
да и незнаю - нужен, не нужен, но факт что код становится понятней и читабельней на порядок.

Re: [JS] звёздочки, оценки сообщений...

Добавлено: 2012-02-08 9:46:17
Overseer
уу.. надо смотреть исходники, телепатировать такие пепелацы нереально..
надо искать как при загрузке страницы (или отпрыска) дернуть функцию, которая бы показала голоса + место для хранения самих голосов и этой функции.

Re: [JS] звёздочки, оценки сообщений...

Добавлено: 2012-02-08 14:35:40
Alex Keda
да исходники-то открыты.
от этого не сильно легче - стиль написанного php там ну оччень своеобразный =))

Re: [JS] звёздочки, оценки сообщений...

Добавлено: 2012-02-08 17:01:44
Overseer
Alex Keda писал(а):да исходники-то открыты.
от этого не сильно легче - стиль написанного php там ну оччень своеобразный =))
да потому что это Joomla... :crazy:
я там встречал такие перлы, что просто прозревал. правил дыры вроде возможности инклуда любых файлов, а suhosin проблевался на такое:

Код: Выделить всё

include ("../../../../../../../../../../filename.php");

Re: [JS] звёздочки, оценки сообщений...

Добавлено: 2012-02-08 18:16:18
Overseer
пардон, был не прав, это не Joomla, в названии Joonte Software смутило "Joo".

Re: [JS] звёздочки, оценки сообщений...

Добавлено: 2012-02-13 10:24:45
ADRE
Overseer писал(а):
Alex Keda писал(а):про переменные и ajax - снова непонял.
> голос известен, он есть при построении этого кода.
где он хранится?
а как еще?
Запрос делать через туже библиотеку что и тикеты получают своё наполнение. просто вместо буков тикета - будет уровень или цыфра, а прикрепить результат голоса - либо через доп таблицу, либо просто через бесконечные куки браузера. вот и всё.
--
если чел не нажимал - вывести среднее значение предложить проголосовать. и обновить учёт.
если есть куки (через JS можно получить), убрать кликабельность. ну если голосовалка для билинга.

Re: [JS] звёздочки, оценки сообщений...

Добавлено: 2012-02-17 12:13:56
Overseer
установил этот биллинг - тормозит покруче, чем Wordpress обвешанный плагинами =О
еще и Smarty, бррр. зачем такой динозавр?

Re: [JS] звёздочки, оценки сообщений...

Добавлено: 2012-02-17 19:48:23
Alex Keda
Overseer писал(а):установил этот биллинг - тормозит покруче, чем Wordpress обвешанный плагинами =О
еще и Smarty, бррр. зачем такой динозавр?
работает. код открытый - можно под себя доработать.

больше ничего и не надо