Drupal 7. DIYサブスクリプションモジュール

序文の代わりに



コンテンツをサブスクライブする機能は、Web業界で最も要求されている機能の1つです。 多くのサイトが同様のものを誇っています。 そして、私たちのプロジェクトも例外ではありませんでした。 指定: Drupal 7サイト。 必要なもの:必要なすべての機能を実装するモジュールを検索または作成します。 どのオプションが選択され、どのオプションが提供されたかについては、先を読むことができます。











適切なモジュールを検索



最も明白で予測可能なオプションは、 サブスクリプションモジュールです。 このモジュールを使用すると、ユーザーはノードおよび分類法の変更(コンテンツに関する新しいコメントを含む)にサブスクライブできます。 このオプションを拒否する主な理由は、ページをリロードせずにサブスクライブする機能がないことと、主に電子メールニュースレターでのモジュールのオリエンテーションです。



別のオプションは、 通知モジュールです。 原則として、その拡張性と拡張性は(私たちのタイプのサブスクリプションを作成するために)私たちに適していましたが、7.xの安定したバージョンがないため、それを使用できませんでした。



そのため、モジュールを自分で作成するという1つの解決策しかありませんでした。



初期設定



モジュール全体を完全に説明するのは意味がありません(これは間違いなく記事の範囲を超えます)。そのため、主な機能について説明し、主なポイントである管理設定から始めます。 最初に、特定の数のフィールドを持つコンテンツタイプ(この例ではItem )を作成する必要があります。 以下、 タイトルボディ画像の各フィールドに主な注意が払われます。







第二に、次のステップは、このタイプのノードを表示するビューを作成することです。 たとえば、次の図のように:







このビューの前述のフィールドに加えて Nidも表示されます。 なぜこれが必要なのですか? このフィールド(サブスクリプションイベントが後で添付される)を一時的に整理した後、裁量でその出力を構成できます。



モジュールファイルとその説明



モジュール開発を開始するには、 sites / all / modulesに custom_subscriptionsフォルダーを作成します 。 4つのファイルが必要になります: custom_subscriptions.info (モジュールに関する基本情報)、 custom_subscriptions.install (インストール設定)、 custom_subscriptions.module (実際にはモジュールファイル自体)、 custom_subscriptions.js (スクリプトはページをリロードせずにサブスクリプションメカニズムを実装します)。 次に、それぞれについて詳しく説明します。



情報ファイル


custom_subscriptions.infoファイルの内容:



name = "Custom Subscriptions" description = "Allows users to follow content" core = 7.x version = 7.x-1.0 php = 5.1 scripts[] = custom_subscriptions.js
      
      





ご覧のとおり、スクリプトファイルはここに含まれています。



インストールファイル


ここに投稿されている例では、データベース内の1つのテーブルで十分であり、フィールドuid (ユーザー識別子)とnid (ユーザーがサブスクライブしているノードの識別子)が含まれています。



custom_subscriptions.installファイルの内容:



 <?php /** * Implements hook_schema() */ function custom_subscriptions_schema() { $schema['custom_subscriptions'] = array( 'description' => t('The base table for subscriptions'), 'fields' => array( 'sid' => array( 'type' => 'serial', 'unsigned' => TRUE, 'not null' => TRUE, ), 'uid' => array( 'type' => 'int', 'length' => 10, 'not null' => TRUE, ), 'nid' => array( 'type' => 'int', 'length' => 10, 'not null' => TRUE, ), ), 'primary key' => array('sid'), ); return $schema; }
      
      





インストール後、テーブルは次の構造になります。







テーマ設定


まず、 ビューに Nidを表示するためのテンプレートを作成します。 私たちの場合、 views-view-field-items-page-nid.tpl.phpという名前があります(テンプレートの名前は、 Viewの設定のAdvance d / Themeセクションで取得できます)。 テンプレートファイルは、 テンプレートフォルダのテーマ( STARTERKITと呼ばれるZen サブトピックが使用された)に配置されます。



ファイルviews-view-field-items-page-nid.tpl.phpの内容



 <?php global $user; ?> <?php if ($user->uid != 0): ?> <?php $following = db_select('custom_subscriptions', 'cs') ->fields('cs') ->condition('uid', $user->uid) ->condition('nid', $output) ->execute() ->rowCount(); ?> <?php if ($following == 0):?> <?php print('<a href="follow/' . $output . '" class="follow">FOLLOW</a>'); ?> <?php else:?> <?php print('<a href="unfollow/' . $output . '" class="following">FOLLOWING</a>'); ?> <?php endif; ?> <?php endif; ?>
      
      





提示されたコードからわかるように、サブスクリプションフィールドは承認されたユーザーのみが使用できます。 さらに、 custom_subscriptionsテーブルのエントリの可用性に応じて、フィールドタイトルはFOLLOW (ユーザーがまだノードにサブスクライブしていない場合)からFOLLOWING (既にサブスクリプションがある場合)に変わります。 コミットされたアクション( follow / unfollow )に関する情報とni dノードの識別子はhref属性に保存されます。



サブスクリプションメカニズムの開発


モジュールファイルとスクリプトの機能は相互接続されているため、それらは一緒に考慮されます。



視覚効果から始めましょう:スクリプトファイルに、コンテンツにカーソル合わせるためのサブスクリプションのフィールドの外観を追加し、このフィールドにカーソル合わせたときに碑文のテキストをFOLLOWINGからUNFOLLOWに変更します( Twitterで行ったのと同じです)。



ファイルcustom_subscriptions.jの内容:



 (function ($) { Drupal.behaviors.collectiveMove = { attach: function(context, settings) { // show buttons on hover $('.view-items .views-row').hover(function() { $(this).find('.views-field-nid a').css('display', 'block'); }); // hide buttons on mouseleave $('.view-items .views-row').mouseleave(function() { $(this).find('.views-field-nid a.follow, .views-field-nid a.unfollow').css('display', 'none'); }); // show 'unfollow' when user has already had a subscription $('.view-items .views-row .views-field-nid .following').live('mouseover', function() { $(this).text('UNFOLLOW'); $(this).addClass('unfollow'); }); // hide 'unfollow' when user has already had a subscription $('.view-items .views-row .views-field-nid .following').live('mouseout', function() { $(this).text('FOLLOWING'); $(this).removeClass('unfollow'); }); } }; })(jQuery);
      
      





これで、楽しい部分が始まります-モジュールファイルとスクリプト間のデータ転送。 主なアイデアは次のとおりです。FOLLOW ポストをクリックすると、リクエストはアクションに関するデータ( 'follow' )とノード識別子をモジュールに送信し、受信したデータがデータベースに書き込まれます。 UNFOLLOWの場合、メカニズムは似ていますが、アクションは異なり( 「unfollow 」)、受信したデータはデータベーステーブルから削除されます。

最初に、 hook_men uを使用してリクエストの送信先のページを作成します。



custom_subscriptions.moduleファイルの内容:



 <?php /* Implements hook_menu() */ function custom_subscriptions_menu() { $items = array(); $items['custom_subscriptions_ajax'] = array( 'title' => 'Ajax callback', 'page callback' => 'custom_subscriptions_ajax', 'access callback' => TRUE, 'type' => MENU_CALLBACK, ); return $items; }
      
      





Drupalモジュールのコードを記述するための規則に従って、開始phpタグのみが設定されていることを思い出してください。



ページの準備ができました-機能を追加します。



custom_subscriptions.moduleファイルの内容:



 <?php /* Implements hook_menu() */ function custom_subscriptions_menu() { ... } /** * Implements ajax callback function */ function custom_subscriptions_ajax() { global $user; if($_POST['type'] == 'follow') { if ($_POST['nid']) { db_insert('custom_subscriptions') ->fields(array( 'uid' => $user->uid, 'nid' => $_POST['nid'], )) ->execute(); print(1); } } else if($_POST['type'] == 'unfollow') { if ($_POST['nid']) { db_delete('custom_subscriptions') ->condition('uid', $user->uid) ->condition('nid', $_POST['nid']) ->execute(); print(1); } } else { print(0); } }
      
      





ポストリクエストから受け取ったアクション( follow / unfollow )に応じて、テーブルにレコードを追加または削除します。 各エントリは、 uid (グローバルユーザーの識別子を取得)とnidによって識別されます 。 成功した場合、「1」を印刷します。



最も重要なことは、 ビューを使用して形成されたページのnidフィールドをクリックしてデータを転送することです。



custom_subscriptions.jsファイルの内容:



 (function ($) { Drupal.behaviors.collectiveMove = { attach: function(context, settings) { ... // click on follow/unfollow buttons $('.view-items .views-row .views-field-nid a').bind('click', function(e) { e.preventDefault(); var href = $(this).attr('href'); var strs = href.split('/'); var item = $(this); $.post( Drupal.settings.basePath + 'custom_subscriptions_ajax', { type: strs[0], nid: strs[1], }, function (data) { if (data == 1) { if (strs[0] == 'follow') { item.text('UNFOLLOW'); item.removeClass('follow'); item.addClass('following unfollow'); item.attr('href', 'unfollow/' + strs[1]); } if (strs[0] == 'unfollow') { item.text('FOLLOW'); item.removeClass('following'); item.removeClass('unfollow'); item.addClass('follow'); item.attr('href', 'follow/' + strs[1]); } } } ); }); } }; })(jQuery);
      
      





nidフィールドのリンクをクリックすると、次の手順が実行されます。



あとがきの代わりに



この記事では、 Drupal 7でノードサブスクリプションの最も単純なモジュールを作成するプロセスについて説明しました。 主なポイントは、 ポストリクエストを使用してページをリロードせずにサブスクリプションを実装することです。

ここで完成したモジュールを見ることができます: github.com/Sacret/custom_subscriptions



All Articles