2009-11-06 70 views
2

我为我的一位客户编写了一个简单的CMS,他专门做了他所需要的内容(没有他永远不会使用的主流内容管理系统的膨胀)。如何在CMS中订购页面?

CMS使他能够创建和管理两种类型的内容:页面和新闻(在侧边栏中显示的短消息)。

页面按字母顺序排列显示在网站的导航菜单中。我的客户希望能够按照自定义顺序对页面进行排序。

以编程方式执行此操作的最佳方法是什么?我正在考虑在pages表中添加一个名为“priority”的列。这将是一个数字,页面将根据此数字进行升序或降序排序。客户可以为每个页面编辑此编号?

只是好奇你对此有什么想法?有一个更好的方法吗?为此目的的一些设计模式?

+2

'他从来不会使用'膨胀'对'客户希望能够对页面进行排序' - 这只是更多的第一轮... – 2009-11-06 16:33:30

+0

不是,他已经使用网站并在那里添加内容。这只是一个小修改(我使用了一个框架,因此我很容易做出这样的小改动)。对我来说这是没有问题的,我只是想听听其他人如何解决这个问题。 – 2009-11-06 16:36:40

回答

7

我个人使用jQuery ui sortable插件。客户端可以拖放列表中的项目,更改顺序。

接下来,我再次使用jQuery来遍历项目列表,编译id的CSV列表并将其发送到服务器。

var imageList; 

function init() { 
    imageList = $("#imagelist"); 

    if(imageList.length > 0) { 
     imageList.sortable({stop:onStopSorting}); 
    } 
} 

function onStopSorting() { 
    var datas = imageList.find("span.data"); 
    var result = new Array(); 
    for(var i = 0; i < datas.length; i++) { 
     result.push(datas.eq(i).html()); 
    } 
    $("#imageSort").val(result.join(",")); 
} 

,并在服务器上:

if(isset($_REQUEST["imageSort"]) && $_REQUEST["imageSort"] != "") { 
    $imageIdList = explode(",", $_REQUEST["imageSort"]); 

    for($i = 0; $i < count($imageIdList); $i++) { 
     $this->setImagePriority($imageIdList[$i], $i+1); 
    } 
} 

它可能会比一个漂亮的设计模式更“快“东经脏”,但它的作品。

+0

即使我以一种不同的方式实现它,我使用了jquery ui sortable插件。谢谢:) – 2009-11-06 19:32:17

4

如果我在预算中,我会给用户一个字段来编辑或控制。简单的方法是一个整数字段,其中的值可以被复制 - 让他们选择数字并手动输入字段。很明显,这是一个快速和肮脏的修复方法 - 如果用户设置了一个大页面序列,然后想在特定插槽中添加一些内容,这是一个问题 - 优先级值相等,因此您必须对其进行排序在别的东西上。

使用浮点值是另一种可能性。在这种情况下,你不让用户看到数字。如果用户想要在项目A和项目B之间放置项目C,则可以将优先级设置为C=(A+B)/2,因为知道小数精度会让您在用完精度之前执行此类操作多次(许多)次。您始终可以制作维护脚本以便按顺序获取数据并分配新值 - 可以每月运行一次,甚至每年运行一次。

这不是花哨的,但实施起来很便宜。

+2

我使用jQuery排序插件,因此用户可以在管理面板中拖放页面,并且每次用户使用鼠标拖放页面时,都会使用AJAX将新页面顺序保存到数据库。这比我预期的要容易。 – 2009-11-06 21:01:39

+0

哦,太好了!我在AJAX上很弱,所以我倾向于认为这很难。你得到了两全其美 - 好*和*便宜。这就是你想要做的事情,对你有好处。 – 2009-11-07 05:35:39