mateusz/silverstripe-polls

SilverStripe 问卷模块

安装: 781

依赖者: 0

建议者: 0

安全: 0

星标: 11

关注者: 2

分支: 16

开放问题: 18

类型:silverstripe-module

dev-master 2014-02-07 04:30 UTC

This package is not auto-updated.

Last update: 2024-09-10 02:03:14 UTC


README

Build Status

维护者

Mateusz Uzdowski

需求

master: SilverStripe 3.0.x 0.1: SilverStripe 2.4.x

安装

  1. 将模块文件夹包含在项目根文件夹中,并将其重命名为 "polls"
  2. 重建数据库模式(dev/build?flush=1)

功能

  • 默认情况下,每个访问者,通过浏览器cookie确定,只能投票一次
  • 使用 Google chart API
  • 支持单选和多选问卷

用法

CMS 使用

  1. 登录 CMS
  2. 转到 问卷 部分
  3. 创建问卷,点击 添加,然后添加几个问卷选项
  4. 后续步骤取决于 PollForm 的实现方式

将 Poll 对象与 PollForm 连接

PollForm 知道如何渲染自己,并且能够渲染选择表和图表。但是,它需要一个 Poll 对象作为其输入,这取决于你如何提供它:这取决于你的项目,你将如何想要这样做。

以下是将一个 Poll 与每个页面关联的最基本示例

class Page extends SiteTree {
	static $has_one = array(
		'Poll' => 'Poll'
	);

	...

    function getCMSFields() {
        $fields = parent::getCMSFields();

        $polls = Poll::get();
        if ($polls) { 
            $fields->addFieldsToTab('Root.Main', array(
                DropdownField::create('PollID', 'Poll', $polls->map(), $this->PollID)->setEmptyString('--- Select a poll ---'),
            ));
        }
        else {
            $fields->addFieldsToTab('Root.Main', array(
                new LiteralField('Heading', '<h1>No polls available</h1>'),
				new LiteralField('PollID', '<p>There are no polls available. Please use <a href="admin/polls">the polls
					section</a> to add them.</p>')
            ));
        }

        return $fields;
    }

	...
}

现在你应该能够在 CMS 中访问你的页面,并从新的下拉菜单中选择问卷。

在模板中嵌入 PollForm

这里有一个建议,如何创建和公开一个 PollForm 给所有模板

class Page_Controller extends ContentController {
	...

	function PollForm() {
		$pollForm = new PollForm($this, 'PollForm', $this->Poll());	
		// Customise some options
		$pollForm->setChartOption('height', 300);
		$pollForm->setChartOption('width', 300);
		$pollForm->setChartOption('colours', array('FF0000', '00FF00'));
		return $pollForm;
	}

	...
}

然后你可以在模板中这样嵌入这个表单

$PollForm

这允许你指定问卷要显示的位置。如果相关的 SiteTree 对象没有与它关联的问卷(即 $this->Poll() 为空),则问卷不会显示。

自定义图表

通过重新定义你的 theme 文件夹中的 PollForm.ss 模板,你可以获得相当大的控制权。以下是默认设置

<% if $Poll.Visible %>
	<h3>$Poll.Title</h3>
	<% if $Image %>
		$Poll.Image.ResizedImage(300,200)
	<% end_if %>
	<% if $Description %>
		$Poll.Description
	<% end_if %>

	<% if $Poll.hasVoted %>
		$Chart
	<% else %>
		$DefaultForm
	<% end_if %>
<% end_if %>

以下是高级设置,它将问卷渲染为简单的 HTML 块,使用一些问卷 API 函数

<% if $Poll.Visible %>
	<div class="poll">
		<% if $Poll.Image %>
			<div class="thumbnail">
				<img src="<% control Poll.Image %>$CroppedImage(150,50).URL<% end_control %>" alt="$Title"/>
			</div>
		<% end_if %>
		<% if $Poll.Title %>
			<h3>$Poll.Title</h3>
		<% end_if %>
		<% if $Poll.Description %>
			<p>$Poll.Description<br/></p>
		<% end_if %>

		<% if $shouldShowResults %>
			<div class='poll-results'>
				<% control Poll.Choices %>
					<div class='poll-results-entry poll-results-entry-$EvenOdd'>
						<span><em>$Title $PercentageOfTotal ($Votes):</em></span>
						<div style='width: $PercentageOfMax;'>&nbsp;</div>
					</div>
				<% end_control %>
			</div>
		<% else %>
			$DefaultForm
		<% end_if %>

		<p class='poll-total'>Total votes: $Poll.TotalVotes</p>
	</div>
<% end_if %>

如果你想要进行全局更改,你可以使用装饰器并定义 replaceChart 函数。例如,以下将提供结果的纯文本渲染

class PollFormDecorator extends DataObjectDecorator {
	function replaceChart() {
		$choices = $this->owner->Poll()->Choices('', '"Order" ASC');

		$results = array();
		if ($choices) foreach($choices as $choice) {
			$results[] = "{$choice->Title}: {$choice->Votes}";
		}

		return implode($results, '<br/>');
	}
}

Object::add_extension('PollForm', 'PollFormDecorator');

最后,为了完全控制问卷表单和结果,可以继承 PollForm - 你可以创建特定于表单的模板或基于重定义 getChart 方法。这样,你也可以为问卷创建多个并行表示层。

自定义投票处理

使用 Vote_Backend,我们可以定义自己的投票处理器。投票处理器负责存储投票以及用户是否已经投票的逻辑。

请参阅 DatabaseVoteHandler 的示例。