4 <meta http-equiv=
"X-UA-Compatible" content=
"IE=edge">
5 <meta name=
"viewport" content=
"width=device-width, initial-scale=1">
6 <meta name=
"description" content=
"">
7 <meta name=
"keywords" content=
" ">
8 <title>Migrating from WSC
3.0 - PHP | WoltLab Suite
5.3 Documentation
</title>
10 <link rel=
"stylesheet" href=
"https://docs.woltlab.com/5.3/css/syntax.css">
11 <link rel=
"stylesheet" href=
"https://fonts.googleapis.com/css?family=Open+Sans:400,300,600">
12 <link rel=
"stylesheet" href=
"https://docs.woltlab.com/5.3/css/font-awesome.min.css">
13 <!--<link rel="stylesheet" type="text/css" href="css/bootstrap.min.css">-->
14 <link rel=
"stylesheet" href=
"https://docs.woltlab.com/5.3/css/modern-business.css">
15 <link rel=
"stylesheet" href=
"https://docs.woltlab.com/5.3/css/lavish-bootstrap.css">
16 <link rel=
"stylesheet" href=
"https://docs.woltlab.com/5.3/css/customstyles.css">
17 <link rel=
"stylesheet" href=
"https://docs.woltlab.com/5.3/css/theme-blue.css?v=3">
19 <script src=
"https://docs.woltlab.com/5.3/js/jquery.min.js"></script>
20 <script src=
"https://docs.woltlab.com/5.3/js/jquery.cookie.min.js"></script>
21 <script src=
"https://docs.woltlab.com/5.3/js/jquery.navgoco.min.js"></script>
22 <script src=
"https://docs.woltlab.com/5.3/js/bootstrap.min.js"></script>
23 <script src=
"https://docs.woltlab.com/5.3/js/anchor.min.js"></script>
24 <script src=
"https://docs.woltlab.com/5.3/js/toc.js"></script>
25 <script src=
"https://docs.woltlab.com/5.3/js/customscripts.js"></script>
27 <link rel=
"shortcut icon" href=
"https://docs.woltlab.com/5.3/images/favicon.ico">
29 <link rel=
"alternate" type=
"application/rss+xml" title=
"woltlab.github.io" href=
"https://docs.woltlab.com/5.3feed.xml">
32 $(document).ready(function() {
33 // Initialize navgoco with default options
34 $(
"#mysidebar").navgoco({
37 openClass: 'active', // open
38 save: false, // leave false or nav highlighting doesn't work right
50 $(
"#collapseAll").click(function(e) {
52 $(
"#mysidebar").navgoco('toggle', false);
55 $(
"#expandAll").click(function(e) {
57 $(
"#mysidebar").navgoco('toggle', true);
65 $('[
data-toggle=
"tooltip"]').tooltip()
73 <nav class=
"navbar navbar-inverse navbar-fixed-top">
74 <div class=
"container topnavlinks">
75 <div class=
"navbar-header">
76 <button type=
"button" class=
"navbar-toggle" data-toggle=
"collapse" data-target=
"#bs-example-navbar-collapse-1">
77 <span class=
"sr-only">Toggle navigation
</span>
78 <span class=
"icon-bar"></span>
79 <span class=
"icon-bar"></span>
80 <span class=
"icon-bar"></span>
82 <a class=
"fa fa-home fa-lg navbar-brand" href=
"index.html"> <span class=
"projectTitle"> WoltLab Suite
5.3 Documentation
</span></a>
84 <div class=
"collapse navbar-collapse" id=
"bs-example-navbar-collapse-1">
85 <ul class=
"nav navbar-nav navbar-right">
86 <!-- entries without drop-downs appear here -->
90 <li><a href=
"https://www.woltlab.com" target=
"_blank">woltlab.com
</a></li>
96 <li><a href=
"https://github.com/WoltLab/WCF/" target=
"_blank">Code on github.com
</a></li>
100 <!-- entries with drop-downs appear here -->
101 <!-- conditional logic to control which topnav appears for the audience defined in the configuration file.-->
104 <!--comment out this block if you want to hide search-->
107 <div id=
"search-demo-container">
108 <input type=
"text" id=
"search-input" placeholder=
"search...">
109 <ul id=
"results-container"></ul>
111 <script src=
"https://docs.woltlab.com/5.3/js/jekyll-search.js" type=
"text/javascript"></script>
112 <script type=
"text/javascript">
113 SimpleJekyllSearch.init({
114 searchInput: document.getElementById('search-input'),
115 resultsContainer: document.getElementById('results-container'),
116 dataSource: 'https://docs.woltlab.com/
5.3/search.json',
117 searchResultTemplate: '
<li><a href=
"{url}" title=
"Migrating from WSC 3.0 - PHP">{title}
</a></li>',
118 noResultsText: 'No results found.',
132 <div class=
"container">
133 <div class=
"col-lg-12"> </div>
136 <div class=
"col-md-3">
140 <ul id=
"mysidebar" class=
"nav">
141 <li class=
"sidebarTitle">WoltLab Suite
5.3</li>
146 <a href=
"#">Getting Started
</a>
152 <li data-identifier=
"index"><a href=
"index.html">Introduction
</a></li>
161 <li data-identifier=
"getting-started_quick-start"><a href=
"getting-started_quick-start.html">Quick Start
</a></li>
171 <a href=
"#">PHP API
</a>
177 <li data-identifier=
"php_pages"><a href=
"php_pages.html">Pages
</a></li>
186 <li data-identifier=
"php_database-objects"><a href=
"php_database-objects.html">Database Objects
</a></li>
195 <li data-identifier=
"php_database-access"><a href=
"php_database-access.html">Database Access
</a></li>
204 <li data-identifier=
"php_exceptions"><a href=
"php_exceptions.html">Exceptions
</a></li>
213 <li class=
"subfolders">
219 <li data-identifier=
"php_api_caches"><a href=
"php_api_caches.html">Caches
</a></li>
224 <li data-identifier=
"php_api_comments"><a href=
"php_api_comments.html">Comments
</a></li>
229 <li data-identifier=
"php_api_cronjobs"><a href=
"php_api_cronjobs.html">Cronjobs
</a></li>
234 <li data-identifier=
"php_api_events"><a href=
"php_api_events.html">Events
</a></li>
239 <li data-identifier=
"php_api_form_builder"><a href=
"php_api_form_builder.html">Form Builder
</a></li>
244 <li data-identifier=
"php_api_package_installation_plugins"><a href=
"php_api_package_installation_plugins.html">Package Installation Plugins
</a></li>
249 <li data-identifier=
"php_api_user_activity_points"><a href=
"php_api_user_activity_points.html">User Activity Points
</a></li>
254 <li data-identifier=
"php_api_user_notifications"><a href=
"php_api_user_notifications.html">User Notifications
</a></li>
259 <li data-identifier=
"php_api_sitemaps"><a href=
"php_api_sitemaps.html">Sitemaps
</a></li>
269 <li data-identifier=
"php_code-style"><a href=
"php_code-style.html">Code Style
</a></li>
278 <li data-identifier=
"php_apps"><a href=
"php_apps.html">Apps
</a></li>
287 <li data-identifier=
"php_gdpr"><a href=
"php_gdpr.html">GDPR
</a></li>
297 <a href=
"#">Languages, Templates & CSS
</a>
303 <li data-identifier=
"view_languages"><a href=
"view_languages.html">Languages
</a></li>
312 <li data-identifier=
"view_templates"><a href=
"view_templates.html">Templates
</a></li>
321 <li data-identifier=
"view_css"><a href=
"view_css.html">CSS
</a></li>
331 <a href=
"#">JavaScript API
</a>
337 <li data-identifier=
"javascript_general-usage"><a href=
"javascript_general-usage.html">General Usage
</a></li>
346 <li class=
"subfolders">
347 <a href=
"#">New API
</a>
352 <li data-identifier=
"javascript_new-api_writing-a-module"><a href=
"javascript_new-api_writing-a-module.html">Writing a module
</a></li>
357 <li data-identifier=
"javascript_new-api_data-structures"><a href=
"javascript_new-api_data-structures.html">Data Structures
</a></li>
362 <li data-identifier=
"javascript_new-api_core"><a href=
"javascript_new-api_core.html">Core Functions
</a></li>
367 <li data-identifier=
"javascript_new-api_dom"><a href=
"javascript_new-api_dom.html">DOM
</a></li>
372 <li data-identifier=
"javascript_new-api_events"><a href=
"javascript_new-api_events.html">Event Handling
</a></li>
377 <li data-identifier=
"javascript_new-api_ajax"><a href=
"javascript_new-api_ajax.html">Ajax
</a></li>
382 <li data-identifier=
"javascript_new-api_dialogs"><a href=
"javascript_new-api_dialogs.html">Dialogs
</a></li>
387 <li data-identifier=
"javascript_new-api_browser"><a href=
"javascript_new-api_browser.html">Browser and Screen Sizes
</a></li>
392 <li data-identifier=
"javascript_new-api_ui"><a href=
"javascript_new-api_ui.html">User Interface
</a></li>
402 <li data-identifier=
"javascript_legacy-api"><a href=
"javascript_legacy-api.html">Legacy API
</a></li>
411 <li data-identifier=
"javascript_helper-functions"><a href=
"javascript_helper-functions.html">Helper Functions
</a></li>
420 <li data-identifier=
"javascript_code-snippets"><a href=
"javascript_code-snippets.html">Code Snippets
</a></li>
430 <a href=
"#">Package Components
</a>
436 <li data-identifier=
"package_package-xml"><a href=
"package_package-xml.html">package.xml
</a></li>
445 <li data-identifier=
"package_pip"><a href=
"package_pip.html">PIPs
</a></li>
455 <a href=
"#">Migration
</a>
461 <li class=
"subfolders">
462 <a href=
"#">Migrating from WSC
5.2</a>
467 <li data-identifier=
"migration_wsc-52_php"><a href=
"migration_wsc-52_php.html">PHP API
</a></li>
472 <li data-identifier=
"migration_wsc-52_templates"><a href=
"migration_wsc-52_templates.html">Templates and Languages
</a></li>
477 <li data-identifier=
"migration_wsc-52_libraries"><a href=
"migration_wsc-52_libraries.html">Third Party Libraries
</a></li>
483 <li class=
"subfolders">
484 <a href=
"#">Migrating from WSC
3.1</a>
489 <li data-identifier=
"migration_wsc-31_php"><a href=
"migration_wsc-31_php.html">PHP API
</a></li>
495 <li class=
"subfolders">
496 <a href=
"#">Migrating from WSC
3.0</a>
501 <li class=
"active" data-identifier=
"migration_wsc-30_php"><a href=
"migration_wsc-30_php.html">PHP API
</a></li>
506 <li data-identifier=
"migration_wsc-30_javascript"><a href=
"migration_wsc-30_javascript.html">JavaScript API
</a></li>
511 <li data-identifier=
"migration_wsc-30_templates"><a href=
"migration_wsc-30_templates.html">Templates
</a></li>
516 <li data-identifier=
"migration_wsc-30_css"><a href=
"migration_wsc-30_css.html">CSS
</a></li>
521 <li data-identifier=
"migration_wsc-30_package"><a href=
"migration_wsc-30_package.html">Package Components
</a></li>
527 <li class=
"subfolders">
528 <a href=
"#">Migrating from WCF
2.1</a>
533 <li data-identifier=
"migration_wcf-21_php"><a href=
"migration_wcf-21_php.html">PHP API
</a></li>
538 <li data-identifier=
"migration_wcf-21_templates"><a href=
"migration_wcf-21_templates.html">Templates
</a></li>
543 <li data-identifier=
"migration_wcf-21_css"><a href=
"migration_wcf-21_css.html">CSS
</a></li>
548 <li data-identifier=
"migration_wcf-21_package"><a href=
"migration_wcf-21_package.html">Package Components
</a></li>
559 <a href=
"#">Tutorials
</a>
565 <li data-identifier=
"tutorial_tutorial-series"><a href=
"tutorial_tutorial-series.html">Tutorial Series
</a></li>
579 var sidebar = $('#mysidebar');
580 var item = sidebar.find('.active');
581 if (item.length ===
0) {
584 sidebar.find('li[
data-identifier=
"' + parent + '"]').addClass('active');
588 sidebar.find(
".active").parents('li').toggleClass(
"active");
594 <div class=
"col-md-9">
595 <div class=
"post-header">
596 <h1 class=
"post-title-main">Migrating from WSC
3.0 - PHP
</h1>
601 <div class=
"post-content">
607 <!-- this handles the automatic toc. use ## for subheads to auto-generate the on-page minitoc. if you use html tags, you must supply an ID for the heading element in order for it to appear in the minitoc. -->
609 $( document ).ready(function() {
610 // Handler for .ready() called.
612 $('#toc').toc({ minimumHeaders:
0, listType: 'ul', showSpeed:
0, headers: 'h2,h3,h4' });
614 /* this offset helps account for the space taken up by the floating toolbar. */
615 $('#toc').on('click', 'a', function() {
616 var target = $(this.getAttribute('href'))
617 , scroll_target = target.offset().top
619 $(window).scrollTop(scroll_target -
10);
630 <h2 id=
"approval-system-for-comments">Approval-System for Comments
</h2>
632 <p>Comments can now be set to require approval by a moderator before being published. This feature is disabled by default if you do not provide a permission in the manager class, enabling it requires a new permission that has to be provided in a special property of your manage implementation.
</p>
634 <div class=
"language-php highlighter-rouge"><div class=
"highlight"><pre class=
"highlight"><code><span class=
"cp"><?php
</span>
635 <span class=
"kd">class
</span> <span class=
"nc">ExampleCommentManager
</span> <span class=
"k">extends
</span> <span class=
"nx">AbstractCommentManager
</span> <span class=
"p">{
</span>
636 <span class=
"k">protected
</span> <span class=
"nv">$permissionAddWithoutModeration
</span> <span class=
"o">=
</span> <span class=
"s1">'foo.bar.example.canAddCommentWithoutModeration'
</span><span class=
"p">;
</span>
637 <span class=
"p">}
</span>
638 </code></pre></div></div>
640 <h2 id=
"raw-html-in-user-activity-events">Raw HTML in User Activity Events
</h2>
642 <p>User activity events were previously encapsulated inside
<code class=
"language-plaintext highlighter-rouge"><div
class=
"htmlContent">…
</div
></code>, with impacts on native elements such as lists. You can now disable the class usage by defining your event as raw HTML:
</p>
644 <div class=
"language-php highlighter-rouge"><div class=
"highlight"><pre class=
"highlight"><code><span class=
"cp"><?php
</span>
645 <span class=
"kd">class
</span> <span class=
"nc">ExampleUserActivityEvent
</span> <span class=
"p">{
</span>
646 <span class=
"c1">// enables raw HTML for output, defaults to `false`
</span>
647 <span class=
"k">protected
</span> <span class=
"nv">$isRawHtml
</span> <span class=
"o">=
</span> <span class=
"kc">true
</span><span class=
"p">;
</span>
648 <span class=
"p">}
</span>
649 </code></pre></div></div>
651 <h2 id=
"permission-to-view-likes-of-an-object">Permission to View Likes of an Object
</h2>
653 <p>Being able to view the like summary of an object was restricted to users that were able to like the object itself. This creates situations where the object type in general is likable, but the particular object cannot be liked by the current users, while also denying them to view the like summary (but it gets partly exposed through the footer note/summary!).
</p>
655 <p>Implement the interface
<code class=
"language-plaintext highlighter-rouge">\wcf\data\like\IRestrictedLikeObjectTypeProvider
</code> in your object provider to add support for this new permission check.
</p>
657 <div class=
"language-php highlighter-rouge"><div class=
"highlight"><pre class=
"highlight"><code><span class=
"cp"><?php
</span>
658 <span class=
"kd">class
</span> <span class=
"nc">LikeableExampleProvider
</span> <span class=
"k">extends
</span> <span class=
"nx">ExampleProvider
</span> <span class=
"k">implements
</span> <span class=
"nx">IRestrictedLikeObjectTypeProvider
</span><span class=
"p">,
</span> <span class=
"nx">IViewableLikeProvider
</span> <span class=
"p">{
</span>
659 <span class=
"k">public
</span> <span class=
"k">function
</span> <span class=
"nf">canViewLikes
</span><span class=
"p">(
</span><span class=
"nx">ILikeObject
</span> <span class=
"nv">$object
</span><span class=
"p">)
</span> <span class=
"p">{
</span>
660 <span class=
"c1">// perform your permission checks here
</span>
661 <span class=
"k">return
</span> <span class=
"kc">true
</span><span class=
"p">;
</span>
662 <span class=
"p">}
</span>
663 <span class=
"p">}
</span>
664 </code></pre></div></div>
666 <h2 id=
"developer-tools-sync-feature">Developer Tools: Sync Feature
</h2>
668 <p>The synchronization feature of the newly added developer tools works by invoking a package installation plugin (PIP) outside of a regular installation, while simulating the basic environment that is already exposed by the API.
</p>
670 <p>However, not all PIPs qualify for this kind of execution, especially because it could be invoked multiple times in a row by the user. This is solved by requiring a special marking for PIPs that have no side-effects (= idempotent) when invoked any amount of times with the same arguments.
</p>
672 <p>There’s another feature that allows all matching PIPs to be executed in a row using a single button click. In order to solve dependencies on other PIPs, any implementing PIP must also provide the method
<code class=
"language-plaintext highlighter-rouge">getSyncDependencies()
</code> that returns the dependent PIPs in an arbitrary order.
</p>
674 <div class=
"language-php highlighter-rouge"><div class=
"highlight"><pre class=
"highlight"><code><span class=
"cp"><?php
</span>
675 <span class=
"kd">class
</span> <span class=
"nc">ExamplePackageInstallationPlugin
</span> <span class=
"k">extends
</span> <span class=
"nx">AbstractXMLPackageInstallationPlugin
</span> <span class=
"k">implements
</span> <span class=
"nx">IIdempotentPackageInstallationPlugin
</span> <span class=
"p">{
</span>
676 <span class=
"k">public
</span> <span class=
"k">static
</span> <span class=
"k">function
</span> <span class=
"nf">getSyncDependencies
</span><span class=
"p">()
</span> <span class=
"p">{
</span>
677 <span class=
"c1">// provide a list of dependent PIPs in arbitrary order
</span>
678 <span class=
"k">return
</span> <span class=
"p">[];
</span>
679 <span class=
"p">}
</span>
680 <span class=
"p">}
</span>
681 </code></pre></div></div>
683 <h2 id=
"media-providers">Media Providers
</h2>
685 <p>Media providers were added through regular SQL queries in earlier versions, but this is neither convenient, nor did it offer a reliable method to update an existing provider. WoltLab Suite
3.1 adds a new
<code class=
"language-plaintext highlighter-rouge">mediaProvider
</code>-PIP that also offers a
<code class=
"language-plaintext highlighter-rouge">className
</code> parameter to off-load the result evaluation and HTML generation.
</p>
687 <h3 id=
"example-implementation">Example Implementation
</h3>
689 <h4 id=
"mediaproviderxml">mediaProvider.xml
</h4>
691 <div class=
"language-xml highlighter-rouge"><div class=
"highlight"><pre class=
"highlight"><code><span class=
"cp"><?xml
version=
"1.0" encoding=
"UTF-8"?
></span>
692 <span class=
"nt"><data
</span> <span class=
"na">xmlns=
</span><span class=
"s">"http://www.woltlab.com"</span> <span class=
"na">xmlns:xsi=
</span><span class=
"s">"http://www.w3.org/2001/XMLSchema-instance"</span> <span class=
"na">xsi:schemaLocation=
</span><span class=
"s">"http://www.woltlab.com http://www.woltlab.com/XSD/tornado/mediaProvider.xsd"</span><span class=
"nt">></span>
693 <span class=
"nt"><import
></span>
694 <span class=
"nt"><provider
</span> <span class=
"na">name=
</span><span class=
"s">"example"</span><span class=
"nt">></span>
695 <span class=
"nt"><title
></span>Example Provider
<span class=
"nt"></title
></span>
696 <span class=
"nt"><regex
></span><span class=
"cp"><![CDATA[https?://example.com/watch?v=(?P
<ID
>[a-zA-Z0-
9])]]
></span><span class=
"nt"></regex
></span>
697 <span class=
"nt"><className
></span><span class=
"cp"><![CDATA[wcf\system\bbcode\media\provider\ExampleBBCodeMediaProvider]]
></span><span class=
"nt"></className
></span>
698 <span class=
"nt"></provider
></span>
699 <span class=
"nt"></import
></span>
700 <span class=
"nt"></data
></span>
701 </code></pre></div></div>
703 <h4 id=
"php-callback">PHP Callback
</h4>
705 <p>The full match is provided for
<code class=
"language-plaintext highlighter-rouge">$url
</code>, while any capture groups from the regular expression are assigned to
<code class=
"language-plaintext highlighter-rouge">$matches
</code>.
</p>
707 <div class=
"language-php highlighter-rouge"><div class=
"highlight"><pre class=
"highlight"><code><span class=
"cp"><?php
</span>
708 <span class=
"kd">class
</span> <span class=
"nc">ExampleBBCodeMediaProvider
</span> <span class=
"k">implements
</span> <span class=
"nx">IBBCodeMediaProvider
</span> <span class=
"p">{
</span>
709 <span class=
"k">public
</span> <span class=
"k">function
</span> <span class=
"nf">parse
</span><span class=
"p">(
</span><span class=
"nv">$url
</span><span class=
"p">,
</span> <span class=
"k">array
</span> <span class=
"nv">$matches
</span> <span class=
"o">=
</span> <span class=
"p">[])
</span> <span class=
"p">{
</span>
710 <span class=
"k">return
</span> <span class=
"s2">"final HTML output"</span><span class=
"p">;
</span>
711 <span class=
"p">}
</span>
712 <span class=
"p">}
</span>
713 </code></pre></div></div>
715 <h2 id=
"re-evaluate-html-messages">Re-Evaluate HTML Messages
</h2>
717 <div class=
"bs-callout bs-callout-warning">You need to manually set the disallowed bbcodes in order to avoid unintentional bbcode evaluation. Please see
<a href=
"https://github.com/WoltLab/WCF/commit/7e058783da1378dda5393a9bb4df9cfe94e5b394">this commit
</a> for a reference implementation inside worker processes.
</div>
719 <p>The HtmlInputProcessor only supported two ways to handle an existing HTML message:
</p>
722 <li>Load the string through
<code class=
"language-plaintext highlighter-rouge">process()
</code> and run it through the validation and sanitation process, both of them are rather expensive operations and do not qualify for rebuild data workers.
</li>
723 <li>Detect embedded content using
<code class=
"language-plaintext highlighter-rouge">processEmbeddedContent()
</code> which bypasses most tasks that are carried out by
<code class=
"language-plaintext highlighter-rouge">process()
</code> which aren’t required, but does not allow a modification of the message.
</li>
726 <p>The newly added method
<code class=
"language-plaintext highlighter-rouge">reprocess($message, $objectType, $objectID)
</code> solves this short-coming by offering a full bbcode and text re-evaluation while bypassing any input filters, assuming that the input HTML was already filtered previously.
</p>
728 <h3 id=
"example-usage">Example Usage
</h3>
730 <div class=
"language-php highlighter-rouge"><div class=
"highlight"><pre class=
"highlight"><code><span class=
"cp"><?php
</span>
731 <span class=
"c1">// rebuild data workers tend to contain code similar to this:
</span>
732 <span class=
"k">foreach
</span> <span class=
"p">(
</span><span class=
"nv">$this
</span><span class=
"o">-
></span><span class=
"na">objectList
</span> <span class=
"k">as
</span> <span class=
"nv">$message
</span><span class=
"p">)
</span> <span class=
"p">{
</span>
733 <span class=
"c1">// ...
</span>
734 <span class=
"k">if
</span> <span class=
"p">(
</span><span class=
"o">!
</span><span class=
"nv">$message
</span><span class=
"o">-
></span><span class=
"na">enableHtml
</span><span class=
"p">)
</span> <span class=
"p">{
</span>
735 <span class=
"c1">// ...
</span>
736 <span class=
"p">}
</span>
737 <span class=
"k">else
</span> <span class=
"p">{
</span>
738 <span class=
"c1">// OLD:
</span>
739 <span class=
"nv">$this
</span><span class=
"o">-
></span><span class=
"na">getHtmlInputProcessor
</span><span class=
"p">()
</span><span class=
"o">-
></span><span class=
"na">processEmbeddedContent
</span><span class=
"p">(
</span><span class=
"nv">$message
</span><span class=
"o">-
></span><span class=
"na">message
</span><span class=
"p">,
</span> <span class=
"s1">'com.example.foo.message'
</span><span class=
"p">,
</span> <span class=
"nv">$message
</span><span class=
"o">-
></span><span class=
"na">messageID
</span><span class=
"p">);
</span>
741 <span class=
"c1">// REPLACE WITH:
</span>
742 <span class=
"nv">$this
</span><span class=
"o">-
></span><span class=
"na">getHtmlInputProcessor
</span><span class=
"p">()
</span><span class=
"o">-
></span><span class=
"na">reprocess
</span><span class=
"p">(
</span><span class=
"nv">$message
</span><span class=
"o">-
></span><span class=
"na">message
</span><span class=
"p">,
</span> <span class=
"s1">'com.example.foo.message'
</span><span class=
"p">,
</span> <span class=
"nv">$message
</span><span class=
"o">-
></span><span class=
"na">messageID
</span><span class=
"p">);
</span>
743 <span class=
"nv">$data
</span><span class=
"p">[
</span><span class=
"s1">'message'
</span><span class=
"p">]
</span> <span class=
"o">=
</span> <span class=
"nv">$this
</span><span class=
"o">-
></span><span class=
"na">getHtmlInputProcessor
</span><span class=
"p">()
</span><span class=
"o">-
></span><span class=
"na">getHtml
</span><span class=
"p">();
</span>
744 <span class=
"p">}
</span>
745 <span class=
"c1">// ...
</span>
746 <span class=
"p">}
</span>
747 </code></pre></div></div>
763 <div class=
"footerBox">
764 <div class=
"container">
765 <div class=
"footerBoxLeft">
767 <a target=
"_blank" href=
"https://github.com/woltlab/woltlab.github.io/blob/master/pages/migration/wsc-30/migration_wsc-30_php.md" class=
"btn btn-default githubEditButton no_icon" role=
"button"><i class=
"fa fa-github fa-lg"></i> Edit on GitHub
</a>
768 <p>Site last generated: Mar
5,
2021</p>
770 <div class=
"footerBoxRight">
771 <a class=
"no_icon" href=
"https://www.woltlab.com"><img src=
"https://docs.woltlab.com/5.3/images/woltlab-black.png" srcset=
"https://docs.woltlab.com/5.3/images/woltlab-black@2x.png 2x" height=
"40" width=
"204" alt=
""></a>
776 <div class=
"pageFooter">
777 <div class=
"container">
778 © 2001 ‐
2021 <a class=
"no_icon" href=
"https://www.woltlab.com">WoltLab GmbH
</a>. All rights reserved. |
<a class=
"no_icon" href=
"https://www.woltlab.com/legal-notice/">Legal Notice
</a> |
<a class=
"no_icon" href=
"https://www.woltlab.com/privacy-policy/">Privacy Policy
</a>