【问题标题】:Creating nodes programmatically in Drupal 6在 Drupal 6 中以编程方式创建节点
【发布时间】:2010-03-30 20:35:01
【问题描述】:

我一直在寻找如何在 Drupal 6 中创建节点。我在 stackoverflow 上找到了一些条目,但问题似乎是针对旧版本的,或者解决方案对我不起作用。好的,这是我目前尝试创建的过程

$node = new stdClass();

$node->title = "test title";
$node->body = "test body";
$node->type= "story";
$node->created = time();
$node->changed = $node->created;
$node->status = 1;
$node->promote = 1;
$node->sticky = 0;
$node->format = 1;
$node->uid = 1;

node_save( $node );

当我执行此代码时,会创建节点,但是当我得到管理页面时,它会抛出以下错误:

警告:在第 258 行的 C:\wamp\www\steelylib\includes\menu.inc 中为 foreach() 提供的参数无效。

警告:在第 258 行的 C:\wamp\www\steelylib\includes\menu.inc 中为 foreach() 提供的参数无效。

用户警告:键 1 查询的重复条目“36”:在 C:\wamp\www\ 中插入到 node_comment_statistics (nid, last_comment_timestamp, last_comment_name, last_comment_uid, comment_count) VALUES (36, 1269980590, NULL, 1, 0) steelylib\sites\all\modules\nodecomment\nodecomment.module 在第 409 行。

警告:在第 258 行的 C:\wamp\www\steelylib\includes\menu.inc 中为 foreach() 提供的参数无效。

警告:在第 258 行的 C:\wamp\www\steelylib\includes\menu.inc 中为 foreach() 提供的参数无效。

我看过不同的教程,似乎都遵循相同的过程。我不确定我做错了什么。我正在使用 Drupal 6.15。当我回滚数据库时(在我进行更改之前),错误就消失了。

编辑
在玩了一会儿之后,我确实发现我的 hook_menu() 中的“访问参数”有一个错误,但就重复条目而言,我永远无法弄清楚。

【问题讨论】:

  • 您已经有一个具有nid36 的节点。这就是它大喊大叫的原因。 nid 作为主键必须是唯一的。 node_save 是否还有其他参数需要传递?
  • 你的问题似乎是节点注释模块。
  • 所有表在默认安装中都有自动增量 ID,因此错误来自未知事物(模块、手动更改数据库、托管问题......)。也尝试通过 drupal_execute 创建节点:drupal.org/search/apachesolr_search/…
  • 我同意你所说的。但是,id 为 36 的节点是正在创建的节点。这几乎就像它试图插入两次一样。我想说错误出现在评论模块中,但是当任何其他模块创建节点时没有错误,所以我不能说它是评论模块。

标签: php drupal drupal-nodes


【解决方案1】:

我相信问题出在其他地方。上面的代码 sn-p 是 100% 正确的。但我敢肯定你在某个地方搞错了。

我在 menu.inc 的第 258 行遇到了警告。警告的来源是错误的菜单条目。检查模块中的所有 hook_menu
像我这样的一个常见错误是为这些菜单条目分配了错误的值:'access callback''access arguments''page callback''page arguments'

记住这些项目:

  • 'access arguments''page arguments' 必须是数组。
  • 如果您想授予对菜单条目的无限制访问权限,请执行以下操作:'access callback' => true

关于重复条目,我还是不知道。

【讨论】:

  • 谢谢!你在 hook_menu 上是对的。我将访问参数作为单个值而不是仅包含一个值的数组。然而,这只解决了 menu.inc 的问题。我仍然收到令人不安的条目已经存在的消息。
【解决方案2】:

我在 Drupal 6 中以编程方式创建节点的做法是;

$node = new stdClass();

$node->name    = "test title";
$node->title   = $node->name;
$node->body    = "test body";
$node->type    = "story";
$node->created = time();
$node->changed = $node->created;
$node->status  = 1;
$node->promote = 1;
$node->sticky  = 0;
$node->format  = 1;
$node->uid     = 1;

if ($node = node_submit($node)) {
  node_save($node);
}
else {
  // Process error
}

【讨论】:

    【解决方案3】:

    您需要清除节点、节点修订和节点评论统计表。

    问题是它试图插入一条已经存在于节点评论统计中的记录。

    【讨论】:

    • 我也这么认为,但是已经存在的节点是我刚刚插入的节点(在数据库中检查它时)。就好像它被插入了两次一样。
    • 好吧,node_save 将在任何其他启用的模块中调用 hook_nodeapi 保存操作。首先禁用非必要模块。
    • 好主意,我明天上班时会这样做。
    • 好吧,我尝试清空所有表格,但重复条目仍然出现相同的错误。但是,我修复了其他错误。请参阅 Farzan 的帖子。
    【解决方案4】:

    我不确定你的网站到底发生了什么,需要检查你的数据库和其他东西,但你看到的错误是由这一行引起的:

    db_query('INSERT INTO {node_comment_statistics} (nid, last_comment_timestamp, last_comment_name, last_comment_uid, comment_count) VALUES (%d, %d, NULL, %d, %d)', $node->nid, $node->created, $node->uid, 0);
    

    当一个节点被保存并且一切看起来都很好时,它就会被执行。这是将某些东西插入该表的地方。但是,不知何故,您的 node_comment_statistics 表中已经有一个 nid 为 36 的节点条目。我不知道您的表是否不同步,或者您正在向此表中插入两行。

    可能的原因:

    • 您有一些使用此表的自定义代码/其他模块?
    • 创建节点时,您在代码中触发了两次 nook_nodeapi 操作插入。

    【讨论】:

    • 我肯定会在表格中插入两行。这些表完全同步。它试图插入两个重复的行。我正在寻找仍然存在的问题...
    【解决方案5】:

    这是一个权限问题。

    就我而言,我必须向用户角色授予“故事:创建新内容”权限。

    【讨论】:

      猜你喜欢
      • 2014-08-02
      • 2017-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多