simplenewsの購読ページをpanels内に表示する方法

Events happening in the community are now at Drupal community events on www.drupal.org.
kenppx's picture

以前にも質問させて頂きました、kenppxと申します。
今回はsimplenewsモジュールについてお聞きしたいのですが、宜しくお願いします。
もしかすると、panels及びpage managerに関する質問になるのかも知れません。

構築環境は以下の通りです。
Drupal 7
Simplenews 7.x-1.0-alpha1
Panels 7.x-3.0-alpha3

simplenewsにより生成される、購読用フォームページ(newsletter/subscriptions)に
panelsによりコンテンツを加える方法を教えて頂けたらと思います。今までに以下の事を試してみました。

1.page manager(ページ)でパスが/node/%nodeのページにコンテンツを加えてみたのですが、
  newsletter/subscriptionsにはコンテンツが表示されませんでした。

2.次にpage managerでAdd custom pageからnewsletter/subscriptionsに
 カスタムページを作ろうとしたのですが、下記の様に『そのパスはもう使われてるよ!!』と怒られてしまいました。

That path is already in use. This system cannot override existing paths.

3.同じくpage managerで/subscription/*に対して同様の事をしてみましたが、コンテンツは表示されませんでした。

4.逆にこのページをpanels内のコンテンツとして表示出来ないかを試してみたのですが、コンテンツ選択画面で
  選択項目が見つからず断念。Existing nodeとして探してみましたが見つからず。(そもそもこのページはノード?)

以上を試してみたのですが、ダメでした。どなたかアドバイスを頂けたらと思います。
何卒宜しくお願いします。

Comments

PanelsはDrupalのノードやリストが並ぶConte

qchan's picture

PanelsはDrupalのノードやリストが並ぶContent部分、Themeの.infoファイルにある

regions[content] = Content
言い換えると、node.tpl.phpで操作される部分

をURLを持ったページとしてそっくり置き換えるという趣旨のモジュールなので、
そのままではSimplenewsモジュールが作ったURLを伴った”newsletter/subscriptions”ページと同居はできないと思います。

しかし、発想を逆にしてPanelsで新規ページを作った中に”newsletter/subscriptions”の中身をPaneの中に呼び出したり、
Simplenewsが吐き出すブロックを配置することは可能です。
簡単なのはBlock管理ページにSimplenewsのSubscriptions Blockがあるはずなのでそれを呼び出せるはずです。

kenppxさんのやりたいことと合っていればよいのですが。

ありがとうございます。

kenppx's picture

qchan様とても丁寧なご説明ありがとうございます。

そのままではSimplenewsモジュールが作った
URLを伴った”newsletter/subscriptions”ページと
同居はできないと思います。

やはりそうですか…。色々試したのですがどうしてもダメでした。

発想を逆にしてPanelsで新規ページを作った
中に”newsletter/subscriptions”の中身を
Paneの中に呼び出したり、Simplenewsが
吐き出すブロックを配置することは可能です。

simplenewsが吐き出す購読用のブロックを呼び出すことは
できるのですが、"newsletter/subscriptions"の中身そのもの
を呼び出すことがどうしてもできません。
もしよろしければ具体的な方法を教えて頂ければ幸いです。
これがnodeであれば簡単に呼び出せるとは思うのですが、
モジュール自体が吐き出すページとなると、どの様にpane内に
呼び出せば良いのかがわかりません。

"newsletter/subscriptions"内のフ

qchan's picture

"newsletter/subscriptions"内のフォームと
購読用のブロックの内容は同じように思えますが、ブロック呼び出しではだめな理由はなにかあったりしますか?

問題点

kenppx's picture

qchan様

問題点としましては、購読解除用のボタンがブロックには無い事です。
一方、"newsletter/subscriptions"内には登録解除ボタンがあります。
出来れば、登録解除ボタンのある"newsletter/subscriptions"の中身を
表示できたらと考えております。

qchan's picture

なるほど理解しました。

moduleがから吐き出されるページというのは、Nodeという統一されたフォーマットには縛られないコンテンツです。
moduleには、そのURLへアクセスがあったときにどんなプログラムを動かすかという指示が書けます。
まったく自由に動かせるのでDrupalがCMSというよりWebアプリケーションフレームワークとして使える強さもここにあります。
いかようにも書けてしまいますから、決まった取り出し手順はないんです。
その都度、.module ファイルに書かれたプログラムを読んで対応することになります。

kenppxさんがモジュールの吐き出した内容をPanelsに取り出したい場合は、
hook_menu()やFormAPIを調べて実装する必要がありますね。
もっと簡単な方法があるとうれしいので、どなたかのコメントを待ちたいと思います。

今回ですと

$items['newsletter/subscriptions'] = array(

のような $items[] の部分にその大枠が書いてあります。
'page callback'の項目を見ると、Formを吐き出しているのが見て取れるので
PaneでPHPフィルターを有効にしてから、以下のように書けば出てくるかもしれません。

<?php
module_load_include
('inc', 'simplenews', 'includes/simplenews.admin');
return
drupal_render(drupal_get_form('simplenews_subscription_list_add'));
?>

そういう事でしたか…。

kenppx's picture

qchan様
ご説明本当にありがとうございます。上記のコード試してみます。
また、これからhookやFormAPIについて勉強してみます。
ちなみに、phpフィルターを有効にしてpane内やブロック内にphpを記述という手法は
Drupalの世界では日常的に使用される方法ですか?
初心者の私としては、ただ便利な機能だなぁーとだけ思ってしまうのですが…。
何か注意点等ありましたら、教えていただけると幸いです。
質問ばかりで申し訳ありません。

qchan's picture

PHPフィルターはDrupalコアの機能なので特殊な使い方ではないと思います。
Body,Block, CCK field,Rules,Viewsなどでも使えます。
例えばBlock に書くSnipetリスト
PHP block snippets | drupal.org

しかし、非常に便利な反面、使い方には気をつけたほうがよいとあちこちで書かれています。

  • まずはセキュリティの面での不安はいうまでもないですね。

あと、

  • メンテナンス性が落ちる。(どこに書いたか忘れてしまうんですよね)
  • 表示のパフォーマンスが少し落ちる。
  • コードがDBに入るのでバージョングできない。
  • 同じくコードがDBに入るので、もしそのコードが原因で画面が表示できなくなるとDBを直接触らないと復旧できない。

などマイナス面もありますから、慎重に使ったほうがよいでしょうね。(自戒を込めて)

dokumori's picture

あと、書き間違うとWSODになります。最悪、復旧するのに該当のコードをdbから直接削除することになったりもします。サイトが落ちた場合の損害を考慮して、僕の今のクライアントには使用禁止にしてもらっています。

WSOD

kenppx's picture

dokumori様

WSODは恐怖ですね。復旧の仕方は知っていないとですね。
勉強しようと思います。

kenppx's picture

なるほどー、使う時には十分に注意が必要ですね。
心しておきます。DBを操作して復旧する方法も勉強する必要がありますね。
調べてみます。

日本 コミュニティ: Drupal Japan User Group

Group organizers

Group categories

Group notifications

This group offers an RSS feed. Or subscribe to these personalized, sitewide feeds:

Hot content this week