Esempio n. 1
0
 protected static function updateContentRoute($oldRouteInfo, $newRouteInfo)
 {
     $db = vB::getDbAssertor();
     $events = array();
     $events[] = "vB_ChannelStructure_chg";
     // invalidate vB_ChTree... record so that channels' routes are updated
     // update redirect301 fields
     $updateIds = $db->assertQuery('get_update_route_301', array('oldrouteid' => $oldRouteInfo['routeid']));
     if (!empty($updateIds)) {
         $routeIds = array();
         foreach ($updateIds as $route) {
             $routeid = $route['routeid'];
             $events[] = "routeChg_{$routeid}";
             $routeIds[] = $routeid;
         }
         $db->update('routenew', array('redirect301' => $newRouteInfo['routeid'], 'name' => vB_dB_Query::VALUE_ISNULL), array('routeid' => $routeIds));
     }
     // update routeid in nodes table
     $updateIds = $db->assertQuery('vBForum:node', array(vB_dB_Query::TYPE_KEY => vB_dB_Query::QUERY_SELECT, vB_dB_Query::COLUMNS_KEY => array('nodeid'), vB_dB_Query::CONDITIONS_KEY => array('routeid' => $oldRouteInfo['routeid'])));
     if (!empty($updateIds)) {
         $nodeIds = array();
         foreach ($updateIds as $node) {
             $nodeid = $node['nodeid'];
             // this does not affect parents, so we don't need to clear they cache
             $events[] = "nodeChg_{$nodeid}";
             $nodeIds[] = $nodeid;
         }
         $db->update('vBForum:node', array('routeid' => $newRouteInfo['routeid']), array('nodeid' => $nodeIds));
     }
     // don't modify the routeid for default pages, as it will still be used
     $updateIds = $db->assertQuery('page', array(vB_dB_Query::TYPE_KEY => vB_dB_Query::QUERY_SELECT, vB_dB_Query::COLUMNS_KEY => array('pageid'), vB_dB_Query::CONDITIONS_KEY => array('routeid' => $oldRouteInfo['routeid'], 'pagetype' => vB_Page::TYPE_CUSTOM)));
     if (!empty($updateIds)) {
         $pageIds = array();
         foreach ($updateIds as $page) {
             $pageid = $page['pageid'];
             $events[] = "pageChg_{$pageid}";
             $pageIds[] = $pageid;
         }
         $db->update('page', array('routeid' => $newRouteInfo['routeid']), array('pageid' => $pageIds));
     }
     /* The code below implies that multiple conversation routes could exist under a single channel. However, I don't know
      *	when this might be the case. When moving channels/topics, the routes are untouched. Topic redirects are handled by
      *	the redirect & node tables.
      */
     // update conversation generic route
     $routes = $db->getRows('routenew', array(vB_dB_Query::TYPE_KEY => vB_dB_Query::QUERY_SELECT, vB_dB_Query::CONDITIONS_KEY => array(array('field' => 'class', 'value' => array('vB5_Route_Conversation', 'vB5_Route_Article')), array('field' => 'prefix', 'value' => $oldRouteInfo['prefix']), array('field' => 'contentid', 'value' => $oldRouteInfo['channelid']), array('field' => 'redirect301', 'operator' => vB_dB_Query::OPERATOR_ISNULL))));
     foreach ($routes as $route) {
         $events[] = "routeChg_{$route['routeid']}";
         //if the old route has a name, clear it.  Only one route should ever have a name and it belongs to the route
         //we are about to create.
         if ($route['name']) {
             $db->update('routenew', array('name' => vB_dB_Query::VALUE_ISNULL), array('routeid' => $route['routeid']));
         }
         // create new conversation route using most of the old route's data
         $newConversationRoute = $route;
         unset($newConversationRoute['routeid']);
         unset($newConversationRoute['redirect301']);
         $newConversationRoute['prefix'] = $newRouteInfo['prefix'];
         // special case, if prefix is empty (i.e. this is a new home page) then we must leave out the leading '/',
         // or selectBestRoute will not be able to match the path (which never has a leading '/') to regex.
         $newConversationRoute['regex'] = ($newRouteInfo['prefix'] === '' ? '' : preg_quote($newRouteInfo['prefix']) . '/') . vB5_Route_Conversation::REGEXP;
         // save the new route. If you need to call validInput(), be sure to unset prefix first, otherwise it'll think it's
         // a custom conversation url (as opposed to custom channel url, which this is)
         $newConversationRouteid = vB5_Route_Conversation::saveRoute($newConversationRoute);
         if (is_array($newConversationRouteid)) {
             $newConversationRouteid = (int) array_pop($newConversationRouteid);
         }
         // then update old convo route's redirect301
         $db->update('routenew', array('redirect301' => $newConversationRouteid), array('routeid' => $route['routeid']));
         // update routeids for conversation nodes
         // Copied from the channel node updates above.
         $updateIds = $db->assertQuery('vBForum:node', array(vB_dB_Query::TYPE_KEY => vB_dB_Query::QUERY_SELECT, vB_dB_Query::COLUMNS_KEY => array('nodeid'), vB_dB_Query::CONDITIONS_KEY => array('routeid' => $route['routeid'])));
         if (!empty($updateIds)) {
             $nodeIds = array();
             foreach ($updateIds as $node) {
                 $nodeid = $node['nodeid'];
                 // this does not affect parents, so we don't need to clear they cache
                 $events[] = "nodeChg_{$nodeid}";
                 $nodeIds[] = $nodeid;
             }
             // if there are ever cases of multiple conversation routes per channel, and they're sizable, it might be
             // worth creating a method query to handle all node updates at once instead of per conversation route.
             $db->update('vBForum:node', array('routeid' => $newConversationRouteid), array('nodeid' => $nodeIds));
         }
     }
     vB_Cache::allCacheEvent($events);
 }
Esempio n. 2
0
 protected static function validInput(array &$data)
 {
     parent::validInput($data);
     $data['class'] = __CLASS__;
     return $data;
 }