Commit c0ad442fbc58d079c05646c7cef00f05079ccd39

Authored by Brad Shuttleworth
1 parent 5e6ae707

correct path_info irregularities.


git-svn-id: https://kt-dms.svn.sourceforge.net/svnroot/kt-dms/trunk@4774 c91229c3-7414-0410-bfa2-8a42b809f60b
admin.php
... ... @@ -13,7 +13,7 @@ class AdminSplashDispatcher extends KTAdminDispatcher {
13 13  
14 14 function AdminSplashDispatcher() {
15 15 $this->aBreadcrumbs = array(
16   - array('url' => KTUtil::getRequestScriptName($_SERVER), 'name' => 'Administration'),
  16 + array('url' => $_SERVER['PHP_SELF'], 'name' => 'Administration'),
17 17 );
18 18  
19 19 parent::KTAdminDispatcher();
... ... @@ -37,7 +37,7 @@ class AdminSplashDispatcher extends KTAdminDispatcher {
37 37 $aTemplateData = array(
38 38 "context" => $this,
39 39 "categories" => $categories,
40   - "baseurl" => KTUtil::getRequestScriptName($_SERVER),
  40 + "baseurl" => $_SERVER['PHP_SELF'],
41 41 );
42 42 return $oTemplate->render($aTemplateData);
43 43 }
... ... @@ -51,7 +51,7 @@ class AdminSplashDispatcher extends KTAdminDispatcher {
51 51 $aCategory = $oRegistry->getCategory($category);
52 52  
53 53 $aItems = $oRegistry->getItemsForCategory($category);
54   - $this->aBreadcrumbs[] = array("name" => $aCategory["title"]);
  54 + $this->aBreadcrumbs[] = array("name" => $aCategory["title"], "url" => KTUtil::ktLink('admin.php',$category));
55 55  
56 56  
57 57 $this->oPage->title = _("DMS Administration") . ": " . $aCategory["title"];
... ... @@ -61,13 +61,14 @@ class AdminSplashDispatcher extends KTAdminDispatcher {
61 61 "context" => $this,
62 62 "category" => $aCategory,
63 63 "items" => $aItems,
64   - "baseurl" => KTUtil::getRequestScriptName($_SERVER),
  64 + "baseurl" => $_SERVER['PHP_SELF'],
65 65 );
66 66 return $oTemplate->render($aTemplateData);
67 67 }
68 68 }
69 69  
70 70 $sub_url = KTUtil::arrayGet($_SERVER, 'PATH_INFO');
  71 +
71 72 $sub_url = trim($sub_url);
72 73 $sub_url= trim($sub_url, "/");
73 74  
... ... @@ -84,8 +85,8 @@ if (empty($sub_url)) {
84 85 $aCategory = $oRegistry->getCategory($aParts[0]);
85 86  
86 87 $oDispatcher->aBreadcrumbs = array();
87   - $oDispatcher->aBreadcrumbs[] = array('url' => KTUtil::getRequestScriptName($_SERVER), 'name' => 'Administration');
88   - $oDispatcher->aBreadcrumbs[] = array("name" => $aCategory['title'], "url" => KTUtil::getRequestScriptName($_SERVER) . '/' . $aParts[0]);
  88 + $oDispatcher->aBreadcrumbs[] = array('url' => $_SERVER['PHP_SELF'], 'name' => 'Administration');
  89 + $oDispatcher->aBreadcrumbs[] = array("name" => $aCategory['title'], "url" => KTUtil::ktLink('admin.php',$aParts[0]));
89 90 } else {
90 91 // FIXME (minor) redirect to no-suburl?
91 92 $oDispatcher = new AdminSplashDispatcher();
... ...
config/dmsDefaults.php
... ... @@ -371,7 +371,7 @@ if (array_key_exists('HTTPS', $_SERVER)) {
371 371 }
372 372 $oKTConfig->setdefaultns("KnowledgeTree", "rootUrl", $KTInit->guessRootUrl());
373 373 $oKTConfig->setdefaultns("KnowledgeTree", "execSearchPath", $_SERVER['PATH']);
374   -$oKTConfig->setdefaultns("KnowledgeTree", "pathInfoSupport", true);
  374 +$oKTConfig->setdefaultns("KnowledgeTree", "pathInfoSupport", false);
375 375 $oKTConfig->setdefaultns("storage", "manager", 'KTOnDiskPathStorageManager');
376 376 $oKTConfig->setdefaultns("config", "useDatabaseConfiguration", false);
377 377 $oKTConfig->setdefaultns("tweaks", "browseToRoot", false);
... ...
docs/INSTALL.txt
... ... @@ -121,6 +121,11 @@ Installing this package is beyond the scope of this document - please
121 121 consult the KnowledgeTree Wiki at http://support.ktdms.com/confluence/
122 122 to see how others have approached this on your platform.
123 123  
  124 +NOTE: if you install the packages outside of the path normally searched
  125 +by your operating system (e.g. in c:\antiword or /usr/local/bin) you will
  126 +need to specify the _full_ path to the actual applications (e.g.
  127 +/usr/local/bin/pdftotext).
  128 +
124 129 Troubleshooting
125 130 ---------------
126 131  
... ...
lib/templating/smartytemplate.inc.php
... ... @@ -77,6 +77,7 @@ class KTSmartyTemplate extends KTTemplate {
77 77 $smarty->register_function('entity_radios', array('KTSmartyTemplate', 'entity_radios'));
78 78 $smarty->register_block('i18n', array('KTSmartyTemplate', 'i18n_block'), false);
79 79 $smarty->register_modifier('addQueryString', array('KTSmartyTemplate', 'addQueryString'));
  80 + $smarty->register_function('ktLink', array('KTSmartyTemplate', 'ktLink'));
80 81 $smarty->register_modifier('addQS', array('KTSmartyTemplate', 'addQueryString'));
81 82 $smarty->register_modifier('addQueryStringSelf', array('KTSmartyTemplate', 'addQueryStringSelf'));
82 83 $smarty->register_modifier('addQSSelf', array('KTSmartyTemplate', 'addQueryStringSelf'));
... ... @@ -240,9 +241,29 @@ class KTSmartyTemplate extends KTTemplate {
240 241 return KTUtil::addQueryString($url, $qs);
241 242 }
242 243  
  244 +
  245 + /*
  246 + * ktLink generates a fully prepared link for KT.
  247 + *
  248 + * It takes into account kt_path_info requirements,
  249 + * rootUrl requirements, etc.
  250 + *
  251 + * To do this effectively, you need three things:
  252 + *
  253 + * @param base e.g. /admin.php
  254 + * @param subpath e.g. /security/permissions/
  255 + * @param query e.g. fFolder=1&fMyVar=2
  256 + *
  257 + */
  258 + function ktLink($params, &$smarty) {
  259 + return KTUtil::ktLink($params['base'], $params['subpath'], $params['query']);
  260 + }
  261 +
  262 +
243 263 function addQueryStringSelf($qs) {
244 264 return KTUtil::addQueryStringSelf($qs);
245 265 }
  266 +
246 267 }
247 268  
248 269 ?>
... ...
lib/util/ktutil.inc
... ... @@ -450,6 +450,27 @@ class KTUtil {
450 450 }
451 451 // }}}
452 452  
  453 + // {{{ ktLink
  454 + function ktLink($base, $subpath='', $qs='') {
  455 + $KTConfig =& KTConfig::getSingleton();
  456 + $root = $KTConfig->get("KnowledgeTree/rootUrl");
  457 + $url = $root . '/' . $base;
  458 + $query = '';
  459 +
  460 + $hasPathInfo = $KTConfig->get("KnowledgeTree/pathInfoSupport");
  461 + if ($hasPathInfo) {
  462 + $url .= $subpath;
  463 + } else {
  464 + $query = 'kt_path_info=' . $subpath;
  465 + if (!empty($qs)) {
  466 + $query .= '&';
  467 + }
  468 + }
  469 + $query .= $qs;
  470 + return KTUtil::addQueryString($url, $query);
  471 + }
  472 + // }}}
  473 +
453 474 // {{{ addQueryStringSelf
454 475 function addQueryStringSelf($qs) {
455 476 return KTUtil::addQueryString($_SERVER['PHP_SELF'], $qs);
... ...
plugins/ktcore/admin/workflows.php
... ... @@ -36,7 +36,7 @@ class WorkflowNavigationPortlet extends KTPortlet {
36 36 if (is_null($this->oWorkflow)) { return _('No Workflow Selected.'); }
37 37  
38 38 $aAdminPages = array();
39   - $aAdminPages[] = array('name' => _('Overview'), 'url' => $_SERVER['PHP_SELF'] . '?action=editWorkflow&fWorkflowId=' . $this->oWorkflow->getId());
  39 + $aAdminPages[] = array('name' => _('Overview'), 'url' => KTUtil::addQueryString($_SERVER['PHP_SELF'], '?action=editWorkflow&fWorkflowId=' . $this->oWorkflow->getId()));
40 40 $aAdminPages[] = array('name' => _('States'), 'url' => $_SERVER['PHP_SELF'] . '?action=manageStates&fWorkflowId=' . $this->oWorkflow->getId());
41 41 $aAdminPages[] = array('name' => _('Transitions'), 'url' => $_SERVER['PHP_SELF'] . '?action=manageTransitions&fWorkflowId=' . $this->oWorkflow->getId());
42 42 $aAdminPages[] = array('name' => _('Actions'), 'url' => $_SERVER['PHP_SELF'] . '?action=manageActions&fWorkflowId=' . $this->oWorkflow->getId());
... ...
templates/kt3/admin_categories.smarty
1 1 <dl class="panel_menu">
2 2 {foreach item=aCategory from=$categories}
3   - <dt><a href="{$smarty.server.PHP_SELF}?action=viewCategory&fCategory={$aCategory.name}">{$aCategory.title}</a></dt>
  3 + <dt>{capture assign="cat_id"}{$aCategory.name}{/capture}<a href="{$smarty.server.PHP_SELF|addQueryString:"action=viewCategory&fCategory=$cat_id"}">{$aCategory.title}</a></dt>
4 4 <dd class="descriptiveText">{$aCategory.description}</dd>
5 5 {/foreach}
6 6 </dl>
7 7 \ No newline at end of file
... ...
templates/kt3/admin_items.smarty
... ... @@ -5,7 +5,7 @@
5 5 {else}
6 6 <dl class="panel_menu">
7 7 {foreach item=aItem from=$items}
8   - <dt><a href="{$baseurl}/{$aItem.fullname}">{$aItem.title}</a></dt>
  8 + <dt><a href="{ktLink base="admin.php" subpath="`$aItem.fullname`"}">{$aItem.title}</a></dt>
9 9 <dd class="descriptiveText">{$aItem.description}</dd>
10 10 {/foreach}
11 11 </dl>
... ...
templates/ktcore/manage_permissions.smarty
... ... @@ -47,7 +47,7 @@
47 47 </td> -->
48 48 <td>
49 49 <a
50   -href="{$smarty.server.PHP_SELF}?action=deletePermission&id={$oPerm->getId()}"
  50 +href="{addQS}action=deletePermission&id={$oPerm->getId()}{/addQS}"
51 51 class="ktAction ktDelete">{i18n}Delete Permission{/i18n}</a>
52 52 </td>
53 53 { /if }
... ...
templates/ktcore/metadata/conditional/manageConditional.smarty
1   -<h2>{i18n}Manage conditional fieldset{/i18n}<h2>
  1 +<h2>{i18n}Manage conditional fieldset{/i18n}</h2>
2 2  
3 3 {if $sIncomplete || !$oFieldset->getIsComplete()}
4 4 <div class="ktError">
... ... @@ -27,9 +27,9 @@ to complete{/i18n}: {$sIncomplete|escape}&lt;/p&gt;
27 27 <h2>{i18n}Conditional type{/i18n}</h2>
28 28  
29 29 {if $oFieldset->getIsComplex()}
30   -{i18n}Complex{/i18n}: <a
  30 +<p>{i18n}Complex{/i18n}: <a
31 31 href="{$rootUrl}/plugins/ktcore/admin/manageConditionals.php?action=editComplexFieldset&fieldset_id={$oFieldset->getId()}">{i18n}Manage
32   -complex conditional{/i18n}</a>
  32 +complex conditional{/i18n}</a></p>
33 33  
34 34 <form action="{$smarty.server.PHP_SELF}" method="POST">
35 35 <input type="hidden" name="action" value="changeToSimple" />
... ... @@ -39,8 +39,9 @@ complex conditional{/i18n}&lt;/a&gt;
39 39  
40 40 {else}
41 41  
42   -{i18n}Simple{/i18n}: <a
  42 +<p>{i18n}Simple{/i18n}: <a
43 43 href="{$rootUrl}/plugins/ktcore/admin/manageConditionals.php?action=editFieldset&fieldset_id={$oFieldset->getId()}">{i18n}Manage simple conditional{/i18n}</a>
  44 +</p>
44 45  
45 46 <form action="{$smarty.server.PHP_SELF}" method="POST">
46 47 <input type="hidden" name="action" value="changeToComplex" />
... ...
templates/ktcore/principals/addgroup.smarty
... ... @@ -13,7 +13,7 @@
13 13 {/foreach}
14 14 <div class="form_actions">
15 15 <input type="submit" value="{i18n}create group{/i18n}" />
16   - <a href="?action=main" class="ktCancelLink">{i18n}Cancel{/i18n}</a>
  16 + <a href="{addQS}action=main{/addQS}" class="ktCancelLink">{i18n}Cancel{/i18n}</a>
17 17 </div>
18 18 </fieldset>
19 19 </form>
... ...
templates/ktcore/principals/adduser.smarty
... ... @@ -36,7 +36,7 @@ within KnowledgeTree below.{/i18n}&lt;/p&gt;
36 36 {/foreach}
37 37 <div class="form_actions">
38 38 <input type="submit" value="{i18n}create user{/i18n}" />
39   - <a href="?action=main" class="ktCancelLink">{i18n}Cancel{/i18n}</a>
  39 + <a href="{addQS}action=main{/addQS}" class="ktCancelLink">{i18n}Cancel{/i18n}</a>
40 40 </div>
41 41 </fieldset>
42 42 </form>
... ...
templates/ktcore/principals/editgroup.smarty
... ... @@ -14,7 +14,7 @@ the system&#39;s information about group &lt;strong&gt;#name&lt;/strong&gt;{/i18n}&lt;/p&gt;
14 14 {/foreach}
15 15 <div class="form_actions">
16 16 <input type="submit" value="{i18n}save changes to group{/i18n}" />
17   - <a href="?action=main" class="ktCancelLink">{i18n}Cancel{/i18n}</a>
  17 + <a href="{addQS}action=main{/addQS}" class="ktCancelLink">{i18n}Cancel{/i18n}</a>
18 18 </div>
19 19 </fieldset>
20 20 </form>
... ...
templates/ktcore/principals/edituser.smarty
... ... @@ -12,7 +12,7 @@
12 12 {/foreach}
13 13 <div class="form_actions">
14 14 <input type="submit" value="{i18n}save changes{/i18n}" />
15   - <a href="?action=main" class="ktCancelLink">{i18n}Cancel{/i18n}</a>
  15 + <a href="{addQS}action=main{/addQS}" class="ktCancelLink">{i18n}Cancel{/i18n}</a>
16 16 </div>
17 17 </fieldset>
18 18 </form>
... ...
templates/ktcore/principals/groupadmin.smarty
... ... @@ -4,7 +4,7 @@
4 4 <legend>Add New Group</legend>
5 5 <p class="descriptiveText">{i18n}Groups allow you to assign permissions and roles to a
6 6 number of different users at once.{/i18n}</p>
7   -<p><a href="?action=addGroup" class="ktAction ktAddGroup" style="float: left; padding-right: 0.5em;">Add Group</a><a href="?action=addGroup">Add a new group</a>.</p>
  7 +<p><a href="{addQS}action=addGroup{/addQS}" class="ktAction ktAddGroup ktInline">Add Group</a><a href="{addQS}action=addGroup{/addQS}">Add a new group</a>.</p>
8 8 </fieldset>
9 9 <!-- we roll both in here. -->
10 10 <form action="{$smarty.server.PHP_SELF}" method="POST">
... ... @@ -12,7 +12,7 @@ number of different users at once.{/i18n}&lt;/p&gt;
12 12 <legend>{i18n}Search for groups{/i18n}</legend>
13 13 <p class="descriptiveText">{i18n}Since there may be many groups in the
14 14 system, please type a few letters from the group's name to begin.
15   -Alternatively, <a href="?show_all=1">view all groups</a> (note that this
  15 +Alternatively, <a href="{addQS}show_all=1{/addQS}">view all groups</a> (note that this
16 16 action may take some time if you have many groups).{/i18n}</p>
17 17  
18 18 {foreach item=oWidget from=$search_fields}
... ... @@ -53,13 +53,13 @@ action may take some time if you have many groups).{/i18n}&lt;/p&gt;
53 53 {$context->_getUnitName($oGroup)}
54 54 {/if}
55 55 </td>
56   - <td><a href="?action=editGroup&group_id={$oGroup->getId()}"
  56 + <td><a href="{addQS}action=editGroup&group_id={$oGroup->getId()}{/addQS}"
57 57 class="ktAction ktEdit">{i18n}Edit{/i18n}</a></td>
58 58 <td><a
59   -href="?action=manageUsers&group_id={$oGroup->getId()}">{i18n}Manage Users{/i18n}</a></td>
  59 +href="{addQS}action=manageUsers&group_id={$oGroup->getId()}{/addQS}">{i18n}Manage Users{/i18n}</a></td>
60 60 <td><a
61   -href="?action=manageSubgroups&group_id={$oGroup->getId()}">{i18n}Manage sub-groups{/i18n}</a></td>
62   - <td><a href="?action=deleteGroup&group_id={$oGroup->getId()}"
  61 +href="{addQS}action=manageSubgroups&group_id={$oGroup->getId()}{/addQS}">{i18n}Manage sub-groups{/i18n}</a></td>
  62 + <td><a href="{addQS}action=deleteGroup&group_id={$oGroup->getId()}{/addQS}"
63 63 class="ktAction ktDelete">{i18n}Delete{/i18n}</a></td>
64 64 </tr>
65 65 {/foreach}
... ...
templates/ktcore/principals/groups_managesubgroups.smarty
... ... @@ -63,7 +63,7 @@
63 63  
64 64 <div class="form_actions">
65 65 <input type="submit" value="{i18n}save changes{/i18n}" />
66   - <a href="?action=main" class="ktCancelLink">{i18n}Cancel{/i18n}</a>
  66 + <a href="{addQS}action=main{/addQS}" class="ktCancelLink">{i18n}Cancel{/i18n}</a>
67 67 </div>
68 68 </fieldset>
69 69 </form>
... ...
templates/ktcore/principals/groups_manageusers.smarty
... ... @@ -62,7 +62,7 @@
62 62  
63 63 <div class="form_actions">
64 64 <input type="submit" value="{i18n}save changes{/i18n}" />
65   - <a href="?action=main" class="ktCancelLink">{i18n}Cancel{/i18n}</a>
  65 + <a href="{addQS}action=main{/addQS}" class="ktCancelLink">{i18n}Cancel{/i18n}</a>
66 66 </div>
67 67 </fieldset>
68 68 </form>
... ...
templates/ktcore/principals/orgadmin.smarty
... ... @@ -36,7 +36,7 @@ asd
36 36 {foreach item=oOrg from=$org_list}
37 37 <tr>
38 38 <td>{$oOrg->getName()}</td>
39   - <td><a href="?org_id={$oOrg->getId()}" class="ktAction ktEdit">{i18n}Edit{/i18n}</a></td>
  39 + <td><a href="{addQS}org_id={$oOrg->getId()}{/addQS}" class="ktAction ktEdit">{i18n}Edit{/i18n}</a></td>
40 40  
41 41 </tr>
42 42 {/foreach}
... ...
templates/ktcore/principals/password.smarty
... ... @@ -15,9 +15,6 @@
15 15 <div class="form_actions">
16 16 <input type="submit" value="{i18n}Change your password{/i18n}" />
17 17  
18   - <!-- FIXME add CSS for secondary actions. -->
19   - <!-- Commenting this out due to redundancy. Why is it here?
20   - <p><a href="?action=setPassword">{i18n}Change your password.{/i18n}</a></p> -->
21 18 </div>
22 19 </fieldset>
23 20  
... ...
templates/ktcore/principals/preferences.smarty
... ... @@ -15,7 +15,7 @@
15 15 <div class="form_actions">
16 16 <input type="submit" value="{i18n}Update your details{/i18n}" />
17 17 <!-- FIXME add CSS for secondary actions. -->
18   - <p><a href="?action=setPassword">{i18n}Change your password.{/i18n}</a></p>
  18 + <p><a href="{addQS}action=setPassword{/addQS}">{i18n}Change your password.{/i18n}</a></p>
19 19 </div>
20 20 </fieldset>
21 21  
... ...
templates/ktcore/principals/roleadmin.smarty
... ... @@ -35,7 +35,7 @@
35 35  
36 36 <div class="form_actions">
37 37 <input type="submit" value="{i18n}update role information{/i18n}" />
38   - <a href="?action=main" class="ktCancelLink">{i18n}Cancel{/i18n}</a>
  38 + <a href="{addQS}action=main{/addQS}" class="ktCancelLink">{i18n}Cancel{/i18n}</a>
39 39 </div class="form_actions">
40 40 </fieldset>
41 41 </form>
... ... @@ -55,8 +55,8 @@
55 55 {foreach item=oRole from=$roles}
56 56 <tr>
57 57 <td>{$oRole->getName()}</td>
58   - <td><a href="?action=editRole&role_id={$oRole->getId()}" class="ktAction ktEdit">{i18n}Edit{/i18n}</a></td>
59   - <td><a href="?action=deleteRole&role_id={$oRole->getId()}" class="ktAction ktDelete">{i18n}Delete{/i18n}</a></td>
  58 + <td><a href="{addQS}action=editRole&role_id={$oRole->getId()}{/addQS}" class="ktAction ktEdit">{i18n}Edit{/i18n}</a></td>
  59 + <td><a href="{addQS}action=deleteRole&role_id={$oRole->getId()}{/addQS}" class="ktAction ktDelete">{i18n}Delete{/i18n}</a></td>
60 60 </tr>
61 61 {/foreach}
62 62 {else}
... ...
templates/ktcore/principals/unitadmin.smarty
... ... @@ -9,7 +9,7 @@ of the document management system to a particular part of your
9 9 organisation. Unit administrators have additional right within that
10 10 portion of the document management system, and they can also adjust the
11 11 membership of groups that belong to the unit.{/i18n}</p>
12   -<p><a href="?action=addGroup" class="ktAction ktAddGroup ktInline">Add Unit</a><a href="?action=addUnit">Add a new unit</a>.</p>
  12 +<p><a href="{addQS}action=addGroup{/addQS}" class="ktAction ktAddGroup ktInline">Add Unit</a><a href="{addQS}action=addUnit{/addQS}">Add a new unit</a>.</p>
13 13 </fieldset>
14 14  
15 15 <table class="listing">
... ... @@ -24,8 +24,8 @@ membership of groups that belong to the unit.{/i18n}&lt;/p&gt;
24 24 {foreach item=oUnit from=$unit_list}
25 25 <tr>
26 26 <td>{$oUnit->getName()}</td>
27   - <td><a href="?action=editUnit&unit_id={$oUnit->getId()}" class="ktAction ktEdit">{i18n}Edit{/i18n}</a></td>
28   - <td><a href="?action=deleteUnit&unit_id={$oUnit->getId()}" class="ktAction ktDelete">{i18n}Delete{/i18n}</a></td>
  27 + <td><a href="{addQS}action=editUnit&unit_id={$oUnit->getId()}{/addQS}" class="ktAction ktEdit">{i18n}Edit{/i18n}</a></td>
  28 + <td><a href="{addQS}action=deleteUnit&unit_id={$oUnit->getId()}{/addQS}" class="ktAction ktDelete">{i18n}Delete{/i18n}</a></td>
29 29 </tr>
30 30 {/foreach}
31 31 </tbody>
... ...
templates/ktcore/principals/updatepassword.smarty
... ... @@ -12,7 +12,7 @@
12 12  
13 13 <div class="form_actions">
14 14 <input type="submit" value="{i18n}change password{/i18n}" />
15   - <a href="?action=main" class="ktCancelLink">{i18n}Cancel{/i18n}</a>
  15 + <a href="{addQS}action=main{/addQS}" class="ktCancelLink">{i18n}Cancel{/i18n}</a>
16 16 </div>
17 17 </fieldset>
18 18 </form>
... ...
templates/ktcore/principals/usergroups.smarty
... ... @@ -64,7 +64,7 @@
64 64  
65 65 <div class="form_actions">
66 66 <input type="submit" value="{i18n}save changes{/i18n}" />
67   - <a href="?action=main" class="ktCancelLink">{i18n}Cancel{/i18n}</a>
  67 + <a href="{addQS}action=main{/addQS}" class="ktCancelLink">{i18n}Cancel{/i18n}</a>
68 68 </div>
69 69 </fieldset>
70 70 </form>
... ...