プロジェクト

全般

プロフィール

Bug(バグ) #1678

トップバナー(ログイン前)とサイドバナー(ログイン前)が表示されない

pnetan  13年以上前に追加. 8年以上前に更新.

ステータス:
Fixed(完了)
優先度:
Normal(通常)
担当者:
対象バージョン:
開始日:
2010-10-14
期日:
進捗率:

100%

3.6 で発生するか:
Yes
3.8 で発生するか:
Unknown (未調査)

説明

Overview (現象)

http://sns.openpne.jp/communityTopic/6399 より転記

3.6beta5 トップバナー(ログイン前)とサイドバナー(ログイン前)が表示されません。

トップバナー(ログイン前)の掲載場所にはトップバナー(ログイン後)が表示され、サイドバナー(ログイン前)には何も表示されません。

FirefoxとChromeとIE8で確認しましたのでブラウザの影響ではないようです。
よろしくお願いいたします。

追記コメント

ガジェット設定でサイドバナーをweb全体に公開にしたら、ログインページにもサイドバナー(ログイン後)が表示されました。

トップバナー(ログイン前)とサイドバナー(ログイン前)は項目があるだけで未実装?

Causes (原因)

バナー表示は、ログイン/未ログインを sfUser::getMember() がインスタンスを返すかどうかで判断している。
しかし、3.6系では外部公開機能に対応するため未ログイン時には opAnonymousMember を返すように変更されている、
このことが原因でログイン判定がうまく機能しなくなり、正しく表示されていない。

追記コメントにあるサイドバナーを"web全体に公開"にした場合は表示された件は、
正常な挙動であり、"全員に公開"の場合ログインしていない状態では表示されない。

Way to fix (修正内容)

opAnonymousMember のインスタンスでないかどうかをログイン判定の条件に加える。


関連するチケット

関連している OpenPNE 3 - Backport(バックポート) #2138: トップバナー(ログイン前)とサイドバナー(ログイン前)が表示されない Fixed(完了) 2010-10-14

関係しているリビジョン

リビジョン 6ddc3426 (差分)
Kousuke Ebiharaほぼ13年前に追加

changed way to check whether an instance of member is opAnonymousMember in side banner gadget (refs #1678)

リビジョン 4c383aa4 (差分)
Kousuke Ebiharaほぼ13年前に追加

fixed "$sf_user->getMember()->getRawValue()" causes fatal error when registration process (refs #1678)

リビジョン 6c6363cb (差分)
Kousuke Ebiharaほぼ13年前に追加

fixed that a user in registration process could view after-login banner (refs #1678)

履歴

#1 Kousuke Ebihara13年以上前に更新

  • 対象バージョンOpenPNE 3.7.0 にセット
  • 3.6 で発生するかYes にセット

ログイン前ページ用のガジェットの公開範囲周りのバグのように思います。おそらく OpenPNE 3.5.x 以降でしか再現しないでしょう。

#2 Masato Nagasawaほぼ13年前に更新

  • ステータスNew(新規) から Accepted(着手) に変更
  • 担当者Masato Nagasawa にセット

3.7にて確認。
3.4では発生しませんでした。

3.6から外部公開機能が追加されたことにより、
getUser()->getMember() の値が false にならなくなったことが原因であると思われます。

#3 Masato Nagasawaほぼ13年前に更新

  • ステータスAccepted(着手) から Pending Review(レビュー待ち) に変更
  • 進捗率0 から 50 に変更

チケット番号を間違えてしまいました。(#を付け忘れていたため自動リンクはされていません)
e2f1721eb6b3c3da2249979d1350efd4a237cfa6 にて修正しました。

#4 Kousuke Ebiharaほぼ13年前に更新

  • ステータスPending Review(レビュー待ち) から Rejected(差し戻し) に変更

インスタンスが opAnonymousMember かどうかの確認を、 get_class() の返り値を文字列比較することによっておこなっていますが、 instanceof 演算子を利用しておこなうようにしてください。これは速度や可読性の面で有利であるということもありますが、メンバーのインスタンスが opAnonymousMember であるかどうかの配慮をおこなっている他の箇所と判断基準を合わせるという目的が大きいです。

#5 Kousuke Ebiharaほぼ13年前に更新

  • ステータスRejected(差し戻し) から Accepted(着手) に変更

http://redmine.openpne.jp/issues/1678#note-4 の指摘事項についての対応を引き受けます。

#6 Kousuke Ebiharaほぼ13年前に更新

  • 担当者Masato Nagasawa から Kousuke Ebihara に変更

#7 Kousuke Ebiharaほぼ13年前に更新

  • ステータスAccepted(着手) から Pending Review(レビュー待ち) に変更
  • 担当者Kousuke Ebihara から Masato Nagasawa に変更

#8 Rimpei Ogawaほぼ13年前に更新

  • ステータスPending Review(レビュー待ち) から 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 Kousuke Ebiharaほぼ13年前に更新

  • ステータスRejected(差し戻し) から Pending Review(レビュー待ち) に変更

#10 Naoya Tozukaほぼ13年前に更新

  • ステータスPending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
  • 進捗率50 から 70 に変更

修正確認しました。テンプレート側で false を想定したコードに修正する、という note-8 の方針に沿ったものであり、問題ないと思われます。

#11 Kousuke Ebiharaほぼ13年前に更新

  • ステータスPending Testing(テスト待ち) から Rejected(差し戻し) に変更
  • 進捗率70 から 50 に変更

http://redmine.openpne.jp/issues/2138#note-5 で指摘されているように、登録画面においてログイン後バナーが表示されるという問題が存在しているので、差し戻します。

#12 Kousuke Ebiharaほぼ13年前に更新

  • ステータスRejected(差し戻し) から Pending Review(レビュー待ち) に変更

6c6363cb25288a0c0f2a924021d00d5522a501a8http://redmine.openpne.jp/issues/1678#note-11 の問題に対応しました。 opSecurityUser::isSNSMember() の返り値をチェックするように変更しています。

#13 Minoru Takai12年以上前に更新

  • ステータスPending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
  • 進捗率50 から 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 isao sano12年以上前に更新

  • ステータスPending Testing(テスト待ち) から Fixed(完了) に変更
  • 進捗率70 から 100 に変更

テスト完了致しました。
問題は発見されなかったため、ステータスをFixed(完了)に致します。

#15 kaoru n8年以上前に更新

  • 3.8 で発生するかUnknown (未調査) にセット

他の形式にエクスポート: Atom PDF