Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision ae87c27e

Von Moritz Bunkus vor fast 9 Jahren hinzugefügt

  • ID ae87c27e82eaa39a78e2380c9c069abe674ced86
  • Vorgänger 21794e2b
  • Nachfolger 96f8eef0

AttrDuration: Implementation für Spalten, die Dauer in Minuten speichern

Unterschiede anzeigen:

SL/DB/Helper/AttrDuration.pm
3 3
use strict;
4 4

  
5 5
use parent qw(Exporter);
6
our @EXPORT = qw(attr_duration);
6
our @EXPORT = qw(attr_duration attr_duration_minutes);
7 7

  
8 8
use Carp;
9 9

  
......
13 13
  _make($package, $_) for @attributes;
14 14
}
15 15

  
16
sub attr_duration_minutes {
17
  my ($package, @attributes) = @_;
18

  
19
  _make_minutes($package, $_) for @attributes;
20
}
21

  
16 22
sub _make {
17 23
  my ($package, $attribute) = @_;
18 24

  
......
75 81
  };
76 82
}
77 83

  
84
sub _make_minutes {
85
  my ($package, $attribute) = @_;
86

  
87
  no strict 'refs';
88

  
89
  *{ $package . '::' . $attribute . '_as_hours' } = sub {
90
    my ($self, $value) = @_;
91

  
92
    $self->$attribute($value * 60 + ($self->$attribute % 60)) if @_ > 1;
93
    return int(($self->$attribute // 0) / 60);
94
  };
95

  
96
  *{ $package . '::' . $attribute . '_as_minutes' } = sub {
97
    my ($self, $value) = @_;
98

  
99
    $self->$attribute(int($self->$attribute) - (int($self->$attribute) % 60) + ($value // 0)) if @_ > 1;
100
    return ($self->$attribute // 0) % 60;
101
  };
102

  
103
  *{ $package . '::' . $attribute . '_as_duration_string' } = sub {
104
    my ($self, $value) = @_;
105

  
106
    if (@_ > 1) {
107
      if (!defined($value) || ($value eq '')) {
108
        $self->$attribute(undef);
109
      } else {
110
        croak $::locale->text("Invalid duration format") if $value !~ m{^(?:(\d*):)?(\d+)$};
111
        $self->$attribute(($1 // 0) * 60 + ($2 // 0));
112
      }
113
    }
114

  
115
    my $as_hours   = "${attribute}_as_hours";
116
    my $as_minutes = "${attribute}_as_minutes";
117
    return defined($self->$attribute) ? sprintf('%d:%02d', $self->$as_hours, $self->$as_minutes) : undef;
118
  };
119
}
120

  
78 121
1;
79 122
__END__
80 123

  
......
92 135
  # In a Rose model:
93 136
  use SL::DB::Helper::AttrDuration;
94 137
  __PACKAGE__->attr_duration('time_estimation');
138
  __PACKAGE__->attr_duration_minutes('hours');
95 139

  
96 140
  # Read access:
97 141
  print "Minutes: " . $obj->time_estimation_as_minutes . " hours: " . $obj->time_estimation_as_hours . "\n";
......
104 148

  
105 149
=head1 OVERVIEW
106 150

  
107
This is a helper for columns that store a duration as a numeric or
108
floating point number representing a number of hours. So the value
109
1.75 would stand for "1 hour, 45 minutes".
151
This is a helper for columns that store a duration in one of two formats:
110 152

  
111
The helper methods created are:
153
=over 2
154

  
155
=item 1. as a numeric or floating point number representing a number
156
of hours
157

  
158
=item 2. as an integer presenting a number of minutes
159

  
160
=back
161

  
162
In the first case the value 1.75 would stand for "1 hour, 45
163
minutes". In the second case the value 105 represents the same
164
duration.
165

  
166
The helper methods created depend on the mode. Calling
167
C<attr_duration> makes the following methods available:
112 168

  
113 169
=over 4
114 170

  
......
160 216

  
161 217
=back
162 218

  
219
With C<attr_duration_minutes> the following methods are available:
220

  
221
=over 4
222

  
223
=item C<attribute_as_minutes [$new_value]>
224

  
225
Access only the minutes. Return values are in the range [0 - 59].
226

  
227
=item C<attribute_as_hours [$new_value]>
228

  
229
Access only the hours. Returns an integer value.
230

  
231
=item C<attribute_as_duration_string [$new_value]>
232

  
233
Access the full value as a formatted string in the form C<h:mm>,
234
e.g. C<1:30> for the value 90 minutes. Parsing such a string is
235
supported, too.
236

  
237
=back
238

  
163 239
=head1 FUNCTIONS
164 240

  
165 241
=over 4
......
169 245
Package method. Call with the names of attributes for which the helper
170 246
methods should be created.
171 247

  
248
=item C<attr_duration_minutes @attributes>
249

  
250
Package method. Call with the names of attributes for which the helper
251
methods should be created.
252

  
172 253
=back
173 254

  
174 255
=head1 BUGS

Auch abrufbar als: Unified diff