mateusz / silverstripe-polls
SilverStripe 问卷模块
dev-master
2014-02-07 04:30 UTC
Requires
- silverstripe/cms: ~3.1.2
- silverstripe/framework: ~3.1.2
This package is not auto-updated.
Last update: 2024-09-10 02:03:14 UTC
README
维护者
需求
master: SilverStripe 3.0.x 0.1: SilverStripe 2.4.x
安装
- 将模块文件夹包含在项目根文件夹中,并将其重命名为 "polls"
- 重建数据库模式(dev/build?flush=1)
功能
- 默认情况下,每个访问者,通过浏览器cookie确定,只能投票一次
- 使用 Google chart API
- 支持单选和多选问卷
用法
CMS 使用
- 登录 CMS
- 转到 问卷 部分
- 创建问卷,点击 添加,然后添加几个问卷选项
- 后续步骤取决于 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;'> </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
的示例。