Overview

Packages

  • None
  • Wicked

Classes

  • Text_Wiki_Parse_Heading2
  • Text_Wiki_Parse_Toc2
  • Text_Wiki_Render_Latex_Heading2
  • Text_Wiki_Render_Latex_Toc2
  • Text_Wiki_Render_Plain_Heading2
  • Text_Wiki_Render_Plain_Toc2
  • Text_Wiki_Render_Rst
  • Text_Wiki_Render_Rst_Blockquote
  • Text_Wiki_Render_Rst_Bold
  • Text_Wiki_Render_Rst_Code
  • Text_Wiki_Render_Rst_Deflist
  • Text_Wiki_Render_Rst_Emphasis
  • Text_Wiki_Render_Rst_Freelink
  • Text_Wiki_Render_Rst_Heading2
  • Text_Wiki_Render_Rst_Links
  • Text_Wiki_Render_Rst_List
  • Text_Wiki_Render_Rst_Newline
  • Text_Wiki_Render_Rst_Paragraph
  • Text_Wiki_Render_Rst_Raw
  • Text_Wiki_Render_Rst_Toc2
  • Text_Wiki_Render_Rst_Tt
  • Text_Wiki_Render_Rst_Url
  • Text_Wiki_Render_Xhtml_Attribute
  • Text_Wiki_Render_Xhtml_Code2
  • Text_Wiki_Render_Xhtml_Freelink2
  • Text_Wiki_Render_Xhtml_Heading2
  • Text_Wiki_Render_Xhtml_Image2
  • Text_Wiki_Render_Xhtml_Interwiki
  • Text_Wiki_Render_Xhtml_Registrylink
  • Text_Wiki_Render_Xhtml_Toc2
  • Text_Wiki_Render_Xhtml_Url
  • Text_Wiki_Render_Xhtml_Wickedblock
  • Text_Wiki_Render_Xhtml_Wikilink2
  • Wicked
  • Wicked_Api
  • Wicked_Driver
  • Wicked_Driver_Sql
  • Wicked_Exception
  • Wicked_Factory_Driver
  • Wicked_Page
  • Wicked_Page_AddPage
  • Wicked_Page_AllPages
  • Wicked_Page_AttachedFiles
  • Wicked_Page_BackLinks
  • Wicked_Page_DeletePage
  • Wicked_Page_EditPage
  • Wicked_Page_LeastPopular
  • Wicked_Page_LikePages
  • Wicked_Page_MergeOrRename
  • Wicked_Page_MostPopular
  • Wicked_Page_NewPage
  • Wicked_Page_RecentChanges
  • Wicked_Page_RevertPage
  • Wicked_Page_Search
  • Wicked_Page_StandardHistoryPage
  • Wicked_Page_StandardPage
  • Wicked_Page_SyncDiff
  • Wicked_Page_SyncPages
  • Wicked_Sync
  • Wicked_Sync_Wicked
  • Wicked_Test
  • Overview
  • Package
  • Class
  • Tree
  1: <?php
  2: /**
  3:  * Wicked AttachedFiles class.
  4:  *
  5:  * Copyright 2003-2012 Horde LLC (http://www.horde.org/)
  6:  *
  7:  * See the enclosed file COPYING for license information (GPL). If you
  8:  * did not receive this file, see http://www.horde.org/licenses/gpl.
  9:  *
 10:  * @author  Jason M. Felice <jason.m.felice@gmail.com>
 11:  * @package Wicked
 12:  */
 13: class Wicked_Page_AttachedFiles extends Wicked_Page {
 14: 
 15:     /**
 16:      * Display modes supported by this page.
 17:      *
 18:      * @var array
 19:      */
 20:     public $supportedModes = array(
 21:         Wicked::MODE_CONTENT => true,
 22:         Wicked::MODE_EDIT => true,
 23:         Wicked::MODE_REMOVE => true,
 24:         Wicked::MODE_DISPLAY => true);
 25: 
 26:     /**
 27:      * The page for which we'd like to manipulate attachments.
 28:      *
 29:      * @var string
 30:      */
 31:     protected $_referrer = null;
 32: 
 33:     /**
 34:      * Constructor.
 35:      */
 36:     public function __construct($referrer)
 37:     {
 38:         $this->_referrer = $referrer;
 39:     }
 40: 
 41:     /**
 42:      * Returns the current user's permissions for the referring page.
 43:      *
 44:      * @return integer  The permissions bitmask.
 45:      */
 46:     public function getPermissions()
 47:     {
 48:         return parent::getPermissions($this->referrer());
 49:     }
 50: 
 51:     /**
 52:      * Returns this page rendered in content mode.
 53:      *
 54:      * @throws Wicked_Exception
 55:      */
 56:     public function content()
 57:     {
 58:         global $wicked, $notification;
 59: 
 60:         if (!$wicked->pageExists($this->referrer())) {
 61:             throw new Wicked_Exception(sprintf(_("Referrer \"%s\" does not exist."),
 62:                                                $this->referrer()));
 63:         }
 64: 
 65:         $referrer_id = $wicked->getPageId($this->referrer());
 66:         $attachments = $wicked->getAttachedFiles($referrer_id, true);
 67: 
 68:         foreach ($attachments as $idx => $attach) {
 69:             $attachments[$idx]['date'] = date('M j, Y g:ia',
 70:                                               $attach['attachment_created']);
 71: 
 72:             $attachments[$idx]['url'] = Horde::downloadUrl(
 73:                 $attach['attachment_name'],
 74:                 array('page' => $referrer_id,
 75:                       'file' => $attach['attachment_name'],
 76:                       'version' => $attach['attachment_version']));
 77: 
 78:             $attachments[$idx]['delete_form'] = $this->allows(Wicked::MODE_REMOVE);
 79: 
 80:             $this->_page['change_author'] = $attachments[$idx]['change_author'];
 81:             $attachments[$idx]['change_author'] = $this->author();
 82:         }
 83: 
 84:         return $attachments;
 85:     }
 86: 
 87:     /**
 88:      * Returns this page rendered in Display mode.
 89:      *
 90:      * @throws Wicked_Exception
 91:      */
 92:     public function display()
 93:     {
 94:         global $registry, $wicked, $notification, $conf;
 95: 
 96:         try {
 97:             $attachments = $this->content();
 98:         } catch (Wicked_Exception $e) {
 99:             $notification->push(sprintf(_("Error retrieving attachments: %s"),
100:                                         $e->getMessage()),
101:                                 'horde.error');
102:             throw $e;
103:         }
104: 
105:         $template = $GLOBALS['injector']->createInstance('Horde_Template');
106: 
107:         $template->setOption('gettext', true);
108:         $template->set('pageName', $this->pageName());
109:         $template->set('formAction', Wicked::url('AttachedFiles'));
110:         $template->set('deleteButton', Horde_Themes::img('delete.png'));
111:         $template->set('referrerLink', Wicked::url($this->referrer()));
112: 
113:         $refreshIcon = Horde::link($this->pageUrl())
114:             . Horde::img('reload.png',
115:                          sprintf(_("Reload \"%s\""), $this->pageTitle()))
116:             . '</a>';
117:         $template->set('refreshIcon', $refreshIcon);
118:         $template->set('attachments', $attachments, true);
119: 
120:         /* Get an array of unique filenames for the update form. */
121:         $files = array();
122:         foreach ($attachments as $attachment) {
123:             $files[$attachment['attachment_name']] = true;
124:         }
125:         $files = array_keys($files);
126:         sort($files);
127:         $template->set('files', $files);
128:         $template->set('canUpdate',
129:                        $this->allows(Wicked::MODE_EDIT) && count($files),
130:                        true);
131:         $template->set('canAttach', $this->allows(Wicked::MODE_EDIT), true);
132:         if ($conf['wicked']['require_change_log']) {
133:             $template->set('requireChangelog', true, true);
134:         } else {
135:             $template->set('requireChangelog', false, true);
136:         }
137: 
138:         $requiredMarker = Horde::img('required.png', '*');
139:         $template->set('requiredMarker', $requiredMarker);
140:         $template->set('referrer', $this->referrer());
141:         $template->set('formInput', Horde_Util::formInput());
142: 
143:         Horde::addScriptFile('stripe.js', 'horde', true);
144:         echo $template->fetch(WICKED_TEMPLATES . '/display/AttachedFiles.html');
145:     }
146: 
147:     public function pageName()
148:     {
149:         return 'AttachedFiles';
150:     }
151: 
152:     public function pageTitle()
153:     {
154:         return sprintf(_("Attached Files: %s"), $this->referrer());
155:     }
156: 
157:     public function referrer()
158:     {
159:         return $this->_referrer;
160:     }
161: 
162:     /**
163:      * Retrieves the form fields and processes the attachment.
164:      */
165:     public function handleAction()
166:     {
167:         global $notification, $wicked, $registry, $conf;
168: 
169:         // Only allow POST commands.
170:         $cmd = Horde_Util::getPost('cmd');
171:         $version = Horde_Util::getFormData('version');
172:         $is_update = (bool)Horde_Util::getFormData('is_update');
173:         $filename = Horde_Util::getFormData('filename');
174:         $change_log = Horde_Util::getFormData('change_log');
175: 
176:         // See if we're supposed to delete an attachment.
177:         if ($cmd == 'delete' && $filename && $version) {
178:             if (!$this->allows(Wicked::MODE_REMOVE)) {
179:                 $notification->push(_("You do not have permission to delete attachments from this page."), 'horde.error');
180:                 return;
181:             }
182: 
183:             try {
184:                 $wicked->removeAttachment($wicked->getPageId($this->referrer()),
185:                                           $filename, $version);
186:                 $notification->push(
187:                     sprintf(_("Successfully deleted version %s of \"%s\" from \"%s\""),
188:                             $version, $filename, $this->referrer()),
189:                     'horde.success');
190:             } catch (Wicked_Exception $e) {
191:                 $notification->push($result->getMessage(), 'horde.error');
192:             }
193:             return;
194:         }
195: 
196:         if (empty($filename)) {
197:             $filename = Horde_Util::dispelMagicQuotes($_FILES['attachment_file']['name']);
198:         }
199: 
200:         try {
201:             $GLOBALS['browser']->wasFileUploaded('attachment_file', _("attachment"));
202:         } catch (Horde_Browser_Exception $e) {
203:             $notification->push($e, 'horde.error');
204:             return;
205:         }
206: 
207:         if (strpos($filename, ' ') !== false) {
208:             $notification->push(
209:                 _("Attachments with spaces can't be embedded into a page."),
210:                 'horde.warning');
211:         }
212: 
213:         $data = file_get_contents($_FILES['attachment_file']['tmp_name']);
214:         if ($data === false) {
215:             $notification->push(_("Can't read uploaded file."), 'horde.error');
216:             return;
217:         }
218: 
219:         if (!$this->allows(Wicked::MODE_EDIT)) {
220:             $notification->push(
221:                 sprintf(_("You do not have permission to edit \"%s\""),
222:                         $this->referrer()),
223:                 'horde.error');
224:             return;
225:         }
226: 
227:         if ($conf['wicked']['require_change_log'] && empty($change_log)) {
228:             $notification->push(
229:                 _("You must enter a change description to attach this file."),
230:                 'horde.error');
231:             return;
232:         }
233: 
234:         $referrer_id = $wicked->getPageId($this->referrer());
235:         try {
236:             $attachments = $wicked->getAttachedFiles($referrer_id);
237:         } catch (Wicked_Exception $e) {
238:             $notification->push(sprintf(_("Error retrieving attachments: %s"),
239:                                         $e->getMessage()),
240:                                 'horde.error');
241:             return;
242:         }
243: 
244:         $found = false;
245:         foreach ($attachments as $attach) {
246:             if ($filename == $attach['attachment_name']) {
247:                 $found = true;
248:                 break;
249:             }
250:         }
251: 
252:         if ($is_update) {
253:             if (!$found) {
254:                 $notification->push(
255:                     sprintf(_("Can't update \"%s\": no such attachment."),
256:                             $filename),
257:                     'horde.error');
258:                 return;
259:             }
260:         } else {
261:             if ($found) {
262:                 $notification->push(
263:                     sprintf(_("There is already an attachment named \"%s\"."),
264:                             $filename),
265:                     'horde.error');
266:                 return;
267:             }
268:         }
269: 
270:         $file = array('page_id'         => $referrer_id,
271:                       'attachment_name' => $filename,
272:                       'change_log'      => $change_log);
273: 
274:         try {
275:             $wicked->attachFile($file, $data);
276:         } catch (Wicked_Exception $e) {
277:             $notification->push($e);
278:             Horde::logMessage($e);
279:             throw $e;
280:         }
281: 
282:         if ($is_update) {
283:             $message = sprintf(_("Updated attachment \"%s\" on page \"%s\"."),
284:                                $filename, $this->referrer());
285:         } else {
286:             $message = sprintf(_("New attachment \"%s\" to page \"%s\"."),
287:                                $filename, $this->referrer());
288:         }
289:         $notification->push($message, 'horde.success');
290: 
291:         $url = Wicked::url($this->referrer(), true, -1);
292:         Wicked::mail($message . ' ' . _("View page: ") . $url . "\n",
293:                      array('Subject' => '[' . $registry->get('name')
294:                            . '] attachment: ' . $this->referrer() . ', '
295:                            . $filename));
296:     }
297: 
298: }
299: 
API documentation generated by ApiGen