Project

General

Profile

Bug(バグ) #3192

Updated by Yuya Watanabe about 10 years ago

h3. 概要

コンバート時にプロフィールの公開範囲デフォルト設定が正しくコンバートされない

h3. 原因

下記部分で c_profile のテーブルの public_flag_default をそのまま使用しているが,2 系では数値ではなく文字列で管理していたため,そのまま利用すると正しく格納されない.実際には 0 になる

<pre>
mysql> select public_flag_default from c_profile group by public_flag_default;
+---------------------+
| public_flag_default |
+---------------------+
| public |
| friend |
| private |
+---------------------+
3 rows in set (0.00 sec)
</pre>

テーブル定義.

<pre>
mysql> show create table profile\G
*************************** 1. row ***************************
Table: profile
Create Table: CREATE TABLE `profile` (
...
`default_public_flag` tinyint(4) NOT NULL DEFAULT '1' COMMENT 'Default of public flag',
...
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Saves input/select items for the member profile'
1 row in set (0.00 sec)
</pre>

実際に格納している部分.

data/upgrade/2/opUpgradeFrom2MemberProfileStrategy.class.php
<pre>
54 protected function importProfile($ids, $idStr)
55 {
56 $list = $this->conn->fetchAll('SELECT c_profile_id, name, is_required, public_flag_edit, public_flag_default, form_type, val_type, disp_regist, disp_config, disp_search, val_regexp, val_min, val_max, sort_order FROM c_profile WHER E c_profile_id IN ('.$idStr.') LIMIT 16', $ids);
...
62 $this->conn->execute('INSERT INTO profile (id, name, is_required, is_unique, is_edit_public_flag, default_public_flag, form_type, value_type, is_disp_regist, is_disp_config, is_disp_search, value_regexp, value_min, value_max, so rt_order, created_at, updated_at) VALUES (?, ?, ?, 0, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NOW(), NOW())', array(
63 $profile['c_profile_id'] , $profile['name'] , $profile['is_required'] , $profile['public_flag_edit'] ,
...
66 ));
67 }
68 }
</pre>

実際に格納される値は下記のような形になる.(cast関数参考URL https://dev.mysql.com/doc/refman/5.1/ja/cast-functions.html )

<pre>
mysql> SELECT CAST('public' AS UNSIGNED), CAST('private' AS UNSIGNED), CAST('friend' AS UNSIGNED);
+----------------------------+-----------------------------+----------------------------+
| CAST('public' AS UNSIGNED) | CAST('private' AS UNSIGNED) | CAST('friend' AS UNSIGNED) |
+----------------------------+-----------------------------+----------------------------+
| 0 | 0 | 0 |
+----------------------------+-----------------------------+----------------------------+
1 row in set, 3 warnings (0.00 sec)
</pre>

h3. 修正案

下記設定に従って, opUpgradeFrom2MemberProfileStrategy.class.php の値を正しく設定する.

lib/model/doctrine/ProfileTable.class.php
<pre>
13 const PUBLIC_FLAG_SNS = 1;
14 const PUBLIC_FLAG_FRIEND = 2;
15 const PUBLIC_FLAG_PRIVATE = 3;
16 const PUBLIC_FLAG_WEB = 4;
17
18 protected $publicFlags = array(
19 self::PUBLIC_FLAG_WEB => 'All Users on the Web',
20 self::PUBLIC_FLAG_SNS => 'All Members',
21 self::PUBLIC_FLAG_FRIEND => '%my_friend%',
22 self::PUBLIC_FLAG_PRIVATE => 'Private',
23 );
</pre>

<pre>
array_search($flag, array('public' => 1, 'friend' = 2, 'private' = 3));
</pre>

h3. 確認環境

OpenPNE 3.6.5
(OpenPNE 3.8 は 2 系からのアップグレードに対応していない)

Back