123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- <?php
- namespace dokuwiki;
- /**
- * Class Draft
- *
- * @package dokuwiki
- */
- class Draft
- {
- protected $errors = [];
- protected $cname;
- protected $id;
- protected $client;
- /**
- * Draft constructor.
- *
- * @param string $ID the page id for this draft
- * @param string $client the client identification (username or ip or similar) for this draft
- */
- public function __construct($ID, $client)
- {
- $this->id = $ID;
- $this->client = $client;
- $this->cname = getCacheName("$client\n$ID", '.draft');
- if(file_exists($this->cname) && file_exists(wikiFN($ID))) {
- if (filemtime($this->cname) < filemtime(wikiFN($ID))) {
- // remove stale draft
- $this->deleteDraft();
- }
- }
- }
- /**
- * Get the filename for this draft (whether or not it exists)
- *
- * @return string
- */
- public function getDraftFilename()
- {
- return $this->cname;
- }
- /**
- * Checks if this draft exists on the filesystem
- *
- * @return bool
- */
- public function isDraftAvailable()
- {
- return file_exists($this->cname);
- }
- /**
- * Save a draft of a current edit session
- *
- * The draft will not be saved if
- * - drafts are deactivated in the config
- * - or the editarea is empty and there are no event handlers registered
- * - or the event is prevented
- *
- * @triggers DRAFT_SAVE
- *
- * @return bool whether has the draft been saved
- */
- public function saveDraft()
- {
- global $INPUT, $INFO, $EVENT_HANDLER, $conf;
- if (!$conf['usedraft']) {
- return false;
- }
- if (!$INPUT->post->has('wikitext') &&
- !$EVENT_HANDLER->hasHandlerForEvent('DRAFT_SAVE')) {
- return false;
- }
- $draft = [
- 'id' => $this->id,
- 'prefix' => substr($INPUT->post->str('prefix'), 0, -1),
- 'text' => $INPUT->post->str('wikitext'),
- 'suffix' => $INPUT->post->str('suffix'),
- 'date' => $INPUT->post->int('date'),
- 'client' => $this->client,
- 'cname' => $this->cname,
- 'errors' => [],
- ];
- $event = new Extension\Event('DRAFT_SAVE', $draft);
- if ($event->advise_before()) {
- $draft['hasBeenSaved'] = io_saveFile($draft['cname'], serialize($draft));
- if ($draft['hasBeenSaved']) {
- $INFO['draft'] = $draft['cname'];
- }
- } else {
- $draft['hasBeenSaved'] = false;
- }
- $event->advise_after();
- $this->errors = $draft['errors'];
- return $draft['hasBeenSaved'];
- }
- /**
- * Get the text from the draft file
- *
- * @throws \RuntimeException if the draft file doesn't exist
- *
- * @return string
- */
- public function getDraftText()
- {
- if (!file_exists($this->cname)) {
- throw new \RuntimeException(
- "Draft for page $this->id and user $this->client doesn't exist at $this->cname."
- );
- }
- $draft = unserialize(io_readFile($this->cname,false));
- return cleanText(con($draft['prefix'],$draft['text'],$draft['suffix'],true));
- }
- /**
- * Remove the draft from the filesystem
- *
- * Also sets $INFO['draft'] to null
- */
- public function deleteDraft()
- {
- global $INFO;
- @unlink($this->cname);
- $INFO['draft'] = null;
- }
- /**
- * Get a formatted message stating when the draft was saved
- *
- * @return string
- */
- public function getDraftMessage()
- {
- global $lang;
- return $lang['draftdate'] . ' ' . dformat(filemtime($this->cname));
- }
- /**
- * Retrieve the errors that occured when saving the draft
- *
- * @return array
- */
- public function getErrors()
- {
- return $this->errors;
- }
- /**
- * Get the timestamp when this draft was saved
- *
- * @return int
- */
- public function getDraftDate()
- {
- return filemtime($this->cname);
- }
- }
|