166 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			166 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?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.$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);
 | |
|     }
 | |
| }
 |