[pmwiki-users] PmWiki 2.2.107 released
Petko Yotov
5ko at 5ko.fr
Tue Feb 6 16:19:05 CST 2018
On 05/02/2018 11:36, Moni Kellermann wrote:
> Am 02.02.2018 um 18:51 schrieb Petko Yotov:
>> Hello. PmWiki version 2.2.107 was published today
>
> I am trying out this skin:
> http://www.pmwiki.org/wiki/Skins/Vanilla5
>
> With PmWiki 2.2.107 running on XAMPP/PHP 7.21, I now get the error
>
> Deprecated: Function create_function() is deprecated in
> C:\xampp\htdocs\pmwiki-2.2.107\pmwiki.php on line 481
>
> which refers to the section
>
> function PCCF($code, $template = 'default', $args = '$m') {
...
>
> and specifically the line
>
> $fn = create_function($args, $code);
>
> I understand that create_function is deprecated in PHP 7.2, and that
> the fault is with the skin, not with PmWiki, as the standard skins do
> not trigger this.
>
> Which means that a) we need to fix both pmwiki.php as well as the skin.
> I get the same error with the Twitter Bootstrap skin.
>
> Both those skins work with 2.2.107 when running XAMPP/PHP 5.6.33.
The line will not trigger a warning in PHP 7.2 if no recipe or skin
calls PCCF() directly or via other functions, notably Markup_e().
PmWiki doesn't call this function any more and there are about 159
recipes and 71 skins that are reported PHP 7.2 compatible - I've
reviewed most of these and rewrote some of those that needed updates.
The line in itself doesn't need fixing, and it works fine on older PHP
versions (and on PHP 7.2 as long as it is not called). An administrator
can even configure the server not to show "Deprecated" warnings if they
like, and the function will work fine.
I have rewritten the documentation about the PHP changes and the way to
update recipes:
http://www.pmwiki.org/wiki/PmWiki/Troubleshooting
http://www.pmwiki.org/wiki/PmWiki/CustomMarkup
I can provide assistance to maintainers of recipes and skins if the
instructions are insufficient or if there is another problem, but when
there are active maintainers listed on a recipe or skin page, I prefer
to let them update their work. They should not hesitate to contact me if
they encounter any difficulty or if they have any question. :-)
For example, the Vanilla5/skin.php file can be updated this way:
Instead of these 2 lines:
Markup_e('nosearch', 'directives', '/\\(:nosearch:\\)/i',
"SetTmplDisplay('PageSearchFmt',0)");
Markup_e('notabs', 'directives', '/\\(:notabs:\\)/i',
"SetTmplDisplay('PageTabsFmt',0)");
We add these:
Markup('nosearch', 'directives', '/\\(:nosearch:\\)/i',
"v5_nosearch");
Markup('notabs', 'directives', '/\\(:notabs:\\)/i', "v5_notabs");
function v5_nosearch() {
SetTmplDisplay('PageSearchFmt',0);
}
function v5_notabs() {
SetTmplDisplay('PageTabsFmt',0);
}
Instead of the evaluated code passed as 4-th argument to Markup_e(), we
pass a function name to Markup().
The above will work in PHP 7.2 without errors but also in any PHP 5+
(probably 4+) versions on PmWiki 2.2.56 or newer. The above can be
written in a number of different and correct ways, for example like the
function MarkupTmplDisplay() in scripts/stdmarkup.php. A developer can
select the way s/he likes most.
It is also possible to pass a lambda function or closure as a 4-th
argument, for example:
Markup('notabs', 'directives', '/\\(:notabs:\\)/i',
function(){ SetTmplDisplay('PageTabsFmt',0); } );
While I find this elegant, it will only work in PHP 5.3 or newer so the
PmWiki core and my own addons do not use this method. If a recipe
maintainer chooses this method instead of passing a function name, the
recipe page should note the PHP 5.3 prerequisite.
Petko
More information about the pmwiki-users
mailing list