Bug(バグ) #1678
完了トップバナー(ログイン前)とサイドバナー(ログイン前)が表示されない
100%
説明
Overview (現象)¶
http://sns.openpne.jp/communityTopic/6399 より転記
3.6beta5 トップバナー(ログイン前)とサイドバナー(ログイン前)が表示されません。 トップバナー(ログイン前)の掲載場所にはトップバナー(ログイン後)が表示され、サイドバナー(ログイン前)には何も表示されません。 FirefoxとChromeとIE8で確認しましたのでブラウザの影響ではないようです。 よろしくお願いいたします。
追記コメント
ガジェット設定でサイドバナーをweb全体に公開にしたら、ログインページにもサイドバナー(ログイン後)が表示されました。 トップバナー(ログイン前)とサイドバナー(ログイン前)は項目があるだけで未実装?
Causes (原因)¶
バナー表示は、ログイン/未ログインを sfUser::getMember() がインスタンスを返すかどうかで判断している。
しかし、3.6系では外部公開機能に対応するため未ログイン時には opAnonymousMember を返すように変更されている、
このことが原因でログイン判定がうまく機能しなくなり、正しく表示されていない。
追記コメントにあるサイドバナーを"web全体に公開"にした場合は表示された件は、
正常な挙動であり、"全員に公開"の場合ログインしていない状態では表示されない。
Way to fix (修正内容)¶
opAnonymousMember のインスタンスでないかどうかをログイン判定の条件に加える。
Kousuke Ebihara さんが約14年前に更新
- 対象バージョン を OpenPNE 3.7.0 にセット
- 3.6 で発生するか を Yes にセット
ログイン前ページ用のガジェットの公開範囲周りのバグのように思います。おそらく OpenPNE 3.5.x 以降でしか再現しないでしょう。
Masato Nagasawa さんが13年以上前に更新
- ステータス を New(新規) から Accepted(着手) に変更
- 担当者 を Masato Nagasawa にセット
3.7にて確認。
3.4では発生しませんでした。
3.6から外部公開機能が追加されたことにより、
getUser()->getMember() の値が false にならなくなったことが原因であると思われます。
Masato Nagasawa さんが13年以上前に更新
- ステータス を Accepted(着手) から Pending Review(レビュー待ち) に変更
- 進捗率 を 0 から 50 に変更
チケット番号を間違えてしまいました。(#を付け忘れていたため自動リンクはされていません)
e2f1721eb6b3c3da2249979d1350efd4a237cfa6 にて修正しました。
Kousuke Ebihara さんが13年以上前に更新
- ステータス を Pending Review(レビュー待ち) から Rejected(差し戻し) に変更
インスタンスが opAnonymousMember かどうかの確認を、 get_class() の返り値を文字列比較することによっておこなっていますが、 instanceof 演算子を利用しておこなうようにしてください。これは速度や可読性の面で有利であるということもありますが、メンバーのインスタンスが opAnonymousMember であるかどうかの配慮をおこなっている他の箇所と判断基準を合わせるという目的が大きいです。
Kousuke Ebihara さんが13年以上前に更新
- ステータス を Rejected(差し戻し) から Accepted(着手) に変更
http://redmine.openpne.jp/issues/1678#note-4 の指摘事項についての対応を引き受けます。
Kousuke Ebihara さんが13年以上前に更新
- ステータス を Accepted(着手) から Pending Review(レビュー待ち) に変更
- 担当者 を Kousuke Ebihara から Masato Nagasawa に変更
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
Kousuke Ebihara さんが13年以上前に更新
- ステータス を Rejected(差し戻し) から Pending Review(レビュー待ち) に変更
Naoya Tozuka さんが13年以上前に更新
- ステータス を Pending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
- 進捗率 を 50 から 70 に変更
修正確認しました。テンプレート側で false を想定したコードに修正する、という note-8 の方針に沿ったものであり、問題ないと思われます。
Kousuke Ebihara さんが13年以上前に更新
- ステータス を Pending Testing(テスト待ち) から Rejected(差し戻し) に変更
- 進捗率 を 70 から 50 に変更
http://redmine.openpne.jp/issues/2138#note-5 で指摘されているように、登録画面においてログイン後バナーが表示されるという問題が存在しているので、差し戻します。
Kousuke Ebihara さんが13年以上前に更新
- ステータス を Rejected(差し戻し) から Pending Review(レビュー待ち) に変更
6c6363cb25288a0c0f2a924021d00d5522a501a8 で http://redmine.openpne.jp/issues/1678#note-11 の問題に対応しました。 opSecurityUser::isSNSMember() の返り値をチェックするように変更しています。
Minoru Takai さんが13年以上前に更新
- ステータス を 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 の補足を参照)。