2012-09-07 80 views
0

我正在創建一個自定義模塊,該模塊允許用戶創建將與項目相關的私人博客文章。所以我創建了一個名爲「tasker_blog」的新content_type,它只有一個標題和正文。用戶去查看他們的項目並點擊一個鏈接,將他們帶到'tasker_project /%/ blog'%作爲項目的ID。我的表單被正確顯示,但當我提交表單時,我有兩個問題, 1)標題在提交時丟失 2)出現此錯誤:EntityMalformedException:缺少類型節點實體上的bundle屬性。在entity_extract_ids()中。Drupal自定義節點添加表單

這是我寫的代碼(取出一些非相關部分)。

function tasker_project_menu() { 
    $items = array(); 

    $items['tasker_project/%/blog'] = array(
     'title' => 'Private Blog Post', 
     'page callback' => 'drupal_get_form', 
     'page arguments' => array('tasker_project_blog_form',1), 
     'access arguments' => array('view tasker projects'), 
     'type' => MENU_CALLBACK, 
    ); 

    return $items; 
} 

function tasker_project_blog_form($form, &$form_state) { 
    drupal_add_css(drupal_get_path('module', 'tasker_project') . '/tasker_project.css'); 
    global $user; 
    module_load_include('inc', 'node', 'node.pages'); 
    $node = (object) array(
     'uid' => $user->uid, 
     'name' => (isset($user->name) ? $user->name : ''), 
     'type' => 'tasker_blog', 
     'language' => 'und', 
    ); 
    node_object_prepare($node); 

    $form = drupal_get_form('tasker_blog_node_form',$node); 
    $form['hidden_project_id'] = array(
     '#type' => 'hidden', 
     '#value' => arg(1), 
    ); 

    return $form; 
} 

如果我沒有提交任何其他內容,我得到上面提到的錯誤。如果我添加此(使用編制品顯示變量):

function tasker_project_node_validate($node, $form, &$form_state) { 
    s($_REQUEST); 
    s($form_state['values']); 
    die(); 
} 

$ _REQUEST陣列輸出:

array (9) (
    'title' => string (4) "test" 
    'body' => array (1) (
     'und' => array (1) (
      array (2) (
       'format' => string (13) "filtered_html" 
       'value' => string (13) "<p>test</p> 
" 
      ) 
     ) 
    ) 
    'changed' => string (0) "" 
    'form_build_id' => string (48) "form-eKWwyFlBOzi4LsajaAiEZBG7J0uOSI1UDVIhiDomeJE" 
    'form_token' => string (43) "N421-IiWecixBJGbxTHGcJAIrd6ZutzAW0LAtVSsrJ4" 
    'form_id' => string (24) "tasker_project_blog_form" 
    'hidden_project_id' => string (2) "10" 
    'additional_settings__active_tab' => string (0) "" 
    'op' => string (4) "Save" 
) 

$ form_state [ '值']陣列輸出:

array (27) (
    'nid' => NULL 
    'vid' => NULL 
    'uid' => string (1) "5" 
    'created' => integer 1347038959 
    'type' => string (11) "tasker_blog" 
    'language' => string (3) "und" 
    'changed' => string (0) "" 
    'title' => string (0) "" 
    'additional_settings__active_tab' => string (0) "" 
    'revision' => bool FALSE 
    'log' => string (0) "" 
    'name' => string (10) "ndenlinger" 
    'date' => string (0) "" 
    'status' => integer 0 
    'promote' => integer 0 
    'sticky' => integer 0 
    'submit' => string (4) "Save" 
    'preview' => string (7) "Preview" 
    'body' => array (1) (
     'und' => array (1) (
      array (3) (
       'summary' => string (0) "" 
       'format' => string (13) "filtered_html" 
       'value' => string (13) "<p>test</p> 
" 
      ) 
     ) 
    ) 
    //...MORE HERE REMOVED SINCE NOT RELEVANT 
) 

所以我我不確定這兩個問題是否相關。節點保存後,我將向存儲nid和project_id的自定義表中添加一行。

+0

你爲什麼不使用普通的節點形式(節點/添加/ tasker_blog)與節點參照項目?更好的是,您可以使用View來僅允許引用允許的節點。 這樣,任何人都可以通過編輯隱藏的HTML來發布任何項目的博客文章。 –

+0

來自tasker_project /%/ blog的傳入變量不是節點的標識,而是博客文章連接到的項目的標識。我嘗試使用node/add/tasker_blog?p = 123發送它,但是drupal將Get變量關閉。我想不出另一種方法來將項目id轉換爲除會話變量之外的其他形式,但如果我要設置會話變量,並且他們會定期發佈博客文章,它將會連接到項目。 – Pitchinnate

+0

另外,我試着設置自己的'#validate',form_state變量的標題是正確的。它是由於某種原因剝離標題的hook_node_validate()函數。 – Pitchinnate

回答

0

找到解決辦法,如果任何人有過這樣的問題:

drupal_add_css(drupal_get_path('module', 'tasker_project') . '/tasker_project.css'); 
    global $user; 
    module_load_include('inc', 'node', 'node.pages'); 
    $node = (object) array(
     'uid' => $user->uid, 
     'name' => (isset($user->name) ? $user->name : ''), 
     'type' => 'tasker_blog', 
     'language' => 'und', 
    ); 
    node_object_prepare($node); 
    $form_state['build_info']['args'] = array($node); 

    $form = drupal_retrieve_form('tasker_blog_node_form', $form_state); 
    drupal_prepare_form('tasker_blog_node_form', $form, $form_state); 
    $form['hidden_project_id'] = array(
     '#type' => 'hidden', 
     '#value' => arg(1), 
    ); 

我用drupal_retrieve_form和drupal_prepare_form,一切似乎現在能夠正常工作。不知道爲什麼drupal_build_form或drupal_get_form無法正常工作。

相關問題