在Drupal 6中编程创建节点

3

我一直在寻找如何在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 );

当我执行这段代码时,节点被创建了,但当我进入管理页面时,它会抛出以下错误:
警告:在C:\ wamp \ www \ steelylib \ includes \ menu.inc的第258行foreach()提供了无效的参数。
警告:在C:\ wamp \ www \ steelylib \ includes \ menu.inc的第258行foreach()提供了无效的参数。
用户警告:在C:\ wamp \ www \ steelylib \ sites \ all \ modules \ nodecomment \ nodecomment.module的第409行中,重复输入“36”以获取键1查询:INSERT INTO node_comment_statistics(nid,last_comment_timestamp,last_comment_name,last_comment_uid,comment_count)VALUES(36,1269980590,NULL,1,0)。
警告:在C:\ wamp \ www \ steelylib \ includes \ menu.inc的第258行foreach()提供了无效的参数。
警告:在C:\ wamp \ www \ steelylib \ includes \ menu.inc的第258行foreach()提供了无效的参数。
我查看了不同的教程,所有教程似乎都遵循相同的过程。我不确定我做错了什么。我正在使用Drupal 6.15。当我回滚数据库(回到更改之前)时,错误消失了。
编辑: 经过一番尝试后,我发现我的hook_menu()中的“access arguments”有误,但是关于重复输入,我从未能够找到原因。

你已经有一个 nid36 的节点了。这就是为什么它在报错。nid 必须是唯一的,因为它是主键。你是否需要传递其他参数给 node_save 函数? - prodigitalson
你的问题似乎是节点评论模块。 - googletorp
所有表在默认安装中都具有自动增量ID,因此错误来自未知的事物(模块、手动更改数据库、托管问题等)。还可以尝试通过drupal_execute创建节点:http://drupal.org/search/apachesolr_search/drupal_execute%20node%20save - Nikit
我同意你所说的。然而,ID为36的节点是正在被创建的节点。这似乎就像是它试图插入两次一样。我想说错误可能在评论模块中,但是当任何其他模块创建节点时都没有错误,所以我不能说这是评论模块的问题。 - user131441
5个回答

3
我所做的程序化在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
我认为问题源自其他地方。上面的代码片段是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的问题。我仍然收到那个令人困扰的条目已经存在的消息。 - user131441

1

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

问题在于它正在尝试插入已经存在于节点评论统计中的记录。


我也曾这样想,但已经存在的节点是我刚刚插入的节点(在数据库中检查时)。就好像它被插入了两次一样。 - user131441
好的,node_save会在其他启用的模块中调用hook_nodeapi保存操作。首先禁用非必需的模块。 - Kevin
好的,思路很好。我明天回到工作时会去实施。 - user131441
我尝试清空所有表格,但仍然出现了重复输入的错误。不过我已经修复了其他错误。请参考Farzan的帖子。 - user131441

0

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

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 op insert操作。

我肯定是在表中插入了两行。这些表完全同步。它正在尝试插入两个重复的行。我仍在努力寻找问题所在... - user131441

0

很可能这是一个权限问题。

在我的情况下,我不得不给用户角色授予“故事:创建新内容”的权限。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接