1

我正在开发一个类似 PHP CMS 的项目,并且试图找出在 PHP 中处理 CRUD 功能的最方便的方法。

CMS 完全使用程序 PHP 进行编程(没有 OOP - 我知道你们中的许多人不会同意这一点......),并且旨在保持一切尽可能简单和轻便,以及创建高度可重用的函数和代码片段.

CMS 允许根据需要安装/激活多个模块。这些模块描述了不同类型的内容,所以我可能最终会得到一些像页面、新闻、博客这样的东西,仅举几例。

对于这些内容类型中的每一种,我都必须创建 CRUD 操作,现在我正在尝试找到最方便的方法来实现这一点。

一个要求是这些内容类型中的每一个的表单都包含在单个外部文件中(用于插入和编辑),并且如果有某种方法可以集成服务器端输入验证,那将是一个加号。

4

4 回答 4

4

CRUD 操作是指(繁琐的)数据库查询吗?

您可以轻松地设置数据库,以便除了内容类型中的一些常见字段外,特定内容类型的所有数据都存储为 TEXT 字段中的序列化关联数组。

这样,您只需对任何特定内容类型的 CRUD 进行一组查询,因为传递给 CRUD 函数的数据只是盲目地序列化。

例如,假设我们声明内容标题、创建/更新日期、标签和简短描述被视为通用数据。从那里我们有一个博客和一个页面内容类型。

我可能会这样创建一个数据库表:

CREATE TABLE `content` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` VARCHAR  NOT NULL,
  `short_description` TEXT  NOT NULL,
  `tags` TEXT ,
  `data` TEXT ,
  `content_type` INT  NOT NULL,
  `created_at` DATETIME  NOT NULL,
  `updated_at` DATETIME  NOT NULL,
  PRIMARY KEY (`id`)
)

(继续假设我们将为 content_type 创建参考表)

虽然博客可能需要像“pingbacks”这样的数据,而页面可能只需要正文,但您只需存储类似于以下博客示例的输出:

$data = serialize(array(
    "body" => "Lorem ipsum",
    "pingbacks" => array()
));

更新很容易,只要您从数据库中获取数据,您就可以将数据反序列化以编辑为基于内容类型选择的表单。显示的工作方式相同,只需根据内容类型获取模板并将未序列化的数据数组发送给它。模板永远不需要担心数据是如何存储的,它只需要一个 $data['pingbacks']。

至于您的表单,我的建议是打破您的反 OOP 公约并找到一个表单生成库。如果您可以从框架中提取它,请使用Zend_FormZend_ConfigZend_Validate来自Zend Framework(在这种情况下,所有 Zend_Config 相当于一个方便的接口来加载和遍历 XML 和 INI 文件)让生活变得非常美好。您可以让您的 XML 文件为每种内容类型定义表单,您所要做的只是在页面上呈现表单(根据内容类型获取 XML),获取过滤后的数据,删除“通用字段”之类的名称,创建/更新日期,然后将剩余的内容序列化到数据库中。不需要了解特定内容类型的架构(除非您希望严格)。

尽管从个人角度来说,我强烈建议您考虑使用 Zend_Form(使用 Zend_Validate 和 Zend_Config)以及使用Doctrine作为 ORM/数据库抽象层。您可能会发现,在数据库上运行操作时,至少 Doctrine 会让您的生活变得更加轻松。

于 2008-12-22T18:19:01.943 回答
1

尽管从个人角度来说,我强烈建议您考虑使用 Zend_Form(使用 Zend_Validate 和 Zend_Config)以及使用 Doctrine 作为 ORM/数据库抽象层。您可能会发现,在数据库上运行操作时,至少 Doctrine 会让您的生活变得更加轻松。

我同意德库西诺的观点。既然已经完成了,为什么还要自己动手呢?我还想看看Zend DB,如果您需要 PHP4 和 5 解决方案PHP ADOdb

我最近开始了一个学术项目,和你有同样的愿望;最终我选择了 PHP ADoDB。

于 2008-12-23T21:29:23.743 回答
0

我建议 www.ajaxcrud.com - 它易于使用、轻量级,并且可以让您在几秒钟内启动并运行。

于 2013-11-27T15:40:26.570 回答
0

你可以试试这个:http: //xcrud.com,真的很有帮助

于 2013-12-16T21:17:51.180 回答