ホームページ >バックエンド開発 >PHPチュートリアル >Drupal Goes Social:Drupalに「好む」モジュールを構築します

Drupal Goes Social:Drupalに「好む」モジュールを構築します

William Shakespeare
William Shakespeareオリジナル
2025-02-18 09:03:10981ブラウズ

この記事では、ユーザーがjQuery ajaxを使用して「いいね」を「いいね」とすることを可能にするDrupalモジュールを構築する方法を示しています。

Drupal goes Social: Building a

主要な機能:

    jquery ajaxを介した非同期の好み
  • liksのデータベースストレージ(ユーザーごと、投稿ごと)。
  • count updatesのようなリアルタイム。
  • ステータスとは異なります
  • モジュールの作成:

drupalインストールの

ディレクトリ内に
    フォルダーを作成します。
  1. 内部likepostsites/all/modules/custom
  2. を作成します
  3. likepost likepost.info
  4. create
:(初期
<code>name = likepost
description = Allows users to like Drupal posts.
core = 7.x</code>
の実装は完全性のために以下に含まれていますが、コア機能は後で追加されます)
  1. likepost.module hook_help
  2. データベーススキーマを定義するには
を作成します:
<code class="language-php">/**
 * @file
 * Main module file.
 */

/**
 * Implements hook_help().
 */
function likepost_help($path, $arg) {
  if ($path == 'admin/help#likepost') {
    $output = '<h3>' . t('About') . '</h3>';
    $output .= '<p>' . t('This module allows users to like posts in Drupal.') . '</p>';
    return $output;
  }
}</code>
  1. likepost.installモジュールをインストールします。
  2. テーブルが作成されます
<code class="language-php"><?php
/**
 * Implements hook_schema().
 */
function likepost_schema() {
  $schema['likepost_table_for_likes'] = array(
    'description' => t('Stores post likes.'),
    'fields' => array(
      'userid' => array(
        'type' => 'int',
        'not null' => TRUE,
        'default' => 0,
        'description' => t('User ID'),
      ),
      'nodeid' => array(
        'type' => 'int',
        'unsigned' => TRUE,
        'not null' => TRUE,
        'default' => 0,
        'description' => t('Node ID'),
      ),
    ),
    'primary key' => array('userid', 'nodeid'),
  );
  return $schema;
}</code>

likepost_table_for_likes

ajaxハンドリング(post.moduleなど):

Drupal goes Social: Building a

次の関数を

に追加します

いいねボタンを表示する(post.moduleなど):likepost.module

<code class="language-php">/**
 * Implements hook_menu().
 */
function likepost_menu() {
  $items['likepost/like/%'] = array(
    'title' => 'Like',
    'page callback' => 'likepost_like',
    'page arguments' => array(2),
    'access arguments' => array('access content'),
    'type' => MENU_SUGGESTED_ITEM,
  );
  return $items;
}

function likepost_like($nodeid) {
  $nodeid = (int) $nodeid;
  global $user;

  $like = likepost_get_like($nodeid, $user->uid);

  if ($like) {
    db_delete('likepost_table_for_likes')
      ->condition('userid', $user->uid)
      ->condition('nodeid', $nodeid)
      ->execute();
    $like = 0;
  } else {
    db_insert('likepost_table_for_likes')
      ->fields(array(
        'userid' => $user->uid,
        'nodeid' => $nodeid,
      ))
      ->execute();
    $like = 1;
  }

  $total_count = likepost_get_total_like($nodeid);
  drupal_json_output(array(
    'like_status' => $like,
    'total_count' => $total_count,
  ));
}

function likepost_get_total_like($nid) {
  $total_count = db_query('SELECT COUNT(*) FROM {likepost_table_for_likes} WHERE nodeid = :nodeid', array(':nodeid' => $nid))->fetchField();
  return (int) $total_count;
}

function likepost_get_like($nodeid, $userid) {
  $like = db_query('SELECT COUNT(*) FROM {likepost_table_for_likes} WHERE nodeid = :nodeid AND userid = :userid', array(':nodeid' => $nodeid, ':userid' => $userid))->fetchField();
  return (int) $like;
}</code>

スタイリング(post.cssのような):

<code class="language-php">/**
 * Implements hook_node_view().
 */
function likepost_node_view($node, $view_mode) {
  if ($view_mode == 'full') {
    $node->content['likepost_display'] = array(
      '#markup' => display_like_post_details($node->nid),
      '#weight' => 100,
    );
    $node->content['#attached']['js'][] = array(
      'data' => drupal_get_path('module', 'likepost') . '/likepost.js',
    );
    $node->content['#attached']['css'][] = array(
      'data' => drupal_get_path('module', 'likepost') . '/likepost.css',
    );
  }
}

function display_like_post_details($nid) {
  global $user;
  $totalLike = likepost_get_total_like($nid);
  $hasCurrentUserLiked = likepost_get_like($nid, $user->uid);
  return theme('like_post', array(
    'nid' => $nid,
    'totalLike' => $totalLike,
    'hasCurrentUserLiked' => $hasCurrentUserLiked,
  ));
}

/**
 * Implements hook_theme().
 */
function likepost_theme() {
  $themes = array(
    'like_post' => array(
      'arguments' => array('nid', 'totalLike', 'hasCurrentUserLiked'),
    ),
  );
  return $themes;
}

function theme_like_post($arguments) {
  $nid = $arguments['nid'];
  $totalLike = $arguments['totalLike'];
  $hasCurrentUserLiked = $arguments['hasCurrentUserLiked'];
  global $base_url;
  $output = '<div>';
  $output .= 'Total number of likes on the post are ';
  $output .= '<div class="total_count">' . $totalLike . '</div>';
  $linkText = ($hasCurrentUserLiked == 0) ? 'Like' : 'Unlike';
  $output .= l($linkText, $base_url . '/likepost/like/' . $nid, array('attributes' => array('class' => 'like-link')));
  $output .= '</div>';
  return $output;
}</code>

jQuery(likepost.js):

<code class="language-css">.likepost {
  border-style: dotted;
  border-color: #98bf21;
  padding: 10px;
}

.total_count {
  font-weight: bold;
}

.like-link {
  color: red;
}

.like-link:hover {
  color: red;
}</code>

変更を行った後、Drupalのキャッシュをクリアすることを忘れないでください。 この詳細な説明により、好みのモジュールのより堅牢で理解できる実装が可能になるはずです。 スクリーンショットはプレースホルダーです。 Drupalサイトに実際のモジュール出力が表示されます。

以上がDrupal Goes Social:Drupalに「好む」モジュールを構築しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。