Creating and Editing Person Information
</a>
+</li>
+
+ <li class="md-nav__item">
+ <a href="#rebuild-data-worker" class="md-nav__link">
+ Rebuild Data Worker
+ </a>
+
</li>
<li class="md-nav__item">
Creating and Editing Person Information
</a>
+</li>
+
+ <li class="md-nav__item">
+ <a href="#rebuild-data-worker" class="md-nav__link">
+ Rebuild Data Worker
+ </a>
+
</li>
<li class="md-nav__item">
<span class="normal">28</span>
<span class="normal">29</span>
<span class="normal">30</span>
-<span class="normal">31</span></pre></div></td><td class="code"><div class="highlight"><pre><span></span><code>├── files
+<span class="normal">31</span>
+<span class="normal">32</span>
+<span class="normal">33</span>
+<span class="normal">34</span></pre></div></td><td class="code"><div class="highlight"><pre><span></span><code>├── files
│ ├── acp
│ │ └── database
│ │ └── install_com.woltlab.wcf.people.php
│ │ └── Controller
│ │ └── Person.js
│ └── lib
-│ └── data
-│ └── person
-│ ├── Person.class.php
-│ └── information
-│ ├── PersonInformation.class.php
-│ ├── PersonInformationAction.class.php
-│ ├── PersonInformationEditor.class.php
-│ └── PersonInformationList.class.php
+│ ├── data
+│ │ └── person
+│ │ ├── Person.class.php
+│ │ └── information
+│ │ ├── PersonInformation.class.php
+│ │ ├── PersonInformationAction.class.php
+│ │ ├── PersonInformationEditor.class.php
+│ │ └── PersonInformationList.class.php
+│ └── system
+│ └── worker
+│ └── PersonRebuildDataWorker.class.php
├── language
│ ├── de.xml
│ └── en.xml
<p>The process for getting and submitting the dialog to edit existing pieces of information is similar to the process for adding new pieces of information.
Instead of the id of the person, however, we now pass the id of the edited piece of information and in <code>submitEditDialog()</code>, we update the edited information instead of creating a new one like in <code>submitAddDialog()</code>.
After editing a piece of information, we do not reload the page but dynamically update the text of the information in the TypeScript code so that we return the updated rendered information text and id of the edited pieced of information in <code>submitAddDialog()</code>.</p>
+<h2 id="rebuild-data-worker">Rebuild Data Worker<a class="headerlink" href="#rebuild-data-worker" title="Permanent link">#</a></h2>
+<p>To ensure the integrity of the person data, <code>PersonRebuildDataWorker</code> updates the <code>informationCount</code> counter:</p>
+<div class="titledCodeBox">
+ <div class="codeBoxTitle">
+ <code>files/lib/system/worker/PersonRebuildDataWorker.class.php</code>
+ <a class="codeBoxTitleGitHubLink" href="https://github.com/WoltLab/docs.woltlab.com/tree/5.4/snippets/tutorial/tutorial-series/part-5/files/lib/system/worker/PersonRebuildDataWorker.class.php" title="View on GitHub"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1M8 13h8v-2H8v2m9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1 0 1.71-1.39 3.1-3.1 3.1h-4V17h4a5 5 0 0 0 5-5 5 5 0 0 0-5-5z"/></svg></span></a>
+ </div>
+ <table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"> 1</span>
+<span class="normal"> 2</span>
+<span class="normal"> 3</span>
+<span class="normal"> 4</span>
+<span class="normal"> 5</span>
+<span class="normal"> 6</span>
+<span class="normal"> 7</span>
+<span class="normal"> 8</span>
+<span class="normal"> 9</span>
+<span class="normal">10</span>
+<span class="normal">11</span>
+<span class="normal">12</span>
+<span class="normal">13</span>
+<span class="normal">14</span>
+<span class="normal">15</span>
+<span class="normal">16</span>
+<span class="normal">17</span>
+<span class="normal">18</span>
+<span class="normal">19</span>
+<span class="normal">20</span>
+<span class="normal">21</span>
+<span class="normal">22</span>
+<span class="normal">23</span>
+<span class="normal">24</span>
+<span class="normal">25</span>
+<span class="normal">26</span>
+<span class="normal">27</span>
+<span class="normal">28</span>
+<span class="normal">29</span>
+<span class="normal">30</span>
+<span class="normal">31</span>
+<span class="normal">32</span>
+<span class="normal">33</span>
+<span class="normal">34</span>
+<span class="normal">35</span>
+<span class="normal">36</span>
+<span class="normal">37</span>
+<span class="normal">38</span>
+<span class="normal">39</span>
+<span class="normal">40</span>
+<span class="normal">41</span>
+<span class="normal">42</span>
+<span class="normal">43</span>
+<span class="normal">44</span>
+<span class="normal">45</span>
+<span class="normal">46</span>
+<span class="normal">47</span>
+<span class="normal">48</span>
+<span class="normal">49</span>
+<span class="normal">50</span>
+<span class="normal">51</span>
+<span class="normal">52</span>
+<span class="normal">53</span>
+<span class="normal">54</span>
+<span class="normal">55</span>
+<span class="normal">56</span>
+<span class="normal">57</span>
+<span class="normal">58</span>
+<span class="normal">59</span>
+<span class="normal">60</span>
+<span class="normal">61</span>
+<span class="normal">62</span>
+<span class="normal">63</span>
+<span class="normal">64</span>
+<span class="normal">65</span>
+<span class="normal">66</span></pre></div></td><td class="code"><div class="highlight"><pre><span></span><code><span class="o"><?</span><span class="nx">php</span>
+
+<span class="k">namespace</span> <span class="nx">wcf\system\worker</span><span class="p">;</span>
+
+<span class="k">use</span> <span class="nx">wcf\data\person\PersonList</span><span class="p">;</span>
+<span class="k">use</span> <span class="nx">wcf\system\WCF</span><span class="p">;</span>
+
+<span class="sd">/**</span>
+<span class="sd"> * Worker implementation for updating people.</span>
+<span class="sd"> *</span>
+<span class="sd"> * @author Matthias Schmidt</span>
+<span class="sd"> * @copyright 2001-2021 WoltLab GmbH</span>
+<span class="sd"> * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php></span>
+<span class="sd"> * @package WoltLabSuite\Core\System\Worker</span>
+<span class="sd"> *</span>
+<span class="sd"> * @method PersonList getObjectList()</span>
+<span class="sd"> */</span>
+<span class="k">class</span> <span class="nc">PersonRebuildDataWorker</span> <span class="k">extends</span> <span class="nx">AbstractRebuildDataWorker</span>
+<span class="p">{</span>
+ <span class="sd">/**</span>
+<span class="sd"> * @inheritDoc</span>
+<span class="sd"> */</span>
+ <span class="k">protected</span> <span class="nv">$limit</span> <span class="o">=</span> <span class="mi">500</span><span class="p">;</span>
+
+ <span class="sd">/**</span>
+<span class="sd"> * @inheritDoc</span>
+<span class="sd"> */</span>
+ <span class="k">protected</span> <span class="nv">$objectListClassName</span> <span class="o">=</span> <span class="nx">PersonList</span><span class="o">::</span><span class="na">class</span><span class="p">;</span>
+
+ <span class="sd">/**</span>
+<span class="sd"> * @inheritDoc</span>
+<span class="sd"> */</span>
+ <span class="k">protected</span> <span class="k">function</span> <span class="nf">initObjectList</span><span class="p">()</span>
+ <span class="p">{</span>
+ <span class="k">parent</span><span class="o">::</span><span class="na">initObjectList</span><span class="p">();</span>
+
+ <span class="nv">$this</span><span class="o">-></span><span class="na">objectList</span><span class="o">-></span><span class="na">sqlOrderBy</span> <span class="o">=</span> <span class="s1">'person.personID'</span><span class="p">;</span>
+ <span class="p">}</span>
+
+ <span class="sd">/**</span>
+<span class="sd"> * @inheritDoc</span>
+<span class="sd"> */</span>
+ <span class="k">public</span> <span class="k">function</span> <span class="nf">execute</span><span class="p">()</span>
+ <span class="p">{</span>
+ <span class="k">parent</span><span class="o">::</span><span class="na">execute</span><span class="p">();</span>
+
+ <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">\count</span><span class="p">(</span><span class="nv">$this</span><span class="o">-></span><span class="na">objectList</span><span class="p">))</span> <span class="p">{</span>
+ <span class="k">return</span><span class="p">;</span>
+ <span class="p">}</span>
+
+ <span class="nv">$sql</span> <span class="o">=</span> <span class="s2">"UPDATE wcf"</span> <span class="o">.</span> <span class="nx">WCF_N</span> <span class="o">.</span> <span class="s2">"_person person</span>
+<span class="s2"> SET informationCount = (</span>
+<span class="s2"> SELECT COUNT(*)</span>
+<span class="s2"> FROM wcf"</span> <span class="o">.</span> <span class="nx">WCF_N</span> <span class="o">.</span> <span class="s2">"_person_information person_information</span>
+<span class="s2"> WHERE person_information.personID = person.personID</span>
+<span class="s2"> )</span>
+<span class="s2"> WHERE person.personID = ?"</span><span class="p">;</span>
+ <span class="nv">$statement</span> <span class="o">=</span> <span class="nx">WCF</span><span class="o">::</span><span class="na">getDB</span><span class="p">()</span><span class="o">-></span><span class="na">prepareStatement</span><span class="p">(</span><span class="nv">$sql</span><span class="p">);</span>
+
+ <span class="nx">WCF</span><span class="o">::</span><span class="na">getDB</span><span class="p">()</span><span class="o">-></span><span class="na">beginTransaction</span><span class="p">();</span>
+ <span class="k">foreach</span> <span class="p">(</span><span class="nv">$this</span><span class="o">-></span><span class="na">getObjectList</span><span class="p">()</span> <span class="k">as</span> <span class="nv">$person</span><span class="p">)</span> <span class="p">{</span>
+ <span class="nv">$statement</span><span class="o">-></span><span class="na">execute</span><span class="p">([</span><span class="nv">$person</span><span class="o">-></span><span class="na">personID</span><span class="p">]);</span>
+ <span class="p">}</span>
+ <span class="nx">WCF</span><span class="o">::</span><span class="na">getDB</span><span class="p">()</span><span class="o">-></span><span class="na">commitTransaction</span><span class="p">();</span>
+ <span class="p">}</span>
+<span class="p">}</span>
+</code></pre></div>
+</td></tr></table>
+</div>
+
<h2 id="username-and-ip-address-event-listeners">Username and IP Address Event Listeners<a class="headerlink" href="#username-and-ip-address-event-listeners" title="Permanent link">#</a></h2>
<p>As we store the name of the user who create a new piece of information and store their IP address, we have to add event listeners to properly handle the following scenarios:</p>
<ol>
-<li>
-<p>If the user is renamed, the value of <code>username</code> stored with the person information has to be updated, which can be achieved by a simple event listener that only has to specify the name of relevant database table if <code>AbstractUserActionRenameListener</code> is extended:</p>
-<p><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"> 1</span>
+<li>If the user is renamed, the value of <code>username</code> stored with the person information has to be updated, which can be achieved by a simple event listener that only has to specify the name of relevant database table if <code>AbstractUserActionRenameListener</code> is extended:</li>
+</ol>
+<div class="titledCodeBox">
+ <div class="codeBoxTitle">
+ <code>files/lib/system/event/listener/PersonUserActionRenameListener.class.php</code>
+ <a class="codeBoxTitleGitHubLink" href="https://github.com/WoltLab/docs.woltlab.com/tree/5.4/snippets/tutorial/tutorial-series/part-5/files/lib/system/event/listener/PersonUserActionRenameListener.class.php" title="View on GitHub"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1M8 13h8v-2H8v2m9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1 0 1.71-1.39 3.1-3.1 3.1h-4V17h4a5 5 0 0 0 5-5 5 5 0 0 0-5-5z"/></svg></span></a>
+ </div>
+ <table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"> 1</span>
<span class="normal"> 2</span>
<span class="normal"> 3</span>
<span class="normal"> 4</span>
<span class="p">}</span>
</code></pre></div>
</td></tr></table>
-2. If users are merged, all pieces of information need to be assigned to the target user of the merging.
- Again, we only have to specify the name of relevant database table if <code>AbstractUserMergeListener</code> is extended:</p>
-<p><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"> 1</span>
+</div>
+
+<ol>
+<li>If users are merged, all pieces of information need to be assigned to the target user of the merging.
+ Again, we only have to specify the name of relevant database table if <code>AbstractUserMergeListener</code> is extended:</li>
+</ol>
+<div class="titledCodeBox">
+ <div class="codeBoxTitle">
+ <code>files/lib/system/event/listener/PersonUserMergeListener.class.php</code>
+ <a class="codeBoxTitleGitHubLink" href="https://github.com/WoltLab/docs.woltlab.com/tree/5.4/snippets/tutorial/tutorial-series/part-5/files/lib/system/event/listener/PersonUserMergeListener.class.php" title="View on GitHub"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1M8 13h8v-2H8v2m9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1 0 1.71-1.39 3.1-3.1 3.1h-4V17h4a5 5 0 0 0 5-5 5 5 0 0 0-5-5z"/></svg></span></a>
+ </div>
+ <table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"> 1</span>
<span class="normal"> 2</span>
<span class="normal"> 3</span>
<span class="normal"> 4</span>
<span class="p">}</span>
</code></pre></div>
</td></tr></table>
-3. If the option to prune stored ip addresses after a certain period of time is enabled, we also have to prune them in the person information database table.
- Here we also only have to specify the name of the relevant database table and provide the mapping from the <code>ipAddress</code> column to the <code>time</code> column:</p>
-<p><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"> 1</span>
+</div>
+
+<ol>
+<li>If the option to prune stored ip addresses after a certain period of time is enabled, we also have to prune them in the person information database table.
+ Here we also only have to specify the name of the relevant database table and provide the mapping from the <code>ipAddress</code> column to the <code>time</code> column:</li>
+</ol>
+<div class="titledCodeBox">
+ <div class="codeBoxTitle">
+ <code>files/lib/system/event/listener/PersonPruneIpAddressesCronjobListener.class.php</code>
+ <a class="codeBoxTitleGitHubLink" href="https://github.com/WoltLab/docs.woltlab.com/tree/5.4/snippets/tutorial/tutorial-series/part-5/files/lib/system/event/listener/PersonPruneIpAddressesCronjobListener.class.php" title="View on GitHub"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1M8 13h8v-2H8v2m9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1 0 1.71-1.39 3.1-3.1 3.1h-4V17h4a5 5 0 0 0 5-5 5 5 0 0 0-5-5z"/></svg></span></a>
+ </div>
+ <table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"> 1</span>
<span class="normal"> 2</span>
<span class="normal"> 3</span>
<span class="normal"> 4</span>
<span class="p">}</span>
</code></pre></div>
</td></tr></table>
-4. The ip addresses in the person information database table also have to be considered for the user data export which can also be done with minimal effort by providing the name of the relevant database table: </p>
-<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"> 1</span>
+</div>
+
+<ol>
+<li>The ip addresses in the person information database table also have to be considered for the user data export which can also be done with minimal effort by providing the name of the relevant database table:</li>
+</ol>
+<div class="titledCodeBox">
+ <div class="codeBoxTitle">
+ <code>files/lib/system/event/listener/PersonUserExportGdprListener.class.php</code>
+ <a class="codeBoxTitleGitHubLink" href="https://github.com/WoltLab/docs.woltlab.com/tree/5.4/snippets/tutorial/tutorial-series/part-5/files/lib/system/event/listener/PersonUserExportGdprListener.class.php" title="View on GitHub"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1M8 13h8v-2H8v2m9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1 0 1.71-1.39 3.1-3.1 3.1h-4V17h4a5 5 0 0 0 5-5 5 5 0 0 0-5-5z"/></svg></span></a>
+ </div>
+ <table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"> 1</span>
<span class="normal"> 2</span>
<span class="normal"> 3</span>
<span class="normal"> 4</span>
<span class="p">}</span>
</code></pre></div>
</td></tr></table>
-</li>
-</ol>
+</div>
+
<p>Lastly, we present the updated <code>eventListener.xml</code> file with new entries for all of these event listeners:</p>
<div class="titledCodeBox">
<div class="codeBoxTitle">
<div class="md-source-date">
<small>
- Last update: 2021-04-23
+ Last update: 2021-05-03
</small>
</div>