11 C4::Message - object for messages in the message_queue table
15 How to add a new message to the queue:
19 my $borrower = { borrowernumber => 1 };
20 my $item = C4::Items::GetItem(1);
21 my $letter = C4::Letters::getletter('circulation', 'CHECKOUT');
22 C4::Letters::parseletter($letter, 'biblio', $item->{biblionumber});
23 C4::Letters::parseletter($letter, 'biblioitems', $item->{biblionumber});
24 C4::Message->enqueue($letter, $borrower->{borrowernumber}, 'email');
26 How to update a borrower's last checkout message:
29 my $borrower = { borrowernumber => 1 };
30 my $message = C4::Message->find_last_message($borrower, 'CHECKOUT', 'email');
31 $message->append("you also checked out some other book....");
36 This module presents an OO interface to the message_queue. Previously, you could
37 only add messages to the message_queue via C<C4::Letters::EnqueueMessage()>. With
38 this module, you can also get previously inserted messages, manipulate them, and
39 save them back to the database.
49 =head3 C4::Message->new(\%attributes)
51 This method creates an in-memory version of a message object.
55 # C4::Message->new(\%attributes) -- constructor
57 my ($class, $opts) = @_;
59 bless {%$opts} => $class;
63 =head3 C4::Message->find($id)
65 This method searches the message_queue table for a row with the given
66 C<message_id> and it'll return a C4::Message object if it finds one.
70 # C4::Message->find($id) -- find a message by its message_id
72 my ($class, $id) = @_;
73 my $dbh = C4::Context->dbh;
74 my $msgs = $dbh->selectall_arrayref(
75 qq{SELECT * FROM message_queue WHERE message_id = ?},
80 return $class->new($msgs->[0]);
86 =head3 C4::Message->find_last_message($borrower, $letter_code, $transport)
88 This method is used to get the borrower's most recent, pending, check-in or
89 checkout message. (This makes it possible to add more information to the
90 message before it gets sent out.)
94 # C4::Message->find_last_message($borrower, $letter_code, $transport)
95 # -- get the borrower's most recent pending checkin or checkout notification
96 sub find_last_message {
97 my ($class, $borrower, $letter_code, $transport) = @_;
98 # $type is the message_transport_type
99 $transport ||= 'email';
100 my $dbh = C4::Context->dbh;
101 my $msgs = $dbh->selectall_arrayref(
105 WHERE status = 'pending'
106 AND borrowernumber = ?
108 AND message_transport_type = ?
111 $borrower->{borrowernumber},
116 return $class->new($msgs->[0]);
123 =head3 C4::Message->enqueue($letter, $borrowernumber, $transport)
125 This is a front-end for C<C4::Letters::EnqueueLetter()> that adds metadata to
130 # C4::Message->enqueue($letter, $borrowernumber, $transport)
132 my ($class, $letter, $borrowernumber, $transport) = @_;
133 my $metadata = _make_metadata($letter);
134 $letter->{metadata} = Dump($metadata);
136 C4::Letters::EnqueueLetter({
138 borrowernumber => $borrowernumber,
139 message_transport_type => $transport,
143 # _make_metadata($letter) -- return the letter split into head/body/footer
146 if ($letter->{content} =~ /----/) {
147 my ($header, $body, $footer) = split(/----\r?\n?/, $letter->{content});
156 body => [$letter->{content}],
162 =head2 Instance Methods
164 =head3 $message->update()
166 This saves the $message object back to the database. It needs to have
167 already been created via C<enqueue> for this to work.
171 # $object->update -- save object to database
174 my $dbh = C4::Context->dbh;
184 message_transport_type = ?,
193 $self->borrowernumber,
196 $self->{metadata}, # we want the raw YAML here
198 $self->message_transport_type,
208 =head3 $message->metadata(\%new_metadata)
210 This method automatically serializes and deserializes the metadata
211 attribute. (It is stored in YAML format.)
215 # $object->metadata -- this is a YAML serialized column that contains a
216 # structured representation of $object->content
218 my ($self, $data) = @_;
220 $data->{header} ||= '';
221 $data->{body} ||= [];
222 $data->{footer} ||= '';
223 $self->{metadata} = Dump($data);
224 $self->content($self->render_metadata);
227 return Load($self->{metadata});
231 # turn $object->metadata into a string suitable for $object->content
232 sub render_metadata {
233 my ($self, $format) = @_;
234 $format ||= sub { $_[0] || "" };
235 my $metadata = $self->metadata;
236 my $body = $metadata->{body};
237 my $text = join('', map { $format->($_) } @$body);
238 return $metadata->{header} . $text . $metadata->{footer};
241 =head3 $message->append(\%letter)
243 If passed a hashref, this method will assume that the hashref is in the form
244 that C<C4::Letters::getletter()> returns. It will append the body of the
245 letter to the message.
247 =head3 $message->append($string)
249 If passed a string, it'll append the string to the message.
253 # $object->append($letter_or_item) -- add a new item to a message's content
255 my ($self, $letter_or_item, $format) = @_;
257 if (ref($letter_or_item)) {
258 my $letter = $letter_or_item;
259 my $metadata = _make_metadata($letter);
260 $item = $metadata->{body}->[0];
262 $item = $letter_or_item;
264 if (not $self->metadata) {
265 carp "Can't append to messages that don't have metadata.";
268 my $metadata = $self->metadata;
269 push @{$metadata->{body}}, $item;
270 $self->metadata($metadata);
271 my $new_content = $self->render_metadata($format);
272 return $self->content($new_content);
275 =head2 Attributes Accessors
277 =head3 $message->message_id
279 =head3 $message->borrowernumber
281 =head3 $message->subject
283 =head3 $message->content
285 =head3 $message->metadata
287 =head3 $message->letter_code
289 =head3 $message->message_transport_type
291 =head3 $message->status
293 =head3 $message->time_queued
295 =head3 $message->to_address
297 =head3 $message->from_address
299 =head3 $message->content_type
303 # $object->$method -- treat keys as methods
305 my ($self, @args) = @_;
306 my $attr = $AUTOLOAD;
308 if (ref($self->{$attr}) eq 'CODE') {
309 $self->{$attr}->($self, @args);
312 $self->{$attr} = $args[0];
325 L<C4::Circulation>, L<C4::Letters>, L<C4::Members::Messaging>
329 John Beppu <john.beppu@liblime.com>
333 # Local Variables: ***
335 # indent-tabs-mode: nil ***
336 # cperl-close-paren-offset: -4 ***
337 # cperl-continued-statement-offset: 4 ***
338 # cperl-indent-level: 4 ***
339 # cperl-indent-parens-as-block: t ***
340 # cperl-tab-always-indent: nil ***
342 # vim:tabstop=8 softtabstop=4 shiftwidth=4 shiftround expandtab