1<?php 2/** 3 * DokuWiki Plugin struct (Action Component) 4 * 5 * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html 6 * @author Andreas Gohr, Michael Große <dokuwiki@cosmocode.de> 7 */ 8 9// must be run within Dokuwiki 10use dokuwiki\plugin\struct\meta\Assignments; 11use dokuwiki\plugin\struct\meta\Schema; 12 13if(!defined('DOKU_INC')) die(); 14 15class action_plugin_struct_move extends DokuWiki_Action_Plugin { 16 17 /** 18 * Registers a callback function for a given event 19 * 20 * @param Doku_Event_Handler $controller DokuWiki's event controller object 21 * @return void 22 */ 23 public function register(Doku_Event_Handler $controller) { 24 $controller->register_hook('PLUGIN_MOVE_PAGE_RENAME', 'AFTER', $this, 'handle_move'); 25 } 26 27 /** 28 * Renames all occurances of a page ID in the database 29 * 30 * @param Doku_Event $event event object by reference 31 * @param mixed $param [the parameters passed as fifth argument to register_hook() when this 32 * handler was registered] 33 * @return bool 34 */ 35 public function handle_move(Doku_Event $event, $param) { 36 /** @var helper_plugin_struct_db $hlp */ 37 $hlp = plugin_load('helper', 'struct_db'); 38 $db = $hlp->getDB(); 39 if(!$db) return false; 40 41 $old = $event->data['src_id']; 42 $new = $event->data['dst_id']; 43 44 // ALL data tables (we don't trust the assigments are still there) 45 foreach(Schema::getAll('page') as $tbl) { 46 $sql = "UPDATE data_$tbl SET pid = ? WHERE pid = ?"; 47 $db->query($sql, array($new, $old)); 48 $sql = "UPDATE multi_$tbl SET pid = ? WHERE pid = ?"; 49 $db->query($sql, array($new, $old)); 50 } 51 // assignments 52 $sql = "UPDATE schema_assignments SET pid = ? WHERE pid = ?"; 53 $db->query($sql, array($new, $old)); 54 // make sure assignments still match patterns; 55 $assignments = new Assignments(); 56 $assignments->reevaluatePageAssignments($new); 57 58 // titles 59 $sql = "UPDATE titles SET pid = ? WHERE pid = ?"; 60 $db->query($sql, array($new, $old)); 61 62 return true; 63 } 64} 65