使用Perl和PostgreSQL保存复选框选项

时间:2014-06-25 15:49:41

标签: mysql perl postgresql

我正在尝试创建一个用户首选项页面,其中包含一系列复选框,让用户决定他们希望如何接收通知。这是我当前的偏好HTML表单:

<form method="post">
  <table id="preferences" class = "preferences">
    <tr class="headers">
      <th class = "preferences">Preference</th>
      <th class = "preferences">Value</th>
      <th class = "preferences">Notification Preferences</th>
    </tr>
    <tr>
      <td class = "preferences">Default Post Markup</td>
      <td class = "preferences">
        <select name="default_markup">
          <% foreach(USystem::Markup->markup_types) {
                 print Usystem::Utils::option_tag($_->{id}, $_->{name}, $prefs->value(1));
             } %>
        </select>
      </td>
      <td>
        <input type = "checkbox" name = "notification-option" id = "all-post"> All Posts <br/>
        <input type = "checkbox" name = "notification-option" id = "others-post"> Other's Posts <br/>
        <input type = "checkbox" name = "notification-option" id = "client-post"> Cilent's Post <br/>
        <input type = "checkbox" name = "notification-option" id = "assign-post"> Task Assigned
      </td>
    </tr>
    <tr>
      <th colspan="3" class="submitrow"><input type="submit" name="submit" value="Save Preferences" /></th>
    </tr>
  </table>
</form>

我刚刚添加了4个复选框,我需要帮助将它们保存到数据库中,我使用布尔值来确定它们是否被选中。

在选择“保存首选项”按钮时运行的HTML页面上的My Perl脚本:

my $form = $Request->Params;
my $prefs = USystem::UserPrefs->new($user->userid);

if($Request->{Method} =~ /POST/i) {
    my $dbh = USystem::DB->new;

    if($form->{submit} eq "Save Preferences") {
        $prefs->value($USER_PREF_MARKUPTYPE, $form->{default_markup});
        $prefs->update;
    }
    $Response->Redirect('/preferences');
}

$ Request-&gt; Params与CGI-&gt; Params()

基本相同

这是UserPrefs:

package USystems::UserPrefs;

use strict;
use USystems::DB;

sub new {
    my $self = shift;
    my $class = ref($self) || $self;
    my $userid = shift;

    $self = bless {}, $class;
    $self->{dbh} = USystems::DB->new;

    if($userid) {
        $self->userid($userid);
        $self->__populate;
    }

    return $self;
}

sub __populate {
    my $self = shift;

    my $sth = $self->{dbh}->prepare("select prefid, value from user_preferences where userid=?");
    $sth->execute($self->userid);
    while(my $href = $sth->fetchrow_hashref()) {
        $self->value($href->{PREFID}, $href->{VALUE});
    }
    $sth->finish();
}

sub update {
    my $self = shift;

    my $sth = $self->{dbh}->prepare("delete from user_preferences where userid=?");
    $sth->execute($self->userid);
    $sth->finish;

    $sth = $self->{dbh}->prepare("insert into user_preferences(userid, prefid, value) values(?, ?, ?)");
    while(my ($prefid, $value) = each %{$self->{PREFS}}) {
        $sth->execute($self->userid, $prefid, $value);
    }
    $sth->finish;
}

sub userid {
    my $self = shift;
    $self->{USERID} = shift if(@_);
    $self->{USERID};
}

sub value {
    my $self = shift;
    my $prefid = shift;
    $self->{PREFS}->{$prefid} = shift if(@_);
    return $self->{PREFS}->{$prefid};
}

1

如何存储是否选中复选框的值以及更新当前的Perl脚本以接收值。我对Perl很陌生并没有太多运气。如果你能解释为什么你做了你也做了什么,我会很高兴。

如果您需要更多信息,请告诉我。感谢

1 个答案:

答案 0 :(得分:2)

该行

my $prefs = USystem::UserPrefs->new($user->userid)

创建一个新对象,并从数据库中复制该用户的当前首选项。之后,您可以使用$prefs->value(value_name [, new_value)访问或更新个人偏好设置,并且对$prefs->update的调用会将当前值复制回数据库

你已经拥有

$prefs->value($USER_PREF_MARKUPTYPE, $form->{default_markup})

你需要在调用

之前添加更多这样的调用来设置其他首选项的值
$prefs->update

全部保存