http://redmine.openpne.jp/
http://redmine.openpne.jp/favicon.ico
2011-10-10T06:07:45Z
OpenPNE Issue Tracking System
OpenPNE 3 - Bug(バグ) #2478: プロフィール項目で「単一選択」の状態で保存したあとに「複数選択」の状態で保存を行おうとしても保存されていないように見える
http://redmine.openpne.jp/issues/2478?journal_id=11577
2011-10-10T06:07:45Z
Yuya Watanabe
watanabe@openpne.jp
<ul></ul><p>問題かどうかはわからないが,「テキスト」と「単一選択」の場合にも同じレコードにデータが保存されてしまう.</p>
OpenPNE 3 - Bug(バグ) #2478: プロフィール項目で「単一選択」の状態で保存したあとに「複数選択」の状態で保存を行おうとしても保存されていないように見える
http://redmine.openpne.jp/issues/2478?journal_id=11587
2011-10-11T03:25:58Z
Yuya Watanabe
watanabe@openpne.jp
<ul></ul><a name="メモ"></a>
<h3 >メモ<a href="#メモ" class="wiki-anchor">¶</a></h3>
<p>記録に関して関係ありそうな部分のコードを記載.</p>
<p>lib/action/opMemberAction.class.php<br /><pre>
209 public function executeEditProfile($request)
210 {
211 $this->memberForm = new MemberForm($this->getUser()->getMember());
212
213 $profiles = $this->getUser()->getMember()->getProfiles();
214 $this->profileForm = new MemberProfileForm($profiles);
215 $this->profileForm->setConfigWidgets();
216
217 if ($request->isMethod('post'))
218 {
219 $this->memberForm->bind($request->getParameter('member'));
220 $this->profileForm->bind($request->getParameter('profile'));
221 if ($this->memberForm->isValid() && $this->profileForm->isValid())
222 {
223 $this->memberForm->save();
224 $this->profileForm->save($this->getUser()->getMemberId());
225 $this->redirect('@member_profile_mine');
226 }
227 }
228
229 return sfView::SUCCESS;
230 }
</pre></p>
<p>lib/form/doctrine/MemberProfileForm.class.php<br /><pre>
43 public function save($memberId)
44 {
45 $values = $this->getValues();
46
47 foreach ($values as $key => $value)
48 {
49 $profile = Doctrine::getTable('Profile')->retrieveByName($key);
50 if (!$profile)
51 {
52 continue;
53 }
54
55 $memberProfile = Doctrine::getTable('MemberProfile')->retrieveByMemberIdAndProfileId($memberId, $profile->getId());
56
57 if (is_null($value['value']))
58 {
59 if ($memberProfile)
60 {
61 if ($profile->isMultipleSelect())
62 {
63 $memberProfile->clearChildren();
64 }
65 $memberProfile->delete();
66 }
67 continue;
68 }
69 if (!$memberProfile)
70 {
71 $memberProfile = new MemberProfile();
72 $memberProfile->setMemberId($memberId);
73 $memberProfile->setProfileId($profile->getId());
74 }
75
76 $memberProfile->setPublicFlag($memberProfile->getProfile()->getDefaultPublicFlag());
77 if (isset($value['public_flag']))
78 {
79 $memberProfile->setPublicFlag($value['public_flag']);
80 }
81 $memberProfile->save();
82
83 if ($profile->isMultipleSelect())
84 {
85 $ids = array();
86 $_values = array();
87 if ('date' === $profile->getFormType())
88 {
89 $_values = array_map('intval', explode('-', $value['value']));
90 $options = $profile->getProfileOption();
91 foreach ($options as $option)
92 {
93 $ids[] = $option->getId();
94 }
95 $memberProfile->setValue($value['value']);
96 }
97 else
98 {
99 $ids = $value['value'];
100 }
101 Doctrine::getTable('MemberProfile')->createChild($memberProfile, $memberId, $profile->getId(), $ids, $_values);
102 }
103 else
104 {
105 $memberProfile->setValue($value['value']);
106 }
107
108 $memberProfile->save();
109 }
110
111 return true;
112 }
</pre></p>
<p>lib/model/doctrine/MemberProfileTable.class.php <br /><pre>
88 public function retrieveByMemberIdAndProfileId($memberId, $profileId)
89 {
90 return $this->createQuery()
91 ->where('member_id = ?', $memberId)
92 ->andWhere('profile_id = ?', $profileId)
93 ->fetchOne();
94 }
</pre></p>
OpenPNE 3 - Bug(バグ) #2478: プロフィール項目で「単一選択」の状態で保存したあとに「複数選択」の状態で保存を行おうとしても保存されていないように見える
http://redmine.openpne.jp/issues/2478?journal_id=11588
2011-10-11T05:17:25Z
Yuya Watanabe
watanabe@openpne.jp
<ul><li><strong>ステータス</strong> を <i>New(新規)</i> から <i>Accepted(着手)</i> に変更</li><li><strong>担当者</strong> を <i>Yuya Watanabe</i> にセット</li><li><strong>対象バージョン</strong> を <i>OpenPNE 3.7.0</i> にセット</li></ul>
OpenPNE 3 - Bug(バグ) #2478: プロフィール項目で「単一選択」の状態で保存したあとに「複数選択」の状態で保存を行おうとしても保存されていないように見える
http://redmine.openpne.jp/issues/2478?journal_id=11590
2011-10-11T05:41:57Z
Yuya Watanabe
watanabe@openpne.jp
<ul></ul><a name="メモ"></a>
<h3 >メモ<a href="#メモ" class="wiki-anchor">¶</a></h3>
<p>データ取得に関して関係ありそうなコードを記載.</p>
<p>lib/action/opMemberAction.class.php 213行目<br /><pre><code class="php syntaxhl"><span class="CodeRay"><span class="integer">209</span> <span class="keyword">public</span> <span class="keyword">function</span> <span class="function">executeEditProfile</span>(<span class="local-variable">$request</span>)
<span class="integer">210</span> {
<span class="integer">211</span> <span class="local-variable">$this</span>->memberForm = <span class="keyword">new</span> <span class="constant">MemberForm</span>(<span class="local-variable">$this</span>->getUser()->getMember());
<span class="integer">212</span>
<span class="integer">213</span> <span class="local-variable">$profiles</span> = <span class="local-variable">$this</span>->getUser()->getMember()->getProfiles();
<span class="integer">214</span> <span class="local-variable">$this</span>->profileForm = <span class="keyword">new</span> <span class="constant">MemberProfileForm</span>(<span class="local-variable">$profiles</span>);
</span></code></pre></p>
<p>lib/model/doctrine/Member.class.php<br /><pre><code class="php syntaxhl"><span class="CodeRay"> <span class="integer">13</span> <span class="keyword">public</span> <span class="keyword">function</span> <span class="function">getProfiles</span>(<span class="local-variable">$viewableCheck</span> = <span class="predefined-constant">false</span>, <span class="local-variable">$myMemberId</span> = <span class="predefined-constant">null</span>)
<span class="integer">14</span> {
<span class="integer">15</span> <span class="keyword">if</span> (<span class="local-variable">$viewableCheck</span>)
<span class="integer">16</span> {
<span class="integer">17</span> <span class="keyword">return</span> <span class="constant">Doctrine</span>::getTable(<span class="string"><span class="delimiter">'</span><span class="content">MemberProfile</span><span class="delimiter">'</span></span>)->getViewableProfileListByMemberId(<span class="local-variable">$this</span>->getId(), <span class="local-variable">$myMemberId</span>);
<span class="integer">18</span> }
<span class="integer">19</span>
<span class="integer">20</span> <span class="keyword">return</span> <span class="constant">Doctrine</span>::getTable(<span class="string"><span class="delimiter">'</span><span class="content">MemberProfile</span><span class="delimiter">'</span></span>)->getProfileListByMemberId(<span class="local-variable">$this</span>->getId());
<span class="integer">21</span> }
</span></code></pre></p>
<p>lib/model/doctrine/MemberProfileTable.class.php<br /><pre><code class="php syntaxhl"><span class="CodeRay"> <span class="integer">12</span> {
<span class="integer">13</span> <span class="keyword">public</span> <span class="keyword">function</span> <span class="function">getProfileListByMemberId</span>(<span class="local-variable">$memberId</span>)
<span class="integer">14</span> {
<span class="integer">15</span> <span class="local-variable">$profiles</span> = <span class="constant">Doctrine</span>::getTable(<span class="string"><span class="delimiter">'</span><span class="content">Profile</span><span class="delimiter">'</span></span>)->createQuery()
<span class="integer">16</span> ->select(<span class="string"><span class="delimiter">'</span><span class="content">id</span><span class="delimiter">'</span></span>)
<span class="integer">17</span> ->orderBy(<span class="string"><span class="delimiter">'</span><span class="content">sort_order</span><span class="delimiter">'</span></span>)
<span class="integer">18</span> ->execute(<span class="predefined">array</span>(), <span class="constant">Doctrine</span>::<span class="constant">HYDRATE_NONE</span>);
<span class="integer">19</span>
<span class="integer">20</span> <span class="local-variable">$queryCacheHash</span> = <span class="string"><span class="delimiter">'</span><span class="delimiter">'</span></span>;
<span class="integer">21</span>
<span class="integer">22</span> <span class="local-variable">$q</span> = <span class="local-variable">$this</span>->createQuery()
<span class="integer">23</span> ->where(<span class="string"><span class="delimiter">'</span><span class="content">member_id = ?</span><span class="delimiter">'</span></span>)
<span class="integer">24</span> ->andWhere(<span class="string"><span class="delimiter">'</span><span class="content">profile_id = ?</span><span class="delimiter">'</span></span>)
<span class="integer">25</span> ->andWhere(<span class="string"><span class="delimiter">'</span><span class="content">level = 0</span><span class="delimiter">'</span></span>)
<span class="integer">26</span> ->orderBy(<span class="string"><span class="delimiter">'</span><span class="content">id</span><span class="delimiter">'</span></span>);
<span class="integer">27</span>
<span class="integer">28</span> <span class="local-variable">$memberProfiles</span> = <span class="predefined">array</span>();
<span class="integer">29</span> <span class="keyword">foreach</span> (<span class="local-variable">$profiles</span> <span class="keyword">as</span> <span class="local-variable">$profile</span>)
<span class="integer">30</span> {
<span class="integer">31</span> <span class="keyword">if</span> (<span class="local-variable">$queryCacheHash</span>)
<span class="integer">32</span> {
<span class="integer">33</span> <span class="local-variable">$q</span>->setCachedQueryCacheHash(<span class="local-variable">$queryCacheHash</span>);
<span class="integer">34</span> }
<span class="integer">35</span>
<span class="integer">36</span> <span class="local-variable">$memberProfile</span> = <span class="local-variable">$q</span>->fetchOne(<span class="predefined">array</span>(<span class="local-variable">$memberId</span>, <span class="local-variable">$profile</span>[<span class="integer">0</span>]));
<span class="integer">37</span> <span class="keyword">if</span> (<span class="local-variable">$memberProfile</span>)
<span class="integer">38</span> {
<span class="integer">39</span> <span class="local-variable">$memberProfiles</span>[] = <span class="local-variable">$memberProfile</span>;
<span class="integer">40</span> }
<span class="integer">41</span>
<span class="integer">42</span> <span class="keyword">if</span> (!<span class="local-variable">$queryCacheHash</span>)
<span class="integer">43</span> {
<span class="integer">44</span> <span class="local-variable">$queryCacheHash</span> = <span class="local-variable">$q</span>->calculateQueryCacheHash();
<span class="integer">45</span> }
<span class="integer">46</span> }
<span class="integer">47</span>
<span class="integer">48</span> <span class="comment">// NOTICE: this returns Array not Doctrine::Collection</span>
<span class="integer">49</span> <span class="keyword">return</span> <span class="local-variable">$memberProfiles</span>;
<span class="integer">50</span> }
</span></code></pre></p>
<p>apps/pc_frontend/modules/member/templates/_profileListBox.php<br /><pre>
28 $profileValue = (string)$profile;
</pre></p>
<p>lib/model/doctrine/MemberProfile.class.php <br /><pre>
13 public function __toString()
14 {
15 if ('date' !== $this->getFormType())
16 {
17 if ($this->getProfileOptionId())
18 {
19 $option = Doctrine::getTable('ProfileOption')->find($this->getProfileOptionId());
20 return (string)$option->getValue();
21 }
22
23 $children = $this->getChildrenValues(true);
24 if ($children)
25 {
26 return implode(', ', $children);
27 }
28 }
29
30 return (string)$this->getValue();
31 }
44 public function getValue()
45 {
46 if ($this->_get('value_datetime'))
47 {
48 if ($this->_get('value'))
49 {
50 if ('0000-00-00 00:00:00' === $this->_get('value_datetime'))
51 {
52 return null;
53 }
54
55 $obj = new DateTime($this->_get('value_datetime'));
56 return $obj->format('Y-m-d');
57 }
58
59 return null;
60 }
61
62 if ($this->getProfile()->isPreset())
63 {
64 if ('op_preset_birthday' === $this->getProfile()->getName())
65 {
66 return null;
67 }
68
69 return $this->_get('value');
70 }
71 elseif ('date' !== $this->getFormType() && $this->getProfileOptionId())
72 {
73 return $this->getProfileOptionId();
74 }
75
76 $children = $this->getChildrenValues();
77 if ($children)
78 {
79 if ('date' === $this->getFormType())
80 {
81 if (count($children) == 3 && $children[0] && $children[1] && $children[2])
82 {
83 $obj = new DateTime();
84 $obj->setDate($children[0], $children[1], $children[2]);
85 return $obj->format('Y-m-d');
86 }
87 return null;
88 }
89 return $children;
90 }
</pre></p>
OpenPNE 3 - Bug(バグ) #2478: プロフィール項目で「単一選択」の状態で保存したあとに「複数選択」の状態で保存を行おうとしても保存されていないように見える
http://redmine.openpne.jp/issues/2478?journal_id=11600
2011-10-11T11:01:55Z
Yuya Watanabe
watanabe@openpne.jp
<ul></ul><a name="メモ"></a>
<h3 >メモ<a href="#メモ" class="wiki-anchor">¶</a></h3>
<p>データベース内で木構造を表現する手法として「入れ子集合モデル」というものがあり,本チケットで扱われている複数項目のレコード記録方法としてこのモデルが使われているようである.</p>
<p>config/doctrine/schema.yml 145行目でNestedSetと定義されている<br /><pre><code class="yaml syntaxhl"><span class="CodeRay"><span class="key">143 MemberProfile</span>:
<span class="key">144 actAs</span>:
<span class="key">145 NestedSet</span>:
<span class="key">146 hasManyRoots</span>: <span class="string"><span class="content">true</span></span>
<span class="key">147 rootColumnName</span>: <span class="string"><span class="content">tree_key</span></span>
<span class="key">148 Timestampable</span>:
<span class="key">149 columns</span>:
<span class="key">150 id</span>: <span class="string"><span class="content">{ type: integer(4), primary: true, autoincrement: true, comment: "Serial number" }</span></span>
<span class="key">151 member_id</span>: <span class="string"><span class="content">{ type: integer(4), notnull: true, comment: "Member id" }</span></span>
<span class="key">152 profile_id</span>: <span class="string"><span class="content">{ type: integer(4), notnull: true, comment: "Profile id" }</span></span>
<span class="key">153 profile_option_id</span>: <span class="string"><span class="content">{ type: integer(4), comment: "Profile option id" }</span></span>
<span class="key">154 value</span>: <span class="string"><span class="content">{ type: string, default: "", notnull: true, comment: "Text content for this profile item" }</span></span>
<span class="key">155 value_datetime</span>: <span class="string"><span class="content">{ type: timestamp, comment: "Profile datetime value" }</span></span>
<span class="key">156 public_flag</span>: <span class="string"><span class="content">{ type: integer(1), comment: "Public flag" }</span></span>
<span class="key">157 relations</span>:
<span class="key">158 Member</span>: <span class="string"><span class="content">{ local: member_id, foreign: id, onDelete: cascade }</span></span>
<span class="key">159 Profile</span>: <span class="string"><span class="content">{ local: profile_id, foreign: id, onDelete: cascade }</span></span>
<span class="key">160 ProfileOption</span>: <span class="string"><span class="content">{ local: profile_option_id, foreign: id, onDelete: cascade }</span></span>
<span class="key">161 indexes</span>:
<span class="key">162 lft_INDEX</span>:
<span class="key">163 fields</span>: <span class="string"><span class="content">[lft]</span></span>
<span class="key">164 options</span>:
<span class="key">165 type</span>: <span class="string"><span class="content">INNODB</span></span>
<span class="key">166 collate</span>: <span class="string"><span class="content">utf8_unicode_ci</span></span>
<span class="key">167 charset</span>: <span class="string"><span class="content">utf8</span></span>
<span class="key">168 comment</span>: <span class="string"><span class="delimiter">"</span><span class="content">Saves informations of every member''s profile</span><span class="delimiter">"</span></span>
</span></pre></p></code></pre>
OpenPNE 3 - Bug(バグ) #2478: プロフィール項目で「単一選択」の状態で保存したあとに「複数選択」の状態で保存を行おうとしても保存されていないように見える
http://redmine.openpne.jp/issues/2478?journal_id=11603
2011-10-12T05:51:25Z
Yuya Watanabe
watanabe@openpne.jp
<ul></ul><p>保存する際に既存の値を保持しておく必要はないと思うので,あるメンバがそのプロフィール項目ですでに保存した値がある場合はそのレコードを上書きするのではなく削除してあたらしく作りなおす方針を検討する.</p>
<p>このとき,$profile->isMultipleSelect()は管理画面で設定した値を用いているため,これから記録しようとするデータに対してこれを用いるのは問題ないが,DB内にあるデータを表していないので記録の前処理で行う削除時にisMultipleSelect()の値を用いるとデータに則さない処理を行なってしまう可能性があることに注意する必要がある.おそらく$memberProfile->getNode()->hasChildren()などで判定できると思われる.</p>
OpenPNE 3 - Bug(バグ) #2478: プロフィール項目で「単一選択」の状態で保存したあとに「複数選択」の状態で保存を行おうとしても保存されていないように見える
http://redmine.openpne.jp/issues/2478?journal_id=11606
2011-10-12T07:24:18Z
Yuya Watanabe
watanabe@openpne.jp
<ul></ul><a name="note-6の修正案を適用した実装案について"></a>
<h2 >note-6の修正案を適用した実装案について<a href="#note-6の修正案を適用した実装案について" class="wiki-anchor">¶</a></h2>
<a name="実装案"></a>
<h3 >実装案<a href="#実装案" class="wiki-anchor">¶</a></h3>
<pre><code class="diff syntaxhl"><span class="CodeRay"><span class="line comment">diff --git a/lib/form/doctrine/MemberProfileForm.class.php b/lib/form/doctrine/MemberProfileForm.class.php</span>
<span class="line comment">index 83bb56f..0ab1d03 100644</span>
<span class="line head"><span class="head">--- </span><span class="filename">a/lib/form/doctrine/MemberProfileForm.class.php</span></span>
<span class="line head"><span class="head">+++ </span><span class="filename">b/lib/form/doctrine/MemberProfileForm.class.php</span></span>
<span class="change"><span class="change">@@</span> -54,25 +54,24 <span class="change">@@</span></span> <span class="keyword">class</span> <span class="class">MemberProfileForm</span> <span class="keyword">extends</span> <span class="constant">BaseForm</span>
<span class="local-variable">$memberProfile</span> = <span class="constant">Doctrine</span>::getTable(<span class="string"><span class="delimiter">'</span><span class="content">MemberProfile</span><span class="delimiter">'</span></span>)->retrieveByMemberIdAndProfileId(<span class="local-variable">$memberId</span>, <span class="local-variable">$profile</span>->getId());
<span class="line delete"><span class="delete">-</span> <span class="keyword">if</span> (<span class="eyecatcher"><span class="predefined">is_null</span>(<span class="local-variable">$value</span>[<span class="string"><span class="delimiter">'</span><span class="content">value</span><span class="delimiter">'</span></span>])</span>)</span>
<span class="line insert"><span class="insert">+</span> <span class="keyword">if</span> (<span class="eyecatcher"><span class="local-variable">$memberProfile</span></span>)</span>
{
<span class="line delete"><span class="delete">-</span> <span class="keyword">if</span> (<span class="local-variable">$memberProfile</span>)</span>
<span class="line insert"><span class="insert">+</span> <span class="keyword">if</span> (<span class="local-variable">$memberProfile</span><span class="eyecatcher">->getNode()->hasChildren()</span>)</span>
{
<span class="line delete"><span class="delete">-</span> <span class="keyword">if</span> (<span class="local-variable">$profile</span>->isMultipleSelect())</span>
<span class="line delete"><span class="delete">-</span> {</span>
<span class="line delete"><span class="delete">-</span> <span class="local-variable">$memberProfile</span>->clearChildren();</span>
<span class="line delete"><span class="delete">-</span> }</span>
<span class="line delete"><span class="delete">-</span> <span class="local-variable">$memberProfile</span>-><span class="predefined">delete</span>();</span>
<span class="line insert"><span class="insert">+</span> <span class="local-variable">$memberProfile</span>->clearChildren();</span>
}
<span class="line delete"><span class="delete">-</span> <span class="eyecatcher"><span class="keyword">continue</span></span>;</span>
<span class="line insert"><span class="insert">+</span> <span class="eyecatcher"><span class="local-variable">$memberProfile</span>-><span class="predefined">delete</span>()</span>;</span>
}
<span class="line delete"><span class="delete">-</span> <span class="keyword">if</span> (!<span class="local-variable">$memberProfile</span>)</span>
<span class="line insert"><span class="insert">+</span></span>
<span class="line insert"><span class="insert">+</span> <span class="keyword">if</span> (<span class="predefined">is_null</span>(<span class="local-variable">$value</span>[<span class="string"><span class="delimiter">'</span><span class="content">value</span><span class="delimiter">'</span></span>]))</span>
{
<span class="line delete"><span class="delete">-</span> <span class="local-variable">$memberProfile</span> = <span class="keyword">new</span> <span class="constant">MemberProfile</span>();</span>
<span class="line delete"><span class="delete">-</span> <span class="local-variable">$memberProfile</span>->setMemberId(<span class="local-variable">$memberId</span>);</span>
<span class="line delete"><span class="delete">-</span> <span class="local-variable">$memberProfile</span>->setProfileId(<span class="local-variable">$profile</span>->getId());</span>
<span class="line insert"><span class="insert">+</span> <span class="keyword">continue</span>;</span>
}
<span class="line insert"><span class="insert">+</span> <span class="local-variable">$memberProfile</span> = <span class="keyword">new</span> <span class="constant">MemberProfile</span>();</span>
<span class="line insert"><span class="insert">+</span> <span class="local-variable">$memberProfile</span>->setMemberId(<span class="local-variable">$memberId</span>);</span>
<span class="line insert"><span class="insert">+</span> <span class="local-variable">$memberProfile</span>->setProfileId(<span class="local-variable">$profile</span>->getId());</span>
<span class="line insert"><span class="insert">+</span></span>
<span class="local-variable">$memberProfile</span>->setPublicFlag(<span class="local-variable">$memberProfile</span>->getProfile()->getDefaultPublicFlag());
<span class="keyword">if</span> (<span class="predefined">isset</span>(<span class="local-variable">$value</span>[<span class="string"><span class="delimiter">'</span><span class="content">public_flag</span><span class="delimiter">'</span></span>]))
{
</span></pre>
<a name="問題点"></a>
<h3 >問題点<a href="#問題点" class="wiki-anchor">¶</a></h3>
<p>表面の動作的には問題ないが,プロフィールを更新するたびにDB側のmember_profileテーブルでプロフィール数+複数選択分のIDが消費されてゆく.</p></code></pre>
OpenPNE 3 - Bug(バグ) #2478: プロフィール項目で「単一選択」の状態で保存したあとに「複数選択」の状態で保存を行おうとしても保存されていないように見える
http://redmine.openpne.jp/issues/2478?journal_id=11672
2011-10-18T10:24:12Z
Yuya Watanabe
watanabe@openpne.jp
<ul></ul><a name="修正方針"></a>
<h3 >修正方針<a href="#修正方針" class="wiki-anchor">¶</a></h3>
<p>テキスト,単一選択,複数選択それぞれのフォームタイプの場合の値が同時に保存されているようなので,フォームタイプに即した値を出力時に返すようにする.</p>
<a name="実装案"></a>
<h3 >実装案<a href="#実装案" class="wiki-anchor">¶</a></h3>
<pre><code class="diff syntaxhl"><span class="CodeRay"><span class="line comment">diff --git a/lib/model/doctrine/MemberProfile.class.php b/lib/model/doctrine/MemberProfile.class.php</span>
<span class="line comment">index a085613..a6368a4 100644</span>
<span class="line head"><span class="head">--- </span><span class="filename">a/lib/model/doctrine/MemberProfile.class.php</span></span>
<span class="line head"><span class="head">+++ </span><span class="filename">b/lib/model/doctrine/MemberProfile.class.php</span></span>
<span class="change"><span class="change">@@</span> -14,16 +14,23 <span class="change">@@</span></span> <span class="keyword">class</span> <span class="class">MemberProfile</span> <span class="keyword">extends</span> <span class="constant">BaseMemberProfile</span> <span class="keyword">implements</span> opAccessControlRecordIn
{
<span class="keyword">if</span> (<span class="string"><span class="delimiter">'</span><span class="content">date</span><span class="delimiter">'</span></span> !== <span class="local-variable">$this</span>->getFormType())
{
<span class="line delete"><span class="delete">-</span> <span class="keyword">if</span> (<span class="local-variable">$this</span>-><span class="eyecatcher">getProfileOptionId</span>())</span>
<span class="line insert"><span class="insert">+</span> <span class="keyword">if</span> (<span class="local-variable">$this</span>-><span class="eyecatcher"><span class="constant">Profile</span>->isMultipleSelect</span>())</span>
{
<span class="line delete"><span class="delete">-</span> <span class="local-variable">$option</span> = <span class="constant">Doctrine</span>::getTable(<span class="string"><span class="delimiter">'</span><span class="content">ProfileOption</span><span class="delimiter">'</span></span>)->find(<span class="local-variable">$this</span>->getProfileOptionId());</span>
<span class="line delete"><span class="delete">-</span> <span class="keyword">return</span> (<span class="predefined-type">string</span>)<span class="local-variable">$option</span>->getValue();</span>
<span class="line insert"><span class="insert">+</span> <span class="local-variable">$children</span> = <span class="local-variable">$this</span>->getChildrenValues(<span class="predefined-constant">true</span>);</span>
<span class="line insert"><span class="insert">+</span> <span class="keyword">if</span> (<span class="local-variable">$children</span>)</span>
<span class="line insert"><span class="insert">+</span> {</span>
<span class="line insert"><span class="insert">+</span> <span class="keyword">return</span> <span class="predefined">implode</span>(<span class="string"><span class="delimiter">'</span><span class="content">, </span><span class="delimiter">'</span></span>, <span class="local-variable">$children</span>);</span>
<span class="line insert"><span class="insert">+</span> }</span>
<span class="line insert"><span class="insert">+</span> <span class="keyword">else</span></span>
<span class="line insert"><span class="insert">+</span> {</span>
<span class="line insert"><span class="insert">+</span> <span class="keyword">return</span> <span class="string"><span class="delimiter">'</span><span class="delimiter">'</span></span>;</span>
<span class="line insert"><span class="insert">+</span> }</span>
}
<span class="line delete"><span class="delete">-</span></span>
<span class="line delete"><span class="delete">-</span> <span class="local-variable">$children</span> = <span class="local-variable">$this</span>->getChildrenValues(<span class="predefined-constant">true</span>);</span>
<span class="line delete"><span class="delete">-</span> <span class="keyword">if</span> (<span class="local-variable">$children</span>)</span>
<span class="line insert"><span class="insert">+</span> <span class="keyword">if</span> (<span class="local-variable">$this</span>-><span class="constant">Profile</span>->isSingleSelect() && <span class="local-variable">$this</span>->getProfileOptionId())</span>
{
<span class="line delete"><span class="delete">-</span> <span class="keyword">return</span> <span class="predefined">implode</span>(<span class="string"><span class="delimiter">'</span><span class="content">, </span><span class="delimiter">'</span></span>, <span class="local-variable">$children</span>);</span>
<span class="line insert"><span class="insert">+</span> <span class="local-variable">$option</span> = <span class="constant">Doctrine</span>::getTable(<span class="string"><span class="delimiter">'</span><span class="content">ProfileOption</span><span class="delimiter">'</span></span>)->find(<span class="local-variable">$this</span>->getProfileOptionId());</span>
<span class="line insert"><span class="insert">+</span></span>
<span class="line insert"><span class="insert">+</span> <span class="keyword">return</span> (<span class="predefined-type">string</span>)<span class="local-variable">$option</span>->getValue();</span>
}
}
<span class="change"><span class="change">@@</span> -68,17 +75,27 <span class="change">@@</span></span> <span class="keyword">class</span> <span class="class">MemberProfile</span> <span class="keyword">extends</span> <span class="constant">BaseMemberProfile</span> <span class="keyword">implements</span> opAccessControlRecordIn
<span class="keyword">return</span> <span class="local-variable">$this</span>->_get(<span class="string"><span class="delimiter">'</span><span class="content">value</span><span class="delimiter">'</span></span>);
}
<span class="line delete"><span class="delete">-</span> <span class="keyword">elseif</span> (<span class="string"><span class="delimiter">'</span><span class="content">date</span><span class="delimiter">'</span></span> !== <span class="local-variable">$this</span>->getFormType()<span class="eyecatcher"> && <span class="local-variable">$this</span>->getProfileOptionId()</span>)</span>
<span class="line insert"><span class="insert">+</span> <span class="keyword">elseif</span> (<span class="string"><span class="delimiter">'</span><span class="content">date</span><span class="delimiter">'</span></span> !== <span class="local-variable">$this</span>->getFormType())</span>
{
<span class="line delete"><span class="delete">-</span> <span class="keyword">return</span> <span class="local-variable">$this</span>->getProfileOptionId();</span>
<span class="line insert"><span class="insert">+</span> <span class="keyword">if</span> (<span class="local-variable">$this</span>-><span class="constant">Profile</span>->isMultipleSelect())</span>
<span class="line insert"><span class="insert">+</span> {</span>
<span class="line insert"><span class="insert">+</span> <span class="local-variable">$children</span> = <span class="local-variable">$this</span>->getChildrenValues();</span>
<span class="line insert"><span class="insert">+</span> <span class="keyword">if</span> (<span class="local-variable">$children</span>)</span>
<span class="line insert"><span class="insert">+</span> {</span>
<span class="line insert"><span class="insert">+</span> <span class="keyword">return</span> <span class="local-variable">$children</span>;</span>
<span class="line insert"><span class="insert">+</span> }</span>
<span class="line insert"><span class="insert">+</span> }</span>
<span class="line insert"><span class="insert">+</span> <span class="keyword">elseif</span> (<span class="local-variable">$this</span>-><span class="constant">Profile</span>->isSingleSelect() && <span class="local-variable">$this</span>->getProfileOptionId())</span>
<span class="line insert"><span class="insert">+</span> {</span>
<span class="line insert"><span class="insert">+</span> <span class="keyword">return</span> <span class="local-variable">$this</span>->getProfileOptionId();</span>
<span class="line insert"><span class="insert">+</span> }</span>
}
<span class="line delete"><span class="delete">-</span></span>
<span class="line delete"><span class="delete">-</span> <span class="local-variable">$children</span> = <span class="local-variable">$this</span>->getChildrenValues();</span>
<span class="line delete"><span class="delete">-</span> <span class="keyword">if</span> (<span class="local-variable">$children</span>)</span>
<span class="line insert"><span class="insert">+</span> <span class="keyword">else</span></span>
{
<span class="line delete"><span class="delete">-</span> <span class="keyword">if</span> (<span class="string"><span class="delimiter">'</span><span class="content">date</span><span class="delimiter">'</span></span> === <span class="local-variable">$this</span>->getFormType())</span>
<span class="line insert"><span class="insert">+</span> <span class="local-variable">$children</span> = <span class="local-variable">$this</span>->getChildrenValues();</span>
<span class="line insert"><span class="insert">+</span> <span class="keyword">if</span> (<span class="local-variable">$children</span>)</span>
{
<span class="line delete"><span class="delete">-</span> <span class="keyword">if</span> (<span class="eyecatcher"><span class="predefined">count</span>(<span class="local-variable">$children</span>) == <span class="integer">3</span></span> && <span class="local-variable">$children</span>[<span class="integer">0</span>] && <span class="local-variable">$children</span>[<span class="integer">1</span>] && <span class="local-variable">$children</span>[<span class="integer">2</span>])</span>
<span class="line insert"><span class="insert">+</span> <span class="keyword">if</span> (<span class="eyecatcher"><span class="integer">3</span> =< <span class="predefined">count</span>(<span class="local-variable">$children</span>)</span> && <span class="local-variable">$children</span>[<span class="integer">0</span>] && <span class="local-variable">$children</span>[<span class="integer">1</span>] && <span class="local-variable">$children</span>[<span class="integer">2</span>])</span>
{
<span class="local-variable">$obj</span> = <span class="keyword">new</span> <span class="constant">DateTime</span>();
<span class="local-variable">$obj</span>->setDate(<span class="local-variable">$children</span>[<span class="integer">0</span>], <span class="local-variable">$children</span>[<span class="integer">1</span>], <span class="local-variable">$children</span>[<span class="integer">2</span>]);
<span class="change"><span class="change">@@</span> -86,7 +103,6 <span class="change">@@</span></span> <span class="keyword">class</span> <span class="class">MemberProfile</span> <span class="keyword">extends</span> <span class="constant">BaseMemberProfile</span> <span class="keyword">implements</span> opAccessControlRecordIn
}
<span class="keyword">return</span> <span class="predefined-constant">null</span>;
}
<span class="line delete"><span class="delete">-</span> <span class="keyword">return</span> <span class="local-variable">$children</span>;</span>
}
<span class="keyword">return</span> <span class="predefined-constant">parent</span>::rawGet(<span class="string"><span class="delimiter">'</span><span class="content">value</span><span class="delimiter">'</span></span>);
</span></code></pre>
<a name="問題点"></a>
<h3 >問題点<a href="#問題点" class="wiki-anchor">¶</a></h3>
<p>この修正案の場合には日付がどのように記録されているかを考慮していなかった.<br />実際にDBを確認してみると,日付の値は年月日それぞれを子ノードの列valueに保存されていることを確認した.<br />しかし,年月日が保存されるかどうかは子ノードが存在しないまたは子ノードの数が3つ以上であるときのみ正しく記録されることを確認した.<br />つまり,複数選択によってすでに値がDBに記録されている場合,フォームタイプが日付の場合に正しく記録できない状態であると言える.<br />そのため,表示部分だけでなく同時に記録部分も修正する必要がある.</p>
OpenPNE 3 - Bug(バグ) #2478: プロフィール項目で「単一選択」の状態で保存したあとに「複数選択」の状態で保存を行おうとしても保存されていないように見える
http://redmine.openpne.jp/issues/2478?journal_id=11747
2011-10-21T07:35:38Z
Yuya Watanabe
watanabe@openpne.jp
<ul></ul><a name="修正方針"></a>
<h3 >修正方針<a href="#修正方針" class="wiki-anchor">¶</a></h3>
<p>DB内にはテキスト,単一選択,複数選択,日付の4つのフォームタイプの値を共存させつつ,取得時にはそのフォームタイプに従った値を返すように修正します.</p>
<p>現在の状態だと取得時にはDB内の値が存在するかどうかで返す値を決定しているので,複数のフォームタイプの値がDB内に記録されていると正しい値を返さないという問題を解決するためにnote-8のような修正を行います.</p>
<p>また,note-8の修正だけでは4つのフォームタイプの値を共存させるという条件を満たしていないため,正しく値を記録できるような実装を行います.</p>
OpenPNE 3 - Bug(バグ) #2478: プロフィール項目で「単一選択」の状態で保存したあとに「複数選択」の状態で保存を行おうとしても保存されていないように見える
http://redmine.openpne.jp/issues/2478?journal_id=11980
2011-10-31T09:50:56Z
wa ta
watanabe4dgt@gmail.com
<ul><li><strong>ステータス</strong> を <i>Accepted(着手)</i> から <i>Pending Review(レビュー待ち)</i> に変更</li><li><strong>進捗率</strong> を <i>0</i> から <i>50</i> に変更</li></ul><p>更新履歴 <a class="changeset" title="(fixes #2478) fixed to change the flow for saving and displaying MemberProfile" href="http://redmine.openpne.jp/projects/op3/repository/revisions/f84facbf5ea0f7433881b5ccfd6735763ecf61bc">f84facbf5ea0f7433881b5ccfd6735763ecf61bc</a> で適用されました。</p>
OpenPNE 3 - Bug(バグ) #2478: プロフィール項目で「単一選択」の状態で保存したあとに「複数選択」の状態で保存を行おうとしても保存されていないように見える
http://redmine.openpne.jp/issues/2478?journal_id=12085
2011-11-08T13:02:01Z
Minoru Takai
main.coeurl@gmail.com
<ul><li><strong>ステータス</strong> を <i>Pending Review(レビュー待ち)</i> から <i>Rejected(差し戻し)</i> に変更</li></ul><p>詳細まで追っていないので不具合が生じているというだけの指摘になりますが、次の問題が生じています。</p>
<ol>
<li>管理画面からプロフィール項目に「日付」のものを追加</li>
<li>メンバー側でプロフィール編集を開き、(特に値を変更せずに)保存する</li>
<li>次の Fatal Error が生じる<br /><pre>
Fatal error: Call to a member function setValue() on a non-object
in /path/to/OpenPNE/lib/form/doctrine/MemberProfileForm.class.php on line 99
</pre><pre>
lib/form/doctrine/MemberProfileForm.class.php
87- $children = $memberProfile->getNode()->getChildren();
88- if ('date' === $profile->getFormType())
89- {
90- foreach ($children as $child)
91- {
92- $child->setValue(null);
93- $child->save();
94- }
95- $_values = array_map('intval', explode('-', $value['value']));
96- $options = $profile->getProfileOption();
97- foreach ($_values as $i => $value)
98- {
99- $children[$i]->setValue($value);
100- $children[$i]->save();
101- }
102- }
103- else
</pre></li>
</ol>
OpenPNE 3 - Bug(バグ) #2478: プロフィール項目で「単一選択」の状態で保存したあとに「複数選択」の状態で保存を行おうとしても保存されていないように見える
http://redmine.openpne.jp/issues/2478?journal_id=13659
2012-03-22T09:10:22Z
Shouta Kashiwagi
kashiwagi@openpne.jp
<ul><li><strong>対象バージョン</strong> を <i>OpenPNE 3.7.0</i> から <i>252</i> に変更</li></ul>
OpenPNE 3 - Bug(バグ) #2478: プロフィール項目で「単一選択」の状態で保存したあとに「複数選択」の状態で保存を行おうとしても保存されていないように見える
http://redmine.openpne.jp/issues/2478?journal_id=14315
2012-04-09T06:04:12Z
Shouta Kashiwagi
kashiwagi@openpne.jp
<ul><li><strong>対象バージョン</strong> を <i>252</i> から <i>OpenPNE 3.8.x</i> に変更</li></ul>
OpenPNE 3 - Bug(バグ) #2478: プロフィール項目で「単一選択」の状態で保存したあとに「複数選択」の状態で保存を行おうとしても保存されていないように見える
http://redmine.openpne.jp/issues/2478?journal_id=15857
2012-11-07T09:52:04Z
Yuya Watanabe
watanabe@openpne.jp
<ul><li><strong>対象バージョン</strong> を <i>OpenPNE 3.8.x</i> から <i>OpenPNE 3.9.0-old</i> に変更</li><li><strong>3.6 で発生するか</strong> を <i>Unknown (未調査)</i> にセット</li><li><strong>3.8 で発生するか</strong> を <i>Unknown (未調査)</i> にセット</li></ul>
OpenPNE 3 - Bug(バグ) #2478: プロフィール項目で「単一選択」の状態で保存したあとに「複数選択」の状態で保存を行おうとしても保存されていないように見える
http://redmine.openpne.jp/issues/2478?journal_id=22288
2017-04-03T08:59:23Z
isao sano
sano@tejimaya.com
<ul></ul><p>対象バージョン変更のため、修正内容の確認を行います。</p>
OpenPNE 3 - Bug(バグ) #2478: プロフィール項目で「単一選択」の状態で保存したあとに「複数選択」の状態で保存を行おうとしても保存されていないように見える
http://redmine.openpne.jp/issues/2478?journal_id=22311
2017-04-03T09:59:15Z
isao sano
sano@tejimaya.com
<ul><li><strong>対象バージョン</strong> を <i>OpenPNE 3.9.0-old</i> から <i>OpenPNE 3.9.0</i> に変更</li></ul>
OpenPNE 3 - Bug(バグ) #2478: プロフィール項目で「単一選択」の状態で保存したあとに「複数選択」の状態で保存を行おうとしても保存されていないように見える
http://redmine.openpne.jp/issues/2478?journal_id=22340
2017-04-06T07:16:48Z
isao sano
sano@tejimaya.com
<ul></ul><p>再現を確認しました(2017/04/06)</p>
OpenPNE 3 - Bug(バグ) #2478: プロフィール項目で「単一選択」の状態で保存したあとに「複数選択」の状態で保存を行おうとしても保存されていないように見える
http://redmine.openpne.jp/issues/2478?journal_id=22586
2017-06-13T06:47:33Z
Shinichi Urabe
urabe+op3@nuts-choco.com
<ul></ul><p>最初に登録したフォームタイプを編集で変更できない仕様としてもいいように思いますが、どうでしょうか。</p>
<p>→ フォームタイプが違うプロフィールに変更したい場合は、削除して追加する仕様とする</p>
OpenPNE 3 - Bug(バグ) #2478: プロフィール項目で「単一選択」の状態で保存したあとに「複数選択」の状態で保存を行おうとしても保存されていないように見える
http://redmine.openpne.jp/issues/2478?journal_id=24248
2020-01-29T06:29:31Z
kaoru n
<ul><li><strong>対象バージョン</strong> を <i>OpenPNE 3.9.0</i> から <i>OpenPNE 3.10.x</i> に変更</li></ul>
OpenPNE 3 - Bug(バグ) #2478: プロフィール項目で「単一選択」の状態で保存したあとに「複数選択」の状態で保存を行おうとしても保存されていないように見える
http://redmine.openpne.jp/issues/2478?journal_id=25380
2020-08-11T09:24:18Z
kaoru n
<ul><li><strong>対象バージョン</strong> を <i>OpenPNE 3.10.x</i> から <i>OpenPNE 3.11.x</i> に変更</li></ul>