通过 link 编辑模式下的 drupal 加载节点,包括将发布选项更改为已发布的属性? drupal_goto

drupal load node in edit mode via link including attribute to change publishing option to published? drupal_goto

是否可以在编辑模式下加载节点并将发布选项设置为已发布?

drupal_goto("node/$node->nid/edit");

因此用户不必手动设置选项,只有在用户单击保存后才会保存为已发布(节点设置为未发布)。

我想替换程序化方法,因为它在编辑模式之前也会保存它

$node->status = NODE_PUBLISHED;
node_save($node);

仅供参考“发布选项”字段

<div class="form-item form-type-checkbox form-item-status">
<input type="checkbox" id="edit-status" name="status" value="1" class="form-checkbox">  
<label class="option" for="edit-status">Published </label>

您可以使用hook_form_alter()来改变形式:

function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
    // if ($form_id == 'TYPE_node_form') {
        $form['options']['status']['#default_value'] = 1;
    // }
}

因此,将检查发布选项。

您可以使用hook_node_presave()更改节点属性(提交时):

function MYMODULE_node_presave($node) {
    $node->status = NODE_PUBLISHED;
}

即使未选中发布选项,这也会导致将节点设置为已发布。


编辑: 看完评论后,我建议你使用另一种行为。您可以将 ?from-email 附加到 drupal_goto(),然后在 hook_form_alter() 中添加自定义提交,然后在 hook_node_presave() 中比较原始节点和发布的节点的值值,并在检测到更改时强制 status :

  1. 当您来自电子邮件时,将您的 drupal_goto() 更改为:

    drupal_goto("node/$node->nid/edit", ['query' => ['from-email' => 1]]);
    
  2. 在您的 hook_form_alter() 中,检查 URL 是否包含 from-email,添加自定义处理程序:

    function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
        if (isset($_GET['from-email'])) {
            // add at the first place to the list of handlers:
            array_unshift($form['actions']['submit']['#submit'], 'MODULE_my_custom_submit_handler') ;
        }
    }
    
  3. 自定义处理程序:

    function MYMODULE_my_custom_submit_handler($form, &$form_state) {
    
        $nid = $form_state['values']['nid'];
        $node = node_load($nid);
    
        // to debug:
        // var_dump($form_state['values'], $node);die;
    
        // check diff
        $to_publish = false ;
        if ($node->title != $form_state['values']['title']) $to_publish = true;
        if ($node->body['und'][0]['value'] != $form_state['values']['body']['und'][0]['value']) $to_publish = true ;
        // and so on...
    
        if ($to_publish) {
            // force the status to 1.
            $form_state['values']['status'] = 1;
        }
    }