Deployed 9f06c72 to 5.4 with MkDocs 1.1.2 and mike 1.0.0
[GitHub/WoltLab/woltlab.github.io.git] / 5.4 / tutorial / series / part_5 / index.html
index 1843b6382e22673e44a82ddd7372fb2c0ced97ca..ed82da69e3ea2173499bdac2876b411c66046949 100644 (file)
     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">
@@ -2111,7 +2125,10 @@ To make use of those APIs, we need content generated by users in the frontend.</
 <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
@@ -2121,14 +2138,17 @@ To make use of those APIs, we need content generated by users in the frontend.</
 │   │           └── 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
@@ -3738,12 +3758,159 @@ An alternative to reloading to the page would be dynamically inserting the new p
 <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">&lt;?</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 &lt;http://opensource.org/licenses/lgpl-license.php&gt;</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">-&gt;</span><span class="na">objectList</span><span class="o">-&gt;</span><span class="na">sqlOrderBy</span> <span class="o">=</span> <span class="s1">&#39;person.personID&#39;</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">-&gt;</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">&quot;UPDATE  wcf&quot;</span> <span class="o">.</span> <span class="nx">WCF_N</span> <span class="o">.</span> <span class="s2">&quot;_person person</span>
+<span class="s2">                SET     informationCount = (</span>
+<span class="s2">                            SELECT  COUNT(*)</span>
+<span class="s2">                            FROM    wcf&quot;</span> <span class="o">.</span> <span class="nx">WCF_N</span> <span class="o">.</span> <span class="s2">&quot;_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 = ?&quot;</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">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</span><span class="na">execute</span><span class="p">([</span><span class="nv">$person</span><span class="o">-&gt;</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">-&gt;</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>
@@ -3786,9 +3953,18 @@ After editing a piece of information, we do not reload the page but dynamically
 <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>
@@ -3831,9 +4007,18 @@ After editing a piece of information, we do not reload the page but dynamically
 <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>
@@ -3876,8 +4061,17 @@ After editing a piece of information, we do not reload the page but dynamically
 <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>
@@ -3920,8 +4114,8 @@ After editing a piece of information, we do not reload the page but dynamically
 <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">
@@ -3996,7 +4190,7 @@ After editing a piece of information, we do not reload the page but dynamically
 <div class="md-source-date">
   <small>
     
-      Last update: 2021-04-23
+      Last update: 2021-05-03
     
   </small>
 </div>