Bug(バグ) #1678
トップバナー(ログイン前)とサイドバナー(ログイン前)が表示されない
100%
Description
Overview (現象)¶
http://sns.openpne.jp/communityTopic/6399 より転記
3.6beta5 トップバナー(ログイン前)とサイドバナー(ログイン前)が表示されません。 トップバナー(ログイン前)の掲載場所にはトップバナー(ログイン後)が表示され、サイドバナー(ログイン前)には何も表示されません。 FirefoxとChromeとIE8で確認しましたのでブラウザの影響ではないようです。 よろしくお願いいたします。
追記コメント
ガジェット設定でサイドバナーをweb全体に公開にしたら、ログインページにもサイドバナー(ログイン後)が表示されました。 トップバナー(ログイン前)とサイドバナー(ログイン前)は項目があるだけで未実装?
Causes (原因)¶
バナー表示は、ログイン/未ログインを sfUser::getMember() がインスタンスを返すかどうかで判断している。
しかし、3.6系では外部公開機能に対応するため未ログイン時には opAnonymousMember を返すように変更されている、
このことが原因でログイン判定がうまく機能しなくなり、正しく表示されていない。
追記コメントにあるサイドバナーを"web全体に公開"にした場合は表示された件は、
正常な挙動であり、"全員に公開"の場合ログインしていない状態では表示されない。
Way to fix (修正内容)¶
opAnonymousMember のインスタンスでないかどうかをログイン判定の条件に加える。
Related issues
Associated revisions
changed way to check whether an instance of member is opAnonymousMember in side banner gadget (refs #1678)
fixed "$sf_user->getMember()->getRawValue()" causes fatal error when registration process (refs #1678)
fixed that a user in registration process could view after-login banner (refs #1678)
History
#1
Updated by Kousuke Ebihara almost 13 years ago
- Target version set to OpenPNE 3.7.0
- 3.6 で発生するか set to Yes
ログイン前ページ用のガジェットの公開範囲周りのバグのように思います。おそらく OpenPNE 3.5.x 以降でしか再現しないでしょう。
#2
Updated by Masato Nagasawa over 12 years ago
- Status changed from New(新規) to Accepted(着手)
- Assignee set to Masato Nagasawa
3.7にて確認。
3.4では発生しませんでした。
3.6から外部公開機能が追加されたことにより、
getUser()->getMember() の値が false にならなくなったことが原因であると思われます。
#3
Updated by Masato Nagasawa over 12 years ago
- Status changed from Accepted(着手) to Pending Review(レビュー待ち)
- % Done changed from 0 to 50
チケット番号を間違えてしまいました。(#を付け忘れていたため自動リンクはされていません)
e2f1721eb6b3c3da2249979d1350efd4a237cfa6 にて修正しました。
#4
Updated by Kousuke Ebihara over 12 years ago
- Status changed from Pending Review(レビュー待ち) to Rejected(差し戻し)
インスタンスが opAnonymousMember かどうかの確認を、 get_class() の返り値を文字列比較することによっておこなっていますが、 instanceof 演算子を利用しておこなうようにしてください。これは速度や可読性の面で有利であるということもありますが、メンバーのインスタンスが opAnonymousMember であるかどうかの配慮をおこなっている他の箇所と判断基準を合わせるという目的が大きいです。
#5
Updated by Kousuke Ebihara about 12 years ago
- Status changed from Rejected(差し戻し) to Accepted(着手)
http://redmine.openpne.jp/issues/1678#note-4 の指摘事項についての対応を引き受けます。
#6
Updated by Kousuke Ebihara about 12 years ago
- Assignee changed from Masato Nagasawa to Kousuke Ebihara
#7
Updated by Kousuke Ebihara about 12 years ago
- Status changed from Accepted(着手) to Pending Review(レビュー待ち)
- Assignee changed from Kousuke Ebihara to Masato Nagasawa
#8
Updated by Rimpei Ogawa about 12 years ago
- Status changed from Pending Review(レビュー待ち) to Rejected(差し戻し)
e2f1721eb6b3c3da2249979d1350efd4a237cfa6 の修正により、仮登録状態のメンバーが画面を開くと以下のようなエラーが発生するようになっています。
Fatal error: Call to a member function getRawValue() on a non-object in /path/to/OpenPNE/apps/pc_frontend/templates/_header.php on line 15
このエラーは opSecurityUser::getMember() が仮登録状態の(登録画面を開いたが登録完了していない)ユーザーの場合に opAnonymousMember のインスタンスではなく false を返すことが原因です。
仮登録状態のユーザーに対して、getMember() が opAnonymousMember のインスタンスを返すようにするか、テンプレート側で false を想定したコードに修正するかのいずれかの対応の必要があります。
急ぎ対応するのであればテンプレート側で false を想定したコードに修正するほうが影響範囲が少ないため安全と思われます。
関連チケット
#1944: 仮登録状態でメンバープロフィールページにアクセスするとFatal Error
#9
Updated by Kousuke Ebihara about 12 years ago
- Status changed from Rejected(差し戻し) to Pending Review(レビュー待ち)
#10
Updated by Naoya Tozuka about 12 years ago
- Status changed from Pending Review(レビュー待ち) to Pending Testing(テスト待ち)
- % Done changed from 50 to 70
修正確認しました。テンプレート側で false を想定したコードに修正する、という note-8 の方針に沿ったものであり、問題ないと思われます。
#11
Updated by Kousuke Ebihara about 12 years ago
- Status changed from Pending Testing(テスト待ち) to Rejected(差し戻し)
- % Done changed from 70 to 50
http://redmine.openpne.jp/issues/2138#note-5 で指摘されているように、登録画面においてログイン後バナーが表示されるという問題が存在しているので、差し戻します。
#12
Updated by Kousuke Ebihara about 12 years ago
- Status changed from Rejected(差し戻し) to Pending Review(レビュー待ち)
6c6363cb25288a0c0f2a924021d00d5522a501a8 で http://redmine.openpne.jp/issues/1678#note-11 の問題に対応しました。 opSecurityUser::isSNSMember() の返り値をチェックするように変更しています。
#13
Updated by Minoru Takai about 12 years ago
- Status changed from Pending Review(レビュー待ち) to Pending Testing(テスト待ち)
- % Done changed from 50 to 70
レビューしました。
- (r1) e2f1721e
-<?php if ($sf_user->getMember()): ?> +<?php $member = $sf_user->getMember()->getRawValue() ?> +<?php if ($member && 'opAnonymousMember' !== get_class($member)): ?> <?php echo op_banner('side_after') ?> <?php else: ?> <?php echo op_banner('side_before') ?>
- (r2) 6ddc3426
<?php $member = $sf_user->getMember()->getRawValue() ?> -<?php if ($member && 'opAnonymousMember' !== get_class($member)): ?> +<?php if ($member && !($member instanceof opAnonymousMember)): ?> <?php echo op_banner('side_after') ?> <?php else: ?> <?php echo op_banner('side_before') ?>
- (r3) 4c383aa4
-<?php $member = $sf_user->getMember()->getRawValue() ?> -<?php if ($member && !($member instanceof opAnonymousMember)): ?> +<?php $member = $sf_user->getMember() ?> +<?php if ($member && !($member->getRawValue() instanceof opAnonymousMember)): ?> <?php echo op_banner('side_after') ?> <?php else: ?> <?php echo op_banner('side_before') ?>
- (r4) 6c6363cb
-<?php $member = $sf_user->getMember() ?> -<?php if ($member && !($member->getRawValue() instanceof opAnonymousMember)): ?> +<?php if ($sf_user->isSNSMember()): ?> <?php echo op_banner('side_after') ?> <?php else: ?> <?php echo op_banner('side_before') ?>
- (r1) if ($sf_user->getMember()) だけだったので、 $sf_user->getMember()->getRawValue() が返すオブジェクトの型が opAnonymousMember でないかどうか(ログイン中メンバーであるかどうか)を追記
- (r2) get_class() ではなく instanceof を使うように修正
- (r3) $sf_user->getMember() が、 Member か opAnonymousMember 以外の値 (false) を返すことがあり、 getRawValue() が常に呼べるわけではないので修正
- (r4) $sf_user から直接 isSNSMember() を呼んで、ログイン中メンバーであるかどうかを判定するように修正
note-11 の「登録画面においてログイン後バナーが表示されるという問題が存在している」という認識は誤解であり、(r3) 時点でそのような問題はありませんでした。
note-12 では (r3) から (r4) への書き換えが行なわれていますが、動作的には (r3) と (r4) は全く同じ結果となっているはずです(※)。
※ $sf_user->getMember() メソッドの実装は #1944 で修正されていますが、上記の話は #1944 の修正前か修正後かに関わらず当てはまります。
この箇所において、最も適切な if 文は (r4) のものであるので、 note-12 の修正を以てコードチェック OK とします(どのような if 文が適切かは #1944-note-22 の補足を参照)。
#14
Updated by isao sano almost 12 years ago
- Status changed from Pending Testing(テスト待ち) to Fixed(完了)
- % Done changed from 70 to 100
テスト完了致しました。
問題は発見されなかったため、ステータスをFixed(完了)に致します。
#15
Updated by kaoru n almost 8 years ago
- 3.8 で発生するか set to Unknown (未調査)