From 4758a18d7642e495ec0540340634a8864e09511d Mon Sep 17 00:00:00 2001 From: Jan Schneider Date: Thu, 11 Nov 2010 23:17:58 +0100 Subject: [PATCH] Nicer invitation mails. --- kronolith/lib/Event.php | 4 +- kronolith/lib/Kronolith.php | 19 +++- kronolith/templates/itip/notification.html.php | 123 +++++++++++++++---------- kronolith/templates/view/view.inc | 2 +- kronolith/themes/graphics/big_invitation.png | Bin 0 -> 8911 bytes 5 files changed, 97 insertions(+), 51 deletions(-) create mode 100644 kronolith/themes/graphics/big_invitation.png diff --git a/kronolith/lib/Event.php b/kronolith/lib/Event.php index ef1369af1..c9d9152bf 100644 --- a/kronolith/lib/Event.php +++ b/kronolith/lib/Event.php @@ -581,8 +581,8 @@ abstract class Kronolith_Event } // Tags - $tags = implode(', ', $this->tags); - if (!empty($tags)) { + if ($this->tags) { + $tags = implode(', ', $this->tags); $vEvent->setAttribute('CATEGORIES', $tags); } diff --git a/kronolith/lib/Kronolith.php b/kronolith/lib/Kronolith.php index bf9cf7263..cb17a5a4d 100644 --- a/kronolith/lib/Kronolith.php +++ b/kronolith/lib/Kronolith.php @@ -2254,10 +2254,20 @@ class Kronolith return; } + // Generate image mime part first and only once, because we + // need the Content-ID. + $background = new Horde_Themes_Image('big_invitation.png'); + $image = new Horde_Mime_Part(); + $image->setType('image/png'); + $image->setContents(file_get_contents($background->fs)); + $image->setContentId(); + $image->setDisposition('attachment'); + $share = $GLOBALS['kronolith_shares']->getShare($event->calendar); $view = new Horde_View(array('templatePath' => KRONOLITH_TEMPLATES . '/itip')); new Horde_View_Helper_Text($view); $view->event = $event; + $view->imageId = $image->getContentId(); foreach ($event->attendees as $email => $status) { /* Don't bother sending an invitation/update if the recipient does @@ -2346,12 +2356,19 @@ class Kronolith $bodyText->setType('text/plain'); $bodyText->setCharset('UTF-8'); $bodyText->setContents($view->render('notification.plain.php')); + $bodyText->setDisposition('inline'); $multipart->addPart($bodyText); $bodyHtml = new Horde_Mime_Part(); $bodyHtml->setType('text/html'); $bodyHtml->setCharset('UTF-8'); $bodyHtml->setContents($view->render('notification.html.php')); - $multipart->addPart($bodyHtml); + $bodyHtml->setDisposition('inline'); + $related = new Horde_Mime_Part(); + $related->setType('multipart/related'); + $related->setContentTypeParameter('start', $bodyHtml->setContentId()); + $related->addPart($bodyHtml); + $related->addPart($image); + $multipart->addPart($related); $multipart->addPart($ics); $recipient = empty($status['name']) ? $email : Horde_Mime_Address::trimAddress($status['name'] . ' <' . $email . '>'); $mail = new Horde_Mime_Mail(array('subject' => $view->subject, diff --git a/kronolith/templates/itip/notification.html.php b/kronolith/templates/itip/notification.html.php index b0119b13b..432dcc336 100644 --- a/kronolith/templates/itip/notification.html.php +++ b/kronolith/templates/itip/notification.html.php @@ -1,47 +1,76 @@ -

h($this->header) ?>

- - - - - - - - - - - - - - - event->location)): ?> - - - - - - event->description)): ?> - - - - - - attendees): ?> - - - - - - -
h($this->event->getTitle()) ?>
h($this->event->start->strftime('%x %X')) ?>
h($this->event->end->strftime('%x %X')) ?>
h($this->event->location) ?>
getInstance('Horde_Core_Factory_TextFilter')->filter($this->event->description, 'text2html', array('parselevel' => Horde_Text_Filter_Text2html::MICRO, 'callback' => null)) ?>
- attendees as $attendee): ?> - -
- -
- - -
- -

- -

', '', '', '', '', '') ?>

+

h($this->header) ?>

+ + + +
+ + + + + + + + + + > + + + + + > + + + + + event->location)): ?> + + > + + + + + + attendees): ?> + + > + + + + + + + event->description)): ?> + + > + + + + + + + +
h($this->event->getTitle()) ?>
+ +  event->start->strftime('%x %X') ?>
+ +  event->end->strftime('%x %X') ?>
+ +  h($this->event->location) ?>
+ +   + attendees as $attendee): ?> + + h($attendee) ?>
+ + h($attendee) ?>
+ + + +
+ +  getInstance('Horde_Core_Factory_TextFilter')->filter($this->event->description, 'text2html', array('parselevel' => Horde_Text_Filter_Text2html::MICRO, 'callback' => null)) ?>
+
+ +

+ +

', '', '', '', '', '') ?>

diff --git a/kronolith/templates/view/view.inc b/kronolith/templates/view/view.inc index 35a4cf644..4d948a384 100644 --- a/kronolith/templates/view/view.inc +++ b/kronolith/templates/view/view.inc @@ -172,7 +172,7 @@ if ($this->event->initialized && $this->event->alarm > 0): hasMethod('mail/compose'); foreach ($attendees as $email => $status): $full = empty($status['name']) ? $email : Horde_Mime_Address::trimAddress($status['name'] . (strpos($email, '@') === false ? '' : ' <' . $email . '>')) ?> - call('mail/compose', array(array('to' => $full))))->link(array('title' => sprintf(_("Send an email to %s"), empty($status['name']) ? $email : $status['name']))) . htmlspecialchars($full) . '') : htmlspecialchars($full) ?> + call('mail/compose', array(array('to' => $full)))->link(array('title' => sprintf(_("Send an email to %s"), empty($status['name']) ? $email : $status['name']))) . htmlspecialchars($full) . '') : htmlspecialchars($full) ?> diff --git a/kronolith/themes/graphics/big_invitation.png b/kronolith/themes/graphics/big_invitation.png new file mode 100644 index 0000000000000000000000000000000000000000..c6d7606b473879d3e66bf84b17046075a0e4ea90 GIT binary patch literal 8911 zcmXw91yodD&|g4GY6S`DQbI~X5CNq-L_%0Xnq}E#rID^hpa~^Y)$Hd*|Mnxf8#c_ri6wl*#VX-v@y}WU49(y1?BNxZH>cfbY=D$E3jR zo{OBS9ue^IA+r7i{3b@K7`cEz96fgzjxRm`F7W3gSH*X(Z=GyiJuIAUKpq|*0#F3Z z#mWL{BjDt0m$oZK4@`P+H%Slb>SzPfw17IYD#9%tZQyG6PV|96+PgtnH&=TnXOM;k z(uq~x!qEb5fv|SAfzHL!^Zx%71sfMDXDHGY>V){eRc!uu6-;Z~Phbk&-750VHWqi| zta?zm4MNQ_@dnE%;}FX{!#AP_4^RY6wIGkqt+3(1J}U3*n(M}VCt2#;V@31Yn$ z0~QRYbkYrj|3Nc$mAmQ2HLh&$vOpTDt1Xg;Z41$-ulfITMw?XYPjGCt$1=Ut@Bf>o z$JpT0Ucu?@oBuE(OyToA)#>CbnM=E-be-CU{^SD0~sdg3Wc4vZK{X*WX z_?tv7mHyb}ZCRqSGHvn4{~BodO&}>EHI;sIi{WQ!>5rz8ul1Lbo12?Ii;Hv7X!7rz z32Lz#k5!+DWGVzHu**t4;7U--+WI)_WwZOlm+Bl#+u!`Fj6A7ecDb^}uFfp}p^$@DGf8*AP!hF89k=C_xIug9`) z*MDCm`8%0XA_*st13I|=-r((r$q|(|I=#&NcuhRL`}dbGDKti)DPKOGN zy(ndnL?KWQaKo~{ag)dQ`g@PBxDM&;<)P70zxigij`sa;E+O}VWl0Wc1=Ia6D8}{> zeCBEN`{(WB&G z5Ag#Ogj=7MUO#Hpp*d`B0Mvi`tANW~5pH}Z-z~v;HdtRWNiHV$ubnKS9GXj_s(!D`Ch zglqkc3h+pyfWu3gl(XIv@6>xiP4JiYPzQWg`iMh2^M7;gOCLxMo9pkmK<^SmHr>)jC(yN(WP6X=H#lq z)cQfi7J_%Kwrc!5^f~^Wm2(B&QPRE!~5jl>zDIbBg~cp>2$4OpDk0QR{UjnVN?qB zC+;cE9NuIocu}PJ=;6O95727l-ClXHt%P*3x4dxapR3i|Ow23g(bBfE2*ReMI@+yl zHykOMXYLgHzV8dca#9CV+QMZp@fa7l@!#r3mUxZFwJ+T8q>qHHZyUormt&RrJ0XF4 zcDr4vus$5X74 zS;l&X^QvNL zv*%#YFFdM4bhYGdDyaY1?^>n|Ld2$(DcSZftdBkju|A#Nq$P}LKa;XpaBQ!3b~aQgQu|0hv(1`Fx_ycci*Y3p3t%# z!jB%L_~yJbC;C~1M=8G7!^-=k=+re6vAfvRmmEnK76M)zY?V)!{wE~&sW;*fGC{k- zVto-Tvr5|+MMD0kwd2((F$#s^>kJcOkWV$-@+rgxY^Uf!<;4LGTL>LfW0ErSjXllo z@iaesN{Il={a=0*Bwt^E7|FRZug`zb(b1K$z6zKqns|4>s=pa^C+jGlKOQ5k+^5)u z2h3ON9d91uhg;kFeb$liT;uW0>{^1fEQu($NMs23T^(>u49z*o%8*}cuFlTJ?h*kO z|Biq4X|sqNkqr__!E#&NQR(|>ZPgA4FCM9X8w}JNcTM(t7mmC^m9X6}+J1@fDYVhQ z2EaZ0rMnM5i4ZvtmH|1Ki21Byw1-A#;Ie)X&ka`1N>!e2(n`xbTfKKf=_yB)uq5 zkq}|R&`P-&ogK;Q3dge35mAwKRE$jxPb%0A3|D71ef2YjOyam4w~IGlxJj8skFH%# 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