【问题标题】:Add Yes or No tickboxes to my site (Silverstripe)将是或否复选框添加到我的网站 (Silverstripe)
【发布时间】:2013-12-30 14:03:49
【问题描述】:

我正在尝试在我的 Silverstripe 网站上的一个成员表单中添加一个是或否复选框。我已将这些框添加到站点以及 CMS 中的成员部分。想法是它们应该被链接,例如,当您在网站上勾选“是”时,会员部分也应该被勾选“是”。我一直在尝试,但无法链接复选框。

自从我接触 Silverstripe 以来已经有一段时间了,所以任何方向都将不胜感激。另外,我如何使复选框成为您只能勾选是或否,目前您可以同时勾选。

到目前为止,这是我的代码,我将继续努力,但如果有人能指出我正确的方向,那就太好了。非常感谢。

$fields = new FieldSet( ...
    new CheckboxSetField('Questions','Do you want to show this?', array('true' => 'yes', 'false' => 'no'))
...);

function doSignup($data, $form) {
$member = Member::currentUser();
...
$member->Questions = $data['Questions'];
...
}

function extraStatics() {
    return array(
        'db' => array(
           ...
          'Questions' =>"Enum('Yes,No')", 
            ...
        ), 
    );}

 public function updateCMSFields(FieldSet &$fields) {
  ...
   $fields->addFieldToTab('Root.Membership', new CheckboxSetField('Questions','Do you want to show this?', array('true' => 'yes', 'false' => 'no'))); 
}

【问题讨论】:

  • 您使用的是什么版本的 Silverstripe?
  • 而不是使用 Yes 和 No 作为选项的 Enum,我建议您使用可以设置为 true 或 false 的布尔值。然后使用 CheckboxField 代替 CheckboxSetField。
  • 您好 3dgoo,感谢您的回复,对不起,我已经离开了。我正在使用 SS 2.4.5。如果您使用 CheckboxField,是否可以有两个复选框来表示是和否?如果是这样,我该如何定位它,一些代码示例会很棒。我尝试了布尔值,但当我没有勾选问题复选框时,它一直给我一个通知“未定义索引:问题”。任何帮助表示赞赏,因为我有点卡住了。谢谢。

标签: php content-management-system silverstripe


【解决方案1】:

以下答案适用于 Silverstripe 2.4。

假设我们想向我们的 silverstripe 成员对象添加一个布尔复选框,以由任何登录的管理员通过 CMS 进行控制,并由该登录的成员通过前端进行控制。

首先我们需要扩展 Member 对象。在这个类中,我们将布尔值添加到数据库中。我们还将 CheckboxField 添加到成员的 CMS 字段中。

MemberExtension.php

class MemberExtension extends DataObjectDecorator {

    public function extraStatics() {
        return array (
            'db' => array (
                'Questions' => 'Boolean'
            )
        );
    }

    public function updateCMSFields($fields) {
        $fields->addFieldToTab('Root.Membership', new CheckboxField('Questions', 'Do you want to show this?')); 
    }

}

我们在站点配置中添加 MemberExtension。

_config.php

...
Object::add_extension('Member', 'MemberExtension');
...

然后在我们的页面控制器中,我们添加一个函数来向登录的用户显示一个表单来控制该字段。我们还具有更新功能,可以在提交表单时保存这些更改。

OurCustomPage.php

...
class OurCustomPage_Controller extends Page_Controller {
    ...
    public function MemberForm() {
        if ($member = Member::currentUser()) {
            $form = new Form (
                $this,
                'MemberForm',
                new FieldSet (
                    new CheckboxField('Questions', 'Do you want to show this?', $member->Questions)
                ),
                new FieldSet (
                        new FormAction('update', 'Update')
                )
            );

            return $form;
        }
        return false;
    }

    function update($data, $form) {
        $member = Member::currentUser();
        $member->Questions = isset($data['Questions']);
        $member->write();
        return $this->redirectBack();
    }
    ...
}

注意,isset($data['Questions']) 用于获取问题复选框的真/假值。这是因为如果未选中问题复选框,则未提交问题表单输入。这就是<input type="checkbox" /> 的工作原理。

最后在我们的类布局模板中,我们需要添加$MemberForm

OurCustomPage.ss

...
$MemberForm
...

【讨论】:

  • 嗨 3dgoo,非常感谢您的帮助,它现在正在工作,谢谢谢谢谢谢,聪明!就像你说的那样,这是因为我没有将复选框数据设置为 isset($data['Questions']),我会对此进行记录,感谢您的详细解释。只是出于兴趣,您是否会出于这种目的使用 CheckboxSetField,例如为刑事定罪打勾是或否?另外 SS 2.4 和 SS3 有什么区别,我可以在任何地方/链接学习吗?非常感谢您的大力帮助,您让我很开心,非常感谢!
  • 很高兴我能帮上忙。我不会为这样的事情做一个复选框,不。因为该值只会是真或假,所以我会使用布尔值。对于布尔值,我会使用 CheckboxField 或 OptionsetField 来处理您希望用户选择是或否的情况。
  • Silverstripe 3.1 是 Silverstripe 从未有过的更好版本。我强烈建议您为所有项目使用最新版本。它更稳定,错误更少,更易于开发,得到更好的支持。在官方的 ChangeLogs 中有一些更改的详细信息:doc.silverstripe.org/framework/en/changelogs/3.0.0doc.silverstripe.org/framework/en/3.1/changelogs/3.1.0
  • 非常感谢,非常感谢您的帮助。谢谢:) 如果我想使用OptionsetField,你能给我看一些代码吗?我知道如何在首页和 CMS 上显示该字段,您不会为 OptionsetField 设置 isset,对吗? $member->Questions = isset($data['Questions']);非常感谢。
  • 你如何使用它取决于你设置的OptionsetField。如果您像这样设置它new OptionsetField('Questions', 'Questions', array('true' => 'Yes', false => 'No'));,您可以检索类似$member->Questions = isset($data['Questions']) ? $data['Questions'] : false; 的值。请注意,我没有对此进行测试。
猜你喜欢
  • 1970-01-01
  • 2012-11-29
  • 1970-01-01
  • 2014-03-01
  • 2017-09-26
  • 1970-01-01
  • 1970-01-01
  • 2012-08-07
  • 2017-07-02
相关资源
最近更新 更多