如何从php代码发布节点?尝试过简单查询db_query("UPDATE {node} SET status = 1 WHERE nid = %d", $nid);
,但它不起作用。
我的场景:默认情况下,节点未发布。我正在改变编辑节点表单以添加文本字段。如果用户输入正确的代码节点就会发布。所以我在form_alter和函数中添加了另一个提交函数,检查代码是否正确,尝试将节点状态更新为已发布。
答案 0 :(得分:4)
<?php
// load the node object
$node = node_load($nid);
// set status property to 1
$node->status = 1;
// re-save the node
node_save($node);
?>
另外,我看到你使用$ form ['nid'] ['#value']的评论。您确定该变量包含节点ID值吗?通常你会在表单的提交处理程序上执行代码,这意味着你将使用类似:$ form_state ['values'] ['nid']来获取$ form ['nid']元素的值。
示例:
<?php
function mymodule_myform() {
$form = array();
$form['nid'] = array(
'#type' => 'textfield',
'#title' => 'Node ID to Publish'
);
$form['submit'] = array('#type' => 'submit', '#value' => 'Submit');
}
function mymodule_myform_submit($form, &$form_state) {
$node = node_load($form_state['values']['nid']);
if ($node) {
$node->status = 1;
node_save($node);
}
}
答案 1 :(得分:1)
最佳做法是不直接对db模式进行编码,因为自己编写查询会引入冗余。您应该始终使用节点API。
Drupal在执行节点保存时调用节点api。这为您的应用程序中的所有其他模块提供了以任何方式修改节点的机会。因此,您的代码可能正常工作,而不是您期望的那样。例如,另一个模块可以在您设置节点状态后设置节点状态并覆盖您的值。
这可能有点难以调试。您可以尝试更改代码运行的模块的权重,以便在其他所有内容之后调用。这是您可以直接修改数据库模式的少数例外之一(有一个模块在UI中公开模块权重,但这是一个可怕的想法)。我并不特别喜欢依靠模块权重来获取代码。你最终可能会遇到竞争条件,但这至少会将其确定为原因。
请参阅:
http://api.drupal.org/api/drupal/modules--node--node.module/function/node_save/6
答案 2 :(得分:0)
答案 3 :(得分:0)
检查您的自定义模块/主题是否已启用。
我还会尝试通过Drupal接口创建一个节点(让它取消发布)。然后在自定义模块中运行db_query("UPDATE {node} SET status = 1 WHERE nid = %d", [paste_just_created_node_id_here]);
,看看是否有效。