代码之家  ›  专栏  ›  技术社区  ›  Hortitude

在Drupal 6中为用户保存额外数据的最佳方法

  •  2
  • Hortitude  · 技术社区  · 15 年前

    我正在开发一个在登录时保存不可见用户数据的站点(例如,另一个站点上的外部ID)。我们将在创建帐户后立即创建/保存此数据。

    我可以看到我们用

    1. 内容配置文件模块(我们这边已经在使用)
    2. 配置文件模块
    3. 用户表中的数据列
    4. 创建自己的表

    我觉得1可能是最合乎逻辑的地方,但是在模块中创建一个节点似乎不是一件小事。

    #3似乎是解决这一问题的一种典型方法,但是仅仅在catchall字段中拥有一组序列化数据并不是最佳设计。

    有什么建议吗?

    3 回复  |  直到 15 年前
        1
  •  5
  •   Community Nick Dandoulakis    7 年前

    在我看来,每个选项都有其优点和缺点,你应该是最后一个打电话的人,因为你是唯一知道你的项目是关于什么的人,项目的关键点是什么,预期的典型用户模式是什么,可用的资源是什么等等。

    如果我可以自由选择, 我个人最喜欢的是选项4、1和5 (等等!)5?是:见下文!)我做出选择的指导原则是:

    • 保持它 清洁的
    • 留着它 简单的
    • 成功 可扩展

    #1-内容配置文件模块

    这将是一个 清洁的 解决方案是让开发人员更容易维护代码,因为对用户的所有更改都将通过同一个通道,并且更容易跟踪问题或添加新功能。

    我觉得不是特别的 简单的 因为它要求您与该模块的自定义API进行交互。

    至于 可扩展性 这取决于内容配置文件模块API的设计程度。诱惑可能是简单地使用所述模块为您的目的所做的表,绕过API,但这使您暴露了这样一种可能性:在一个关键的安全更新中,有一天,您在匆忙中,整个系统将崩溃,因为模式已更改…

    #4-创建自己的表

    这将是一个 清洁的 解决方案是因为您可以设计您的表(和您的模块来做您需要做的事情),并且您可以创建自己的API供其他模块使用。另一方面,您将引入另一段代码来改变注册过程,这可能使开发人员更难跟踪问题并以一致的方式扩展系统。

    这将是非常 简单的 实现代码。不过,DB设计也会有好处:要考虑的另一件事是,表将非常容易检查和查询。在大多数情况下,为视图创建一个新的处理程序是非常简单的:5个处理程序中有4个只使用视图附带的原型对象。

    这非常容易 延伸 当然。一旦为一个字段创建了模块,您就可以通过将一个字段的代码复制/粘贴到另一个字段来管理任意多个字段(或者,如果进行OOP,则从同一祖先继承)。

    我知道你已经对Drupal有所了解,但是如果你需要一个关于如何做的指针,我给了你一些方向 this other answer .

    #5-创建您自己的表并移植已经存在的字段

    这将本质上是4减去在不同模块之间散射功能的缺点…当然,如果您已经以另一种方式管理了200个字段,那么这不是一个可行的选项,但是如果您很早就开始设计,那么您可以考虑这一点。

    根据我的经验,几乎每个需要系统集成的项目(即:在多个系统中为同一个用户同步数据)都有用户注册的自定义需求,我发现这个解决方案最适合我的需求,原因有两个:

    1. 我发现我重用了很多我从一个项目到另一个项目写的自定义代码。
    2. 这是将数据与其他系统集成的最灵活的方法( 在某些情况下,我甚至在 自定义表 由同一个模块管理:一个模块包含仅由Drupal使用的自定义字段,另一个模块包含您所称的“不可见字段”。我发现这在很多场景中都非常方便,因为这样可以很容易地分别检查和操作两个系统的数据。

    嗯!

        2
  •  1
  •   John Fiala    15 年前

    如果您已经在使用内容配置文件模块,那么我真的建议您继续使用它并将字段附加到该模块上。创建帐户时保存数据,同时为用户创建节点并不难。真正地。

    $node = new stdClass();
    $node->title = $user->name; // what I'd use, or you can have node auto title handle the title for you.  Up to you!
    $node->field_hidden_field[0]['value'] = '$*#$f82hff';
    $node->uid = $user->uid;
    node_save($node);
    

    鲍勃是你叔叔!

        3
  •  0
  •   Sri    15 年前

    我会选择第三种。最终,甚至其他模块也会针对用户将数据存储在数据库中。因此,您可以直接保存它,可能比那些模块更有效。

    当然,根据数据的大小,您可以调用是在用户表中添加新列,还是使用用户ID作为外键为数据创建新表。