2012-01-04 5 views
0

ユーザーが「お気に入り」として指定したノードからコメントを取得するモジュールを作成しました。だから私は最近のコメントブロックのようにすべてのノードからすべてのコメントを出力しようとはしていませんが、ノードのものだけが「お気に入り」として指定されています。カスタムDrupalモジュールの既存のcomment.tpl.phpを使用してノードコメントを一覧表示する

これらのクエリはすべて機能しますが、私はさまざまなオブジェクトの値を出力してテストしました。だから私は各コメントと対応するノードオブジェクトのためのコメントオブジェクト全体を持っている。私は

$block['content'] = theme('item_list', array('items' => $items)); 

でこれらのCID、NID、コメントテキストなどと出力のリストを作成することができましたが、どのように私は私が同じレイアウトで私のモジュールに持っているコメントオブジェクトをレンダリングに行きますか/私のノードページにあるようにデザイン?私のノードページのコメントは、私自身のレイアウト/デザインで設定したcomment.tpl.phpファイルでレンダリングされています。私は、これらのコメントを同じ方法でレンダリングしたいと思います。

だからこれは私がモジュールからの出力のための正しい方法であると信じて、私のhook_block_view()の実装である:

function jf_comment_feed_block_view($delta = '') { 
switch($delta){ 
    case 'jf_comment_feed': 
     $block['subject'] = t('Comment feed'); 
     if(user_access('access content')){ 
      // Get users favourite locations 
      $loc_result = jf_comment_feed_locations(); 

      $fav_loc = array(); 
      foreach ($loc_result as $loc) { 
       $fav_loc[] = array(
        'data' => $loc->nid, 
       ); 
      } 

      if (empty($fav_loc)) { //No content in the last week. 
       $block['content'] = t('No favourite locations added. 
        To see what goes on at your favourite locations add locations to 
        +My Locations and the posts from those locations will show here.'); 
      } else { 
       //Use our custom function to retrieve data. 
       $result = jf_comment_feed_contents($fav_loc); 

       // ############################################ 
       // Here I need to create my output... I think... 

       // Previously I rendered my results from the query 
       // by using this code (this prints the comment id): 
       // $items = array(); 
       // foreach ($result as $comment){ 
       // $items[] = array(
       //  'data' => comment_load($comment->cid), 
       // ); 
       // } 
       // ############################################ 

       if (empty($items)) { //No content in the last week. 
        $block['content'] = t('No posts from last week.'); 
       } else { 
        // This is the code used to render the 
        // comment id to the block: 
        // $block['content'] = theme('item_list', array('items' => $items)); 
       } 
      } 
     } 
} 
return $block; 
} 

私もしてみました:$のmycommentがどこにある

$block['content'] = theme('comment_view', $mycomment, $mynode); 
$block['content'] = theme('comment', $mycomment, $mynode); 

コメントオブジェクトと$ mynodeはノードオブジェクトです。しかし、これはページを壊す。

確かに私はここで行方不明になっているはずですが、私はこれで2日間のグーグルで過ごしました。運がなかったので...これに助けてくれてありがとう。

EDIT @Cliveはいくつかのアイデアをトリガしなかったし、私は、配列がノードページでどのように見えるかに基づいて、自分自身の配列を作成してみました。私はDevel Themer infoモジュールを使って配列の構造と名前を得ました。

この配列はコメントクリエイターのユーザーの写真と日付を出力しますが、カスタムフィールドfield_jf_commentをコメントに追加しましたが、これは表示されませんが、Develで配列の情報を見ることができます。私は標準のアウト・オブ・ボックス・コメント・フィールドを使用しません。なぜなら、入力用にスケーラブルなテキスト領域ではなくテキスト・フィールドが必要だったからです。デザインの決定。

ここで私はほとんどの値を手動で設定しているので、これは理想的ではありません。これは私の現在のプロジェクトではうまくいきますが、モジュールがもう少し汎用的であれば、他の人もそれを使うことができるのですばらしいでしょう。 Devel Themerの情報を使ってノードページの個々のコメントをクリックすると、要素、db_is_active、is_adminなどのユーザーオブジェクトと配列項目を持つ配列が取得されます。何とかこの配列を再作成してこの配列を$ block ['content']に設定すれば、これはうまくいくと思います。

foreach ($result as $comment) { 
    $items[] = array(
    '#entity_type' => 'comment', 
    '#bundle' => 'comment_node_location', 
    '#theme' => 'comment__node_location', 
    '#comment' => comment_load($comment->cid, FALSE), 
    '#node' => node_load($comment->nid), 
    '#view_mode' => 'full', 
    'field_jf_comment' => array(
     '#theme' => 'field', 
     '#title' => 'Title', 
     '#access' => TRUE, 
     '#label_display' => 'above', 
     '#view_mode' => 'full', 
     '#language' => 'und', 
     '#field_name' => 'field_jf_comment', 
     '#field_type' => 'text', 
     '#entity_type' => 'comment', 
     '#bundle' => 'comment_node_location', 
     '#items' => array(
     '0' => array(
      // This isn't working and gives an error saying: 
      // Notice: Undefined property: stdClass::$field_jf_comment in 
      // jf_comment_feed_block_view() 
      'value' => $comment->field_jf_comment['und']['0']['value'], 
      'format' => $comment->field_jf_comment['und']['0']['format'], 
      'safe_value' => $comment->field_jf_comment['und']['0']['safe_value'] 
     ) 
    ) 
    ) 
); 
} 

そして、私はそれを使ってレンダリングを得る:ここで

は、アレイの実装だ

$block['content'] = $items; 

EDIT @Cliveは正しかったです。彼のコードは私のものと同じですが、コードが少なくなっています。そして、いくつかの変更を加えて、私はあまりにもそこに私のカスタムフィールドを取得するために管理:

$content = ''; 
foreach ($items as $item) { 
    $single_comment = comment_load($item['cid']); 
    $custom_field = field_attach_view('comment', $single_comment, 'field_jf_comment'); 
    $to_render = array(
    '#theme' => 'comment', 
    '#comment' => $single_comment, 
    '#node' => node_load($item['nid']), 
    'field_jf_comment' => $custom_field 
    ); 

    $content .= render($to_render); 
} 

$block['content'] = $content; 

を、私は欠けている唯一のものは、各コメントのリンクです。私が使っている唯一のものは、返信するコメントです。誰もがそれを表示する方法の任意のアイデアを得た?

答えて

0

theme()は、あなたがDrupal 7を使用しているが、Drupal 6スタイルでパラメータを渡そうとしているためにおそらく中断されます。 theme_comment() documentationを見ると、1つの$variablesパラメータが配列であることがわかります。これを試してみてください:

$content = ''; 
foreach ($items as $item) { 
    $to_render = array(
    '#theme' => 'comment', 
    '#comment' => comment_load($item['cid']) 
); 

    $content .= render($to_render); 
} 

$block['content'] = $content; 
+0

ご返信ありがとうございます。私はそれを試しましたが、残念ながらそれは動作していません。私がそれを正確に行うと、ページ全体が壊れて、これらのエラーが出る: – ghost79

+0

注意:未定義の変数:include()の下の行(../all/themes/zen/templates/maintenance-page.tplの85行目) .php)。 Notice:未定義のインデックス:template_preprocess_comment()の#comment(../modules/comment/comment.moduleの2263行)。 注意:未定義インデックス:template_preprocess_comment()内の#node(../modules/comment/comment.moduleの2264行)。 注意:template_preprocess_comment()内の非オブジェクトのプロパティを取得しようとしています(行2268 ../comment/comment.module)。 警告:date_timezone_set()は、パラメータ1がDateTimeになり、format_date()で指定されたブール値(../includes/common.incの1909行)を想定しています。 – ghost79

+0

警告:date_format()は、パラメータ1がDateTime、format_date()で指定されたブール値を期待しています(../includes/common.incの1919行目)。 注意:template_preprocess_comment()の非オブジェクトのプロパティを取得しようとしています(行2269 ../modules/comment/comment.module)。 EntityMalformedException:タイプcommentのエンティティにバンドルプロパティがありません。 entity_extract_ids()内の行(../includes/common.incの7409行)。 – ghost79

0

新しいDrupalの7 theme()構文が第2引数の配列をとります。この配列はテンプレートファイルを呼び出す前に抽出されるので、各キーは新しいphp varになります。

たとえば、array('comment' => $mycomment)はテンプレートに$commentという変数を表示します。

これは役に立ちます。

関連する問題