1
0
Fork 0
mirror of https://github.com/Oreolek/ifhub.club.git synced 2024-06-16 23:00:51 +03:00

Доработка опросов

This commit is contained in:
Denis Shakhov 2014-02-10 18:09:17 +07:00
parent fda7a51786
commit 35d7ea006b
19 changed files with 465 additions and 332 deletions

View file

@ -221,7 +221,7 @@ class ActionAjax extends Action {
if ($oPoll->Add()) {
$oViewer=$this->Viewer_GetLocalViewer();
$oViewer->Assign('oPoll',$oPoll);
$this->Viewer_AssignAjax('sPollItem',$oViewer->Fetch("polls/poll.form.item.tpl"));
$this->Viewer_AssignAjax('sPollItem',$oViewer->Fetch("polls/poll.form.list.item.tpl"));
return true;
} else {
$this->Message_AddError($this->Lang_Get('common.error.save'),$this->Lang_Get('error'));
@ -264,7 +264,7 @@ class ActionAjax extends Action {
if ($oPoll->Update()) {
$oViewer=$this->Viewer_GetLocalViewer();
$oViewer->Assign('oPoll',$oPoll);
$this->Viewer_AssignAjax('sPollItem',$oViewer->Fetch("polls/poll.form.item.tpl"));
$this->Viewer_AssignAjax('sPollItem',$oViewer->Fetch("polls/poll.form.list.item.tpl"));
$this->Viewer_AssignAjax('iPollId',$oPoll->getId());
return true;
} else {

View file

@ -15,218 +15,222 @@ ls.poll = (function ($) {
* Дефолтные опции
*/
var defaults = {
// Роутер голосования
sRouterVoteUrl: aRouter['ajax'] + 'poll/vote/',
// Роутеры
routers: {
vote: aRouter['ajax'] + 'poll/vote/',
add: aRouter['ajax'] + 'poll/create/',
update: aRouter['ajax'] + 'poll/update/',
remove: aRouter['ajax'] + 'poll/remove/',
},
// Селекторы
selectors: {
modal: '#modal-poll-create',
poll: {
poll: '.js-poll',
vote_form: '.js-poll-vote-form',
vote: '.js-poll-vote',
abstain: '.js-poll-abstain',
},
form: {
list: '.js-poll-form-list',
item: '.js-poll-form-list-item',
item_remove: '.js-poll-form-list-item-remove',
submit: '.js-poll-form-submit'
},
answer: {
list: '.js-poll-form-answer-list',
add: '.js-poll-form-answer-add',
item: {
item: '.js-poll-form-answer-item',
text: '.js-poll-form-answer-item-text',
id: '.js-poll-form-answer-item-id',
remove: '.js-poll-form-answer-item-remove',
}
},
// Селекторы результата опроса
result: {
container: '.js-poll-result',
item: '.js-poll-result-item',
sort: '.js-poll-result-sort',
}
},
// Максимальное кол-во вариантов ответов
iMaxItems: 20,
// Селекторы добавления опроса
sAddSelector: '.js-poll-add',
sAddListSelector: '.js-poll-add-list',
sAddItemSelector: '.js-poll-add-item',
sAddItemRemoveSelector: '.js-poll-add-item-remove',
sAddItemInputSelector: '.js-poll-add-item-input',
sAddButtonSelector: '.js-poll-add-button',
// Селекторы опроса
sPollSelector: '.js-poll',
sPollItemOptionSelector: '.js-poll-item-option',
sPollButtonVoteSelector: '.js-poll-button-vote',
sPollButtonAbstainSelector: '.js-poll-button-abstain',
// Селекторы результата опроса
sPollResultSelector: '.js-poll-result',
sPollResultItemSelector: '.js-poll-result-item',
sPollResultButtonSortSelector: '.js-poll-result-button-sort',
// Html варианта ответа
sAddItemHtml: '<li class="poll-add-item js-poll-add-item">' +
'<input type="checkbox" disabled="disabled">' +
'<input type="hidden" name="answers[_NUMBER_][id]" value="_ANSWER_ID_">' +
'<input type="text" name="answers[_NUMBER_][title]" class="poll-add-item-input js-poll-add-item-input" value="_ANSWER_TITLE_">' +
'<i class="icon-remove poll-add-item-remove js-poll-add-item-remove" title="' + ls.lang.get('delete') + '"></i>' +
'</li>'
iMaxAnswers: 20,
};
this.aAnswersInit=[];
this.iCountAnswers=0;
/**
* Инициализация
*
* @param {Object} options Опции
*/
this.init = function(options) {
var self = this;
var _this = this;
this.options = $.extend({}, defaults, options);
$(this.options.sPollSelector).each(function () {
/**
* Форма добавления
*/
// Сабмит формы
$(document).on('submit', '#form-poll-create', function (e) {
var oForm = $(this);
_this[ oForm.data('action') == 'add' ? 'add' : 'update' ](oForm, $(_this.options.selectors.form.submit));
e.preventDefault();
});
// Добавление варианта
$(document).on('click', this.options.selectors.answer.add, function () {
_this.answerAdd($(_this.options.selectors.answer.list));
});
// Добавление варианта по нажатию Ctrl + Enter
$(document).on('keyup', this.options.selectors.answer.text, function (e) {
var key = e.keyCode || e.which;
if (e.ctrlKey && key == 13) {
_this.answerAdd($(_this.options.selectors.answer.list));
}
});
// Удаление варианта
$(document).on('click', this.options.selectors.answer.item.remove, function () {
_this.answerRemove($(this));
});
// Удаление опроса
$(document).on('click', this.options.selectors.form.item_remove, function () {
var oButton = $(this),
oItem = oButton.closest(_this.options.selectors.form.item);
_this.remove(oItem.data('poll-id'), oItem.data('poll-target-tmp'));
});
/**
* Опрос
*/
$(this.options.selectors.poll.poll).each(function () {
var oPoll = $(this),
iPollId = oPoll.data('poll-id');
// Голосование за вариант
oPoll.find(self.options.sPollButtonVoteSelector).on('click', function () {
oPoll.find(_this.options.selectors.poll.vote).on('click', function () {
var form = oPoll.find('form');
self.vote(form,this);
_this.vote(form, $(this));
});
// Воздержаться
oPoll.find(self.options.sPollButtonAbstainSelector).on('click', function () {
oPoll.find(_this.options.selectors.poll.abstain).on('click', function () {
var form = oPoll.find('form');
self.vote(form,this,true);
_this.vote(form, $(this), true);
});
// Сортировка
oPoll.on('click', self.options.sPollResultButtonSortSelector, function () {
self.toggleSort(oPoll);
oPoll.on('click', _this.options.selectors.result.sort, function () {
_this.toggleSort(oPoll);
});
});
};
this.initFormUpdate = function() {
this.initFormCreate();
/**
* Добавление опроса
*/
this.add = function(oForm, oButton) {
ls.ajax.submit(this.options.routers.add, oForm, function(result) {
$(this.options.selectors.form.list).append(result.sPollItem);
$(this.options.selectors.modal).modal('hide');
}.bind(this), { submitButton: oButton });
};
this.initFormCreate = function() {
var self = this;
var oPollAdd=$('#form-poll-create').find(self.options.sAddSelector);
$.each(self.aAnswersInit,function(k,v){
self.addItem(oPollAdd,v);
});
$(this.options.sAddSelector).each(function () {
var oPollAdd = $(this);
// Добавление варианта
oPollAdd.find(self.options.sAddButtonSelector).on('click', function () {
self.addItem(oPollAdd);
}.bind(self));
// Добавление варианта по нажатию Ctrl + Enter
oPollAdd.on('keyup', self.options.sAddItemInputSelector, function (e) {
var key = e.keyCode || e.which;
if (e.ctrlKey && key == 13) {
self.addItem(oPollAdd);
}
});
// Удаление
oPollAdd.on('click', self.options.sAddItemRemoveSelector, function () {
self.removeItem(this);
});
});
/**
* Обновление опроса
*/
this.update = function(oForm, oButton) {
ls.ajax.submit(this.options.routers.update, oForm, function(result) {
$(this.options.selectors.form.item + '[data-poll-id=' + result.iPollId + ']').replaceWith(result.sPollItem);
$(this.options.selectors.modal).modal('hide');
}.bind(this), { submitButton: oButton });
};
this.createPoll = function(form,button) {
ls.ajax.submit(aRouter.ajax+'poll/create/', form, function(result){
$('#poll-form-items').append(result.sPollItem);
$('#modal-poll-create').modal('hide');
},{ submitButton: $(button) });
};
this.updatePoll = function(form,button) {
ls.ajax.submit(aRouter.ajax+'poll/update/', form, function(result){
$('#poll-form-item-'+result.iPollId).replaceWith(result.sPollItem);
$('#modal-poll-create').modal('hide');
},{ submitButton: $(button) });
};
this.removePoll = function(id,tmp) {
ls.ajax.load(aRouter.ajax+'poll/remove/', { id: id, tmp: tmp }, function(result){
/**
* Удаление опроса
*/
this.remove = function(iId, tmp) {
ls.ajax.load(this.options.routers.remove, { id: iId, tmp: tmp }, function(result) {
if (result.bStateError) {
ls.msg.error(null, result.sMsg);
} else {
$('#poll-form-item-'+id).fadeOut('slow', function() {
$(this.options.selectors.form.item + '[data-poll-id=' + iId + ']').fadeOut('slow', function() {
$(this).remove();
});
}
});
return false;
}.bind(this));
};
/**
* Добавляет вариант ответа
*
* @param {Object} oPollAdd Блок добавления опроса
* @param {Object} oAnswerList Блок с ответами
*/
this.addItem = function(oPollAdd,params) {
var defaults = {
number: "0",
answer_id: '',
answer_title: '',
disable_remove: false,
disable_update: false
}
params = $.extend({}, defaults, params);
this.answerAdd = function(oAnswerList) {
var iAnswersCount = oAnswerList.find(this.options.selectors.answer.item.item).length;
if(oPollAdd.find(this.options.sAddItemSelector).length == this.options.iMaxItems) {
ls.msg.error(null, ls.lang.get('topic_question_create_answers_error_max'));
if (iAnswersCount == this.options.iMaxAnswers) {
ls.msg.error(null, ls.lang.get('poll.notices.error_answers_max'));
return false;
}
var self = this,
sTpl = this.options.sAddItemHtml;
var oAnswerItem = $(this.options.selectors.answer.item.item + '[data-is-template=true]').clone().removeAttr('data-is-template').show(),
oAnswerItemText = oAnswerItem.find(this.options.selectors.answer.item.text),
oAnswerItemId = oAnswerItem.find(this.options.selectors.answer.item.id);
sTpl = sTpl.replace(/_NUMBER_/g, this.iCountAnswers);
sTpl = sTpl.replace(/_ANSWER_ID_/g, params.answer_id);
sTpl = sTpl.replace(/_ANSWER_TITLE_/g, params.answer_title);
oNewItem = $(sTpl);
if (params.disable_remove) {
oNewItem.find(this.options.sAddItemRemoveSelector).remove();
}
if (params.disable_update) {
oNewItem.find(this.options.sAddItemInputSelector).attr('disabled','disabled');
}
oPollAdd.find(this.options.sAddListSelector).append(oNewItem);
oNewItem.find('input[type=text]').focus();
this.iCountAnswers++;
oAnswerList.append(oAnswerItem);
oAnswerItemId.attr('name', 'answers[' + iAnswersCount + '][id]');
oAnswerItemText.attr('name', 'answers[' + iAnswersCount + '][title]').focus();
};
this.addItemInit = function(params) {
this.aAnswersInit.push(params);
};
this.clearItemInit = function() {
this.aAnswersInit=[];
};
/**
* Удаляет вариант ответа
*
* @param {Number} oRemoveButton Кнопка удаления
* @param {Object} oRemoveButton Кнопка удаления
*/
this.removeItem = function(oRemoveButton) {
$(oRemoveButton).closest(this.options.sAddItemSelector).remove();
this.answerRemove = function(oRemoveButton) {
oRemoveButton.closest(this.options.selectors.answer.item.item).fadeOut(200, function () {
$(this).remove();
});
};
/**
* Голосование в опросе
*
* @param {Object} form Форма с данными опроса
* @param {Object} button Копка для анимации загрузки
* @param {Object} oForm Форма с данными опроса
* @param {Object} oButton Копка для анимации загрузки
* @param {Boolean} bAbstain Воздержаться при голосовании
*/
this.vote = function(form,button,abstain) {
form=$(form);
var formData=form.serializeJSON();
this.vote = function(oForm, oButton, bAbstain) {
var oFormData = oForm.serializeJSON();
ls.hook.marker('voteBefore');
ls.ajax.submit(this.options.sRouterVoteUrl, form, function(result){
var oPoll = $('[data-poll-id=' + formData.id + ']');
ls.ajax.submit(this.options.routers.vote, oForm, function(result) {
var oPoll = $(this.options.selectors.poll.poll + '[data-poll-id=' + oFormData.id + ']').find(this.options.selectors.poll.vote_form);
oPoll.html(result.sText);
ls.hook.run('ls_pool_vote_after', [form, result], oPoll);
}, { submitButton: $(button), params: { abstain: abstain ? 1 : 0 } });
ls.hook.run('ls_pool_vote_after', [oForm, result], oPoll);
}.bind(this), { submitButton: oButton, params: { abstain: bAbstain ? 1 : 0 } });
};
/**
@ -235,10 +239,10 @@ ls.poll = (function ($) {
* @param {Object} oPoll Блок опроса
*/
this.toggleSort = function(oPoll) {
var oButton = oPoll.find(this.options.sPollResultButtonSortSelector),
oPollResult = oPoll.find(this.options.sPollResultSelector),
aItems = oPollResult.find(this.options.sPollResultItemSelector),
sSortType = oButton.hasClass('active') ? 'poll-item-pos' : 'poll-item-count';
var oButton = oPoll.find(this.options.selectors.result.sort),
oPollResult = oPoll.find(this.options.selectors.result.container),
aItems = oPollResult.find(this.options.selectors.result.item),
sSortType = oButton.hasClass(ls.options.classes.states.active) ? 'poll-item-pos' : 'poll-item-count';
aItems.sort(function (a, b) {
a = $(a).data(sSortType);
@ -253,7 +257,7 @@ ls.poll = (function ($) {
}
});
oButton.toggleClass('active');
oButton.toggleClass(ls.options.classes.states.active);
oPollResult.empty().append(aItems);
};

View file

@ -414,6 +414,36 @@ return array(
),
),
/**
* Опросы
*/
'poll' => array(
'vote' => 'Голосовать',
'abstain' => 'Воздержаться',
// Результат
'result' => array(
'voted_total' => 'Проголосовало',
'abstained_total' => 'Воздержалось',
'sort' => 'Включить\выключить сортировку',
),
// Форма добавления
'form' => array(
'title' => array(
'add' => 'Добавление опроса',
'edit' => 'Редактирование опроса',
),
'answers_title' => 'Варианты ответов',
),
// Всплывающие сообщения
'notices' => array(
// TODO: Fix max number
'error_answers_max' => 'Максимально возможное число вариантов ответа 20',
),
),
/**
* Почта
*/
@ -607,33 +637,6 @@ return array(
'topic_preview' => 'Предпросмотр',
'topic_delete' => 'Удалить',
'topic_delete_confirm' => 'Вы действительно хотите удалить топик?',
/**
* Топик-опрос
*/
'topic_question_title' => 'Опросы',
'topic_question_title_edit' => 'Редактирование опроса',
'topic_question_title_create' => 'Добавление опроса',
'topic_question_vote' => 'Голосовать',
'topic_question_vote_ok' => 'Ваш голос учтен.',
'topic_question_vote_already' => 'Ваш голос уже учтен!',
'topic_question_vote_result' => 'Проголосовало',
'topic_question_vote_result_sort' => 'Включить\выключить сортировку',
'topic_question_abstain' => 'Воздержаться',
'topic_question_abstain_result' => 'Воздержалось',
'topic_question_create' => 'Создание топика-опроса',
'topic_question_edit' => 'Редактирование топика-опроса',
'topic_question_create_title' => 'Вопрос',
'topic_question_create_title_notice' => 'Вопрос должен быть наполнен смыслом, чтобы можно было понять, о чем будет опрос.',
'topic_question_create_title_error' => 'Вопрос должен быть от 2 до 200 символов',
'topic_question_create_answers' => 'Варианты ответов',
'topic_question_create_answers_add' => 'Добавить вариант',
'topic_question_create_answers_delete' => 'Удалить',
'topic_question_create_answers_error' => 'Ответ должен быть от 1 до 100 символов',
'topic_question_create_answers_error_min' => 'Вариантов ответа должно быть как минимум два',
'topic_question_create_answers_error_max' => 'Максимально возможное число вариантов ответа 20',
'topic_question_create_text' => 'Краткое описание (максимум 500 символов)',
'topic_question_create_text_notice' => 'HTML-теги запрещены',
'topic_question_create_text_error' => 'Описание опроса должно быть не более 500 символов',
/**
* Голосование за топик
*/

View file

@ -1,26 +1,28 @@
/**
* Опросы
*
* @template topics/topic.question.tpl
* @template polls/*.tpl
*
* @license GNU General Public License, version 2
* @copyright 2013 OOO "ЛС-СОФТ" {@link http://livestreetcms.com}
* @author Denis Shakhov <denis.shakhov@gmail.com>
*/
.poll { margin-bottom: 15px; background: #fafafa; padding: 15px; }
.poll { margin-bottom: 15px; background: #fafafa; padding: 15px; }
.poll-list { margin-bottom: 20px; margin-left: 0; list-style-type: none; }
.poll-title { font-size: 20px; margin-bottom: 10px; }
.poll-item { margin-bottom: 10px; }
.poll-item:last-child { margin-bottom: 0; }
.poll-item label { display: inline; }
.poll-answer-list { margin-bottom: 20px; margin-left: 0; list-style-type: none; }
.poll-answer-list-item { margin-bottom: 10px; }
.poll-answer-list-item:last-child { margin-bottom: 0; }
.poll-answer-list-item label { display: inline; }
/**
* Результат опроса
*
* @template topics/poll_result.tpl
* @template polls/poll.result.tpl
*/
.poll-result { margin-bottom: 10px; padding: 15px 15px 0; background: #fff; border: 1px solid #eee; }
.poll-result-item { margin-bottom: 20px; overflow: hidden; zoom: 1; }
@ -38,9 +40,11 @@
/**
* Создание опроса
*
* @template actions/ActionQuestion/add.tpl
* @template polls/poll.form.tpl
*/
.poll-add-item { margin-bottom: 10px; padding-right: 25px; position: relative; }
.poll-add-item:last-child { margin-bottom: 0; }
.poll-add-item-input { width: 100%; }
.poll-add-item-remove { position: absolute; top: 7px; right: 0; cursor: pointer; }
.poll-form-answer-item { margin-bottom: 10px; padding-right: 25px; position: relative; }
.poll-form-answer-item:last-child { margin-bottom: 0; }
.poll-form-answer-item-remove { position: absolute; top: 7px; right: 0; cursor: pointer; }
.poll-form-list { }
.poll-form-list-item { padding: 10px 70px 10px 15px; background: #fff; margin-bottom: 1px; position: relative; }

View file

@ -261,7 +261,7 @@ jQuery(document).ready(function($){
// Временный костыль для сабмита форм
// TODO: Перенести в плагин button
$('button[data-button-submit-form]').on('click', function () {
$(document).on('click', 'button[data-button-submit-form]', function () {
$( '#' + $(this).data('button-submit-form') ).submit();
});

View file

@ -1,7 +1 @@
<div id="poll-form-items">
{if $aPollItems}
{foreach $aPollItems as $oPoll}
{include file="polls/poll.form.item.tpl" oPoll=$oPoll}
{/foreach}
{/if}
</div>
{include 'polls/poll.form.list.tpl'}

View file

@ -10,10 +10,11 @@
{block name='field_holder' prepend}
{if $sFieldLabel}<label>{/if}
<input type="checkbox"
id="{if $sFieldId}{$sFieldId}{else}{$sFieldName}{/if}"
name="{$sFieldName}"
value="{if $sFieldValue}{$sFieldValue}{else}1{/if}"
<input type="checkbox"
id="{if $sFieldId}{$sFieldId}{else}{$sFieldName}{/if}"
name="{$sFieldName}"
value="{if $sFieldValue}{$sFieldValue}{else}1{/if}"
{if $bFieldIsDisabled}disabled{/if}
{if $bFieldChecked}checked{else}{if $_aRequest[$sFieldName] == 1}checked{/if}{/if} />
{if $sFieldLabel}{$sFieldLabel}</label>{/if}
{/block}

View file

@ -0,0 +1,20 @@
{**
*
*}
{extends file='forms/fields/form.field.base.tpl'}
{block name='field_before'}
{$bFieldNoLabel = true}
{/block}
{block name='field_holder' prepend}
{if $sFieldLabel}<label>{/if}
<input type="radio"
id="{if $sFieldId}{$sFieldId}{else}{$sFieldName}{/if}"
name="{$sFieldName}"
value="{if $sFieldValue}{$sFieldValue}{else}1{/if}"
{if $bFieldIsDisabled}disabled{/if}
{if $bFieldChecked}checked{else}{if $_aRequest[$sFieldName] == 1}checked{/if}{/if} />
{if $sFieldLabel}{$sFieldLabel}</label>{/if}
{/block}

View file

@ -75,7 +75,7 @@
<script>
ls.lang.load({json var = $aLangJs});
ls.lang.load({lang_load name="blog.blog, favourite.add, favourite.remove, topic_question_create_answers_error_max, geo_select_city, geo_select_region, blog.add.fields.type.note_open, blog.add.fields.type.note_close, common.success.add, common.success.remove"});
ls.lang.load({lang_load name="poll.notices.error_answers_max, blog.blog, favourite.add, favourite.remove, geo_select_city, geo_select_region, blog.add.fields.type.note_open, blog.add.fields.type.note_close, common.success.add, common.success.remove"});
ls.registry.set('comment_max_tree', {json var=$oConfig->Get('module.comment.max_tree')});
ls.registry.set('block_stream_show_tip', {json var=$oConfig->Get('block.stream.show_tip')});

View file

@ -8,73 +8,22 @@
{block name='modal_id'}modal-poll-create{/block}
{block name='modal_class'}modal-poll-create js-modal-default{/block}
{block name='modal_title'}{if $oPoll}Редактирование опроса{else}Создание опроса{/if}{/block}
{block name='modal_title'}
{if $oPoll}
{$aLang.poll.form.title.edit}
{else}
{$aLang.poll.form.title.add}
{/if}
{/block}
{block name='modal_content'}
<form action="" method="post" onsubmit="return false;" id="form-poll-create">
{* Заголовок топика *}
{include file='forms/fields/form.field.text.tpl'
sFieldName = 'poll[title]'
sFieldValue = {($oPoll) ? $oPoll->getTitle() : '' }
sFieldLabel = 'Название опроса'}
{if $oPoll and $oPoll->getCountVote()}
{$bDisableChangeType=true}
{/if}
Пользователь может выбрать:
<label><input type="radio" name="poll[type]" value="one" {if !$oPoll or $oPoll->getCountAnswerMax()==1}checked="checked"{/if} {if $bDisableChangeType}disabled="disabled"{/if}> один вариант</label>
<label><input type="radio" name="poll[type]" value="many" {if $oPoll and $oPoll->getCountAnswerMax()>1}checked="checked"{/if} {if $bDisableChangeType}disabled="disabled"{/if}>
несколько вариантов
</label>
{include file='forms/fields/form.field.text.tpl'
sFieldName = 'poll[count_answer_max]'
sFieldValue = {($oPoll) ? $oPoll->getCountAnswerMax() : 2 }
bFieldIsDisabled = $bDisableChangeType }
<div class="fieldset poll-add js-poll-add">
<header class="fieldset-header">
<h3 class="fieldset-title">{$aLang.topic_question_create_answers}</h3>
</header>
<ul class="fieldset-body poll-add-list js-poll-add-list">
<script type="text/javascript">
ls.poll.clearItemInit();
{if $oPoll}
{$aAnswers=$oPoll->getAnswers()}
{foreach $aAnswers as $oAnswer}
ls.poll.addItemInit({
'answer_title': {json var=$oAnswer->getTitle()},
'answer_id': {json var=$oAnswer->getId()},
'disable_update': {json var=!$oPoll->isAllowUpdate()},
'disable_remove': {json var=(!$oPoll->isAllowUpdate() || $oAnswer->getCountVote()) } });
{/foreach}
{else}
ls.poll.addItemInit({ });
{/if}
</script>
</ul>
{if !$oPoll or $oPoll->isAllowUpdate()}
<footer class="fieldset-footer">
<button type="button" class="button button-primary js-poll-add-button" title="[Ctrl + Enter]">{$aLang.topic_question_create_answers_add}</button>
</footer>
{/if}
</div>
{if $oPoll}
{include file='forms/fields/form.field.hidden.tpl' sFieldName='poll_id' sFieldValue=$oPoll->getId()}
{else}
{include file='forms/fields/form.field.hidden.tpl' sFieldName='target[type]' sFieldValue=$sTargetType}
{include file='forms/fields/form.field.hidden.tpl' sFieldName='target[id]' sFieldValue=$sTargetId}
{/if}
{include file='forms/fields/form.field.hidden.tpl' sFieldName='target[tmp]' sFieldValue=$sTargetTmp}
</form>
{include 'polls/poll.form.tpl'}
{/block}
{block name='modal_footer_begin'}
<button type="submit" class="button button-primary" onclick="{if $oPoll}ls.poll.updatePoll('#form-poll-create',this);{else}ls.poll.createPoll('#form-poll-create',this);{/if}">{if $oPoll}{$aLang.common.save}{else}{$aLang.common.add}{/if}</button>
{include file='forms/fields/form.field.button.tpl'
sFieldAttributes = 'data-button-submit-form="form-poll-create"'
sFieldText = ($oPoll) ? $aLang.common.save : $aLang.common.add
sFieldClasses = 'js-poll-form-submit'
sFieldStyle = 'primary'}
{/block}

View file

@ -0,0 +1,20 @@
{**
* Блок добавления ответа
*
* @styles poll.css
* @scripts <common>/js/poll.js
*}
<li class="poll-form-answer-item js-poll-form-answer-item" {if $bPollItemIsTemplate|default:false}data-is-template="true"{/if} {if $bPollItemIsTemplate|default:false}style="display: none"{/if}>
<input type="hidden" name="answers[{$iPollItemIndex|default:0}][id]" value="{if $oPollItem}{$oPollItem->getId()}{/if}" class="js-poll-form-answer-item-id">
<input type="text"
name="answers[{$iPollItemIndex|default:0}][title]"
class="width-full js-poll-form-answer-item-text"
value="{if $oPollItem}{$oPollItem->getTitle()}{/if}"
{if ! $bPollIsAllowUpdate|default:true}disabled{/if}>
{if $bPollIsAllowRemove|default:true}
<i class="icon-remove poll-form-answer-item-remove js-poll-form-answer-item-remove" title="{$aLang.common.remove}"></i>
{/if}
</li>

View file

@ -1,9 +1,25 @@
<div>
<a href="#" data-type="modal-toggle" data-modal-url="{router page='ajax/poll/modal-create'}" data-modal-aftershow="ls.poll.initFormCreate();" data-param-target_type="{$sTargetType}" data-param-target_id="{$sTargetId}">Добавить опрос</a>
{**
* Форма добавления
*
* @styles poll.css
* @scripts <common>/js/poll.js
*}
{$aBlockParams = []}
{$aBlockParams.target_type = $sTargetType}
{$aBlockParams.target_id = $sTargetId}
<div class="fieldset">
<header class="fieldset-header">
<h3 class="fieldset-title">Опросы</h3>
</header>
{insert name="block" block="pollFormItems" params=$aBlockParams}
<div class="fieldset-body">
<a href="#" class="button button-primary" data-type="modal-toggle" data-modal-url="{router page='ajax/poll/modal-create'}" data-param-target_type="{$sTargetType}" data-param-target_id="{$sTargetId}">Добавить опрос</a>
<br>
<br>
{$aBlockParams = []}
{$aBlockParams.target_type = $sTargetType}
{$aBlockParams.target_id = $sTargetId}
{insert name="block" block="pollFormItems" params=$aBlockParams}
</div>
</div>

View file

@ -1,5 +0,0 @@
<div id="poll-form-item-{$oPoll->getId()}">
Опрос: {$oPoll->getTitle()} &mdash;
<a href="#" data-type="modal-toggle" data-modal-url="{router page='ajax/poll/modal-update'}" data-modal-aftershow="ls.poll.initFormUpdate();" data-param-id="{$oPoll->getId()}" data-param-target_tmp="{$oPoll->getTargetTmp()}">{$aLang.common.edit}</a>
<a href="#" onclick="return ls.poll.removePoll({$oPoll->getId()},'{$oPoll->getTargetTmp()}');">{$aLang.common.remove}</a>
</div>

View file

@ -0,0 +1,15 @@
{**
* Добавленный опрос в форме добавления
*
* @styles poll.css
* @scripts <common>/js/poll.js
*}
<li class="poll-form-list-item js-poll-form-list-item" data-poll-id="{$oPoll->getId()}" data-poll-target-tmp="{$oPoll->getTargetTmp()}">
{$oPoll->getTitle()}
<ul class="user-list-small-item-actions">
<li class="icon-edit js-poll-form-list-item-edit" title="{$aLang.common.edit}" data-type="modal-toggle" data-modal-url="{router page='ajax/poll/modal-update'}" data-param-id="{$oPoll->getId()}" data-param-target_tmp="{$oPoll->getTargetTmp()}"></li>
<li class="icon-remove js-poll-form-list-item-remove" title="{$aLang.common.remove}"></li>
</ul>
</li>

View file

@ -0,0 +1,14 @@
{**
* Список добавленных опросов в форме добавления
*
* @styles poll.css
* @scripts <common>/js/poll.js
*}
<ul class="poll-form-list js-poll-form-list">
{if $aPollItems}
{foreach $aPollItems as $oPoll}
{include 'polls/poll.form.list.item.tpl' oPoll=$oPoll}
{/foreach}
{/if}
</ul>

View file

@ -0,0 +1,85 @@
{**
* Форма добавления опроса
*
* @styles poll.css
* @scripts <common>/js/poll.js
*}
<form action="" method="post" id="form-poll-create" data-action="{if $oPoll}update{else}add{/if}">
{* Заголовок топика *}
{include file='forms/fields/form.field.text.tpl'
sFieldName = 'poll[title]'
sFieldValue = {($oPoll) ? $oPoll->getTitle() : '' }
sFieldLabel = 'Вопрос'}
{* Кол-во вариантов которые может выбрать пользователь *}
{if $oPoll and $oPoll->getCountVote()}
{$bDisableChangeType = true}
{/if}
Пользователь может выбрать:
{include file='forms/fields/form.field.radio.tpl'
sFieldName = 'poll[type]'
sFieldValue = 'one'
sFieldLabel = 'Один вариант'
bFieldChecked = ! $oPoll or $oPoll->getCountAnswerMax() == 1
bFieldIsDisabled = $bDisableChangeType}
{include file='forms/fields/form.field.radio.tpl'
sFieldName = 'poll[type]'
sFieldValue = 'many'
sFieldLabel = 'Несколько вариантов'
bFieldChecked = $oPoll and $oPoll->getCountAnswerMax() > 1
bFieldIsDisabled = $bDisableChangeType}
{include file='forms/fields/form.field.text.tpl'
sFieldName = 'poll[count_answer_max]'
sFieldValue = ($oPoll) ? $oPoll->getCountAnswerMax() : 2
bFieldIsDisabled = $bDisableChangeType}
{* Варианты ответов *}
<div class="fieldset js-poll-add">
<header class="fieldset-header">
<h3 class="fieldset-title">{$aLang.poll.form.answers_title}</h3>
</header>
<ul class="fieldset-body poll-form-answer-list js-poll-form-answer-list">
{if $oPoll}
{$aAnswers = $oPoll->getAnswers()}
{foreach $aAnswers as $oAnswer}
{include 'polls/poll.form.answers.item.tpl'
oPollItem = $oAnswer
iPollItemIndex = $oAnswer@index
bPollIsAllowUpdate = $oPoll->isAllowUpdate()
bPollIsAllowRemove = $oPoll->isAllowUpdate() || ! $oAnswer->getCountVote()}
{/foreach}
{else}
{include 'polls/poll.form.answers.item.tpl'}
{/if}
</ul>
{if ! $oPoll or $oPoll->isAllowUpdate()}
<footer class="fieldset-footer">
<button type="button" class="button js-poll-form-answer-add" title="[Ctrl + Enter]">{$aLang.common.add}</button>
</footer>
{/if}
</div>
{* Скрытые поля *}
{if $oPoll}
{include file='forms/fields/form.field.hidden.tpl' sFieldName='poll_id' sFieldValue=$oPoll->getId()}
{else}
{include file='forms/fields/form.field.hidden.tpl' sFieldName='target[type]' sFieldValue=$sTargetType}
{include file='forms/fields/form.field.hidden.tpl' sFieldName='target[id]' sFieldValue=$sTargetId}
{/if}
{include file='forms/fields/form.field.hidden.tpl' sFieldName='target[tmp]' sFieldValue=$sTargetTmp}
</form>
{* Шаблон ответа для добавления с помощью js *}
{include 'polls/poll.form.answers.item.tpl' bPollItemIsTemplate=true}

View file

@ -1,32 +1,10 @@
{foreach $aPollItems as $oPollItem}
<div class="poll poll-type-{$oPollItem->getTargetType()} js-poll" data-poll-id="{$oPollItem->getId()}" data-poll-answer-max="{$oPollItem->getCountAnswerMax()}">
{$oPollItem->getTitle()}
{if !$oPollItem->getVoteCurrent()}
<form action="" method="post" onsubmit="return false;">
<ul class="poll-list">
{foreach $oPollItem->getAnswers() as $oAnswer}
<li class="poll-item">
<label>
{if $oPollItem->getCountAnswerMax()>1}
<input type="checkbox" name="answers[]" value="{$oAnswer->getId()}" />
{else}
<input type="radio" name="answers[]" value="{$oAnswer->getId()}" />
{/if}
{$oAnswer->getTitle()}
</label>
</li>
{/foreach}
</ul>
<input type="hidden" name="id" value="{$oPollItem->getId()}">
<button type="submit" class="button button-primary js-poll-button-vote">Голосовать</button>
<button type="submit" class="button js-poll-button-abstain">Воздержаться</button>
</form>
{else}
{include file='polls/poll.result.tpl' oPoll=$oPollItem}
{/if}
</div>
{**
* Список опросов
*
* @styles poll.css
* @scripts <common>/js/poll.js
*}
{foreach $aPollItems as $oPoll}
{include 'polls/poll.tpl'}
{/foreach}

View file

@ -1,35 +1,33 @@
{**
* Результат опроса
*
* @styles assets/css/poll.css
* @scripts <framework>/js/livestreet/poll.js
* @styles poll.css
* @scripts <common>/js/poll.js
*}
{$oPoll->getTitle()}
<ul class="poll-result js-poll-result">
{$aAnswerItems=$oPoll->getAnswers()}
{$iPollItemsCount = count($aAnswerItems)}
{$aAnswerItems = $oPoll->getAnswers()}
{$iPollItemsCount = count($aAnswerItems)}
{foreach $aAnswerItems as $oAnswer}
<li class="poll-result-item {if $oPoll->getCountVoteAnswerMax() == $oAnswer->getCountVote()}poll-result-item-most{/if} js-poll-result-item"
data-poll-item-count="{$oAnswer->getCountVote()}"
data-poll-item-pos="{$iPollItemsCount - $oAnswer@index - 1}">
{foreach $aAnswerItems as $oAnswer}
<li class="poll-result-item {if $oPoll->getCountVoteAnswerMax() == $oAnswer->getCountVote()}poll-result-item-most{/if} js-poll-result-item"
data-poll-item-count="{$oAnswer->getCountVote()}"
data-poll-item-pos="{$iPollItemsCount - $oAnswer@index - 1}">
<div class="poll-result-item-count">
<strong>{$oPoll->getAnswerPercent($oAnswer)}%</strong>
<span>({$oAnswer->getCountVote()})</span>
</div>
<div class="poll-result-item-count">
<strong>{$oPoll->getAnswerPercent($oAnswer)}%</strong>
<span>({$oAnswer->getCountVote()})</span>
</div>
<div class="poll-result-item-chart">
<div class="poll-result-item-label">{$oAnswer->getTitle()}</div>
<div class="poll-result-item-bar" style="width: {$oPoll->getAnswerPercent($oAnswer)}%;" ></div>
</div>
</li>
{/foreach}
<div class="poll-result-item-chart">
<div class="poll-result-item-label">{$oAnswer->getTitle()}</div>
<div class="poll-result-item-bar" style="width: {$oPoll->getAnswerPercent($oAnswer)}%;" ></div>
</div>
</li>
{/foreach}
</ul>
{* Кнопка сортировки *}
<button class="button button-icon js-poll-result-button-sort" title="Включить\выключить сортировку"><i class="icon-align-left"></i></button>
<button class="button button-icon js-poll-result-sort" title="{$aLang.poll.result.sort}"><i class="icon-align-left"></i></button>
<span class="poll-result-total">Проголосовало: {$oPoll->getCountVote()} | Воздержалось: {$oPoll->getCountAbstain()}</span>
<span class="poll-result-total">{$aLang.poll.result.voted_total}: {$oPoll->getCountVote()} | {$aLang.poll.result.abstained_total}: {$oPoll->getCountAbstain()}</span>

View file

@ -0,0 +1,37 @@
{**
* Опрос
*
* @styles poll.css
* @scripts <common>/js/poll.js
*}
<div class="poll poll-type-{$oPoll->getTargetType()} js-poll" data-poll-id="{$oPoll->getId()}" data-poll-answer-max="{$oPoll->getCountAnswerMax()}">
<h3 class="poll-title">{$oPoll->getTitle()}</h3>
{if ! $oPoll->getVoteCurrent()}
<form action="" method="post" onsubmit="return false;" class="js-poll-vote-form">
<ul class="poll-answer-list">
{foreach $oPoll->getAnswers() as $oAnswer}
<li class="poll-answer-list-item">
<label>
{if $oPoll->getCountAnswerMax()>1}
<input type="checkbox" name="answers[]" value="{$oAnswer->getId()}" />
{else}
<input type="radio" name="answers[]" value="{$oAnswer->getId()}" />
{/if}
{$oAnswer->getTitle()}
</label>
</li>
{/foreach}
</ul>
{include file='forms/fields/form.field.hidden.tpl' sFieldName='id' sFieldValue=$oPoll->getId()}
<button type="submit" class="button button-primary js-poll-vote">{$aLang.poll.vote}</button>
<button type="submit" class="button js-poll-abstain">{$aLang.poll.abstain}</button>
</form>
{else}
{include file='polls/poll.result.tpl' oPoll=$oPoll}
{/if}
</div>