On March 26, 2019 we launched new MODX Forums. Please join us at the new MODX Community Forums.
Subscribe: RSS
  • Here is something I needed on a website I am building for a client : control the order in which the TVs are ordered when editing a document. This can be pretty essential if you have a lot of TVs and/or if you edit the TVs in your document from the manager.

    How do you do that ? A quick look into manager/actions/dynamic/mutate_content.dynamic.action.php, and more particularly at line 977, will give you the answer : you have to edit the rank field in the modx_site_tmplvars table with phpMyAdmin.

    You’ll notice it has a default value of "0".
    Set ranks according to the order you want your TVs displayed (rank 0 is before rank 1, rank 1 is before rank 2 and so on) when editing a document containing TVs -> you’re set !

    (For reference, here is the related support thread :
    And also the Feature Request I filed in FlySpray :
    http://modxcms.com/bugs/task/444 )

      .: COO - Commerce Guys - Community Driven Innovation :.

      MODx est l'outil id
    • Hi david,

      here is a quick and dirty mod of Mark Kaplan script "Ajax Menu Index Editor".
      It allows to sort tv associated to a specific template.

      Code needs some clean up (some js functions are no more used) but seems to work.

      You ’ll have to check that in manager  and FCK the sql statement "order by" to get TV is set to  rank asc.

      To make it work, install "Ajax Menu Index Editor" to get "SLLists.class.php" in the right place.
      Then create a new module "sortTVorder" for instance, copy and paste the code below.

      Hope that helps

      // +----------------------------------------------------------------------+
      // | Ajax Menu Index Editor                                               |
      // +----------------------------------------------------------------------+
      // | Created January 2006                                                 |
      // +----------------------------------------------------------------------+
      // | ALL credits go to Mark Kaplan                                        |
      // +----------------------------------------------------------------------+
      // qq modifs pour ordonner TV (heliotrope) a partir du script Ajax Menu Index Editor
      // le code a besoin d'etre nettoye des fonctions js inutiles mais ...
      $template= isset($_POST['template'])? $_POST['template']: 0;
      $actionkey = isset($_POST['actionkey'])? $_POST['actionkey']: 0;
      if(isset($_POST['sortableListsSubmitted'])) {$actionkey =1;}
      $header = '
      	<title>Module : ordonner les TV</title>
      <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
      	<link rel="stylesheet" type="text/css" href="media/style/MODx/style.css?" />
      	<link rel="stylesheet" type="text/css" href="media/style/MODx/coolButtons2.css?" />
      <style type="text/css">
      input.button {
      display: none;
      ul.sortableList {
      	padding-left: 20px;
      	margin: 0px;
      	width: 300px;
      	font-family: Arial, sans-serif;
      ul.sortableList li {
      	font-weight: bold;
      	cursor: move;
      	color: white;
      	padding: 2px 2px;
      	margin: 2px 0px;
      	border: 1px solid #000000;
      	background-image: url(https://modx-iglusjax.stackpathdns.com/media/style/MODx/images/grid_hdr.gif);
      	background-repeat: repeat-x;
      #bttn .bttnheight {
      	height: 25px !important;
      	padding: 0px; 
      	padding-top: 6px;
      	float: left;
      	vertical-align:		middle !important;
      #bttn a{
      	cursor: 			default !important;
      	font: 				icon !important;
      	color:				black !important;
      	border:				0px !important;
      	padding:			5px 5px 7px 5px!important;
      	white-space:		nowrap !important;
      	vertical-align:		middle !important;
      	background:	transparent !important;
      #bttn a:hover {
      	border:		1px solid darkgreen !important;
      	padding:			4px 4px 6px 4px !important;		
      	background-image:	url("media/style/MODx/images/button_dn.gif") !important;
      	text-decoration: none;
      #bttn a img {
      	vertical-align: middle !important;
      	<script type="text/javascript" language="JavaScript" src="media/script/modx.js"></script>
      	<script type="text/javascript" language="JavaScript" src="media/script/cb2.js"></script>
      	<script type="text/javascript" language="JavaScript">
      	function reset()
      if ($actionkey == 1){
      $header .= '
      	function save()
      	if (document.getElementById("updated")) {new Effect.Fade(\'updated\',{duration:0});}
      	new Effect.Appear(\'updating\',{duration:0.5});
      }else {
      $header .= '
      	function save()
      parent.menu.ca = "move";
      function setMoveValue(pId, pName) {
      	if (pId==0 || checkParentChildRelation(pId, pName)) {
      		document.getElementById(\'parentName\').innerHTML = "Parent: <b>" + pId + "</b> (" + pName + ")";
      // check if the selected parent is a child of this document
      function checkParentChildRelation(pId, pName) {
      	var sp;
      	var id = document.newdocumentparent.id.value;
      	var tdoc = parent.menu.document;
      	var pn = (tdoc.getElementById) ? tdoc.getElementById("node"+pId) : tdoc.all["node"+pId];
      	if (!pn) return;
      		while (pn.p>0) {
      			pn = (tdoc.getElementById) ? tdoc.getElementById("node"+pn.p) : tdoc.all["node"+pn.p];
      			if (pn.id.substr(4)==id) {
      				alert("Illegal Parent");
      	return true;
      $header .= '	
      <form action="" method="post" name="resetform" style="display: none;">
      <input name="actionkey" type="hidden" value="0" />
      <div class="subTitle" id="bttn">
      	<span class="right"><img src="media/images/_tx_.gif" width="1" height="5"><br />Gestion du rang d\'affichage TV</span>
      if ($actionkey == 1){
      $header .= '<div class="bttnheight"><a id="Button1" onclick="save();"><img src="media/images/icons/save.gif"> Save</a></div>
      <div class="bttnheight"><a id="Button4" onclick="reset();"><img src="media/images/icons/sort.gif"> Sort Another</a></div>';
      }else {
      $header .= '<div class="bttnheight"><a id="Button1" onclick="save();"><img src="media/images/icons/save.gif"> Go</a></div>';
      $header .= '
      		<div class="bttnheight"><a id="Button5" onclick="document.location.href=\'index.php?a=106\';"><img src="media/images/icons/cancel.gif"> Cancel</a></div>
      	<div class="stay">   
      <div class="sectionHeader"><img src="media/images/misc/dot.gif" alt="." /> ';
      $middle = '</div><div class="sectionBody">';
      $footer = ' 
      echo $header."Menu Index Editor".$middle;
      switch ($actionkey) {
      case 0:
         echo '
      <form method="post" action="" name=\'newdocumentparent\'>
      <span id="parentName" class="warning">Please select the template that you\'d like to sort TV.</span><br>
      <input name="actionkey" type="hidden" value="1" />
      <!-- <input type="hidden" name="new_parent" value="" class="inputBox"> -->
      <br />';
       $sql = "select distinct  a.id,a.templatename,c.rank from modx_site_templates a, modx_site_tmplvar_templates b, modx_site_tmplvars c where a.id = b.templateid group by a.id order by a.id";
       //$sql = "select * from modx_site_content";
        if (!$rs= $modx->db->query($sql)) {
                  echo "vide";
      				return '';
      			while ($row= $modx->db->getRow($rs)) {
      				$result[]= $row;
      $total = count($result);
      echo "total:$total";
      echo '<select name="template">';
      foreach ($result as $item) {
      echo '<option value="'.$item['id'].'">'.$item['templatename'].'</option>';
      <input type=\'save\' value="save" style="display:none">
         echo $footer;
      case 1:
      	$basePath = $modx->config['base_path'];
      	$siteURL = $modx->config['site_url'];
      	$include = $basePath.'assets/modules/menuindex/SLLists.class.php';
      $sortableLists = new SLLists($siteURL.'manager/media/script/scriptaculous/');
      $sortableLists->debug = false;
      echo "<span class=\"warning\" style=\"display:none;\" id=\"updating\">Updating...<br /><br /> </span>";
      $tblContent= $modx->getFullTableName('site_tmplvars');
      if(isset($_POST['sortableListsSubmitted'])) {
      echo "<span class=\"warning\" id=\"updated\">Updated!<br /><br /> </span>";
      	//$tbl = $modx->getFullTableName("site_content");
      	$orderArray = $sortableLists->getOrderArray($_POST['categoriesListOrder'],'categories');
      	foreach($orderArray as $item) {
      		$sql = "UPDATE $tblContent set rank=".$item['order']." WHERE id=".$item['element'];
      		echo $sql ."<br />";
      			//$query= "SELECT * FROM modx_site_content WHERE parent = $id ORDER BY menuindex ASC";
                  $query = "select a.id, a.templatename, b.templateid, b.tmplvarid, c.name as tvname, c.id as tvid from modx_site_templates a, modx_site_tmplvar_templates b,  modx_site_tmplvars c ".
                           "where a.id=b.templateid and a.id=".$template." and c.id=b.tmplvarid order by c.rank asc";
      //echo "template:".$_POST['template'];
      			if (!$rs= $modx->db->query($query)) {
      				return '';
      			while ($row= $modx->db->getRow($rs)) {
      				$resource[]= $row;
      echo '<ul id="categories" class="sortableList">';
      $cnt = count($resource);
      if ($cnt < 1) {echo "Opèration terminé"; die;} else {
      foreach ($resource as $item) {
      echo '<li id="item_'.$item['tvid'].'">'.$item['tvname'].'</li>';
      echo '</ul>';
      $sortableLists->printForm('', 'POST', 'Submit', 'button');
      echo '<br>';
      echo $footer;

        Made with MODx : [url=http://www.copadel.com]copadel, fruits et l
      • Man this is great !

        I’ll test this right now !!!

        Edit : It seems to work fine !

        This is exactly what I had in mind, thanks a ton Heliotrope for the time-saver grin
          .: COO - Commerce Guys - Community Driven Innovation :.

          MODx est l&#39;outil id
        • You’ll be able to enjoy this feature with 0.9.5 thanks to the DocManager module smiley
            .: COO - Commerce Guys - Community Driven Innovation :.

            MODx est l&#39;outil id
          • Wow! great work heliotrope!

            thanks wink
              Free MODx Graphic resources and Templates www.tattoocms.it

              MODx IT  www.modx.it

              bubuna.com - Web & Multimedia Design
            • Quote from: davidm at Sep 22, 2006, 10:16 AM

              You’ll be able to enjoy this feature with 0.9.5 thanks to the DocManager module smiley
              This isn’t in the DocManager module (yet!), Menu Index is but not TV sorting - it slipped off the radar. I will work on getting it added in tonight, hopefully should be ready for the 0.9.5 beta 3.

              And, nice work heliotrope! smiley
                Garry Nutting
                Senior Developer
                MODX, LLC

                Email: support@modx.com
                Twitter: @garryn
                Web: modx.com
              • Oops sorry Garry for slipping there, I thought the TV tab in DocManager was doing the same thing Heliotrope’s module is tongue
                  .: COO - Commerce Guys - Community Driven Innovation :.

                  MODx est l&#39;outil id