<?php
if ( !defined('K_COUCH_DIR') ) die();
class CustomRoutes{
function __construct()
{
global $FUNCS;
$FUNCS->add_event_listener( 'add_template_params', array($this, 'add_template_params'));
$FUNCS->register_tag( 'inheritroute', array($this, 'process_route'), 1, 0 );
}
function process_route($params)
{
global $FUNCS, $CTX, $PAGE, $DB, $TAGS;
if(!$PAGE->tpl_inherit)
{
$TAGS->abort($this->param('No inherit.') ,new KNode(K_NODE_TYPE_ROOT));
}
if( isset($_GET['pname']) && $FUNCS->is_title_clean($_GET['pname']))
{
$page_name = $_GET['pname'];
}
else if( isset($_GET['fname']) && $FUNCS->is_title_clean($_GET['fname']))
{
$folder_name = $_GET['fname'];
}
if($page_name)
{
$param = array (
0 => array ( 'lhs' => 'masterpage', 'op' => '=', 'rhs' => $PAGE->tpl_inherit, ),
1 => array ( 'lhs' => 'page_name', 'op' => '=', 'rhs' => $page_name, ),
);
$PAGES = $TAGS->pages($param, new KNode(K_NODE_TYPE_ROOT), 0);
$K_COUNT = $CTX->get('k_count');
if($K_COUNT == 0)
{
$TAGS->abort($this->param('No page found') ,new KNode(K_NODE_TYPE_ROOT));
}
if($K_COUNT > 1)
{
$TAGS->abort($this->param('Multiple found') ,new KNode(K_NODE_TYPE_ROOT));
}
if( K_PRETTY_URLS && $_SERVER['REQUEST_METHOD']!='POST' && !$PAGE->parent_id && $CTX->script!='404.php')
{
$url = $FUNCS->get_url();
$targetUrl = $this->buildURL();
if($url)
{
if($url != $targetUrl)
{
header( "Location: ".$targetUrl, TRUE, 301 );
die();
}
}
}
foreach($CTX->ctx[2]["_scope_"] as $CTX_KEY => $CTX_VAL)
{
$CTX->set($CTX_KEY, $CTX_VAL, 'global');
}
}
else if($folder_name)
{
$param = array (
0 => array ( 'lhs' => 'masterpage', 'op' => '=', 'rhs' => $PAGE->tpl_inherit, ),
1 => array ( 'lhs' => 'root', 'op' => '=', 'rhs' => $folder_name, ),
2 => array ( 'lhs' => 'include_custom_fields', 'op' => '=', 'rhs' => 1, ),
);
$FOLDERS = $TAGS->folders($param, new KNode(K_NODE_TYPE_ROOT));
$K_COUNT = $CTX->get('k_total_folders');
if($K_COUNT == 0)
{
$TAGS->abort($this->param('No folder found') ,new KNode(K_NODE_TYPE_ROOT));
}
if($K_COUNT > 1)
{
$TAGS->abort($this->param('Multiple found') ,new KNode(K_NODE_TYPE_ROOT));
}
foreach($CTX->ctx[2]["_scope_"] as $CTX_KEY => $CTX_VAL)
{
$CTX->set($CTX_KEY, $CTX_VAL, 'global');
}
$CTX->set('k_is_folder', 1, 'global');
}
}
function buildURL()
{
global $PAGE, $FUNCS, $CTX;
$inherit_name = K_SITE_URL.$FUNCS->get_pretty_template_link($PAGE->tpl_inherit);
$page_name = K_SITE_URL.$FUNCS->get_pretty_template_link($PAGE->tpl_name);
$url = $FUNCS->get_url();
$original_url = $CTX->ctx[2]["_scope_"]["k_page_link"];
$new_url = str_replace($inherit_name, $page_name, $original_url);
return $new_url;
}
function param($value)
{
return array ( 0 => array ( 'lhs' => NULL, 'op' => '=', 'rhs' => "$value", ), );
}
function add_template_params(&$attr_custom, $params, $node)
{
global $FUNCS, $PAGE, $CTX;
$attr = $FUNCS->get_named_vars(
array(
'inherit'=>'',
),
$params
);
$attr['inherit'] = trim($attr['inherit']);
$attr_custom = array_merge($attr_custom, $attr);
$html="<cms:inheritroute '$PAGE->tpl_inherit' />";
$parser = new KParser( $html, $node->line_num, 0, '', $node->ID );
$dom = $parser->get_DOM();
foreach( $dom->children as $child_node ){
if( $child_node->type==K_NODE_TYPE_CODE ){
$node->children[] = $child_node;
}
}
}
}
$CR = new CustomRoutes();