diff options
98 files changed, 1278 insertions, 610 deletions
diff --git a/.travis.yml b/.travis.yml index b7b17f2f19..e68ba5f501 100644 --- a/.travis.yml +++ b/.travis.yml @@ -22,9 +22,12 @@ matrix: env: DB=mysqli - php: 5.6 env: DB=mysqli + - php: 7.0 + env: DB=mysqli - php: hhvm env: DB=mysqli allow_failures: + - php: 7.0 - php: hhvm fast_finish: true diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000000..6996ca22d3 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,6 @@ +## CONTRIBUTE + +1. [Create an account on phpBB.com](http://www.phpbb.com/community/ucp.php?mode=register) +2. [Create a ticket (unless there already is one)](http://tracker.phpbb.com/secure/CreateIssue!default.jspa) +3. Read our [Coding guidelines](https://wiki.phpbb.com/Coding_guidelines) and [Git Contribution Guidelines](http://wiki.phpbb.com/Git); if you're new to git, also read [the introduction guide](http://wiki.phpbb.com/display/DEV/Working+with+Git) +4. Send us a pull request @@ -27,9 +27,9 @@ To be able to run an installation from the repo (and not from a pre-built packag We have unit and functional tests in order to prevent regressions. You can view the bamboo continuous integration [here](http://bamboo.phpbb.com) or check our travis build below: -* develop [](http://travis-ci.org/phpbb/phpbb) -* develop-ascraeus [](http://travis-ci.org/phpbb/phpbb) -* develop-olympus [](http://travis-ci.org/phpbb/phpbb) +* [](http://travis-ci.org/phpbb/phpbb) **master** - Latest development version +* [](http://travis-ci.org/phpbb/phpbb) **3.1.x** - Development of version 3.1.x +* [](http://travis-ci.org/phpbb/phpbb) **3.0.x** - Development of version 3.0.x ## LICENSE diff --git a/phpBB/adm/style/acp_users_profile.html b/phpBB/adm/style/acp_users_profile.html index d32348ff1c..573534fc95 100644 --- a/phpBB/adm/style/acp_users_profile.html +++ b/phpBB/adm/style/acp_users_profile.html @@ -2,6 +2,7 @@ <fieldset> <legend>{L_USER_PROFILE}</legend> + <!-- EVENT acp_users_profile_before --> <dl> <dt><label for="jabber">{L_UCP_JABBER}{L_COLON}</label></dt> <dd><input type="email" id="jabber" name="jabber" value="{JABBER}" /></dd> @@ -10,6 +11,7 @@ <dt><label for="birthday">{L_BIRTHDAY}{L_COLON}</label><br /><span>{L_BIRTHDAY_EXPLAIN}</span></dt> <dd>{L_DAY}{L_COLON} <select id="birthday" name="bday_day">{S_BIRTHDAY_DAY_OPTIONS}</select> {L_MONTH}{L_COLON} <select name="bday_month">{S_BIRTHDAY_MONTH_OPTIONS}</select> {L_YEAR}{L_COLON} <select name="bday_year">{S_BIRTHDAY_YEAR_OPTIONS}</select></dd> </dl> + <!-- EVENT acp_users_profile_after --> </fieldset> <!-- IF .profile_fields --> @@ -26,7 +28,7 @@ <!-- END profile_fields --> </fieldset> <!-- ENDIF --> - + <!-- EVENT acp_users_profile_custom_after --> <fieldset class="quick"> <input class="button1" type="submit" name="update" value="{L_SUBMIT}" /> {S_FORM_TOKEN} diff --git a/phpBB/adm/style/install_header.html b/phpBB/adm/style/install_header.html index c818a4fc6d..6f7f129d39 100644 --- a/phpBB/adm/style/install_header.html +++ b/phpBB/adm/style/install_header.html @@ -2,7 +2,7 @@ <html dir="{S_CONTENT_DIRECTION}" lang="{S_USER_LANG}"> <head> <meta charset="utf-8"> -<meta name="viewport" content="width=device-width" /> +<meta name="viewport" content="width=device-width, initial-scale=1" /> <!-- IF META -->{META}<!-- ENDIF --> <title>{PAGE_TITLE}</title> diff --git a/phpBB/adm/style/install_update_diff.html b/phpBB/adm/style/install_update_diff.html index 150ef37e0e..5f80084705 100644 --- a/phpBB/adm/style/install_update_diff.html +++ b/phpBB/adm/style/install_update_diff.html @@ -2,7 +2,7 @@ <html dir="{S_CONTENT_DIRECTION}" lang="{S_USER_LANG}"> <head> <meta charset="utf-8"> -<meta name="viewport" content="width=device-width" /> +<meta name="viewport" content="width=device-width, initial-scale=1" /> <!-- IF META -->{META}<!-- ENDIF --> <title>{PAGE_TITLE}</title> diff --git a/phpBB/adm/style/overall_header.html b/phpBB/adm/style/overall_header.html index f1f7eee282..ada88edff2 100644 --- a/phpBB/adm/style/overall_header.html +++ b/phpBB/adm/style/overall_header.html @@ -2,7 +2,7 @@ <html dir="{S_CONTENT_DIRECTION}" lang="{S_USER_LANG}"> <head> <meta charset="utf-8"> -<meta name="viewport" content="width=device-width" /> +<meta name="viewport" content="width=device-width, initial-scale=1" /> <!-- IF META -->{META}<!-- ENDIF --> <title>{PAGE_TITLE}</title> diff --git a/phpBB/adm/style/simple_header.html b/phpBB/adm/style/simple_header.html index d0b9bf62ed..f62a7a900e 100644 --- a/phpBB/adm/style/simple_header.html +++ b/phpBB/adm/style/simple_header.html @@ -2,6 +2,7 @@ <html dir="{S_CONTENT_DIRECTION}" lang="{S_USER_LANG}"> <head> <meta charset="utf-8"> +<meta name="viewport" content="width=device-width, initial-scale=1" /> <!-- IF META -->{META}<!-- ENDIF --> <title>{PAGE_TITLE}</title> diff --git a/phpBB/assets/javascript/core.js b/phpBB/assets/javascript/core.js index 6481a2e113..806db7d35f 100644 --- a/phpBB/assets/javascript/core.js +++ b/phpBB/assets/javascript/core.js @@ -408,7 +408,9 @@ phpbb.ajaxify = function(options) { $elements.find('input:submit').click(function () { var $this = $(this); - $this.siblings('[data-clicked]').removeAttr('data-clicked'); + // Remove data-clicked attribute from any submit button of form + $this.parents('form:first').find('input:submit[data-clicked]').removeAttr('data-clicked'); + $this.attr('data-clicked', 'true'); }); } diff --git a/phpBB/develop/add_permissions.php b/phpBB/develop/add_permissions.php index fd419a7dde..a5279f8f13 100644 --- a/phpBB/develop/add_permissions.php +++ b/phpBB/develop/add_permissions.php @@ -198,9 +198,9 @@ $prefixes = array('f_', 'a_', 'm_', 'u_'); foreach ($prefixes as $prefix) { $var = $prefix . 'permissions'; - if (sizeof($$var)) + if (sizeof(${$var})) { - foreach ($$var as $auth_option => $l_ary) + foreach (${$var} as $auth_option => $l_ary) { $sql_ary = array( 'auth_option' => $auth_option, diff --git a/phpBB/docs/CHANGELOG.html b/phpBB/docs/CHANGELOG.html index acf5a318be..9710014b56 100644 --- a/phpBB/docs/CHANGELOG.html +++ b/phpBB/docs/CHANGELOG.html @@ -6,7 +6,7 @@ <meta name="description" content="phpBB 3.1.x Changelog" /> <title>phpBB • Changelog</title> -<link href="stylesheet.css" rel="stylesheet" type="text/css" media="screen, projection" /> +<link href="assets/css/stylesheet.css" rel="stylesheet" type="text/css" media="screen, projection" /> </head> @@ -16,15 +16,15 @@ <a id="top" name="top" accesskey="t"></a> <div id="page-header"> <div class="headerbar"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div id="doc-description"> - <a href="../index.php" id="logo"><img src="site_logo.gif" alt="" /></a> + <a href="../index.php" id="logo"><img src="assets/images/site_logo.gif" alt="" /></a> <h1>phpBB 3.1.x Changelog</h1> <p style="display: none;"><a href="#start_here">Skip</a></p> </div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> </div> @@ -34,12 +34,15 @@ <!-- BEGIN DOCUMENT --> -<p>This is a non-exhaustive (but still near complete) changelog for phpBB 3.1.x including release candidate versions. Our thanks to all those people who've contributed bug reports and code fixes.</p> +<p class="paragraph main-description"> + This is a non-exhaustive (but still near complete) changelog for phpBB 3.1.x including release candidate versions. + Our thanks to all those people who've contributed bug reports and code fixes. +</p> <h1>Changelog</h1> <div class="paragraph menu"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> @@ -94,7 +97,7 @@ </div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <hr /> @@ -102,7 +105,7 @@ <a name="changelog"></a><h2>1. Changelog</h2> <div class="paragraph"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> @@ -4713,7 +4716,7 @@ <div class="back2top"><a href="#wrap" class="top">Back to Top</a></div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <hr /> @@ -4721,7 +4724,7 @@ <a name="disclaimer"></a><h2>2. Copyright and disclaimer</h2> <div class="paragraph"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> @@ -4731,7 +4734,7 @@ <div class="back2top"><a href="#wrap" class="top">Back to Top</a></div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <!-- END DOCUMENT --> diff --git a/phpBB/docs/CREDITS.txt b/phpBB/docs/CREDITS.txt index 5c17787495..e3f2b325e8 100644 --- a/phpBB/docs/CREDITS.txt +++ b/phpBB/docs/CREDITS.txt @@ -24,9 +24,10 @@ phpBB Lead Developer: naderman (Nils Adermann) phpBB Developers: bantu (Andreas Fischer) dhruv.goel92 (Dhruv Goel) + Elsensee (Oliver Schramm) marc1706 (Marc Alexander) nickvergessen (Joas Schilling) - nicofuma (Tristan Darricau) + Nicofuma (Tristan Darricau) prototech (Cesar Gallegos) For a list of phpBB Team members, please see: diff --git a/phpBB/docs/FAQ.html b/phpBB/docs/FAQ.html index cd1ec4ae14..0b3b421e72 100644 --- a/phpBB/docs/FAQ.html +++ b/phpBB/docs/FAQ.html @@ -6,7 +6,7 @@ <meta name="description" content="phpBB 3.1.x frequently asked questions" /> <title>phpBB • FAQ</title> -<link href="stylesheet.css" rel="stylesheet" type="text/css" media="screen, projection" /> +<link href="assets/css/stylesheet.css" rel="stylesheet" type="text/css" media="screen, projection" /> </head> @@ -16,16 +16,16 @@ <a id="top" name="top" accesskey="t"></a> <div id="page-header"> <div class="headerbar"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div id="doc-description"> - <a href="../index.php" id="logo"><img src="site_logo.gif" alt="" /></a> + <a href="../index.php" id="logo"><img src="assets/images/site_logo.gif" alt="" /></a> <h1>phpBB 3.1.x FAQ</h1> <p>phpBB 3.1.x frequently asked questions</p> <p style="display: none;"><a href="#start_here">Skip</a></p> </div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> </div> @@ -35,12 +35,17 @@ <!-- BEGIN DOCUMENT --> - <p>This is a very basic Frequently Asked Questions (FAQ) page which attempts to answer some of the more commonly asked questions. It is by no means exhaustive and should be used in combination with the 'built-in' User FAQ within phpBB, the community forums and our IRC channel (see <a href="README.html">README</a> for details).</p> + <p class="paragraph main-description"> + This is a very basic Frequently Asked Questions (FAQ) page which attempts to answer some of the + more commonly asked questions. It is by no means exhaustive and should be used in combination with + the 'built-in' User FAQ within phpBB3, the community forums and our IRC channel + (see <a href="README.html">README</a> for details). + </p> <h1>FAQ</h1> <div class="paragraph menu"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> @@ -66,7 +71,7 @@ </div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <hr /> @@ -74,7 +79,7 @@ <a name="install"></a><h2>I am finding phpBB too difficult to install. Will you do it for me?</h2> <div class="paragraph"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> @@ -88,7 +93,7 @@ <div class="back2top"><a href="#wrap" class="top">Back to Top</a></div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <hr /> @@ -99,7 +104,7 @@ A board is dealing in warez/porn/etc., you need to prevent them doing this!<br / I want to sue you because i think you host an illegal board!</h2> <div class="paragraph"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> @@ -111,7 +116,7 @@ I want to sue you because i think you host an illegal board!</h2> <div class="back2top"><a href="#wrap" class="top">Back to Top</a></div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <hr /> @@ -119,7 +124,7 @@ I want to sue you because i think you host an illegal board!</h2> <a name="viewonline"></a><h2>According to viewonline a user is doing/reading something they should not be able to!</h2> <div class="paragraph"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> @@ -131,7 +136,7 @@ I want to sue you because i think you host an illegal board!</h2> <div class="back2top"><a href="#wrap" class="top">Back to Top</a></div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <hr /> @@ -139,7 +144,7 @@ I want to sue you because i think you host an illegal board!</h2> <a name="mail"></a><h2>I keep getting Mail sending errors when I (or my users) post/send PM's/etc.!</h2> <div class="paragraph"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> @@ -151,7 +156,7 @@ I want to sue you because i think you host an illegal board!</h2> <div class="back2top"><a href="#wrap" class="top">Back to Top</a></div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <hr /> @@ -159,7 +164,7 @@ I want to sue you because i think you host an illegal board!</h2> <a name="mail_language"></a><h2>My users are complaining that emails are not in their selected language!</h2> <div class="paragraph"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> @@ -171,7 +176,7 @@ I want to sue you because i think you host an illegal board!</h2> <div class="back2top"><a href="#wrap" class="top">Back to Top</a></div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <hr /> @@ -179,7 +184,7 @@ I want to sue you because i think you host an illegal board!</h2> <a name="aol_browser"></a><h2>My AOL based users keep getting logged out!</h2> <div class="paragraph"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> @@ -193,7 +198,7 @@ I want to sue you because i think you host an illegal board!</h2> <div class="back2top"><a href="#wrap" class="top">Back to Top</a></div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <hr /> @@ -201,7 +206,7 @@ I want to sue you because i think you host an illegal board!</h2> <a name="avatars"></a><h2>I am unable to upload avatars from my computer, regardless of the settings.</h2> <div class="paragraph"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> @@ -213,7 +218,7 @@ I want to sue you because i think you host an illegal board!</h2> <div class="back2top"><a href="#wrap" class="top">Back to Top</a></div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <hr /> @@ -221,7 +226,7 @@ I want to sue you because i think you host an illegal board!</h2> <a name="gallery_avatars"></a><h2>I just cannot get gallery avatars to appear!</h2> <div class="paragraph"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> @@ -231,7 +236,7 @@ I want to sue you because i think you host an illegal board!</h2> <div class="back2top"><a href="#wrap" class="top">Back to Top</a></div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <hr /> @@ -239,7 +244,7 @@ I want to sue you because i think you host an illegal board!</h2> <a name="permissions"></a><h2>How do I use/set permissions?</h2> <div class="paragraph"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> @@ -249,7 +254,7 @@ I want to sue you because i think you host an illegal board!</h2> <div class="back2top"><a href="#wrap" class="top">Back to Top</a></div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <hr /> @@ -257,7 +262,7 @@ I want to sue you because i think you host an illegal board!</h2> <a name="login_issues"></a><h2>I (or my users) cannot stay logged in to the forum!</h2> <div class="paragraph"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> @@ -269,7 +274,7 @@ I want to sue you because i think you host an illegal board!</h2> <div class="back2top"><a href="#wrap" class="top">Back to Top</a></div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <hr /> @@ -277,7 +282,7 @@ I want to sue you because i think you host an illegal board!</h2> <a name="logout_issues"></a><h2>My users are complaining about being logged out too quickly!</h2> <div class="paragraph"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> @@ -287,7 +292,7 @@ I want to sue you because i think you host an illegal board!</h2> <div class="back2top"><a href="#wrap" class="top">Back to Top</a></div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <hr /> @@ -295,7 +300,7 @@ I want to sue you because i think you host an illegal board!</h2> <a name="not_answered"></a><h2>My question isn't answered here!</h2> <div class="paragraph"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> @@ -309,7 +314,7 @@ I want to sue you because i think you host an illegal board!</h2> <div class="back2top"><a href="#wrap" class="top">Back to Top</a></div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <hr /> @@ -317,7 +322,7 @@ I want to sue you because i think you host an illegal board!</h2> <a name="disclaimer"></a><h2>Copyright and disclaimer</h2> <div class="paragraph"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> @@ -327,7 +332,7 @@ I want to sue you because i think you host an illegal board!</h2> <div class="back2top"><a href="#wrap" class="top">Back to Top</a></div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <!-- END DOCUMENT --> diff --git a/phpBB/docs/INSTALL.html b/phpBB/docs/INSTALL.html index df863917e2..4050636b38 100644 --- a/phpBB/docs/INSTALL.html +++ b/phpBB/docs/INSTALL.html @@ -6,7 +6,7 @@ <meta name="description" content="phpBB 3.1.x Installation, updating and conversion informations" /> <title>phpBB • Install</title> -<link href="stylesheet.css" rel="stylesheet" type="text/css" media="screen, projection" /> +<link href="assets/css/stylesheet.css" rel="stylesheet" type="text/css" media="screen, projection" /> </head> @@ -16,16 +16,16 @@ <a id="top" name="top" accesskey="t"></a> <div id="page-header"> <div class="headerbar"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div id="doc-description"> - <a href="../index.php" id="logo"><img src="site_logo.gif" alt="" /></a> + <a href="../index.php" id="logo"><img src="assets/images/site_logo.gif" alt="" /></a> <h1>phpBB 3.1.x Install</h1> <p>phpBB 3.1.x Installation, updating and conversion informations</p> <p style="display: none;"><a href="#start_here">Skip</a></p> </div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> </div> @@ -35,16 +35,22 @@ <!-- BEGIN DOCUMENT --> -<p><strong>Please read this document completely before proceeding with installation, updating or converting.</strong></p> - -<p>This document will walk you through the basics on installing, updating and converting the forum software.</p> +<div class="paragraph"> + <p><strong>Please read this document completely before proceeding with installation, updating or converting.</strong></p> -<p>A basic overview of running phpBB can be found in the accompanying <a href="README.html">README</a> file. Please ensure you read that document in addition to this! For more detailed information on using, installing, updating and converting phpBB you should read <a href="https://www.phpbb.com/support/docs/en/3.1/ug/">the documentation</a> available online.</p> + <p>This document will walk you through the basics on installing, updating and converting the forum software.</p> + <p> + A basic overview of running phpBB can be found in the accompanying <a href="README.html">README</a> file. + Please ensure you read that document in addition to this! For more detailed information on using, installing, + updating and converting phpBB you should read <a href="https://www.phpbb.com/support/docs/en/3.1/ug/">the documentation</a> + available online. + </p> +</div> <h1>Install</h1> <div class="paragraph menu"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> @@ -82,7 +88,7 @@ </div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <hr /> @@ -90,7 +96,7 @@ <a name="quickinstall"></a><h2>1. Quick install</h2> <div class="paragraph"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> @@ -114,7 +120,7 @@ <div class="back2top"><a href="#wrap" class="top">Back to Top</a></div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <hr /> @@ -122,7 +128,7 @@ <a name="require"></a><h2>2. Requirements</h2> <div class="paragraph"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> @@ -165,7 +171,7 @@ <div class="back2top"><a href="#wrap" class="top">Back to Top</a></div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <hr /> @@ -173,7 +179,7 @@ <a name="install"></a><h2>3. New installation</h2> <div class="paragraph"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> @@ -245,7 +251,7 @@ <div class="back2top"><a href="#wrap" class="top">Back to Top</a></div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <hr /> @@ -253,7 +259,7 @@ <a name="update"></a><h2>4. Updating from stable releases of phpBB 3.1.x</h2> <div class="paragraph"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> @@ -321,7 +327,7 @@ <div class="back2top"><a href="#wrap" class="top">Back to Top</a></div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <hr /> @@ -363,7 +369,7 @@ <a name="convert"></a><h2>6. Conversion from phpBB 2.0.x to phpBB 3.1.x</h2> <div class="paragraph"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> @@ -418,7 +424,7 @@ <div class="back2top"><a href="#wrap" class="top">Back to Top</a></div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <hr /> @@ -426,7 +432,7 @@ <a name="postinstall"></a><h2>7. Important (security related) post-Install tasks for all installation methods</h2> <div class="paragraph"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> @@ -456,7 +462,7 @@ <div class="back2top"><a href="#wrap" class="top">Back to Top</a></div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <hr /> @@ -464,7 +470,7 @@ <a name="anti_spam"></a><h2>8. Anti-Spam Measures</h2> <div class="paragraph"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> <p>Like any online site that allows user input, your board could be subject to unwanted posts; often referred to as <a href="http://en.wikipedia.org/wiki/Forum_spam">forum spam</a>. The vast majority of these attacks will be from automated computer programs known as <a href="http://en.wikipedia.org/wiki/Spambot">spambots</a>. The attacks, generally, are not personal as the spammers are just trying to find accessible targets. phpBB has a number of anti-spam measures built in, including a range of CAPTCHAs. However, administrators are strongly urged to read and follow the advice for <a href="https://www.phpbb.com/support/spam/">Preventing Spam in phpBB</a> as soon as possible after completing the installation of your board.</p> @@ -472,7 +478,7 @@ <div class="back2top"><a href="#wrap" class="top">Back to Top</a></div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <hr /> @@ -480,7 +486,7 @@ <a name="disclaimer"></a><h2>9. Copyright and disclaimer</h2> <div class="paragraph"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> @@ -490,7 +496,7 @@ <div class="back2top"><a href="#wrap" class="top">Back to Top</a></div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <!-- END DOCUMENT --> diff --git a/phpBB/docs/README.html b/phpBB/docs/README.html index b66f47178e..f5ac3ecacd 100644 --- a/phpBB/docs/README.html +++ b/phpBB/docs/README.html @@ -6,7 +6,7 @@ <meta name="description" content="phpBB 3.1.x Readme" /> <title>phpBB • Readme</title> -<link href="stylesheet.css" rel="stylesheet" type="text/css" media="screen, projection" /> +<link href="assets/css/stylesheet.css" rel="stylesheet" type="text/css" media="screen, projection" /> </head> @@ -16,15 +16,15 @@ <a id="top" name="top" accesskey="t"></a> <div id="page-header"> <div class="headerbar"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div id="doc-description"> - <a href="../index.php" id="logo"><img src="site_logo.gif" alt="" /></a> + <a href="../index.php" id="logo"><img src="assets/images/site_logo.gif" alt="" /></a> <h1>phpBB 3.1.x Readme</h1> <p style="display: none;"><a href="#start_here">Skip</a></p> </div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> </div> @@ -34,12 +34,16 @@ <!-- BEGIN DOCUMENT --> - <p>Thank you for downloading phpBB. This README will guide you through the basics of installation and operation of phpBB. Please ensure you read this and the accompanying documentation fully <strong>before</strong> proceeding with the installation.</p> + <p class="paragraph main-description"> + Thank you for downloading phpBB. This README will guide you through the basics of installation + and operation of phpBB. Please ensure you read this and the accompanying documentation fully + <strong>before</strong> proceeding with the installation. + </p> <h1>Readme</h1> <div class="paragraph menu"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> @@ -73,7 +77,7 @@ </div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <hr /> @@ -81,7 +85,7 @@ <a name="install"></a><h2>1. Installing phpBB</h2> <div class="paragraph"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> <p>Installation, update and conversion instructions can be found in the <a href="INSTALL.html">INSTALL</a> document in this directory. If you are intending on converting from a phpBB 2.0.x or 3.0.x installation we highly recommend that you backup any existing data before proceeding!</p> @@ -110,7 +114,7 @@ <div class="back2top"><a href="#wrap" class="top">Back to Top</a></div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <hr /> @@ -118,7 +122,7 @@ <a name="run"></a><h2>2. Running phpBB</h2> <div class="paragraph"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> @@ -162,7 +166,7 @@ <div class="back2top"><a href="#wrap" class="top">Back to Top</a></div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <hr /> @@ -170,7 +174,7 @@ <a name="help"></a><h2>3. Getting help with phpBB</h2> <div class="paragraph"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> @@ -208,7 +212,7 @@ <div class="back2top"><a href="#wrap" class="top">Back to Top</a></div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <hr /> @@ -216,7 +220,7 @@ <a name="status"></a><h2>4. Status of this version</h2> <div class="paragraph"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> @@ -232,7 +236,7 @@ <div class="back2top"><a href="#wrap" class="top">Back to Top</a></div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <hr /> @@ -240,7 +244,7 @@ <a name="bugs"></a><h2>5. Reporting Bugs</h2> <div class="paragraph"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> @@ -283,7 +287,7 @@ <div class="back2top"><a href="#wrap" class="top">Back to Top</a></div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <hr /> @@ -291,7 +295,7 @@ <a name="curbugs"></a><h2>6. Overview of current bug list</h2> <div class="paragraph"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> @@ -307,7 +311,7 @@ <div class="back2top"><a href="#wrap" class="top">Back to Top</a></div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <hr /> @@ -315,7 +319,7 @@ <a name="php"></a><h2>7. PHP compatibility issues</h2> <div class="paragraph"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> @@ -333,7 +337,7 @@ <div class="back2top"><a href="#wrap" class="top">Back to Top</a></div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <hr /> @@ -341,7 +345,7 @@ <a name="disclaimer"></a><h2>8. Copyright and disclaimer</h2> <div class="paragraph"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> @@ -351,7 +355,7 @@ <div class="back2top"><a href="#wrap" class="top">Back to Top</a></div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <!-- END DOCUMENT --> diff --git a/phpBB/docs/stylesheet.css b/phpBB/docs/assets/css/stylesheet.css index 6b8f5994c0..192a6f9f79 100644 --- a/phpBB/docs/stylesheet.css +++ b/phpBB/docs/assets/css/stylesheet.css @@ -11,13 +11,21 @@ body { font-family: Verdana, Helvetica, Arial, sans-serif; color: #828282; background-color: #FFFFFF; - font-size: 12px; + font-size: 10px; margin: 0; padding: 12px 0; } img { border-width: 0; } +ul, ol { + font-size: 1.1em; +} + +ul ul, ol ol { + font-size: inherit; +} + p { line-height: 1.3em; font-size: 1.1em; @@ -70,7 +78,7 @@ h3 { border-bottom: 1px solid #CCCCCC; margin-bottom: 3px; padding-bottom: 2px; - font-size: 1.05em; + font-size: 1.1em; color: #115098; margin-top: 20px; } @@ -80,7 +88,7 @@ h4 { font-weight: bold; margin-bottom: 3px; padding-bottom: 2px; - font-size: 1.05em; + font-size: 1.1em; color: #115098; margin-top: 20px; } @@ -104,6 +112,7 @@ code { border-width: 1px; border-style: solid; background-color: #FAFAFA; + padding: 0 4px; } #wrap { @@ -145,44 +154,16 @@ a#logo:hover { .headerbar { background: #ebebeb none repeat-x 0 0; + border-radius: 7px; color: #FFFFFF; margin-bottom: 4px; - padding: 0 5px; -} - -span.corners-top, span.corners-bottom, span.corners-top span, span.corners-bottom span { - font-size: 1px; - line-height: 1px; - display: block; - height: 5px; - background-repeat: no-repeat; -} - -span.corners-top { - background-image: none; - background-position: 0 0; - margin: 0 -5px; -} - -span.corners-top span { - background-image: none; - background-position: 100% 0; -} - -span.corners-bottom { - background-image: none; - background-position: 0 100%; - margin: 0 -5px; - clear: both; -} - -span.corners-bottom span { - background-image: none; - background-position: 100% 100%; + padding: 5px; } .paragraph { - padding: 0 10px; + border-radius: 7px; + font-size: 1.1em; + padding: 5px 10px; margin-bottom: 4px; background-repeat: no-repeat; background-position: 100% 0; @@ -197,6 +178,10 @@ span.corners-bottom span { color: #000000; } +.main-description { + font-size: 1.15em; +} + .content { color: #333333; } @@ -222,7 +207,7 @@ hr { .headerbar { background-color: #12A3EB; - background-image: url("bg_header.gif"); + background-image: url("../images/bg_header.gif"); color: #FFFFFF; } @@ -231,23 +216,6 @@ hr { color: #28313F; } - -span.corners-top { - background-image: url("corners_left.png"); -} - -span.corners-top span { - background-image: url("corners_right.png"); -} - -span.corners-bottom { - background-image: url("corners_left.png"); -} - -span.corners-bottom span { - background-image: url("corners_right.png"); -} - .error { color: #BC2A4D; } @@ -257,10 +225,6 @@ a:visited { color: #105289; } a:hover { color: #D31141; } a:active { color: #368AD2; } -.paragraph span.corners-top, .paragraph span.corners-bottom { - margin: 0 -10px; -} - .content { padding: 0; line-height: 1.48em; @@ -288,13 +252,17 @@ a:active { color: #368AD2; } } * html hr { margin: 0; } -* html span.corners-top, * html span.corners-bottom { background-image: url("corners_left.gif"); } -* html span.corners-top span, * html span.corners-bottom span { background-image: url("corners_right.gif"); } -.back2top { - clear: both; +.top { + background: url("../images/icon_back_top.gif") no-repeat top left; + text-decoration: none; + width: 11px; height: 11px; - text-align: right; + display: block; + float: right; + overflow: hidden; + letter-spacing: 1000px; + text-indent: 11px; } .content ol, .content ul { @@ -350,3 +318,9 @@ a:active { color: #368AD2; } clear: both; margin-right: 1em; } + +.inner:after { + clear: both; + content: ''; + display: block; +} diff --git a/phpBB/docs/bg_header.gif b/phpBB/docs/assets/images/bg_header.gif Binary files differindex 351de9f46a..351de9f46a 100644 --- a/phpBB/docs/bg_header.gif +++ b/phpBB/docs/assets/images/bg_header.gif diff --git a/phpBB/docs/assets/images/icon_back_top.gif b/phpBB/docs/assets/images/icon_back_top.gif Binary files differnew file mode 100644 index 0000000000..4d2b8f3822 --- /dev/null +++ b/phpBB/docs/assets/images/icon_back_top.gif diff --git a/phpBB/docs/assets/images/site_logo.gif b/phpBB/docs/assets/images/site_logo.gif Binary files differnew file mode 100644 index 0000000000..2517fbedd6 --- /dev/null +++ b/phpBB/docs/assets/images/site_logo.gif diff --git a/phpBB/docs/auth_api.html b/phpBB/docs/auth_api.html index 703e7a18c1..d571e72dd4 100644 --- a/phpBB/docs/auth_api.html +++ b/phpBB/docs/auth_api.html @@ -6,7 +6,7 @@ <meta name="description" content="This is an explanation of how to use the phpBB auth/acl API" /> <title>phpBB3 • Auth API</title> -<link href="stylesheet.css" rel="stylesheet" type="text/css" media="screen, projection" /> +<link href="assets/css/stylesheet.css" rel="stylesheet" type="text/css" media="screen, projection" /> </head> @@ -16,16 +16,16 @@ <a id="top" name="top" accesskey="t"></a> <div id="page-header"> <div class="headerbar"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div id="doc-description"> - <a href="../index.php" id="logo"><img src="site_logo.gif" alt="" /></a> + <a href="../index.php" id="logo"><img src="assets/images/site_logo.gif" alt="" /></a> <h1>Auth API</h1> <p>This is an explanation of how to use the phpBB auth/acl API</p> <p style="display: none;"><a href="#start_here">Skip</a></p> </div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> </div> @@ -35,12 +35,12 @@ <!-- BEGIN DOCUMENT --> - <p>This is an explanation of how to use the phpBB auth/acl API.</p> + <p class="paragraph main-description">This is an explanation of how to use the phpBB auth/acl API.</p> <h1>Auth API</h1> <div class="paragraph menu"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> @@ -65,7 +65,7 @@ </div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <hr /> @@ -73,7 +73,7 @@ <a name="intro"></a><h2>1. Introduction</h2> <div class="paragraph"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> @@ -86,8 +86,8 @@ <p>To use any methods contained with the <code>auth</code> class it first needs to be instantiated. This is best achieved early in the execution of the script in the following manner:</p> <div class="codebox"><pre> -$auth = new phpbb\auth\auth(); - </pre></div> +$auth = new phpbb\auth\auth();</pre> + </div> <p>Once an instance of the class has been created you are free to call the various methods it contains. Please note that should you wish to use the <code>auth_admin</code> methods you will need to instantiate this separately but in the same way.</p> @@ -95,7 +95,7 @@ $auth = new phpbb\auth\auth(); <div class="back2top"><a href="#wrap" class="top">Back to Top</a></div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <hr /> @@ -103,7 +103,7 @@ $auth = new phpbb\auth\auth(); <a name="methods"></a><h2>2. Methods</h2> <div class="paragraph"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> @@ -114,8 +114,8 @@ $auth = new phpbb\auth\auth(); <p>The <code>acl</code> method is the initialisation routine for all the acl functions. If you intend calling any acl method you must first call this. The method takes as its one and only required parameter an associative array containing user information as stored in the database. This array must contain at least the following information; user_id, user_permissions and user_type. It is called in the following way:</p> <div class="codebox"><pre> -$auth->acl(<code>userdata</code>); - </pre></div> +$auth->acl(<code>userdata</code>);</pre> + </div> <p>Where userdata is the array containing the aforementioned data.</p> @@ -124,8 +124,8 @@ $auth->acl(<code>userdata</code>); <p>This method is the primary way of determining what a user can and cannot do for a given option globally or in a given forum. The method should be called in the following way:</p> <div class="codebox"><pre> -$result = $auth->acl_get(<code>option</code>[, <code>forum</code>]); - </pre></div> +$result = $auth->acl_get(<code>option</code>[, <code>forum</code>]);</pre> + </div> <p>Where option is a string representing the required option, e.g. 'f_list', 'm_edit', 'a_adduser', etc. By adding a ! in front of the option, e.g. '!f_list' the result of this method will be negated. The optional forum term is the integer forum_id.</p> @@ -142,8 +142,8 @@ $result = $auth->acl_get(<code>option</code>[, <code>forum</code>]); <p>The method should be called thus:</p> <div class="codebox"><pre> -$result = $auth->acl_gets(<code>option1</code>[, <code>option2</code>, ..., <code>optionN</code>, <code>forum</code>]); - </pre></div> +$result = $auth->acl_gets(<code>option1</code>[, <code>option2</code>, ..., <code>optionN</code>, <code>forum</code>]);</pre> + </div> <p>As with the <code>acl_get</code> method the options are strings representing the required permissions to check. The forum again is an integer representing a given forum_id.</p> @@ -154,16 +154,16 @@ $result = $auth->acl_gets(<code>option1</code>[, <code>option2</code>, ..., < <p>This method is used to find out in which forums a user is allowed to carry out an operation or to find out in which forums he is not allowed to carry out an operation. The method should be called in the following way:</p> <div class="codebox"><pre> -$result = $auth->acl_getf(<code>option</code>[, <code>clean</code>]); - </pre></div> +$result = $auth->acl_getf(<code>option</code>[, <code>clean</code>]);</pre> + </div> <p>Just like in the <code>acl_get</code> method the option is a string specifying the permission which has to be checked (negation using ! is allowed). The second parameter is a boolean. If it is set to false this method returns all forums with either zero or a positive integer. If it is set to true only those forums with a positive integer as the result will be returned.</p> <p>The method returns an associative array of the form:</p> <div class="codebox"><pre> -array(<em>forum_id1</em> => array(<em>option</em> => <em>integer</em>), <em>forum_id2</em> => ...) - </pre></div> +array(<em>forum_id1</em> => array(<em>option</em> => <em>integer</em>), <em>forum_id2</em> => ...)</pre> + </div> <p>Where option is the option passed to the method and integer is either zero or a positive integer and the same <code>acl_get(option, forum_id)</code> would return.</p> @@ -172,8 +172,8 @@ array(<em>forum_id1</em> => array(<em>option</em> => <em>integer</em>), <e <p>This method is used to find out whether a user has a permission in at least one forum or globally. This method is similar to checking whether <code>acl_getf(option, true)</code> returned one or more forums but it's faster. It should be called in the following way:</p> <div class="codebox"><pre> -$result = $auth->acl_getf_global(<code>option</code>) - </pre></div> +$result = $auth->acl_getf_global(<code>option</code>)</pre> + </div> <p>As with the previous methods option is a string specifying the permission which has to be checked.</p> @@ -230,7 +230,7 @@ $result = $auth->acl_get_list($user_id, $permissions, $forum_id); <div class="back2top"><a href="#wrap" class="top">Back to Top</a></div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <hr /> @@ -238,7 +238,7 @@ $result = $auth->acl_get_list($user_id, $permissions, $forum_id); <a name="admin_related"></a><h2>3. Admin related functions</h2> <div class="paragraph"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> @@ -247,8 +247,8 @@ $result = $auth->acl_get_list($user_id, $permissions, $forum_id); <p>To use any methods this class contains it first needs to be instantiated separately from <code>auth</code>. This is achieved in the same way as <code>auth</code>:</p> <div class="codebox"><pre> -$auth_admin = new auth_admin(); - </pre></div> +$auth_admin = new auth_admin();</pre> + </div> <p>This instance gives you access to both the methods of this specific class and that of <code>auth</code>.</p> @@ -256,7 +256,7 @@ $auth_admin = new auth_admin(); <div class="back2top"><a href="#wrap" class="top">Back to Top</a></div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <hr /> @@ -264,7 +264,7 @@ $auth_admin = new auth_admin(); <a name="disclaimer"></a><h2>4. Copyright and disclaimer</h2> <div class="paragraph"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> @@ -274,7 +274,7 @@ $auth_admin = new auth_admin(); <div class="back2top"><a href="#wrap" class="top">Back to Top</a></div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <!-- END DOCUMENT --> diff --git a/phpBB/docs/coding-guidelines.html b/phpBB/docs/coding-guidelines.html index 98cfe0e717..4c5fe73543 100644 --- a/phpBB/docs/coding-guidelines.html +++ b/phpBB/docs/coding-guidelines.html @@ -6,7 +6,7 @@ <meta name="description" content="Ascraeus coding guidelines document" /> <title>phpBB3 • Coding Guidelines</title> -<link href="stylesheet.css" rel="stylesheet" type="text/css" media="screen, projection" /> +<link href="assets/css/stylesheet.css" rel="stylesheet" type="text/css" media="screen, projection" /> </head> @@ -16,16 +16,16 @@ <a id="top" name="top" accesskey="t"></a> <div id="page-header"> <div class="headerbar"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div id="doc-description"> - <a href="../index.php" id="logo"><img src="site_logo.gif" alt="" /></a> + <a href="../index.php" id="logo"><img src="assets/images/site_logo.gif" alt="" /></a> <h1>Coding Guidelines</h1> <p>Ascraeus coding guidelines document</p> <p style="display: none;"><a href="#start_here">Skip</a></p> </div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> </div> @@ -35,12 +35,14 @@ <!-- BEGIN DOCUMENT --> -<p>These are the phpBB Coding Guidelines for Ascraeus, all attempts should be made to follow them as closely as possible.</p> +<p class="paragraph main-description"> + These are the phpBB Coding Guidelines for Ascraeus, all attempts should be made to follow them as closely as possible. +</p> <h1>Coding Guidelines</h1> <div class="paragraph menu"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> @@ -89,7 +91,7 @@ </div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <hr /> @@ -97,7 +99,7 @@ <a name="defaults"></a><h2>1. Defaults</h2> <div class="paragraph"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> @@ -109,8 +111,8 @@ <div class="codebox"><pre> {TAB}$mode{TAB}{TAB}= $request->variable('mode', ''); -{TAB}$search_id{TAB}= $request->variable('search_id', ''); - </pre></div> +{TAB}$search_id{TAB}= $request->variable('search_id', '');</pre> + </div> <p>If entered with tabs (replace the {TAB}) both equal signs need to be on the same column.</p> @@ -133,8 +135,8 @@ * For full copyright and license information, please see * the docs/CREDITS.txt file. * -*/ - </pre></div> +*/</pre> + </div> <p>Please see the <a href="#locations">File Locations section</a> for the correct package name.</p> @@ -157,8 +159,8 @@ /** */ -{CODE} - </pre></div> +{CODE}</pre> + </div> <h4>Files containing only functions:</h4> @@ -185,8 +187,8 @@ Small code snipped, mostly one or two defines or an if statement /** * {DOCUMENTATION} */ -class ... - </pre></div> +class ...</pre> + </div> <a name="locations"></a><h3>1.iii. File Locations</h3> @@ -274,7 +276,7 @@ PHPBB_QA (Set board to QA-Mode, which means the updater also c <div class="back2top"><a href="#wrap" class="top">Back to Top</a></div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <hr /> @@ -282,7 +284,7 @@ PHPBB_QA (Set board to QA-Mode, which means the updater also c <a name="code"></a><h2>2. Code Layout/Guidelines</h2> <div class="paragraph"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> @@ -317,8 +319,8 @@ for ($i = 0; $i < $outer_size; $i++) { foo($i, $j); } -} - </pre></div> +}</pre> + </div> <h4>Function Names:</h4> <p>Functions should also be named descriptively. We're not programming in C here, we don't want to write functions called things like "stristr()". Again, all lower-case names with words separated by a single underscore character in PHP, and camel caps in JavaScript. Function names should be prefixed with "phpbb_" and preferably have a verb in them somewhere. Good function names are <code>phpbb_print_login_status()</code>, <code>phpbb_get_user_data()</code>, etc. Constructor functions in JavaScript should begin with a capital letter.</p> @@ -344,14 +346,14 @@ phpbb/ dir/ class_name.php subdir/ - class_name.php - </pre></div> + class_name.php</pre> + </div> <div class="codebox"><pre> \phpbb\class_name - phpbb/class_name.php \phpbb\dir\class_name - phpbb/dir/class_name.php -\phpbb\dir\subdir\class_name - phpbb/dir/subdir/class_name.php - </pre></div> +\phpbb\dir\subdir\class_name - phpbb/dir/subdir/class_name.php</pre> + </div> <h4>Summary:</h4> @@ -377,8 +379,8 @@ while (condition) do_stuff(); for ($i = 0; $i < size; $i++) - do_stuff($i); - </pre></div> + do_stuff($i);</pre> + </div> <p class="good">// These are all right. </p> <div class="codebox"><pre> @@ -395,8 +397,8 @@ while (condition) for ($i = 0; $i < size; $i++) { do_stuff(); -} - </pre></div> +}</pre> + </div> <h4>Where to put the braces:</h4> <p>In PHP code, braces always go on their own line. The closing brace should also always be at the same column as the corresponding opening brace, examples:</p> @@ -427,8 +429,8 @@ while (condition) function do_stuff() { ... -} - </pre></div> +}</pre> + </div> <p>In JavaScript code, braces always go on the same line:</p> @@ -451,8 +453,8 @@ while (condition) { function do_stuff() { ... -} - </pre></div> +}</pre> + </div> <h4>Use spaces between tokens:</h4> <p>This is another simple, easy step that helps keep code readable without much effort. Whenever you write an assignment, expression, etc.. Always leave <em>one</em> space between the tokens. Basically, write code as if it was English. Put spaces between variable names and operators. Don't put spaces just after an opening bracket or before a closing bracket. Don't put spaces just before a comma or a semicolon. This is best shown with a few examples, examples:</p> @@ -476,26 +478,26 @@ for($i=0; $i<$size; $i++) ... for ($i = 0; $i < $size; $i++) ... $i=($j < $size)?0:1; -$i = ($j < $size) ? 0 : 1; - </pre></div> +$i = ($j < $size) ? 0 : 1;</pre> + </div> <h4>Operator precedence:</h4> <p>Do you know the exact precedence of all the operators in PHP? Neither do I. Don't guess. Always make it obvious by using brackets to force the precedence of an equation so you know what it does. Remember to not over-use this, as it may harden the readability. Basically, do not enclose single expressions. Examples:</p> <p class="bad">// what's the result? who knows. </p> - <div class="codebox"><pre> -$bool = ($i < 7 && $j > 8 || $k == 4); - </pre></div> + <div class="codebox"> + <pre>$bool = ($i < 7 && $j > 8 || $k == 4);</pre> + </div> <p class="bad">// now you can be certain what I'm doing here.</p> - <div class="codebox"><pre> -$bool = (($i < 7) && (($j < 8) || ($k == 4))); - </pre></div> + <div class="codebox"> + <pre>$bool = (($i < 7) && (($j < 8) || ($k == 4)));</pre> + </div> <p class="good">// But this one is even better, because it is easier on the eye but the intention is preserved</p> - <div class="codebox"><pre> -$bool = ($i < 7 && ($j < 8 || $k == 4)); - </pre></div> + <div class="codebox"> + <pre>$bool = ($i < 7 && ($j < 8 || $k == 4));</pre> + </div> <h4>Quoting strings:</h4> <p>There are two different ways to quote strings in PHP - either with single quotes or with double quotes. The main difference is that the parser does variable interpolation in double-quoted strings, but not in single quoted strings. Because of this, you should <em>always</em> use single quotes <em>unless</em> you specifically need variable interpolation to be done on that string. This way, we can save the parser the trouble of parsing a bunch of strings where no interpolation needs to be done.</p> @@ -505,25 +507,25 @@ $bool = ($i < 7 && ($j < 8 || $k == 4)); <div class="codebox"><pre> $str = "This is a really long string with no variables for the parser to find."; -do_stuff("$str"); - </pre></div> +do_stuff("$str");</pre> + </div> <p class="good">// right</p> <div class="codebox"><pre> $str = 'This is a really long string with no variables for the parser to find.'; -do_stuff($str); - </pre></div> +do_stuff($str);</pre> + </div> <p class="bad">// Sometimes single quotes are just not right</p> <div class="codebox"><pre> -$post_url = $phpbb_root_path . 'posting.' . $phpEx . '?mode=' . $mode . '&amp;start=' . $start; - </pre></div> +$post_url = $phpbb_root_path . 'posting.' . $phpEx . '?mode=' . $mode . '&amp;start=' . $start;</pre> + </div> <p class="good">// Double quotes are sometimes needed to not overcrowd the line with concatenations.</p> <div class="codebox"><pre> -$post_url = "{$phpbb_root_path}posting.$phpEx?mode=$mode&amp;start=$start"; - </pre></div> +$post_url = "{$phpbb_root_path}posting.$phpEx?mode=$mode&amp;start=$start";</pre> + </div> <p>In SQL statements mixing single and double quotes is partly allowed (following the guidelines listed here about SQL formatting), else one should try to only use one method - mostly single quotes.</p> @@ -535,40 +537,40 @@ $post_url = "{$phpbb_root_path}posting.$phpEx?mode=$mode&amp;start=$start"; $foo = array( 'bar' => 42, 'boo' => 23 -); - </pre></div> +);</pre> + </div> <p class="good">// right </p> <div class="codebox"><pre> $foo = array( 'bar' => 42, 'boo' => 23, -); - </pre></div> +);</pre> + </div> <h4>Associative array keys:</h4> <p>In PHP, it's legal to use a literal string as a key to an associative array without quoting that string. We don't want to do this -- the string should always be quoted to avoid confusion. Note that this is only when we're using a literal, not when we're using a variable, examples:</p> <p class="bad">// wrong</p> - <div class="codebox"><pre> -$foo = $assoc_array[blah]; - </pre></div> + <div class="codebox"> + <pre>$foo = $assoc_array[blah];</pre> + </div> <p class="good">// right </p> - <div class="codebox"><pre> -$foo = $assoc_array['blah']; - </pre></div> + <div class="codebox"> + <pre>$foo = $assoc_array['blah'];</pre> + </div> <p class="bad">// wrong</p> - <div class="codebox"><pre> -$foo = $assoc_array["$var"]; - </pre></div> + <div class="codebox"> + <pre>$foo = $assoc_array["$var"];</pre> + </div> <p class="good">// right </p> - <div class="codebox"><pre> -$foo = $assoc_array[$var]; - </pre></div> + <div class="codebox"> + <pre>$foo = $assoc_array[$var];</pre> + </div> <h4>Comments:</h4> <p>Each complex function should be preceded by a comment that tells a programmer everything they need to know to use that function. The meaning of every parameter, the expected input, and the output are required as a minimal comment. The function's behaviour in error conditions (and what those error conditions are) should also be present - but mostly included within the comment about the output.<br /><br />Especially important to document are any assumptions the code makes, or preconditions for its proper operation. Any one of the developers should be able to look at any part of the application and figure out what's going on in a reasonable amount of time.<br /><br />Avoid using <code>/* */</code> comment blocks for one-line comments, <code>//</code> should be used for one/two-liners.</p> @@ -582,8 +584,8 @@ $foo = $assoc_array[$var]; <p class="bad">// wrong </p> <div class="codebox"><pre> $array[++$i] = $j; -$array[$i++] = $k; - </pre></div> +$array[$i++] = $k;</pre> + </div> <p class="good">// right </p> <div class="codebox"><pre> @@ -591,39 +593,38 @@ $i++; $array[$i] = $j; $array[$i] = $k; -$i++; - </pre></div> +$i++;</pre> + </div> <h4>Inline conditionals:</h4> <p>Inline conditionals should only be used to do very simple things. Preferably, they will only be used to do assignments, and not for function calls or anything complex at all. They can be harmful to readability if used incorrectly, so don't fall in love with saving typing by using them, examples:</p> <p class="bad">// Bad place to use them</p> <div class="codebox"><pre> -($i < $size && $j > $size) ? do_stuff($foo) : do_stuff($bar); - </pre></div> +($i < $size && $j > $size) ? do_stuff($foo) : do_stuff($bar);</pre> + </div> <p class="good">// OK place to use them </p> <div class="codebox"><pre> -$min = ($i < $j) ? $i : $j; - </pre></div> +$min = ($i < $j) ? $i : $j;</pre> + </div> <h4>Don't use uninitialized variables.</h4> <p>For phpBB3, we intend to use a higher level of run-time error reporting. This will mean that the use of an uninitialized variable will be reported as a warning. These warnings can be avoided by using the built-in isset() function to check whether a variable has been set - but preferably the variable is always existing. For checking if an array has a key set this can come in handy though, examples:</p> <p class="bad">// Wrong </p> - <div class="codebox"><pre> -if ($forum) ... - </pre></div> + <div class="codebox"> + <pre>if ($forum) ...</pre> + </div> <p class="good">// Right </p> - <div class="codebox"><pre> -if (isset($forum)) ... - </pre></div> + <div class="codebox"> + <pre>if (isset($forum)) ...</pre></div> <p class="good">// Also possible</p> - <div class="codebox"><pre> -if (isset($forum) && $forum == 5) - </pre></div> + <div class="codebox"> + <pre>if (isset($forum) && $forum == 5)</pre> + </div> <p>The <code>empty()</code> function is useful if you want to check if a variable is not set or being empty (an empty string, 0 as an integer or string, NULL, false, an empty array or a variable declared, but without a value in a class). Therefore empty should be used in favor of <code>isset($array) && sizeof($array) > 0</code> - this can be written in a shorter way as <code>!empty($array)</code>.</p> @@ -640,8 +641,8 @@ switch ($mode) case 'mode2': // I am doing something completely different here break; -} - </pre></div> +}</pre> + </div> <p class="good">// Good </p> <div class="codebox"><pre> @@ -658,8 +659,8 @@ switch ($mode) default: // Always assume that a case was not caught break; -} - </pre></div> +}</pre> + </div> <p class="good">// Also good, if you have more code between the case and the break </p> <div class="codebox"><pre> @@ -682,8 +683,8 @@ switch ($mode) // Always assume that a case was not caught break; -} - </pre></div> +}</pre> + </div> <p>Even if the break for the default case is not needed, it is sometimes better to include it just for readability and completeness.</p> @@ -710,8 +711,8 @@ switch ($mode) // Always assume that a case was not caught break; -} - </pre></div> +}</pre> + </div> <h4>Class Members</h4> <p>Use the explicit visibility qualifiers <code>public</code>, <code>private</code> and <code>protected</code> for all properties instead of <code>var</code>. @@ -721,14 +722,14 @@ switch ($mode) <p class="bad">//Wrong </p> <div class="codebox"><pre> var $x; -private static function f() - </pre></div> +private static function f()</pre> + </div> <p class="good">// Right </p> <div class="codebox"><pre> public $x; -static private function f() - </pre></div> +static private function f()</pre> + </div> <h4>Constants</h4> <p>Prefer class constants over global constants created with <code>define()</code>.</p> @@ -748,8 +749,8 @@ $sql = 'SELECT * <-one tab->WHERE a = 1 <-two tabs->AND (b = 2 <-three tabs->OR b = 3) -<-one tab->ORDER BY b'; - </pre></div> +<-one tab->ORDER BY b';</pre> + </div> <p>Here the example with the tabs applied:</p> @@ -759,8 +760,8 @@ $sql = 'SELECT * WHERE a = 1 AND (b = 2 OR b = 3) - ORDER BY b'; - </pre></div> + ORDER BY b';</pre> + </div> <h4>SQL Quotes: </h4> <p>Use double quotes where applicable. (The variables in these examples are typecasted to integers beforehand.) Examples: </p> @@ -769,16 +770,16 @@ $sql = 'SELECT * <div class="codebox"><pre> "UPDATE " . SOME_TABLE . " SET something = something_else WHERE a = $b"; -'UPDATE ' . SOME_TABLE . ' SET something = ' . $user_id . ' WHERE a = ' . $something; - </pre></div> +'UPDATE ' . SOME_TABLE . ' SET something = ' . $user_id . ' WHERE a = ' . $something;</pre> + </div> <p class="good">// These are right. </p> <div class="codebox"><pre> 'UPDATE ' . SOME_TABLE . " SET something = something_else WHERE a = $b"; -'UPDATE ' . SOME_TABLE . " SET something = $user_id WHERE a = $something"; - </pre></div> +'UPDATE ' . SOME_TABLE . " SET something = $user_id WHERE a = $something";</pre> + </div> <p>In other words use single quotes where no variable substitution is required or where the variable involved shouldn't appear within double quotes. Otherwise use double quotes.</p> @@ -789,15 +790,15 @@ $sql = 'SELECT * <div class="codebox"><pre> $sql = 'SELECT * FROM ' . SOME_TABLE . ' - WHERE a != 2'; - </pre></div> + WHERE a != 2';</pre> + </div> <p class="good">// This is right. </p> <div class="codebox"><pre> $sql = 'SELECT * FROM ' . SOME_TABLE . ' - WHERE a <> 2'; - </pre></div> + WHERE a <> 2';</pre> + </div> <h4>Common DBAL methods: </h4> @@ -808,8 +809,8 @@ $sql = 'SELECT * <div class="codebox"><pre> $sql = 'SELECT * FROM ' . SOME_TABLE . " - WHERE username = '" . $db->sql_escape($username) . "'"; - </pre></div> + WHERE username = '" . $db->sql_escape($username) . "'";</pre> + </div> <h4>sql_query_limit():</h4> @@ -830,8 +831,8 @@ $sql_ary = array( 'moredata' => $another_int, ); -$db->sql_query('INSERT INTO ' . SOME_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary)); - </pre></div> +$db->sql_query('INSERT INTO ' . SOME_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary));</pre> + </div> <p>To complete the example, this is how an update statement would look like:</p> @@ -845,8 +846,8 @@ $sql_ary = array( $sql = 'UPDATE ' . SOME_TABLE . ' SET ' . $db->sql_build_array('UPDATE', $sql_ary) . ' WHERE user_id = ' . (int) $user_id; -$db->sql_query($sql); - </pre></div> +$db->sql_query($sql);</pre> + </div> <p>The <code>$db->sql_build_array()</code> function supports the following modes: <code>INSERT</code> (example above), <code>INSERT_SELECT</code> (building query for <code>INSERT INTO table (...) SELECT value, column ...</code> statements), <code>UPDATE</code> (example above) and <code>SELECT</code> (for building WHERE statement [AND logic]).</p> @@ -869,8 +870,8 @@ $sql_ary[] = array( 'moredata' => $another_int_2, ); -$db->sql_multi_insert(SOME_TABLE, $sql_ary); - </pre></div> +$db->sql_multi_insert(SOME_TABLE, $sql_ary);</pre> + </div> <h4>sql_in_set():</h4> @@ -880,22 +881,22 @@ $db->sql_multi_insert(SOME_TABLE, $sql_ary); $sql = 'SELECT * FROM ' . FORUMS_TABLE . ' WHERE ' . $db->sql_in_set('forum_id', $forum_ids); -$db->sql_query($sql); - </pre></div> +$db->sql_query($sql);</pre> + </div> <p>Based on the number of values in $forum_ids, the query can look differently.</p> <p class="good">// SQL Statement if $forum_ids = array(1, 2, 3);</p> <div class="codebox"><pre> -SELECT FROM phpbb_forums WHERE forum_id IN (1, 2, 3) - </pre></div> +SELECT FROM phpbb_forums WHERE forum_id IN (1, 2, 3)</pre> + </div> <p class="good">// SQL Statement if $forum_ids = array(1) or $forum_ids = 1</p> <div class="codebox"><pre> -SELECT FROM phpbb_forums WHERE forum_id = 1 - </pre></div> +SELECT FROM phpbb_forums WHERE forum_id = 1</pre> + </div> <p>Of course the same is possible for doing a negative match against a number of values:</p> @@ -903,22 +904,22 @@ SELECT FROM phpbb_forums WHERE forum_id = 1 $sql = 'SELECT * FROM ' . FORUMS_TABLE . ' WHERE ' . $db->sql_in_set('forum_id', $forum_ids, <strong>true</strong>); -$db->sql_query($sql); - </pre></div> +$db->sql_query($sql);</pre> + </div> <p>Based on the number of values in $forum_ids, the query can look differently here too.</p> <p class="good">// SQL Statement if $forum_ids = array(1, 2, 3);</p> <div class="codebox"><pre> -SELECT FROM phpbb_forums WHERE forum_id <strong>NOT</strong> IN (1, 2, 3) - </pre></div> +SELECT FROM phpbb_forums WHERE forum_id <strong>NOT</strong> IN (1, 2, 3)</pre> + </div> <p class="good">// SQL Statement if $forum_ids = array(1) or $forum_ids = 1</p> <div class="codebox"><pre> -SELECT FROM phpbb_forums WHERE forum_id <strong><></strong> 1 - </pre></div> +SELECT FROM phpbb_forums WHERE forum_id <strong><></strong> 1</pre> + </div> <p>If the given array is empty, an error will be produced.</p> @@ -948,8 +949,8 @@ $sql_array = array( 'ORDER_BY' => 'left_id', ); -$sql = $db->sql_build_query('SELECT', $sql_array); - </pre></div> +$sql = $db->sql_build_query('SELECT', $sql_array);</pre> + </div> <p>The possible first parameter for sql_build_query() is SELECT or SELECT_DISTINCT. As you can see, the logic is pretty self-explaining. For the LEFT_JOIN key, just add another array if you want to join on to tables for example. The added benefit of using this construct is that you are able to easily build the query statement based on conditions - for example the above LEFT_JOIN is only necessary if server side topic tracking is enabled; a slight adjustement would be:</p> @@ -984,8 +985,8 @@ else // Here we read the cookie data } -$sql = $db->sql_build_query('SELECT', $sql_array); - </pre></div> +$sql = $db->sql_build_query('SELECT', $sql_array);</pre> + </div> <a name="optimizing"></a><h3>2.iv. Optimizations</h3> @@ -997,16 +998,16 @@ $sql = $db->sql_build_query('SELECT', $sql_array); for ($i = 0; $i < sizeof($post_data); $i++) { do_something(); -} - </pre></div> +}</pre> + </div> <p class="good">// You are able to assign the (not changing) result within the loop itself</p> <div class="codebox"><pre> for ($i = 0, $size = sizeof($post_data); $i < $size; $i++) { do_something(); -} - </pre></div> +}</pre> + </div> <h4>Use of in_array(): </h4> <p>Try to avoid using in_array() on huge arrays, and try to not place them into loops if the array to check consist of more than 20 entries. in_array() can be very time consuming and uses a lot of cpu processing time. For little checks it is not noticeable, but if checked against a huge array within a loop those checks alone can take several seconds. If you need this functionality, try using isset() on the arrays keys instead, actually shifting the values into keys and vice versa. A call to <code>isset($array[$var])</code> is a lot faster than <code>in_array($var, array_keys($array))</code> for example.</p> @@ -1028,29 +1029,29 @@ for ($i = 0, $size = sizeof($post_data); $i < $size; $i++) <p class="bad">// Old method, do not use it</p> <div class="codebox"><pre> $start = (isset($HTTP_GET_VARS['start'])) ? intval($HTTP_GET_VARS['start']) : intval($HTTP_POST_VARS['start']); -$submit = (isset($HTTP_POST_VARS['submit'])) ? true : false; - </pre></div> +$submit = (isset($HTTP_POST_VARS['submit'])) ? true : false;</pre> + </div> <p class="good">// Use request var and define a default variable (use the correct type)</p> <div class="codebox"><pre> $start = $request->variable('start', 0); -$submit = $request->is_set_post('submit'); - </pre></div> +$submit = $request->is_set_post('submit');</pre> + </div> <p class="bad">// $start is an int, the following use of $request->variable() therefore is not allowed</p> <div class="codebox"><pre> -$start = $request->variable('start', '0'); - </pre></div> +$start = $request->variable('start', '0');</pre> + </div> <p class="good">// Getting an array, keys are integers, value defaults to 0</p> <div class="codebox"><pre> -$mark_array = $request->variable('mark', array(0)); - </pre></div> +$mark_array = $request->variable('mark', array(0));</pre> + </div> <p class="good">// Getting an array, keys are strings, value defaults to 0</p> <div class="codebox"><pre> -$action_ary = $request->variable('action', array('' => 0)); - </pre></div> +$action_ary = $request->variable('action', array('' => 0));</pre> + </div> <h4>Login checks/redirection: </h4> <p>To show a forum login box use <code>login_forum_box($forum_data)</code>, else use the <code>login_box()</code> function.</p> @@ -1073,8 +1074,8 @@ $action_ary = $request->variable('action', array('' => 0)); { trigger_error('FORM_INVALID'); } - } - </pre></div> + }</pre> + </div> <p>The string passed to <code>add_form_key()</code> needs to match the string passed to <code>check_form_key()</code>. Another requirement for this to work correctly is that all forms include the <code>{S_FORM_TOKEN}</code> template variable.</p> @@ -1085,8 +1086,8 @@ $action_ary = $request->variable('action', array('' => 0)); <div class="codebox"><pre> $user->session_begin(); $auth->acl($user->data); -$user->setup(); - </pre></div> +$user->setup();</pre> + </div> <p>The <code>$user->setup()</code> call can be used to pass on additional language definition and a custom style (used in viewforum).</p> @@ -1094,16 +1095,16 @@ $user->setup(); <p>All messages/errors should be outputted by calling <code>trigger_error()</code> using the appropriate message type and language string. Example:</p> <div class="codebox"><pre> -trigger_error('NO_FORUM'); - </pre></div> +trigger_error('NO_FORUM');</pre> + </div> <div class="codebox"><pre> -trigger_error($user->lang['NO_FORUM']); - </pre></div> +trigger_error($user->lang['NO_FORUM']);</pre> + </div> <div class="codebox"><pre> -trigger_error('NO_MODE', E_USER_ERROR); - </pre></div> +trigger_error('NO_MODE', E_USER_ERROR);</pre> + </div> <h4>Url formatting</h4> @@ -1112,8 +1113,8 @@ trigger_error('NO_MODE', E_USER_ERROR); <p>The <code>append_sid()</code> function from 2.0.x is available too, though it does not handle url alterations automatically. Please have a look at the code documentation if you want to get more details on how to use append_sid(). A sample call to append_sid() can look like this:</p> <div class="codebox"><pre> -append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=group&amp;g=' . $row['group_id']) - </pre></div> +append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=group&amp;g=' . $row['group_id'])</pre> + </div> <h4>General function usage: </h4> @@ -1169,14 +1170,14 @@ append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=group&amp; <div class="back2top"><a href="#wrap" class="top">Back to Top</a></div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <hr /> <a name="styling"></a><h2>3. Styling</h2> <div class="paragraph"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> <a name="cfgfiles"></a><h3>3.i. Style Config Files</h3> @@ -1193,8 +1194,8 @@ phpbb_version = 3.1.0 # Parent style # Set value to empty or to this style's name if this style does not have a parent style -parent = prosilver - </pre></div> +parent = prosilver</pre> + </div> <a name="genstyling"></a><h3>3.2. General Styling Rules</h3> <p>Templates should be produced in a consistent manner. Where appropriate they should be based off an existing copy, e.g. index, viewforum or viewtopic (the combination of which implement a range of conditional and variable forms). Please also note that the indentation and coding guidelines also apply to templates where possible.</p> @@ -1252,14 +1253,14 @@ parent = prosilver <div class="back2top"><a href="#wrap" class="top">Back to Top</a></div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <hr /> <a name="templating"></a><h2>4. Templating</h2> <div class="paragraph"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> <a name="templates"></a><h3>4.i. General Templating</h3> @@ -1748,7 +1749,7 @@ This may span multiple lines. <div class="back2top"><a href="#wrap" class="top">Back to Top</a></div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <hr /> @@ -1758,7 +1759,7 @@ This may span multiple lines. <a name="charsets"></a><h2>5. Character Sets and Encodings</h2> <div class="paragraph"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> @@ -1821,7 +1822,7 @@ if (utf8_case_fold_nfc($string1) == utf8_case_fold_nfc($string2)) <div class="back2top"><a href="#wrap" class="top">Back to Top</a></div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <hr /> @@ -1829,7 +1830,7 @@ if (utf8_case_fold_nfc($string1) == utf8_case_fold_nfc($string2)) <a name="translation"></a><h2>6. Translation (<abbr title="Internationalisation">i18n</abbr>/<abbr title="Localisation">L10n</abbr>) Guidelines</h2> <div class="paragraph"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> @@ -2356,8 +2357,8 @@ if (utf8_case_fold_nfc($string1) == utf8_case_fold_nfc($string2)) 'PAGE_OF' => 'Page %s of %s', /* Just grabbing the replacements as they come and hope they are in the right order */ - ... - </pre></div> + ...</pre> + </div> <p>… a clearer way to show explicit replacement ordering is to do:</p> @@ -2366,8 +2367,8 @@ if (utf8_case_fold_nfc($string1) == utf8_case_fold_nfc($string2)) 'PAGE_OF' => 'Page %1$s of %2$s', /* Explicit ordering of the replacements, even if they are the same order as English */ - ... - </pre></div> + ...</pre> + </div> <p>Why bother at all? Because some languages, the string transliterated back to English might read something like:</p> @@ -2376,8 +2377,8 @@ if (utf8_case_fold_nfc($string1) == utf8_case_fold_nfc($string2)) 'PAGE_OF' => 'Total of %2$s pages, currently on page %1$s', /* Explicit ordering of the replacements, reversed compared to English as the total comes first */ - ... - </pre></div> + ...</pre> + </div> <a name="usingplurals"></a><h3>6.iv. Using plurals</h3> @@ -2395,8 +2396,8 @@ if (utf8_case_fold_nfc($string1) == utf8_case_fold_nfc($string2)) <div class="codebox"><pre> ... $user->lang('NUMBER_OF_ELEPHANTS', $number_of_elephants); - ... - </pre></div> + ...</pre> + </div> <p>And the English translation would be:</p> @@ -2407,8 +2408,8 @@ if (utf8_case_fold_nfc($string1) == utf8_case_fold_nfc($string2)) 1 => 'You have 1 elephant', // Singular 2 => 'You have %d elephants', // Plural ), - ... - </pre></div> + ...</pre> + </div> <p>While the Bosnian translation can have more cases:</p> @@ -2420,16 +2421,16 @@ if (utf8_case_fold_nfc($string1) == utf8_case_fold_nfc($string2)) 2 => 'You have %d slona', // Used for 5, 6, 3 => ... ), - ... - </pre></div> + ...</pre> + </div> <p><strong>NOTE:</strong> It is okay to use plurals for an unknown number compared to a single item, when the number is not known and displayed:</p> <div class="codebox"><pre> ... 'MODERATOR' => 'Moderator', // Your board has 1 moderator 'MODERATORS' => 'Moderators', // Your board has multiple moderators - ... - </pre></div> + ...</pre> + </div> <a name="writingstyle"></a><h3>6.v. Writing Style</h3> @@ -2443,8 +2444,8 @@ if (utf8_case_fold_nfc($string1) == utf8_case_fold_nfc($string2)) ... 'CONV_ERROR_NO_AVATAR_PATH' => 'Note to developer: you must specify $convertor['avatar_path'] to use %s.', - ... - </pre></div> + ...</pre> + </div> <p class="good">// Good - Literal straight quotes should be escaped with a backslash, ie: \</p> @@ -2452,8 +2453,8 @@ if (utf8_case_fold_nfc($string1) == utf8_case_fold_nfc($string2)) ... 'CONV_ERROR_NO_AVATAR_PATH' => 'Note to developer: you must specify $convertor[\'avatar_path\'] to use %s.', - ... - </pre></div> + ...</pre> + </div> <p>However, because phpBB3 now uses UTF-8 as its sole encoding, we can actually use this to our advantage and not have to remember to escape a straight quote when we don't have to:</p> @@ -2462,24 +2463,24 @@ if (utf8_case_fold_nfc($string1) == utf8_case_fold_nfc($string2)) <div class="codebox"><pre> ... 'USE_PERMISSIONS' => 'Test out user's permissions', - ... - </pre></div> + ...</pre> + </div> <p class="good">// Okay - However, non-programmers wouldn't type "user\'s" automatically</p> <div class="codebox"><pre> ... 'USE_PERMISSIONS' => 'Test out user\'s permissions', - ... - </pre></div> + ...</pre> + </div> <p class="good">// Best - Use the Unicode Right-Single-Quotation-Mark character</p> <div class="codebox"><pre> ... 'USE_PERMISSIONS' => 'Test out user’s permissions', - ... - </pre></div> + ...</pre> + </div> <p>The <code>"</code> (straight double quote), <code><</code> (less-than sign) and <code>></code> (greater-than sign) characters can all be used as displayed glyphs or as part of HTML markup, for example:</p> @@ -2489,8 +2490,8 @@ if (utf8_case_fold_nfc($string1) == utf8_case_fold_nfc($string2)) ... 'FOO_BAR' => 'PHP version < 5.3.3.<br /> Visit "Downloads" at <a href="http://www.php.net/">www.php.net</a>.', - ... - </pre></div> + ...</pre> + </div> <p class="good">// Okay - No more invalid HTML, but "&quot;" is rather clumsy</p> @@ -2498,8 +2499,8 @@ if (utf8_case_fold_nfc($string1) == utf8_case_fold_nfc($string2)) ... 'FOO_BAR' => 'PHP version &lt; 5.3.3.<br /> Visit &quot;Downloads&quot; at <a href="http://www.php.net/">www.php.net</a>.', - ... - </pre></div> + ...</pre> + </div> <p class="good">// Best - No more invalid HTML, and usage of correct typographical quotation marks</p> @@ -2507,8 +2508,8 @@ if (utf8_case_fold_nfc($string1) == utf8_case_fold_nfc($string2)) ... 'FOO_BAR' => 'PHP version &lt; 5.3.3.<br /> Visit “Downloads” at <a href="http://www.php.net/">www.php.net</a>.', - ... - </pre></div> + ...</pre> + </div> <p>Lastly, the <code>&</code> (ampersand) must always be entitised regardless of where it is used:</p> @@ -2517,16 +2518,16 @@ if (utf8_case_fold_nfc($string1) == utf8_case_fold_nfc($string2)) <div class="codebox"><pre> ... 'FOO_BAR' => '<a href="http://somedomain.tld/?foo=1&bar=2">Foo & Bar</a>.', - ... - </pre></div> + ...</pre> + </div> <p class="good">// Good - Valid HTML, amperands are correctly entitised in all cases</p> <div class="codebox"><pre> ... 'FOO_BAR' => '<a href="http://somedomain.tld/?foo=1&amp;bar=2">Foo &amp; Bar</a>.', - ... - </pre></div> + ...</pre> + </div> <p>As for how these charcters are entered depends very much on choice of Operating System, current language locale/keyboard configuration and native abilities of the text editor used to edit phpBB language files. Please see <a href="http://en.wikipedia.org/wiki/Unicode#Input_methods">http://en.wikipedia.org/wiki/Unicode#Input_methods</a> for more information.</p> @@ -2538,7 +2539,7 @@ if (utf8_case_fold_nfc($string1) == utf8_case_fold_nfc($string2)) <div class="back2top"><a href="#wrap" class="top">Back to Top</a></div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <hr /> @@ -2546,7 +2547,7 @@ if (utf8_case_fold_nfc($string1) == utf8_case_fold_nfc($string2)) <a name="disclaimer"></a><h2>7. Copyright and disclaimer</h2> <div class="paragraph"> - <div class="inner"><span class="corners-top"><span></span></span> + <div class="inner"> <div class="content"> @@ -2556,7 +2557,7 @@ if (utf8_case_fold_nfc($string1) == utf8_case_fold_nfc($string2)) <div class="back2top"><a href="#wrap" class="top">Back to Top</a></div> - <span class="corners-bottom"><span></span></span></div> + </div> </div> <!-- END DOCUMENT --> diff --git a/phpBB/docs/corners_left.gif b/phpBB/docs/corners_left.gif Binary files differdeleted file mode 100644 index 206e50368d..0000000000 --- a/phpBB/docs/corners_left.gif +++ /dev/null diff --git a/phpBB/docs/corners_left.png b/phpBB/docs/corners_left.png Binary files differdeleted file mode 100644 index 256bde3daa..0000000000 --- a/phpBB/docs/corners_left.png +++ /dev/null diff --git a/phpBB/docs/corners_right.gif b/phpBB/docs/corners_right.gif Binary files differdeleted file mode 100644 index 0ba66d50b2..0000000000 --- a/phpBB/docs/corners_right.gif +++ /dev/null diff --git a/phpBB/docs/corners_right.png b/phpBB/docs/corners_right.png Binary files differdeleted file mode 100644 index df41823b4c..0000000000 --- a/phpBB/docs/corners_right.png +++ /dev/null diff --git a/phpBB/docs/events.md b/phpBB/docs/events.md index 8086bc9f43..5c4b6a8d7d 100644 --- a/phpBB/docs/events.md +++ b/phpBB/docs/events.md @@ -177,6 +177,27 @@ acp_ranks_list_header_before * Purpose: Add content after the last header-column (but before the action column) in the ranks list in the ACP +acp_users_profile_before +=== +* Locations: + + adm/style/acp_users_profile.html +* Since: 3.1.4-RC1 +* Purpose: Add content before the profile details when editing a user in the ACP + +acp_users_profile_after +=== +* Locations: + + adm/style/acp_users_profile.html +* Since: 3.1.4-RC1 +* Purpose: Add content after the profile details but before the custom profile fields when editing a user in the ACP + +acp_users_profile_custom_after +=== +* Locations: + + adm/style/acp_users_profile.html +* Since: 3.1.4-RC1 +* Purpose: Add content after the the custom profile fields when editing a user in the ACP + acp_simple_footer_after === * Location: adm/style/simple_footer.html @@ -859,6 +880,13 @@ overall_header_page_body_before * Since: 3.1.0-b3 * Purpose: Add content after the page-header, but before the page-body +overall_header_searchbox_before +=== +* Locations: + + styles/prosilver/template/overall_header.html +* Since: 3.1.4-RC1 +* Purpose: Add content before the search box in the header + overall_header_stylesheets_after === * Locations: @@ -980,6 +1008,22 @@ quickreply_editor_message_before * Since: 3.1.0-a4 * Purpose: Add content before the quick reply textbox +search_results_header_after +=== +* Locations: + + styles/prosilver/template/search_results.html + + styles/subsilver2/template/search_results.html +* Since: 3.1.4-RC1 +* Purpose: Add content after the header of the search results + +search_results_header_before +=== +* Locations: + + styles/prosilver/template/search_results.html + + styles/subsilver2/template/search_results.html +* Since: 3.1.4-RC1 +* Purpose: Add content before the header of the search results. + search_results_post_after === * Locations: @@ -1010,6 +1054,14 @@ search_results_postprofile_before * Since: 3.1.0-b3 * Purpose: Add content directly before the post author in search results (posts view mode) +search_results_searchbox_after +=== +* Locations: + + styles/prosilver/template/search_results.html + + styles/subsilver2/template/search_results.html +* Since: 3.1.4-RC1 +* Purpose: Add content right after the searchbox of the search results. + search_results_topic_after === * Locations: @@ -1235,6 +1287,38 @@ ucp_prefs_view_select_menu_append * Purpose: Add options to the bottom of the drop-down lists block of the Edit Display Options screen +ucp_profile_profile_info_before +=== +* Locations: + + styles/prosilver/template/ucp_profile_profile_info.html + + styles/subsilver2/template/ucp_profile_profile_info.html +* Since: 3.1.4-RC1 +* Purpose: Add options in profile page fieldset - before jabber field. + +ucp_profile_profile_info_after +=== +* Locations: + + styles/prosilver/template/ucp_profile_profile_info.html + + styles/subsilver2/template/ucp_profile_profile_info.html +* Since: 3.1.4-RC1 +* Purpose: Add options in profile page fieldset - after custom profile fields. + +ucp_profile_register_details_before +=== +* Locations: + + styles/prosilver/template/ucp_profile_reg_details.html + + styles/subsilver2/template/ucp_profile_reg_details.html +* Since: 3.1.4-RC1 +* Purpose: Add options in profile page fieldset - before first field. + +ucp_profile_register_details_after +=== +* Locations: + + styles/prosilver/template/ucp_profile_reg_details.html + + styles/subsilver2/template/ucp_profile_reg_details.html +* Since: 3.1.4-RC1 +* Purpose: Add options in profile page fieldset - after confirm password field. + ucp_register_credentials_before === * Locations: @@ -1379,6 +1463,14 @@ viewtopic_print_head_append * Since: 3.1.0-a1 * Purpose: Add asset calls directly before the `</head>` tag of the Print Topic screen +viewtopic_body_pagination_top_after +=== +* Locations: + + styles/prosilver/template/viewtopic_body.html + + styles/subsilver2/template/viewtopic_body.html +* Since: 3.1.4-RC1 +* Purpose: Add content after the pagination at top + viewtopic_body_avatar_after === * Locations: diff --git a/phpBB/docs/site_logo.gif b/phpBB/docs/site_logo.gif Binary files differdeleted file mode 100644 index 909114c377..0000000000 --- a/phpBB/docs/site_logo.gif +++ /dev/null diff --git a/phpBB/faq.php b/phpBB/faq.php index 0b4aa33073..5fe155eab0 100644 --- a/phpBB/faq.php +++ b/phpBB/faq.php @@ -35,8 +35,30 @@ switch ($mode) break; default: - $l_title = $user->lang['FAQ_EXPLAIN']; - $user->add_lang('faq', false, true); + $page_title = $user->lang['FAQ_EXPLAIN']; + $ext_name = $lang_file = ''; + + /** + * You can use this event display a custom help page + * + * @event core.faq_mode_validation + * @var string page_title Title of the page + * @var string mode FAQ that is going to be displayed + * @var string lang_file Language file containing the help data + * @var string ext_name Vendor and extension name where the help + * language file can be loaded from + * @since 3.1.4-RC1 + */ + $vars = array( + 'page_title', + 'mode', + 'lang_file', + 'ext_name', + ); + extract($phpbb_dispatcher->trigger_event('core.faq_mode_validation', compact($vars))); + + $l_title = $page_title; + $user->add_lang(($lang_file) ? $lang_file : 'faq', false, true, $ext_name); break; } diff --git a/phpBB/includes/acp/acp_extensions.php b/phpBB/includes/acp/acp_extensions.php index 89fdc8b863..0c9bc0deab 100644 --- a/phpBB/includes/acp/acp_extensions.php +++ b/phpBB/includes/acp/acp_extensions.php @@ -174,11 +174,6 @@ class acp_extensions trigger_error($user->lang['EXTENSION_NOT_ENABLEABLE'] . adm_back_link($this->u_action), E_USER_WARNING); } - if ($phpbb_extension_manager->is_enabled($ext_name)) - { - redirect($this->u_action); - } - try { while ($phpbb_extension_manager->enable_step($ext_name)) diff --git a/phpBB/includes/acp/acp_profile.php b/phpBB/includes/acp/acp_profile.php index 046281596c..97c1f62077 100644 --- a/phpBB/includes/acp/acp_profile.php +++ b/phpBB/includes/acp/acp_profile.php @@ -460,7 +460,7 @@ class acp_profile if (!$cp->vars[$key] && $action == 'edit') { - $cp->vars[$key] = $$key; + $cp->vars[$key] = ${$key}; } $field_data = $cp->vars; diff --git a/phpBB/includes/acp/acp_prune.php b/phpBB/includes/acp/acp_prune.php index 59f15c4890..6eb213fd7a 100644 --- a/phpBB/includes/acp/acp_prune.php +++ b/phpBB/includes/acp/acp_prune.php @@ -507,7 +507,7 @@ class acp_prune AND ug.user_id <> ' . ANONYMOUS . ' AND u.user_type <> ' . USER_FOUNDER . ' AND ug.user_pending = 0 ' . - ((!empty($user_ids)) ? 'AND ' . $db->sql_in_set('ug.user_id', $user_ids) : '') . ' + ((!empty($user_ids)) ? ' AND ' . $db->sql_in_set('ug.user_id', $user_ids) : '') . ' AND u.user_id = ug.user_id'; $result = $db->sql_query($sql); @@ -533,7 +533,7 @@ class acp_prune FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . ' u WHERE u.user_id <> ' . ANONYMOUS . ' AND u.user_type <> ' . USER_FOUNDER . - ((!empty($user_ids)) ? 'AND ' . $db->sql_in_set('p.poster_id', $user_ids) : '') . ' + ((!empty($user_ids)) ? ' AND ' . $db->sql_in_set('p.poster_id', $user_ids) : '') . ' AND ' . $db->sql_in_set('p.post_visibility', array(ITEM_UNAPPROVED, ITEM_REAPPROVE)) . ' AND u.user_id = p.poster_id GROUP BY p.poster_id diff --git a/phpBB/includes/acp/acp_search.php b/phpBB/includes/acp/acp_search.php index eddc6871f8..9ff999567a 100644 --- a/phpBB/includes/acp/acp_search.php +++ b/phpBB/includes/acp/acp_search.php @@ -449,7 +449,6 @@ class acp_search $search = null; $error = false; - $search_options = ''; foreach ($search_types as $type) { if ($this->init_search($type, $search, $error) || !method_exists($search, 'index_created')) diff --git a/phpBB/includes/acp/acp_users.php b/phpBB/includes/acp/acp_users.php index 3c957a7093..8c17fb6311 100644 --- a/phpBB/includes/acp/acp_users.php +++ b/phpBB/includes/acp/acp_users.php @@ -1414,6 +1414,18 @@ class acp_users $error[] = 'FORM_INVALID'; } + /** + * Validate profile data in ACP before submitting to the database + * + * @event core.acp_users_profile_validate + * @var bool submit Flag indicating if submit button has been pressed + * @var array data Array with user profile data + * @var array error Array with the form errors + * @since 3.1.4-RC1 + */ + $vars = array('submit', 'data', 'error'); + extract($phpbb_dispatcher->trigger_event('core.acp_users_profile_validate', compact($vars))); + if (!sizeof($error)) { $sql_ary = array( @@ -1429,9 +1441,10 @@ class acp_users * @var array data Array with user profile data * @var int user_id The user id * @var array user_row Array with the full user data + * @var array sql_ary Array with sql data * @since 3.1.4-RC1 */ - $vars = array('cp_data', 'data', 'user_id', 'user_row'); + $vars = array('cp_data', 'data', 'user_id', 'user_row', 'sql_ary'); extract($phpbb_dispatcher->trigger_event('core.acp_users_profile_modify_sql_ary', compact($vars))); $sql = 'UPDATE ' . USERS_TABLE . ' diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php index 940484a0ea..573df9e55d 100644 --- a/phpBB/includes/functions.php +++ b/phpBB/includes/functions.php @@ -2920,19 +2920,6 @@ function login_box($redirect = '', $l_explain = '', $l_success = '', $admin = fa // Special cases... determine switch ($result['status']) { - case LOGIN_ERROR_ATTEMPTS: - - $captcha = $phpbb_container->get('captcha.factory')->get_instance($config['captcha_plugin']); - $captcha->init(CONFIRM_LOGIN); - // $captcha->reset(); - - $template->assign_vars(array( - 'CAPTCHA_TEMPLATE' => $captcha->get_template(), - )); - - $err = $user->lang[$result['error_msg']]; - break; - case LOGIN_ERROR_PASSWORD_CONVERT: $err = sprintf( $user->lang[$result['error_msg']], @@ -2943,6 +2930,17 @@ function login_box($redirect = '', $l_explain = '', $l_success = '', $admin = fa ); break; + case LOGIN_ERROR_ATTEMPTS: + + $captcha = $phpbb_container->get('captcha.factory')->get_instance($config['captcha_plugin']); + $captcha->init(CONFIRM_LOGIN); + // $captcha->reset(); + + $template->assign_vars(array( + 'CAPTCHA_TEMPLATE' => $captcha->get_template(), + )); + // no break; + // Username, password, etc... default: $err = $user->lang[$result['error_msg']]; @@ -3347,7 +3345,7 @@ function get_preg_expression($mode) case 'email': // Regex written by James Watts and Francisco Jose Martin Moreno // http://fightingforalostcause.net/misc/2006/compare-email-regex.php - return '([\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+\.)*(?:[\w\!\#$\%\'\*\+\-\/\=\?\^\`{\|\}\~]|&)+@((((([a-z0-9]{1}[a-z0-9\-]{0,62}[a-z0-9]{1})|[a-z])\.)+[a-z]{2,63})|(\d{1,3}\.){3}\d{1,3}(\:\d{1,5})?)'; + return '((?:[\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+\.)*(?:[\w\!\#$\%\'\*\+\-\/\=\?\^\`{\|\}\~]|&)+)@((((([a-z0-9]{1}[a-z0-9\-]{0,62}[a-z0-9]{1})|[a-z])\.)+[a-z]{2,63})|(\d{1,3}\.){3}\d{1,3}(\:\d{1,5})?)'; break; case 'bbcode_htm': @@ -4247,9 +4245,10 @@ function obtain_users_online($item_id = 0, $item = 'forum') */ function obtain_users_online_string($online_users, $item_id = 0, $item = 'forum') { - global $config, $db, $user, $auth; + global $config, $db, $user, $auth, $phpbb_dispatcher; - $user_online_link = $online_userlist = ''; + $guests_online = $hidden_online = $l_online_users = $online_userlist = $visible_online = ''; + $user_online_link = $rowset = array(); // Need caps version of $item for language-strings $item_caps = strtoupper($item); @@ -4259,9 +4258,28 @@ function obtain_users_online_string($online_users, $item_id = 0, $item = 'forum' FROM ' . USERS_TABLE . ' WHERE ' . $db->sql_in_set('user_id', $online_users['online_users']) . ' ORDER BY username_clean ASC'; + + /** + * Modify SQL query to obtain online users data + * + * @event core.obtain_users_online_string_sql + * @var array online_users Array with online users data + * from obtain_users_online() + * @var int item_id Restrict online users to item id + * @var string item Restrict online users to a certain + * session item, e.g. forum for + * session_forum_id + * @var string sql SQL query to obtain users online data + * @since 3.1.4-RC1 + */ + $vars = array('online_users', 'item_id', 'item', 'sql'); + extract($phpbb_dispatcher->trigger_event('core.obtain_users_online_string_sql', compact($vars))); + $result = $db->sql_query($sql); + $rowset = $db->sql_fetchrowset($result); + $db->sql_freeresult($result); - while ($row = $db->sql_fetchrow($result)) + foreach ($rowset as $row) { // User is logged in and therefore not a guest if ($row['user_id'] != ANONYMOUS) @@ -4273,13 +4291,12 @@ function obtain_users_online_string($online_users, $item_id = 0, $item = 'forum' if (!isset($online_users['hidden_users'][$row['user_id']]) || $auth->acl_get('u_viewonline')) { - $user_online_link = get_username_string(($row['user_type'] <> USER_IGNORE) ? 'full' : 'no_profile', $row['user_id'], $row['username'], $row['user_colour']); - $online_userlist .= ($online_userlist != '') ? ', ' . $user_online_link : $user_online_link; + $user_online_link[$row['user_id']] = get_username_string(($row['user_type'] <> USER_IGNORE) ? 'full' : 'no_profile', $row['user_id'], $row['username'], $row['user_colour']); } } } - $db->sql_freeresult($result); } + $online_userlist = implode(', ', $user_online_link); if (!$online_userlist) { @@ -4312,6 +4329,33 @@ function obtain_users_online_string($online_users, $item_id = 0, $item = 'forum' $l_online_users = $user->lang('ONLINE_USERS_TOTAL', (int) $online_users['total_online'], $visible_online, $hidden_online); } + /** + * Modify online userlist data + * + * @event core.obtain_users_online_string_modify + * @var array online_users Array with online users data + * from obtain_users_online() + * @var int item_id Restrict online users to item id + * @var string item Restrict online users to a certain + * session item, e.g. forum for + * session_forum_id + * @var array rowset Array with online users data + * @var array user_online_link Array with online users items (usernames) + * @var string online_userlist String containing users online list + * @var string l_online_users String with total online users count info + * @since 3.1.4-RC1 + */ + $vars = array( + 'online_users', + 'item_id', + 'item', + 'rowset', + 'user_online_link', + 'online_userlist', + 'l_online_users', + ); + extract($phpbb_dispatcher->trigger_event('core.obtain_users_online_string_modify', compact($vars))); + return array( 'online_userlist' => $online_userlist, 'l_online_users' => $l_online_users, diff --git a/phpBB/includes/functions_admin.php b/phpBB/includes/functions_admin.php index b016659541..79f9db2f3f 100644 --- a/phpBB/includes/functions_admin.php +++ b/phpBB/includes/functions_admin.php @@ -618,7 +618,7 @@ function move_posts($post_ids, $topic_id, $auto_sync = true) */ function delete_topics($where_type, $where_ids, $auto_sync = true, $post_count_sync = true, $call_delete_posts = true) { - global $db, $config, $phpbb_container; + global $db, $config, $phpbb_container, $phpbb_dispatcher; $approved_topics = 0; $forum_ids = $topic_ids = array(); @@ -672,6 +672,20 @@ function delete_topics($where_type, $where_ids, $auto_sync = true, $post_count_s $table_ary = array(BOOKMARKS_TABLE, TOPICS_TRACK_TABLE, TOPICS_POSTED_TABLE, POLL_VOTES_TABLE, POLL_OPTIONS_TABLE, TOPICS_WATCH_TABLE, TOPICS_TABLE); + /** + * Perform additional actions before topic(s) deletion + * + * @event core.delete_topics_before_query + * @var array table_ary Array of tables from which all rows will be deleted that hold a topic_id occuring in topic_ids + * @var array topic_ids Array of topic ids to delete + * @since 3.1.4-RC1 + */ + $vars = array( + 'table_ary', + 'topic_ids', + ); + extract($phpbb_dispatcher->trigger_event('core.delete_topics_before_query', compact($vars))); + foreach ($table_ary as $table) { $sql = "DELETE FROM $table @@ -680,6 +694,18 @@ function delete_topics($where_type, $where_ids, $auto_sync = true, $post_count_s } unset($table_ary); + /** + * Perform additional actions after topic(s) deletion + * + * @event core.delete_topics_after_query + * @var array topic_ids Array of topic ids that were deleted + * @since 3.1.4-RC1 + */ + $vars = array( + 'topic_ids', + ); + extract($phpbb_dispatcher->trigger_event('core.delete_topics_after_query', compact($vars))); + $moved_topic_ids = array(); // update the other forums diff --git a/phpBB/includes/functions_content.php b/phpBB/includes/functions_content.php index 87cf34bd9d..6f861b8607 100644 --- a/phpBB/includes/functions_content.php +++ b/phpBB/includes/functions_content.php @@ -78,7 +78,7 @@ function gen_sort_selects(&$limit_days, &$sort_by_text, &$sort_days, &$sort_key, foreach ($sorts as $name => $sort_ary) { $key = $sort_ary['key']; - $selected = $$sort_ary['key']; + $selected = ${$sort_ary['key']}; // Check if the key is selectable. If not, we reset to the default or first key found. // This ensures the values are always valid. We also set $sort_dir/sort_key/etc. to the @@ -87,12 +87,12 @@ function gen_sort_selects(&$limit_days, &$sort_by_text, &$sort_days, &$sort_key, { if ($sort_ary['default'] !== false) { - $selected = $$key = $sort_ary['default']; + $selected = ${$key} = $sort_ary['default']; } else { @reset($sort_ary['options']); - $selected = $$key = key($sort_ary['options']); + $selected = ${$key} = key($sort_ary['options']); } } diff --git a/phpBB/includes/functions_display.php b/phpBB/includes/functions_display.php index 31cf43e599..b62b514293 100644 --- a/phpBB/includes/functions_display.php +++ b/phpBB/includes/functions_display.php @@ -375,6 +375,28 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod get_moderators($forum_moderators, $forum_ids_moderator); } + /** + * Event to perform additional actions before the forum list is being generated + * + * @event core.display_forums_before + * @var array active_forum_ary Array with forum data to display active topics + * @var bool display_moderators Flag indicating if we display forum moderators + * @var array forum_moderators Array with forum moderators list + * @var array forum_rows Data array of all forums we display + * @var bool return_moderators Flag indicating if moderators list should be returned + * @var array root_data Array with the root forum data + * @since 3.1.4-RC1 + */ + $vars = array( + 'active_forum_ary', + 'display_moderators', + 'forum_moderators', + 'forum_rows', + 'return_moderators', + 'root_data', + ); + extract($phpbb_dispatcher->trigger_event('core.display_forums_before', compact($vars))); + // Used to tell whatever we have to create a dummy category or not. $last_catless = true; foreach ($forum_rows as $row) diff --git a/phpBB/includes/functions_mcp.php b/phpBB/includes/functions_mcp.php index 811d49f1de..ed96dcf338 100644 --- a/phpBB/includes/functions_mcp.php +++ b/phpBB/includes/functions_mcp.php @@ -368,7 +368,7 @@ function phpbb_get_pm_data($pm_ids) */ function phpbb_mcp_sorting($mode, &$sort_days, &$sort_key, &$sort_dir, &$sort_by_sql, &$sort_order_sql, &$total, $forum_id = 0, $topic_id = 0, $where_sql = 'WHERE') { - global $db, $user, $auth, $template; + global $db, $user, $auth, $template, $phpbb_dispatcher; $sort_days = request_var('st', 0); $min_time = ($sort_days) ? time() - ($sort_days * 86400) : 0; @@ -553,6 +553,56 @@ function phpbb_mcp_sorting($mode, &$sort_days, &$sort_key, &$sort_dir, &$sort_by break; } + // Default total to -1 to allow editing by the event + $total = -1; + + /** + * This event allows you to control the SQL query used to get the total number + * of reports the user can access. + * + * This total is used for the pagination and for displaying the total number + * of reports to the user + * + * + * @event core.mcp_sorting_query_before + * @var string sql The current SQL search string + * @var string mode An id related to the module(s) the user is viewing + * @var string type Which kind of information is this being used for displaying. Posts, topics, etc... + * @var int forum_id The forum id of the posts the user is trying to access, if not 0 + * @var int topic_id The topic id of the posts the user is trying to access, if not 0 + * @var int sort_days The max age of the oldest report to be shown, in days + * @var string sort_key The way the user has decided to sort the data. + * The valid values must be in the keys of the sort_by_* variables + * @var string sort_dir Either 'd' for "DESC" or 'a' for 'ASC' in the SQL query + * @var int limit_days The possible max ages of the oldest report for the user to choose, in days. + * @var array sort_by_sql SQL text (values) for the possible names of the ways of sorting data (keys). + * @var array sort_by_text Language text (values) for the possible names of the ways of sorting data (keys). + * @var int min_time Integer with the minimum post time that the user is searching for + * @var int limit_time_sql Time limiting options used in the SQL query. + * @var int total The total number of reports that exist. Only set if you want to override the result + * @var string where_sql Extra information included in the WHERE clause. It must end with "WHERE" or "AND" or "OR". + * Set to "WHERE" and set total above -1 to override the total value + * @since 3.1.4-RC1 + */ + $vars = array( + 'sql', + 'mode', + 'type', + 'forum_id', + 'topic_id', + 'sort_days', + 'sort_key', + 'sort_dir', + 'limit_days', + 'sort_by_sql', + 'sort_by_text', + 'min_time', + 'limit_time_sql', + 'total', + 'where_sql', + ); + extract($phpbb_dispatcher->trigger_event('core.mcp_sorting_query_before', compact($vars))); + if (!isset($sort_by_sql[$sort_key])) { $sort_key = $default_key; @@ -584,7 +634,7 @@ function phpbb_mcp_sorting($mode, &$sort_days, &$sort_key, &$sort_dir, &$sort_by $total = (int) $db->sql_fetchfield('total'); $db->sql_freeresult($result); } - else + else if ($total < -1) { $total = -1; } diff --git a/phpBB/includes/functions_messenger.php b/phpBB/includes/functions_messenger.php index 045e555d05..fbac3e6f1d 100644 --- a/phpBB/includes/functions_messenger.php +++ b/phpBB/includes/functions_messenger.php @@ -510,7 +510,7 @@ class messenger foreach ($address_ary as $which_ary) { - $$type .= (($$type != '') ? ', ' : '') . (($which_ary['name'] != '') ? mail_encode($which_ary['name'], $encode_eol) . ' <' . $which_ary['email'] . '>' : $which_ary['email']); + ${$type} .= ((${$type} != '') ? ', ' : '') . (($which_ary['name'] != '') ? mail_encode($which_ary['name'], $encode_eol) . ' <' . $which_ary['email'] . '>' : $which_ary['email']); } } diff --git a/phpBB/includes/functions_posting.php b/phpBB/includes/functions_posting.php index f3c49badfe..a06d6f4c35 100644 --- a/phpBB/includes/functions_posting.php +++ b/phpBB/includes/functions_posting.php @@ -1036,7 +1036,7 @@ function load_drafts($topic_id = 0, $forum_id = 0, $id = 0, $pm_action = '', $ms */ function topic_review($topic_id, $forum_id, $mode = 'topic_review', $cur_post_id = 0, $show_quote_button = true) { - global $user, $auth, $db, $template, $bbcode, $cache; + global $user, $auth, $db, $template, $cache; global $config, $phpbb_root_path, $phpEx, $phpbb_container, $phpbb_dispatcher; $phpbb_content_visibility = $phpbb_container->get('content.visibility'); @@ -1094,13 +1094,11 @@ function topic_review($topic_id, $forum_id, $mode = 'topic_review', $cur_post_id $sql = $db->sql_build_query('SELECT', $sql_ary); $result = $db->sql_query($sql); - $bbcode_bitfield = ''; $rowset = array(); $has_attachments = false; while ($row = $db->sql_fetchrow($result)) { $rowset[$row['post_id']] = $row; - $bbcode_bitfield = $bbcode_bitfield | base64_decode($row['bbcode_bitfield']); if ($row['post_attachment']) { @@ -1109,13 +1107,6 @@ function topic_review($topic_id, $forum_id, $mode = 'topic_review', $cur_post_id } $db->sql_freeresult($result); - // Instantiate BBCode class - if (!isset($bbcode) && $bbcode_bitfield !== '') - { - include_once($phpbb_root_path . 'includes/bbcode.' . $phpEx); - $bbcode = new bbcode(base64_encode($bbcode_bitfield)); - } - // Grab extensions $extensions = $attachments = array(); if ($has_attachments && $auth->acl_get('u_download') && $auth->acl_get('f_download', $forum_id)) diff --git a/phpBB/includes/functions_privmsgs.php b/phpBB/includes/functions_privmsgs.php index 838c6a0fec..8e1561b842 100644 --- a/phpBB/includes/functions_privmsgs.php +++ b/phpBB/includes/functions_privmsgs.php @@ -1415,9 +1415,9 @@ function rebuild_header($check_ary) $_types = array('u', 'g'); foreach ($_types as $type) { - if (sizeof($$type)) + if (sizeof(${$type})) { - foreach ($$type as $id) + foreach (${$type} as $id) { $address[$type][$id] = $check_type; } @@ -1957,7 +1957,7 @@ function submit_pm($mode, $subject, &$data, $put_in_outbox = true) */ function message_history($msg_id, $user_id, $message_row, $folder, $in_post_mode = false) { - global $db, $user, $config, $template, $phpbb_root_path, $phpEx, $auth, $bbcode; + global $db, $user, $config, $template, $phpbb_root_path, $phpEx, $auth; // Select all receipts and the author from the pm we currently view, to only display their pm-history $sql = 'SELECT author_id, user_id @@ -2009,7 +2009,6 @@ function message_history($msg_id, $user_id, $message_row, $folder, $in_post_mode $title = $row['message_subject']; $rowset = array(); - $bbcode_bitfield = ''; $folder_url = append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm') . '&folder='; do @@ -2025,7 +2024,6 @@ function message_history($msg_id, $user_id, $message_row, $folder, $in_post_mode else { $rowset[$row['msg_id']] = $row; - $bbcode_bitfield = $bbcode_bitfield | base64_decode($row['bbcode_bitfield']); } } while ($row = $db->sql_fetchrow($result)); @@ -2036,16 +2034,6 @@ function message_history($msg_id, $user_id, $message_row, $folder, $in_post_mode return false; } - // Instantiate BBCode class - if ((empty($bbcode) || $bbcode === false) && $bbcode_bitfield !== '') - { - if (!class_exists('bbcode')) - { - include($phpbb_root_path . 'includes/bbcode.' . $phpEx); - } - $bbcode = new bbcode(base64_encode($bbcode_bitfield)); - } - $title = censor_text($title); $url = append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm'); diff --git a/phpBB/includes/functions_user.php b/phpBB/includes/functions_user.php index 83f6e44453..9cd662027e 100644 --- a/phpBB/includes/functions_user.php +++ b/phpBB/includes/functions_user.php @@ -44,13 +44,13 @@ function user_get_id_name(&$user_id_ary, &$username_ary, $user_type = false) $which_ary = ($user_id_ary) ? 'user_id_ary' : 'username_ary'; - if ($$which_ary && !is_array($$which_ary)) + if (${$which_ary} && !is_array(${$which_ary})) { - $$which_ary = array($$which_ary); + ${$which_ary} = array(${$which_ary}); } - $sql_in = ($which_ary == 'user_id_ary') ? array_map('intval', $$which_ary) : array_map('utf8_clean_string', $$which_ary); - unset($$which_ary); + $sql_in = ($which_ary == 'user_id_ary') ? array_map('intval', ${$which_ary}) : array_map('utf8_clean_string', ${$which_ary}); + unset(${$which_ary}); $user_id_ary = $username_ary = array(); @@ -398,7 +398,7 @@ function user_add($user_row, $cp_data = false, $notifications_data = null) */ function user_delete($mode, $user_ids, $retain_username = true) { - global $cache, $config, $db, $user, $phpbb_dispatcher; + global $cache, $config, $db, $user, $phpbb_dispatcher, $phpbb_container; global $phpbb_root_path, $phpEx; $db->sql_transaction('begin'); @@ -672,6 +672,9 @@ function user_delete($mode, $user_ids, $retain_username = true) } phpbb_delete_users_pms($user_ids); + $phpbb_notifications = $phpbb_container->get('notification_manager'); + $phpbb_notifications->delete_notifications('notification.type.admin_activate_user', $user_ids); + $db->sql_transaction('commit'); /** diff --git a/phpBB/includes/mcp/mcp_topic.php b/phpBB/includes/mcp/mcp_topic.php index 3a456169d5..8347830d0f 100644 --- a/phpBB/includes/mcp/mcp_topic.php +++ b/phpBB/includes/mcp/mcp_topic.php @@ -147,21 +147,13 @@ function mcp_topic_view($id, $mode, $action) $result = $db->sql_query_limit($sql, $posts_per_page, $start); $rowset = $post_id_list = array(); - $bbcode_bitfield = ''; while ($row = $db->sql_fetchrow($result)) { $rowset[] = $row; $post_id_list[] = $row['post_id']; - $bbcode_bitfield = $bbcode_bitfield | base64_decode($row['bbcode_bitfield']); } $db->sql_freeresult($result); - if ($bbcode_bitfield !== '') - { - include_once($phpbb_root_path . 'includes/bbcode.' . $phpEx); - $bbcode = new bbcode(base64_encode($bbcode_bitfield)); - } - $topic_tracking_info = array(); // Get topic tracking info @@ -267,6 +259,8 @@ function mcp_topic_view($id, $mode, $action) * @var int current_row_number Number of the post on this page * @var array post_row Template block array of the current post * @var array row Array with original post and user data + * @var array topic_info Array with topic data + * @var int total Total posts count * @since 3.1.4-RC1 */ $vars = array( @@ -278,6 +272,8 @@ function mcp_topic_view($id, $mode, $action) 'current_row_number', 'post_row', 'row', + 'topic_info', + 'total', ); extract($phpbb_dispatcher->trigger_event('core.mcp_topic_review_modify_row', compact($vars))); diff --git a/phpBB/includes/ucp/ucp_pm_compose.php b/phpBB/includes/ucp/ucp_pm_compose.php index f3b59186a6..51018e3a5d 100644 --- a/phpBB/includes/ucp/ucp_pm_compose.php +++ b/phpBB/includes/ucp/ucp_pm_compose.php @@ -90,6 +90,32 @@ function compose_pm($id, $mode, $action, $user_folders = array()) // we include the language file here $user->add_lang('viewtopic'); + /** + * Modify the default vars before composing a PM + * + * @event core.ucp_pm_compose_modify_data + * @var int msg_id post_id in the page request + * @var int to_user_id The id of whom the message is to + * @var int to_group_id The id of the group the message is to + * @var bool submit Whether the form has been submitted + * @var bool preview Whether the user is previewing the PM or not + * @var string action One of: post, reply, quote, forward, quotepost, edit, delete, smilies + * @var bool delete Whether the user is deleting the PM + * @var int reply_to_all Value of reply_to_all request variable. + * @since 3.1.4-RC1 + */ + $vars = array( + 'msg_id', + 'to_user_id', + 'to_group_id', + 'submit', + 'preview', + 'action', + 'delete', + 'reply_to_all', + ); + extract($phpbb_dispatcher->trigger_event('core.ucp_pm_compose_modify_data', compact($vars))); + // Output PM_TO box if message composing if ($action != 'edit') { diff --git a/phpBB/includes/ucp/ucp_pm_viewmessage.php b/phpBB/includes/ucp/ucp_pm_viewmessage.php index 888c2e6825..d81c4ce7fe 100644 --- a/phpBB/includes/ucp/ucp_pm_viewmessage.php +++ b/phpBB/includes/ucp/ucp_pm_viewmessage.php @@ -53,15 +53,6 @@ function view_message($id, $mode, $folder_id, $msg_id, $folder, $message_row) // Grab icons $icons = $cache->obtain_icons(); - $bbcode = false; - - // Instantiate BBCode if need be - if ($message_row['bbcode_bitfield']) - { - include($phpbb_root_path . 'includes/bbcode.' . $phpEx); - $bbcode = new bbcode($message_row['bbcode_bitfield']); - } - // Load the custom profile fields if ($config['load_cpf_pm']) { diff --git a/phpBB/includes/ucp/ucp_profile.php b/phpBB/includes/ucp/ucp_profile.php index c1cdcf88ca..8d8d42e742 100644 --- a/phpBB/includes/ucp/ucp_profile.php +++ b/phpBB/includes/ucp/ucp_profile.php @@ -114,6 +114,18 @@ class ucp_profile $error[] = 'FORM_INVALID'; } + /** + * Validate user data on editing registration data in UCP + * + * @event core.ucp_profile_reg_details_validate + * @var array data Array with user profile data + * @var bool submit Flag indicating if submit button has been pressed + * @var array error Array of any generated errors + * @since 3.1.4-RC1 + */ + $vars = array('data', 'submit', 'error'); + extract($phpbb_dispatcher->trigger_event('core.ucp_profile_reg_details_validate', compact($vars))); + if (!sizeof($error)) { $sql_ary = array( @@ -353,6 +365,18 @@ class ucp_profile $error[] = 'FORM_INVALID'; } + /** + * Validate user data on editing profile in UCP + * + * @event core.ucp_profile_validate_profile_info + * @var array data Array with user profile data + * @var bool submit Flag indicating if submit button has been pressed + * @var array error Array of any generated errors + * @since 3.1.4-RC1 + */ + $vars = array('data', 'submit', 'error'); + extract($phpbb_dispatcher->trigger_event('core.ucp_profile_validate_profile_info', compact($vars))); + if (!sizeof($error)) { $data['notify'] = $user->data['user_notify_type']; @@ -380,9 +404,10 @@ class ucp_profile * @event core.ucp_profile_info_modify_sql_ary * @var array cp_data Array with the user custom profile fields data * @var array data Array with user profile data + * @var array sql_ary user options data we update * @since 3.1.4-RC1 */ - $vars = array('cp_data', 'data'); + $vars = array('cp_data', 'data', 'sql_ary'); extract($phpbb_dispatcher->trigger_event('core.ucp_profile_info_modify_sql_ary', compact($vars))); $sql = 'UPDATE ' . USERS_TABLE . ' diff --git a/phpBB/includes/ucp/ucp_register.php b/phpBB/includes/ucp/ucp_register.php index 14f6a8bc02..0ee45b0706 100644 --- a/phpBB/includes/ucp/ucp_register.php +++ b/phpBB/includes/ucp/ucp_register.php @@ -30,7 +30,7 @@ class ucp_register function main($id, $mode) { global $config, $db, $user, $auth, $template, $phpbb_root_path, $phpEx; - global $request, $phpbb_container; + global $request, $phpbb_container, $phpbb_dispatcher; // if ($config['require_activation'] == USER_ACTIVATION_DISABLE || @@ -197,6 +197,19 @@ class ucp_register 'lang' => basename(request_var('lang', $user->lang_name)), 'tz' => request_var('tz', $timezone), ); + /** + * Add UCP register data before they are assigned to the template or submitted + * + * To assign data to the template, use $template->assign_vars() + * + * @event core.ucp_register_data_before + * @var bool submit Do we display the form only + * or did the user press submit + * @var array data Array with current ucp registration data + * @since 3.1.4-RC1 + */ + $vars = array('submit', 'data'); + extract($phpbb_dispatcher->trigger_event('core.ucp_register_data_before', compact($vars))); // Check and initialize some variables if needed if ($submit) @@ -257,6 +270,19 @@ class ucp_register $error[] = $user->lang['NEW_PASSWORD_ERROR']; } } + /** + * Check UCP registration data after they are submitted + * + * @event core.ucp_register_data_after + * @var bool submit Do we display the form only + * or did the user press submit + * @var array data Array with current ucp registration data + * @var array cp_data Array with custom profile fields data + * @var array error Array with list of errors + * @since 3.1.4-RC1 + */ + $vars = array('submit', 'data', 'cp_data', 'error'); + extract($phpbb_dispatcher->trigger_event('core.ucp_register_data_after', compact($vars))); if (!sizeof($error)) { @@ -319,6 +345,20 @@ class ucp_register { $user_row['user_new'] = 1; } + /** + * Add into $user_row before user_add + * + * user_add allows adding more data into the users table + * + * @event core.ucp_register_user_row_after + * @var bool submit Do we display the form only + * or did the user press submit + * @var array cp_data Array with custom profile fields data + * @var array user_row Array with current ucp registration data + * @since 3.1.4-RC1 + */ + $vars = array('submit', 'cp_data', 'user_row'); + extract($phpbb_dispatcher->trigger_event('core.ucp_register_user_row_after', compact($vars))); // Register user... $user_id = user_add($user_row, $cp_data); diff --git a/phpBB/install/install_convert.php b/phpBB/install/install_convert.php index 6a892a7373..e16c79474b 100644 --- a/phpBB/install/install_convert.php +++ b/phpBB/install/install_convert.php @@ -599,7 +599,7 @@ class install_convert extends module 'S_EXPLAIN' => $vars['explain'], 'S_LEGEND' => false, 'TITLE_EXPLAIN' => ($vars['explain']) ? $lang[$vars['lang'] . '_EXPLAIN'] : '', - 'CONTENT' => $this->p_master->input_field($config_key, $vars['type'], $$config_key, $options), + 'CONTENT' => $this->p_master->input_field($config_key, $vars['type'], ${$config_key}, $options), ) ); } diff --git a/phpBB/language/en/email/short/newtopic_notify.txt b/phpBB/language/en/email/short/newtopic_notify.txt index bf6799e5be..5089e7dcb8 100644 --- a/phpBB/language/en/email/short/newtopic_notify.txt +++ b/phpBB/language/en/email/short/newtopic_notify.txt @@ -2,7 +2,7 @@ Subject: New topic notification - "{FORUM_NAME}" Hello {USERNAME}, -You are receiving this notification because you are watching the forum "{FORUM_NAME}" at "{SITENAME}". This forum has received a new topic<!-- IF AUTHOR_NAME --> by {AUTHOR_NAME}<!-- ENDIF --> since your last visit, "{TOPIC_TITLE}". You can use the following link to view the forum, no more notifications will be sent until you visit the forum. +You are receiving this notification because you are watching the forum "{FORUM_NAME}" at "{SITENAME}". This forum has received a new topic<!-- IF AUTHOR_NAME !== '' --> by {AUTHOR_NAME}<!-- ENDIF --> since your last visit, "{TOPIC_TITLE}". You can use the following link to view the forum, no more notifications will be sent until you visit the forum. {U_FORUM} diff --git a/phpBB/language/en/email/short/topic_notify.txt b/phpBB/language/en/email/short/topic_notify.txt index 472375fb22..529478eae2 100644 --- a/phpBB/language/en/email/short/topic_notify.txt +++ b/phpBB/language/en/email/short/topic_notify.txt @@ -2,7 +2,7 @@ Subject: Topic reply notification - "{TOPIC_TITLE}" Hello {USERNAME}, -You are receiving this notification because you are watching the topic "{TOPIC_TITLE}" at "{SITENAME}". This topic has received a reply<!-- IF AUTHOR_NAME --> by {AUTHOR_NAME}<!-- ENDIF --> since your last visit. You can use the following link to view the replies made, no more notifications will be sent until you visit the topic. +You are receiving this notification because you are watching the topic "{TOPIC_TITLE}" at "{SITENAME}". This topic has received a reply<!-- IF AUTHOR_NAME !== '' --> by {AUTHOR_NAME}<!-- ENDIF --> since your last visit. You can use the following link to view the replies made, no more notifications will be sent until you visit the topic. If you want to view the newest post made since your last visit, click the following link: {U_NEWEST_POST} diff --git a/phpBB/language/en/help_faq.php b/phpBB/language/en/help_faq.php index 69cb70df62..8f08ac1cd3 100644 --- a/phpBB/language/en/help_faq.php +++ b/phpBB/language/en/help_faq.php @@ -41,7 +41,7 @@ $help = array( ), array( 0 => 'What is COPPA?', - 1 => 'COPPA, or the Children’s Online Privacy Protection Act of 1998, is a law in the United States requiring websites which can potentially collect information from minors under the age of 13 to have written parental consent or some other method of legal guardian acknowledgment, allowing the collection of personally identifiable information from a minor under the age of 13. If you are unsure if this applies to you as someone trying to register or to the website you are trying to register on, contact legal counsel for assistance. Please note that phpBB Limited and the owner’s of this board cannot provide legal advice and is not a point of contact for legal concerns of any kind, except as outlined in question “Who do I contact about abusive and/or legal matters related to this board?”.', + 1 => 'COPPA, or the Children’s Online Privacy Protection Act of 1998, is a law in the United States requiring websites which can potentially collect information from minors under the age of 13 to have written parental consent or some other method of legal guardian acknowledgment, allowing the collection of personally identifiable information from a minor under the age of 13. If you are unsure if this applies to you as someone trying to register or to the website you are trying to register on, contact legal counsel for assistance. Please note that phpBB Limited and the owners of this board cannot provide legal advice and is not a point of contact for legal concerns of any kind, except as outlined in question “Who do I contact about abusive and/or legal matters related to this board?”.', ), array( 0 => 'Why can’t I register?', diff --git a/phpBB/phpbb/auth/provider/ldap.php b/phpBB/phpbb/auth/provider/ldap.php index d32e7504eb..c71950c698 100644 --- a/phpBB/phpbb/auth/provider/ldap.php +++ b/phpBB/phpbb/auth/provider/ldap.php @@ -306,7 +306,7 @@ class ldap extends \phpbb\auth\provider\base return array( 'TEMPLATE_FILE' => 'auth_provider_ldap.html', 'TEMPLATE_VARS' => array( - 'AUTH_LDAP_DN' => $new_config['ldap_base_dn'], + 'AUTH_LDAP_BASE_DN' => $new_config['ldap_base_dn'], 'AUTH_LDAP_EMAIL' => $new_config['ldap_email'], 'AUTH_LDAP_PASSORD' => $new_config['ldap_password'], 'AUTH_LDAP_PORT' => $new_config['ldap_port'], diff --git a/phpBB/phpbb/cache/driver/file.php b/phpBB/phpbb/cache/driver/file.php index fd5bce4515..9a7c4aec7f 100644 --- a/phpBB/phpbb/cache/driver/file.php +++ b/phpBB/phpbb/cache/driver/file.php @@ -279,6 +279,7 @@ class file extends \phpbb\cache\driver\base if ($var_name[0] == '_') { global $phpEx; + $var_name = $this->clean_varname($var_name); return file_exists($this->cache_dir . 'data' . $var_name . ".$phpEx"); } else @@ -334,6 +335,7 @@ class file extends \phpbb\cache\driver\base { global $phpEx; + $filename = $this->clean_varname($filename); $file = "{$this->cache_dir}$filename.$phpEx"; $type = substr($filename, 0, strpos($filename, '_')); @@ -516,6 +518,7 @@ class file extends \phpbb\cache\driver\base { global $phpEx; + $filename = $this->clean_varname($filename); $file = "{$this->cache_dir}$filename.$phpEx"; $lock = new \phpbb\lock\flock($file); @@ -584,4 +587,15 @@ class file extends \phpbb\cache\driver\base return $return_value; } + + /** + * Replace slashes in the file name + * + * @param string $varname name of a cache variable + * @return string $varname name that is safe to use as a filename + */ + protected function clean_varname($varname) + { + return str_replace('/', '-', $varname); + } } diff --git a/phpBB/phpbb/content_visibility.php b/phpBB/phpbb/content_visibility.php index c8516d6c85..700009da6a 100644 --- a/phpBB/phpbb/content_visibility.php +++ b/phpBB/phpbb/content_visibility.php @@ -45,7 +45,7 @@ class content_visibility /** * Event dispatcher object - * @var \phpbb\event\dispatcher + * @var \phpbb\event\dispatcher_interface */ protected $phpbb_dispatcher; @@ -66,7 +66,7 @@ class content_visibility * * @param \phpbb\auth\auth $auth Auth object * @param \phpbb\config\config $config Config object - * @param \phpbb\event\dispatcher $phpbb_dispatcher Event dispatcher object + * @param \phpbb\event\dispatcher_interface $phpbb_dispatcher Event dispatcher object * @param \phpbb\db\driver\driver_interface $db Database object * @param \phpbb\user $user User object * @param string $phpbb_root_path Root path @@ -76,7 +76,7 @@ class content_visibility * @param string $topics_table Topics table name * @param string $users_table Users table name */ - public function __construct(\phpbb\auth\auth $auth, \phpbb\config\config $config, \phpbb\event\dispatcher $phpbb_dispatcher, \phpbb\db\driver\driver_interface $db, \phpbb\user $user, $phpbb_root_path, $php_ext, $forums_table, $posts_table, $topics_table, $users_table) + public function __construct(\phpbb\auth\auth $auth, \phpbb\config\config $config, \phpbb\event\dispatcher_interface $phpbb_dispatcher, \phpbb\db\driver\driver_interface $db, \phpbb\user $user, $phpbb_root_path, $php_ext, $forums_table, $posts_table, $topics_table, $users_table) { $this->auth = $auth; $this->config = $config; @@ -143,12 +143,43 @@ class content_visibility */ public function get_visibility_sql($mode, $forum_id, $table_alias = '') { + $where_sql = ''; + + $get_visibility_sql_overwrite = false; + + /** + * Allow changing the result of calling get_visibility_sql + * + * @event core.phpbb_content_visibility_get_visibility_sql_before + * @var string where_sql Extra visibility conditions. It must end with either an SQL "AND" or an "OR" + * @var string mode Either "topic" or "post" depending on the query this is being used in + * @var array forum_id The forum id in which the search is made. + * @var string table_alias Table alias to prefix in SQL queries + * @var mixed get_visibility_sql_overwrite If a string, forces the function to return get_forums_visibility_sql_overwrite after executing the event + * If false, get_visibility_sql continues normally + * It must be either boolean or string + * @since 3.1.4-RC1 + */ + $vars = array( + 'where_sql', + 'mode', + 'forum_id', + 'table_alias', + 'get_visibility_sql_overwrite', + ); + extract($this->phpbb_dispatcher->trigger_event('core.phpbb_content_visibility_get_visibility_sql_before', compact($vars))); + + if ($get_visibility_sql_overwrite !== false) + { + return $get_visibility_sql_overwrite; + } + if ($this->auth->acl_get('m_approve', $forum_id)) { - return '1 = 1'; + return $where_sql . '1 = 1'; } - return $table_alias . $mode . '_visibility = ' . ITEM_APPROVED; + return $where_sql . $table_alias . $mode . '_visibility = ' . ITEM_APPROVED; } /** @@ -252,7 +283,7 @@ class content_visibility * @event core.phpbb_content_visibility_get_global_visibility_before * @var array where_sqls The action the user tried to execute * @var string mode Either "topic" or "post" depending on the query this is being used in - * @var array forum_ids Array of forum ids which the posts/topics are limited to + * @var array exclude_forum_ids Array of forum ids the current user doesn't have access to * @var string table_alias Table alias to prefix in SQL queries * @var array approve_forums Array of forums where the user has m_approve permissions * @var string visibility_sql_overwrite Forces the function to return an implosion of where_sqls (joined by "OR") @@ -261,7 +292,7 @@ class content_visibility $vars = array( 'where_sqls', 'mode', - 'forum_ids', + 'exclude_forum_ids', 'table_alias', 'approve_forums', 'visibility_sql_overwrite', diff --git a/phpBB/phpbb/db/driver/mysqli.php b/phpBB/phpbb/db/driver/mysqli.php index 2ed08211ad..c0ddfbf76c 100644 --- a/phpBB/phpbb/db/driver/mysqli.php +++ b/phpBB/phpbb/db/driver/mysqli.php @@ -34,8 +34,7 @@ class mysqli extends \phpbb\db\driver\mysql_base return $this->sql_error(''); } - // Mysqli extension supports persistent connection since PHP 5.3.0 - $this->persistency = (version_compare(PHP_VERSION, '5.3.0', '>=')) ? $persistency : false; + $this->persistency = $persistency; $this->user = $sqluser; // If persistent connection, set dbhost to localhost when empty and prepend it with 'p:' prefix diff --git a/phpBB/phpbb/event/kernel_terminate_subscriber.php b/phpBB/phpbb/event/kernel_terminate_subscriber.php index 57e4840380..3a709f73fd 100644 --- a/phpBB/phpbb/event/kernel_terminate_subscriber.php +++ b/phpBB/phpbb/event/kernel_terminate_subscriber.php @@ -35,7 +35,7 @@ class kernel_terminate_subscriber implements EventSubscriberInterface public static function getSubscribedEvents() { return array( - KernelEvents::TERMINATE => 'on_kernel_terminate', + KernelEvents::TERMINATE => array('on_kernel_terminate', ~PHP_INT_MAX), ); } } diff --git a/phpBB/phpbb/file_downloader.php b/phpBB/phpbb/file_downloader.php index ca8b1f4534..462b87ca51 100644 --- a/phpBB/phpbb/file_downloader.php +++ b/phpBB/phpbb/file_downloader.php @@ -91,7 +91,7 @@ class file_downloader } else { - throw new \RuntimeException('FSOCK_DISABLED'); + throw new \phpbb\exception\runtime_exception('FSOCK_DISABLED'); } } diff --git a/phpBB/phpbb/notification/manager.php b/phpBB/phpbb/notification/manager.php index aa52eb61d0..db92170dd8 100644 --- a/phpBB/phpbb/notification/manager.php +++ b/phpBB/phpbb/notification/manager.php @@ -38,7 +38,7 @@ class manager /** @var \phpbb\config\config */ protected $config; - /** @var \phpbb\event\dispatcher */ + /** @var \phpbb\event\dispatcher_interface */ protected $phpbb_dispatcher; /** @var \phpbb\db\driver\driver_interface */ @@ -73,7 +73,7 @@ class manager * @param ContainerInterface $phpbb_container * @param \phpbb\user_loader $user_loader * @param \phpbb\config\config $config - * @param \phpbb\event\dispatcher $phpbb_dispatcher + * @param \phpbb\event\dispatcher_interface $phpbb_dispatcher * @param \phpbb\db\driver\driver_interface $db * @param \phpbb\cache\service $cache * @param \phpbb\user $user @@ -85,7 +85,7 @@ class manager * * @return \phpbb\notification\manager */ - public function __construct($notification_types, $notification_methods, ContainerInterface $phpbb_container, \phpbb\user_loader $user_loader, \phpbb\config\config $config, \phpbb\event\dispatcher $phpbb_dispatcher, \phpbb\db\driver\driver_interface $db, \phpbb\cache\service $cache, $user, $phpbb_root_path, $php_ext, $notification_types_table, $notifications_table, $user_notifications_table) + public function __construct($notification_types, $notification_methods, ContainerInterface $phpbb_container, \phpbb\user_loader $user_loader, \phpbb\config\config $config, \phpbb\event\dispatcher_interface $phpbb_dispatcher, \phpbb\db\driver\driver_interface $db, \phpbb\cache\service $cache, $user, $phpbb_root_path, $php_ext, $notification_types_table, $notifications_table, $user_notifications_table) { $this->notification_types = $notification_types; $this->notification_methods = $notification_methods; diff --git a/phpBB/phpbb/plupload/plupload.php b/phpBB/phpbb/plupload/plupload.php index 3c686a552f..fcce5b3bd8 100644 --- a/phpBB/phpbb/plupload/plupload.php +++ b/phpBB/phpbb/plupload/plupload.php @@ -326,7 +326,7 @@ class plupload $tmp_file = $this->temporary_filepath($upload['tmp_name']); - if (!move_uploaded_file($upload['tmp_name'], $tmp_file)) + if (!phpbb_is_writable($this->temporary_directory) || !move_uploaded_file($upload['tmp_name'], $tmp_file)) { $this->emit_error(103, 'PLUPLOAD_ERR_MOVE_UPLOADED'); } diff --git a/phpBB/phpbb/search/fulltext_native.php b/phpBB/phpbb/search/fulltext_native.php index 93ea46ca60..4d02dd1cbf 100644 --- a/phpBB/phpbb/search/fulltext_native.php +++ b/phpBB/phpbb/search/fulltext_native.php @@ -823,6 +823,13 @@ class fulltext_native extends \phpbb\search\base ); } + // if using mysql and the total result count is not calculated yet, get it from the db + if (!$total_results && $is_mysql) + { + // Also count rows for the query as if there was not LIMIT. Add SQL_CALC_FOUND_ROWS to SQL + $sql_array['SELECT'] = 'SQL_CALC_FOUND_ROWS ' . $sql_array['SELECT']; + } + $sql_array['WHERE'] = implode(' AND ', $sql_where); $sql_array['GROUP_BY'] = ($group_by) ? (($type == 'posts') ? 'p.post_id' : 'p.topic_id') . ', ' . $sort_by_sql[$sort_key] : ''; $sql_array['ORDER_BY'] = $sql_sort; @@ -838,19 +845,9 @@ class fulltext_native extends \phpbb\search\base } $this->db->sql_freeresult($result); - // if we use mysql and the total result count is not cached yet, retrieve it from the db if (!$total_results && $is_mysql) { - // Count rows for the executed queries. Replace $select within $sql with SQL_CALC_FOUND_ROWS, and run it - $sql_array_copy = $sql_array; - $sql_array_copy['SELECT'] = 'SQL_CALC_FOUND_ROWS p.post_id '; - - $sql_calc = $this->db->sql_build_query('SELECT', $sql_array_copy); - unset($sql_array_copy); - - $this->db->sql_query($sql_calc); - $this->db->sql_freeresult($result); - + // Get the number of results as calculated by MySQL $sql_count = 'SELECT FOUND_ROWS() as total_results'; $result = $this->db->sql_query($sql_count); $total_results = (int) $this->db->sql_fetchfield('total_results'); diff --git a/phpBB/phpbb/session.php b/phpBB/phpbb/session.php index 0a6a18ffbe..bedd581725 100644 --- a/phpBB/phpbb/session.php +++ b/phpBB/phpbb/session.php @@ -130,6 +130,10 @@ class session $script_path .= (substr($script_path, -1, 1) == '/') ? '' : '/'; $root_script_path .= (substr($root_script_path, -1, 1) == '/') ? '' : '/'; + $forum_id = $request->variable('f', 0); + // maximum forum id value is maximum value of mediumint unsigned column + $forum_id = ($forum_id > 0 && $forum_id < 16777215) ? $forum_id : 0; + $page_array += array( 'page_name' => $page_name, 'page_dir' => $page_dir, @@ -139,7 +143,7 @@ class session 'root_script_path' => str_replace(' ', '%20', htmlspecialchars($root_script_path)), 'page' => $page, - 'forum' => request_var('f', 0), + 'forum' => $forum_id, ); return $page_array; diff --git a/phpBB/posting.php b/phpBB/posting.php index ac412c0c73..a65ba46fc9 100644 --- a/phpBB/posting.php +++ b/phpBB/posting.php @@ -1517,9 +1517,13 @@ if (!sizeof($error) && $preview) 'L_MAX_VOTES' => $user->lang('MAX_OPTIONS_SELECT', (int) $post_data['poll_max_options']), )); - $parse_poll->message = implode("\n", $post_data['poll_options']); - $parse_poll->format_display($post_data['enable_bbcode'], $post_data['enable_urls'], $post_data['enable_smilies']); - $preview_poll_options = explode('<br />', $parse_poll->message); + $preview_poll_options = array(); + foreach ($post_data['poll_options'] as $poll_option) + { + $parse_poll->message = $poll_option; + $parse_poll->format_display($post_data['enable_bbcode'], $post_data['enable_urls'], $post_data['enable_smilies']); + $preview_poll_options[] = $parse_poll->message; + } unset($parse_poll); foreach ($preview_poll_options as $key => $option) diff --git a/phpBB/search.php b/phpBB/search.php index 164d834ff2..cece37f29c 100644 --- a/phpBB/search.php +++ b/phpBB/search.php @@ -797,7 +797,7 @@ if ($keywords || $author || $author_id || $search_id || $submit) } else { - $bbcode_bitfield = $text_only_message = ''; + $text_only_message = ''; $attach_list = array(); while ($row = $db->sql_fetchrow($result)) @@ -817,7 +817,6 @@ if ($keywords || $author || $author_id || $search_id || $submit) if ($return_chars == -1 || utf8_strlen($text_only_message) < ($return_chars + 3)) { $row['display_text_only'] = false; - $bbcode_bitfield = $bbcode_bitfield | base64_decode($row['bbcode_bitfield']); // Does this post have an attachment? If so, add it to the list if ($row['post_attachment'] && $config['allow_attachments']) @@ -837,13 +836,6 @@ if ($keywords || $author || $author_id || $search_id || $submit) unset($text_only_message); - // Instantiate BBCode if needed - if ($bbcode_bitfield !== '') - { - include_once($phpbb_root_path . 'includes/bbcode.' . $phpEx); - $bbcode = new bbcode(base64_encode($bbcode_bitfield)); - } - // Pull attachment data if (sizeof($attach_list)) { diff --git a/phpBB/styles/prosilver/template/forumlist_body.html b/phpBB/styles/prosilver/template/forumlist_body.html index 3e7a2cd102..f2e03630ff 100644 --- a/phpBB/styles/prosilver/template/forumlist_body.html +++ b/phpBB/styles/prosilver/template/forumlist_body.html @@ -45,7 +45,7 @@ <!-- EVENT forumlist_body_subforums_before --> <br /><strong>{forumrow.L_SUBFORUM_STR}{L_COLON}</strong> <!-- BEGIN subforum --> - <a href="{forumrow.subforum.U_SUBFORUM}" class="subforum<!-- IF forumrow.subforum.S_UNREAD --> unread<!-- ELSE --> read<!-- ENDIF -->" title="<!-- IF forumrow.subforum.UNREAD -->{L_UNREAD_POSTS}<!-- ELSE -->{L_NO_UNREAD_POSTS}<!-- ENDIF -->">{forumrow.subforum.SUBFORUM_NAME}</a><!-- IF not forumrow.subforum.S_LAST_ROW -->{L_COMMA_SEPARATOR}<!-- ENDIF --> + <a href="{forumrow.subforum.U_SUBFORUM}" class="subforum<!-- IF forumrow.subforum.S_UNREAD --> unread<!-- ELSE --> read<!-- ENDIF -->" title="<!-- IF forumrow.subforum.S_UNREAD -->{L_UNREAD_POSTS}<!-- ELSE -->{L_NO_UNREAD_POSTS}<!-- ENDIF -->">{forumrow.subforum.SUBFORUM_NAME}</a><!-- IF not forumrow.subforum.S_LAST_ROW -->{L_COMMA_SEPARATOR}<!-- ENDIF --> <!-- END subforum --> <!-- EVENT forumlist_body_subforums_after --> <!-- ENDIF --> diff --git a/phpBB/styles/prosilver/template/mcp_logs.html b/phpBB/styles/prosilver/template/mcp_logs.html index eaa3838f17..4f74085968 100644 --- a/phpBB/styles/prosilver/template/mcp_logs.html +++ b/phpBB/styles/prosilver/template/mcp_logs.html @@ -22,10 +22,10 @@ <table class="table1"> <thead> <tr> - <th>{L_USERNAME}</th> - <th style="text-align: center">{L_IP}</th> - <th style="text-align: center">{L_TIME}</th> - <th>{L_ACTION}</th> + <th class="name">{L_USERNAME}</th> + <th class="center">{L_IP}</th> + <th class="center">{L_TIME}</th> + <th class="name">{L_ACTION}</th> <!-- IF S_CLEAR_ALLOWED --><th>{L_MARK}</th><!-- ENDIF --> </tr> </thead> @@ -34,8 +34,8 @@ <!-- BEGIN log --> <!-- IF log.S_ROW_COUNT is even --><tr class="bg1"><!-- ELSE --><tr class="bg2"><!-- ENDIF --> <td>{log.USERNAME}</td> - <td style="text-align: center">{log.IP}</td> - <td style="text-align: center">{log.DATE}</td> + <td class="center">{log.IP}</td> + <td class="center">{log.DATE}</td> <td>{log.ACTION}<br /> {log.DATA} </td> diff --git a/phpBB/styles/prosilver/template/mcp_notes_user.html b/phpBB/styles/prosilver/template/mcp_notes_user.html index ec317b141a..3e8d47eb9d 100644 --- a/phpBB/styles/prosilver/template/mcp_notes_user.html +++ b/phpBB/styles/prosilver/template/mcp_notes_user.html @@ -65,9 +65,9 @@ <table class="table1"> <thead> <tr> - <th>{L_REPORT_BY}</th> - <th style="text-align: center">{L_IP}</th> - <th style="text-align: center">{L_TIME}</th> + <th class="name reportby">{L_REPORT_BY}</th> + <th class="center">{L_IP}</th> + <th class="center">{L_TIME}</th> <th>{L_ACTION_NOTE}</th> <!-- IF S_CLEAR_ALLOWED --><th>{L_MARK}</th><!-- ENDIF --> </tr> @@ -76,11 +76,11 @@ <!-- BEGIN usernotes --> <!-- IF usernotes.S_ROW_COUNT is even --><tr class="bg1"><!-- ELSE --><tr class="bg2"><!-- ENDIF --> <td>{usernotes.REPORT_BY}</td> - <td style="text-align: center">{usernotes.IP}</td> - <td style="text-align: center">{usernotes.REPORT_AT}</td> + <td class="center">{usernotes.IP}</td> + <td class="center">{usernotes.REPORT_AT}</td> <td>{usernotes.ACTION}</td> - <!-- IF S_CLEAR_ALLOWED --><td style="width: 5%; text-align: center;"><input type="checkbox" name="marknote[]" id="note-{usernotes.ID}" value="{usernotes.ID}" /></td><!-- ENDIF --> + <!-- IF S_CLEAR_ALLOWED --><td class="center" style="width: 5%;"><input type="checkbox" name="marknote[]" id="note-{usernotes.ID}" value="{usernotes.ID}" /></td><!-- ENDIF --> </tr> <!-- BEGINELSE --> <tr> diff --git a/phpBB/styles/prosilver/template/navbar_footer.html b/phpBB/styles/prosilver/template/navbar_footer.html index 4a9275c898..b5a705d567 100644 --- a/phpBB/styles/prosilver/template/navbar_footer.html +++ b/phpBB/styles/prosilver/template/navbar_footer.html @@ -1,4 +1,4 @@ -<div class="navbar"> +<div class="navbar" role="navigation"> <div class="inner"> <ul id="nav-footer" class="linklist bulletin" role="menubar"> diff --git a/phpBB/styles/prosilver/template/overall_footer.html b/phpBB/styles/prosilver/template/overall_footer.html index 6f35d0e80b..8749ce60e8 100644 --- a/phpBB/styles/prosilver/template/overall_footer.html +++ b/phpBB/styles/prosilver/template/overall_footer.html @@ -3,7 +3,7 @@ <!-- EVENT overall_footer_page_body_after --> -<div id="page-footer"> +<div id="page-footer" role="contentinfo"> <!-- INCLUDE navbar_footer.html --> <div class="copyright"> diff --git a/phpBB/styles/prosilver/template/overall_header.html b/phpBB/styles/prosilver/template/overall_header.html index 121094f6e0..c4dbb6a035 100644 --- a/phpBB/styles/prosilver/template/overall_header.html +++ b/phpBB/styles/prosilver/template/overall_header.html @@ -2,7 +2,7 @@ <html dir="{S_CONTENT_DIRECTION}" lang="{S_USER_LANG}"> <head> <meta charset="utf-8" /> -<meta name="viewport" content="width=device-width" /> +<meta name="viewport" content="width=device-width, initial-scale=1" /> {META} <title><!-- IF UNREAD_NOTIFICATIONS_COUNT -->({UNREAD_NOTIFICATIONS_COUNT}) <!-- ENDIF --><!-- IF not S_VIEWTOPIC and not S_VIEWFORUM -->{SITENAME} - <!-- ENDIF --><!-- IF S_IN_MCP -->{L_MCP} - <!-- ELSEIF S_IN_UCP -->{L_UCP} - <!-- ENDIF -->{PAGE_TITLE}<!-- IF S_VIEWTOPIC or S_VIEWFORUM --> - {SITENAME}<!-- ENDIF --></title> @@ -59,7 +59,7 @@ <div id="wrap"> <a id="top" class="anchor" accesskey="t"></a> <div id="page-header"> - <div class="headerbar"> + <div class="headerbar" role="banner"> <div class="inner"> <div id="site-description"> @@ -69,8 +69,9 @@ <p class="skiplink"><a href="#start_here">{L_SKIP}</a></p> </div> + <!-- EVENT overall_header_searchbox_before --> <!-- IF S_DISPLAY_SEARCH and not S_IN_SEARCH --> - <div id="search-box" class="search-box search-header"> + <div id="search-box" class="search-box search-header" role="search"> <form action="{U_SEARCH}" method="get" id="search"> <fieldset> <input name="keywords" id="keywords" type="search" maxlength="128" title="{L_SEARCH_KEYWORDS}" class="inputbox search tiny" size="20" value="{SEARCH_WORDS}" placeholder="{L_SEARCH_MINI}" /> @@ -91,7 +92,7 @@ <!-- EVENT overall_header_page_body_before --> <a id="start_here" class="anchor"></a> - <div id="page-body"> + <div id="page-body" role="main"> <!-- IF S_BOARD_DISABLED and S_USER_LOGGED_IN and (U_MCP or U_ACP) --> <div id="information" class="rules"> <div class="inner"> diff --git a/phpBB/styles/prosilver/template/search_results.html b/phpBB/styles/prosilver/template/search_results.html index 970a7bcdd1..f76afe3767 100644 --- a/phpBB/styles/prosilver/template/search_results.html +++ b/phpBB/styles/prosilver/template/search_results.html @@ -1,21 +1,25 @@ <!-- INCLUDE overall_header.html --> +<!-- EVENT search_results_header_before --> + <h2 class="searchresults-title"><!-- IF SEARCH_TITLE -->{SEARCH_TITLE}<!-- ELSE -->{SEARCH_MATCHES}<!-- ENDIF --><!-- IF SEARCH_WORDS -->{L_COLON} <a href="{U_SEARCH_WORDS}">{SEARCH_WORDS}</a><!-- ENDIF --></h2> <!-- IF SEARCHED_QUERY --> <p>{L_SEARCHED_QUERY}{L_COLON} <strong>{SEARCHED_QUERY}</strong></p><!-- ENDIF --> <!-- IF IGNORED_WORDS --> <p>{L_IGNORED_TERMS}{L_COLON} <strong>{IGNORED_WORDS}</strong></p><!-- ENDIF --> <!-- IF PHRASE_SEARCH_DISABLED --> <p><strong>{L_PHRASE_SEARCH_DISABLED}</strong></p><!-- ENDIF --> <!-- IF SEARCH_TOPIC --> - <p><a class="arrow-{S_CONTENT_FLOW_BEGIN}" href="{U_SEARCH_TOPIC}">{L_RETURN_TO_TOPIC}</a></p> + <p class="return-link"><a class="arrow-{S_CONTENT_FLOW_BEGIN}" href="{U_SEARCH_TOPIC}">{L_RETURN_TO_TOPIC}</a></p> <!-- ELSE --> - <p><a class="arrow-{S_CONTENT_FLOW_BEGIN}" href="{U_SEARCH}" title="{L_SEARCH_ADV}">{L_GO_TO_SEARCH_ADV}</a></p> + <p class="advanced-search-link"><a class="arrow-{S_CONTENT_FLOW_BEGIN}" href="{U_SEARCH}" title="{L_SEARCH_ADV}">{L_GO_TO_SEARCH_ADV}</a></p> <!-- ENDIF --> +<!-- EVENT search_results_header_after --> + <!-- IF .pagination or SEARCH_MATCHES or TOTAL_MATCHES or PAGE_NUMBER --> <div class="action-bar top"> <!-- IF TOTAL_MATCHES > 0 --> - <div class="search-box"> + <div class="search-box" role="search"> <form method="post" action="{S_SEARCH_ACTION}"> <fieldset> <input class="inputbox search tiny" type="search" name="add_keywords" id="add_keywords" value="" placeholder="{L_SEARCH_IN_RESULTS}" /> @@ -26,6 +30,8 @@ </div> <!-- ENDIF --> + <!-- EVENT search_results_searchbox_after --> + <div class="pagination"> {SEARCH_MATCHES} <!-- IF .pagination --> diff --git a/phpBB/styles/prosilver/template/simple_footer.html b/phpBB/styles/prosilver/template/simple_footer.html index d5d0f45fa9..123f8992f2 100644 --- a/phpBB/styles/prosilver/template/simple_footer.html +++ b/phpBB/styles/prosilver/template/simple_footer.html @@ -1,6 +1,6 @@ </div> - <div class="copyright">{CREDIT_LINE} + <div class="copyright" role="contentinfo">{CREDIT_LINE} <!-- IF TRANSLATION_INFO --><br />{TRANSLATION_INFO}<!-- ENDIF --> <!-- IF DEBUG_OUTPUT --><br />{DEBUG_OUTPUT}<!-- ENDIF --> </div> diff --git a/phpBB/styles/prosilver/template/simple_header.html b/phpBB/styles/prosilver/template/simple_header.html index a0c7bc68bb..ab4f855a97 100644 --- a/phpBB/styles/prosilver/template/simple_header.html +++ b/phpBB/styles/prosilver/template/simple_header.html @@ -2,7 +2,7 @@ <html dir="{S_CONTENT_DIRECTION}" lang="{S_USER_LANG}"> <head> <meta charset="utf-8" /> -<meta name="viewport" content="width=device-width" /> +<meta name="viewport" content="width=device-width, initial-scale=1" /> {META} <title>{SITENAME} • <!-- IF S_IN_MCP -->{L_MCP} • <!-- ELSEIF S_IN_UCP -->{L_UCP} • <!-- ENDIF -->{PAGE_TITLE}</title> @@ -36,4 +36,4 @@ <div id="wrap"> <a id="top" class="anchor" accesskey="t"></a> - <div id="page-body"> + <div id="page-body" role="main"> diff --git a/phpBB/styles/prosilver/template/ucp_profile_autologin_keys.html b/phpBB/styles/prosilver/template/ucp_profile_autologin_keys.html index 6fec0b8aed..65909b7068 100644 --- a/phpBB/styles/prosilver/template/ucp_profile_autologin_keys.html +++ b/phpBB/styles/prosilver/template/ucp_profile_autologin_keys.html @@ -10,19 +10,19 @@ <table class="table1"> <thead> <tr> - <th>{L_LOGIN_KEY}</th> - <th>{L_IP}</th> - <th>{L_LOGIN_TIME}</th> - <th class="mark">{L_MARK}</th> + <th class="name">{L_LOGIN_KEY}</th> + <th class="center">{L_IP}</th> + <th class="center">{L_LOGIN_TIME}</th> + <th class="center mark">{L_MARK}</th> </tr> </thead> <tbody> <!-- BEGIN sessions --> <!-- IF sessions.S_ROW_COUNT is even --><tr class="bg1"><!-- ELSE --><tr class="bg2"><!-- ENDIF --> <td><label for="{sessions.KEY}">{sessions.KEY}</label></td> - <td style="text-align: center">{sessions.IP}</td> - <td style="text-align: center">{sessions.LOGIN_TIME}</td> - <td style="text-align: center" class="mark"><input type="checkbox" name="keys[]" value="{sessions.KEY}" id="{sessions.KEY}" /></td> + <td class="center">{sessions.IP}</td> + <td class="center">{sessions.LOGIN_TIME}</td> + <td class="center mark"><input type="checkbox" name="keys[]" value="{sessions.KEY}" id="{sessions.KEY}" /></td> </tr> <!-- BEGINELSE --> <tr><td colspan="4" class="bg1" style="text-align: center">{L_PROFILE_NO_AUTOLOGIN_KEYS}</td></tr> diff --git a/phpBB/styles/prosilver/template/ucp_profile_profile_info.html b/phpBB/styles/prosilver/template/ucp_profile_profile_info.html index e8e2aedc14..69eda8c42c 100644 --- a/phpBB/styles/prosilver/template/ucp_profile_profile_info.html +++ b/phpBB/styles/prosilver/template/ucp_profile_profile_info.html @@ -10,6 +10,7 @@ <fieldset> <!-- IF ERROR --><p class="error">{ERROR}</p><!-- ENDIF --> + <!-- EVENT ucp_profile_profile_info_before --> <!-- IF S_BIRTHDAYS_ENABLED --> <dl> <dt><label for="bday_day">{L_BIRTHDAY}{L_COLON}</label><br /><span>{L_BIRTHDAY_EXPLAIN}</span></dt> @@ -34,6 +35,7 @@ <dd>{profile_fields.FIELD}</dd> </dl> <!-- END profile_fields --> + <!-- EVENT ucp_profile_profile_info_after --> </fieldset> </div> diff --git a/phpBB/styles/prosilver/template/ucp_profile_reg_details.html b/phpBB/styles/prosilver/template/ucp_profile_reg_details.html index 4b26bc2e99..2642b7a419 100644 --- a/phpBB/styles/prosilver/template/ucp_profile_reg_details.html +++ b/phpBB/styles/prosilver/template/ucp_profile_reg_details.html @@ -12,6 +12,7 @@ <fieldset> <!-- IF ERROR --><p class="error">{ERROR}</p><!-- ENDIF --> + <!-- EVENT ucp_profile_register_details_before --> <dl> <dt><label <!-- IF S_CHANGE_USERNAME -->for="username"<!-- ENDIF -->>{L_USERNAME}{L_COLON}</label><br /><span>{L_USERNAME_EXPLAIN}</span></dt> <dd><!-- IF S_CHANGE_USERNAME --><input type="text" name="username" id="username" value="{USERNAME}" class="inputbox" title="{L_USERNAME}" /><!-- ELSE --><strong>{USERNAME}</strong><!-- ENDIF --></dd> @@ -30,6 +31,7 @@ <dd><input type="password" name="password_confirm" id="password_confirm" maxlength="255" value="{PASSWORD_CONFIRM}" class="inputbox" title="{L_CONFIRM_PASSWORD}" /></dd> </dl> <!-- ENDIF --> + <!-- EVENT ucp_profile_register_details_after --> </fieldset> </div> </div> diff --git a/phpBB/styles/prosilver/template/viewforum_body.html b/phpBB/styles/prosilver/template/viewforum_body.html index 43e994f1f9..a0a0cd547a 100644 --- a/phpBB/styles/prosilver/template/viewforum_body.html +++ b/phpBB/styles/prosilver/template/viewforum_body.html @@ -50,7 +50,7 @@ <!-- ENDIF --> <!-- IF S_DISPLAY_SEARCHBOX --> - <div class="search-box"> + <div class="search-box" role="search"> <form method="get" id="forum-search" action="{S_SEARCHBOX_ACTION}"> <fieldset> <input class="inputbox search tiny" type="search" name="keywords" id="search_keywords" size="20" placeholder="{L_SEARCH_FORUM}" /> diff --git a/phpBB/styles/prosilver/template/viewtopic_body.html b/phpBB/styles/prosilver/template/viewtopic_body.html index 3b2c0a9c65..5b8078877e 100644 --- a/phpBB/styles/prosilver/template/viewtopic_body.html +++ b/phpBB/styles/prosilver/template/viewtopic_body.html @@ -42,7 +42,7 @@ <!-- INCLUDE viewtopic_topic_tools.html --> <!-- IF S_DISPLAY_SEARCHBOX --> - <div class="search-box"> + <div class="search-box" role="search"> <form method="get" id="topic-search" action="{S_SEARCHBOX_ACTION}"> <fieldset> <input class="inputbox search tiny" type="search" name="keywords" id="search_keywords" size="20" placeholder="{L_SEARCH_TOPIC}" /> @@ -64,7 +64,7 @@ <!-- ENDIF --> </div> <!-- ENDIF --> - + <!-- EVENT viewtopic_body_pagination_top_after --> </div> <!-- IF S_HAS_POLL --> diff --git a/phpBB/styles/prosilver/theme/bidi.css b/phpBB/styles/prosilver/theme/bidi.css index 889110e3fc..d9bf9f9fa5 100644 --- a/phpBB/styles/prosilver/theme/bidi.css +++ b/phpBB/styles/prosilver/theme/bidi.css @@ -313,6 +313,13 @@ li.breadcrumbs span:first-child > a { padding-right: 19px; } +/* Notification mark read link */ +.rtl .dropdown-extended a.mark_read { + border-radius: 0 3px 3px 0; + left: 0; + right: auto; +} + .rtl a.top { float: left; } diff --git a/phpBB/styles/prosilver/theme/buttons.css b/phpBB/styles/prosilver/theme/buttons.css index d600e76b44..aecac4defd 100644 --- a/phpBB/styles/prosilver/theme/buttons.css +++ b/phpBB/styles/prosilver/theme/buttons.css @@ -8,6 +8,7 @@ cursor: pointer; display: inline-block; height: 18px; + line-height: 18px; font-size: 13px; white-space: nowrap; border: 1px solid transparent; diff --git a/phpBB/styles/prosilver/theme/colours.css b/phpBB/styles/prosilver/theme/colours.css index 505b18288b..4743b4b39b 100644 --- a/phpBB/styles/prosilver/theme/colours.css +++ b/phpBB/styles/prosilver/theme/colours.css @@ -96,7 +96,9 @@ table.zebra-list tr:nth-child(even) td, ul.zebra-list li:nth-child(even) { background-color: #e1ebf2; } -.bg3 { background-color: #cadceb; } +.bg3 { + background-color: #cadceb; +} .ucprowbg { background-color: #DCDEE2; @@ -164,9 +166,9 @@ dl.details dd { ---------------------------------------- */ .pagination li a { - color: #5C758C; background-color: #ECEDEE; border-color: #B4BAC0; + color: #5C758C; } .pagination li.ellipsis span { @@ -175,14 +177,14 @@ dl.details dd { } .pagination li.active span { - color: #FFFFFF; background-color: #4692BF; border-color: #4692BF; + color: #FFFFFF; } .pagination li a:hover, .pagination .dropdown-visible a.dropdown-trigger, .nojs .pagination .dropdown-container:hover a.dropdown-trigger { - border-color: #368AD2; background-color: #368AD2; + border-color: #368AD2; color: #FFFFFF; } @@ -263,13 +265,13 @@ a:hover { color: #D31141; } /* Post body links */ .postlink { - color: #368AD2; border-bottom-color: #368AD2; + color: #368AD2; } .postlink:visited { - color: #5D8FBD; border-bottom-color: #5D8FBD; + color: #5D8FBD; } .postlink:hover { @@ -656,7 +658,6 @@ Colours and backgrounds for buttons.css .icon-register { background-image: url("./images/icon_register.gif"); } .icon-search, .responsive-search a { background-image: url("./images/icon_search.gif"); } .icon-search-active { background-image: url("./images/subforum_read.gif"); } -.icon-search-advanced { background-image: url("./images/icon_search_adv.gif"); } .icon-search-new { background-image: url("./images/subforum_unread.gif"); } .icon-search-self { background-image: url("./images/icon_topic_latest.gif"); } .icon-search-unanswered { background-image: url("./images/icon_post_target.gif"); } diff --git a/phpBB/styles/prosilver/theme/common.css b/phpBB/styles/prosilver/theme/common.css index 9da24b6ef9..11e3314f17 100644 --- a/phpBB/styles/prosilver/theme/common.css +++ b/phpBB/styles/prosilver/theme/common.css @@ -671,6 +671,8 @@ table.table1 tbody th { /* Specific column styles */ table.table1 .name { text-align: left; } +table.table1 .center { text-align: center; } +table.table1 .reportby { width: 15%; } table.table1 .posts { text-align: center; width: 7%; } table.table1 .joined { text-align: left; width: 15%; } table.table1 .active { text-align: left; width: 15%; } diff --git a/phpBB/styles/subsilver2/template/forumlist_body.html b/phpBB/styles/subsilver2/template/forumlist_body.html index c1609f0979..6c9b64827a 100644 --- a/phpBB/styles/subsilver2/template/forumlist_body.html +++ b/phpBB/styles/subsilver2/template/forumlist_body.html @@ -56,7 +56,7 @@ <!-- EVENT forumlist_body_subforums_before --> <p class="forumdesc"><strong>{forumrow.L_SUBFORUM_STR}{L_COLON}</strong> <!-- BEGIN subforum --> - <a href="{forumrow.subforum.U_SUBFORUM}" class="subforum<!-- IF forumrow.subforum.S_UNREAD --> unread<!-- ELSE --> read<!-- ENDIF -->" title="<!-- IF forumrow.subforum.UNREAD -->{L_UNREAD_POSTS}<!-- ELSE -->{L_NO_UNREAD_POSTS}<!-- ENDIF -->">{forumrow.subforum.SUBFORUM_NAME}</a><!-- IF not forumrow.subforum.S_LAST_ROW -->{L_COMMA_SEPARATOR}<!-- ENDIF --> + <a href="{forumrow.subforum.U_SUBFORUM}" class="subforum<!-- IF forumrow.subforum.S_UNREAD --> unread<!-- ELSE --> read<!-- ENDIF -->" title="<!-- IF forumrow.subforum.S_UNREAD -->{L_UNREAD_POSTS}<!-- ELSE -->{L_NO_UNREAD_POSTS}<!-- ENDIF -->">{forumrow.subforum.SUBFORUM_NAME}</a><!-- IF not forumrow.subforum.S_LAST_ROW -->{L_COMMA_SEPARATOR}<!-- ENDIF --> <!-- END subforum --> </p> <!-- EVENT forumlist_body_subforums_after --> diff --git a/phpBB/styles/subsilver2/template/memberlist_body.html b/phpBB/styles/subsilver2/template/memberlist_body.html index ecfb4b69c5..d412a6a64b 100644 --- a/phpBB/styles/subsilver2/template/memberlist_body.html +++ b/phpBB/styles/subsilver2/template/memberlist_body.html @@ -39,11 +39,10 @@ <table class="tablebg" width="100%" cellspacing="1"> <tr> <th nowrap="nowrap">#</th> - <th nowrap="nowrap" width="25%" align="{S_CONTENT_FLOW_BEGIN}"><a href="{U_SORT_USERNAME}">{L_USERNAME}</a></th> + <th nowrap="nowrap" width="36%" align="{S_CONTENT_FLOW_BEGIN}"><a href="{U_SORT_USERNAME}">{L_USERNAME}</a></th> <th nowrap="nowrap" width="15%"><a href="{U_SORT_JOINED}">{L_JOINED}</a></th> <th nowrap="nowrap" width="10%"><a href="{U_SORT_POSTS}">{L_POSTS}</a></th> <th nowrap="nowrap" width="15%"><a href="{U_SORT_RANK}">{L_RANK}</a></th> - <th nowrap="nowrap" width="11%">{L_SEND_MESSAGE}</th> <th nowrap="nowrap" width="11%"><a href="{U_SORT_EMAIL}">{L_EMAIL}</a></th> <!-- IF S_IN_SEARCH_POPUP and not S_SELECT_SINGLE --><th width="2%" nowrap="nowrap">{L_MARK}</th><!-- ENDIF --> </tr> @@ -52,11 +51,11 @@ <!-- IF S_SHOW_GROUP --> <!-- IF memberrow.S_FIRST_ROW and memberrow.S_GROUP_LEADER --> <tr class="row3"> - <td colspan="8"><b class="gensmall">{L_GROUP_LEADER}</b></td> + <td colspan="7"><b class="gensmall">{L_GROUP_LEADER}</b></td> </tr> <!-- ELSEIF not memberrow.S_GROUP_LEADER and not $S_MEMBER_HEADER --> <tr class="row3"> - <td colspan="8"><b class="gensmall">{L_GROUP_MEMBERS}</b></td> + <td colspan="7"><b class="gensmall">{L_GROUP_MEMBERS}</b></td> </tr> <!-- DEFINE $S_MEMBER_HEADER = 1 --> <!-- ENDIF --> @@ -69,7 +68,6 @@ <td class="genmed" align="center" nowrap="nowrap"> {memberrow.JOINED} </td> <td class="gen" align="center">{memberrow.POSTS}</td> <td class="gen" align="center"><!-- IF memberrow.RANK_IMG -->{memberrow.RANK_IMG}<!-- ELSE -->{memberrow.RANK_TITLE}<!-- ENDIF --></td> - <td class="gen" align="center"> <!-- IF memberrow.U_PM --><a href="{memberrow.U_PM}" class="imageset">{PM_IMG}</a><!-- ENDIF --> </td> <td class="gen" align="center"> <!-- IF memberrow.U_EMAIL --><a href="{memberrow.U_EMAIL}" class="imageset">{EMAIL_IMG}</a><!-- ENDIF --> </td> <!-- IF memberrow.S_PROFILE_FIELD1 --> <!-- Use a construct like this to include admin defined profile fields. Replace FIELD1 with the name of your field. --> @@ -81,7 +79,7 @@ <!-- BEGINELSE --> <tr> - <td class="row1" colspan="<!-- IF S_IN_SEARCH_POPUP -->9<!-- ELSE -->8<!-- ENDIF -->" align="center"> + <td class="row1" colspan="<!-- IF S_IN_SEARCH_POPUP -->8<!-- ELSE -->7<!-- ENDIF -->" align="center"> <span class="gen"><!-- IF S_SHOW_GROUP -->{L_NO_GROUP_MEMBERS}<!-- ELSE -->{L_NO_MEMBERS}<!-- ENDIF --></span> </td> </tr> @@ -89,7 +87,7 @@ <!-- END memberrow --> <tr> - <td class="cat" colspan="<!-- IF S_IN_SEARCH_POPUP -->9<!-- ELSE -->8<!-- ENDIF -->" align="center"><!-- IF S_IN_SEARCH_POPUP and not S_SELECT_SINGLE --><input class="btnlite" type="submit" value="{L_SELECT_MARKED}" /><!-- ELSE --><span class="gensmall">{L_SELECT_SORT_METHOD}{L_COLON}</span> <select name="sk">{S_MODE_SELECT}</select> <span class="gensmall">{L_ORDER}</span> <select name="sd">{S_ORDER_SELECT}</select> <input type="submit" name="submit" value="{L_SUBMIT}" class="btnlite" /><!-- ENDIF --></td> + <td class="cat" colspan="<!-- IF S_IN_SEARCH_POPUP -->8<!-- ELSE -->7<!-- ENDIF -->" align="center"><!-- IF S_IN_SEARCH_POPUP and not S_SELECT_SINGLE --><input class="btnlite" type="submit" value="{L_SELECT_MARKED}" /><!-- ELSE --><span class="gensmall">{L_SELECT_SORT_METHOD}{L_COLON}</span> <select name="sk">{S_MODE_SELECT}</select> <span class="gensmall">{L_ORDER}</span> <select name="sd">{S_ORDER_SELECT}</select> <input type="submit" name="submit" value="{L_SUBMIT}" class="btnlite" /><!-- ENDIF --></td> </tr> </table> {S_FORM_TOKEN} diff --git a/phpBB/styles/subsilver2/template/search_results.html b/phpBB/styles/subsilver2/template/search_results.html index 23d0b3a146..6f651b2618 100644 --- a/phpBB/styles/subsilver2/template/search_results.html +++ b/phpBB/styles/subsilver2/template/search_results.html @@ -1,5 +1,7 @@ <!-- INCLUDE overall_header.html --> +<!-- EVENT search_results_header_before --> + <form method="post" action="{S_SEARCH_ACTION}"> <table width="100%" cellspacing="1"> @@ -8,10 +10,12 @@ </tr> <tr> <td class="genmed"><!-- IF SEARCH_TOPIC -->{L_SEARCHED_TOPIC}{L_COLON} <a href="{U_SEARCH_TOPIC}"><b>{SEARCH_TOPIC}</b></a><br /><!-- ENDIF --><!-- IF SEARCH_WORDS -->{L_SEARCHED_FOR}{L_COLON} <a href="{U_SEARCH_WORDS}"><b>{SEARCH_WORDS}</b></a><!-- ENDIF --><!-- IF IGNORED_WORDS --> {L_IGNORED_TERMS}{L_COLON} <b>{IGNORED_WORDS}</b><!-- ENDIF --></td> - <td align="{S_CONTENT_FLOW_END}"><!-- IF SEARCH_IN_RESULTS --><span class="genmed">{L_SEARCH_IN_RESULTS}{L_COLON} </span><input class="post" type="text" name="add_keywords" value="" /> <input class="btnlite" type="submit" name="submit" value="{L_GO}" /><!-- ENDIF --></td> + <td align="{S_CONTENT_FLOW_END}"><!-- EVENT search_results_searchbox_after --><!-- IF SEARCH_IN_RESULTS --><span class="genmed">{L_SEARCH_IN_RESULTS}{L_COLON} </span><input class="post" type="text" name="add_keywords" value="" /> <input class="btnlite" type="submit" name="submit" value="{L_GO}" /><!-- ENDIF --></td> </tr> </table> +<!-- EVENT search_results_header_after --> + <br clear="all" /> <!-- IF S_SHOW_TOPICS --> diff --git a/phpBB/styles/subsilver2/template/ucp_avatar_options_local.html b/phpBB/styles/subsilver2/template/ucp_avatar_options_local.html index 7beddfc109..919cf49e44 100644 --- a/phpBB/styles/subsilver2/template/ucp_avatar_options_local.html +++ b/phpBB/styles/subsilver2/template/ucp_avatar_options_local.html @@ -14,19 +14,19 @@ <!-- BEGIN avatar_local_row --> <tr> <!-- BEGIN avatar_local_col --> - <td class="row1" align="center"><img src="{avatar_local_col.avatar_local_col.AVATAR_IMAGE}" alt="{avatar_local_col.avatar_local_col.AVATAR_NAME}" title="{avatar_local_col.avatar_local_col.AVATAR_NAME}" /></td> + <td class="row1" align="center" id="av-{avatar_local_row.S_ROW_COUNT}-{avatar_local_row.avatar_local_col.S_ROW_COUNT}"><img src="{avatar_local_row.avatar_local_col.AVATAR_IMAGE}" alt="{avatar_local_row.avatar_local_col.AVATAR_NAME}" title="{avatar_local_row.avatar_local_col.AVATAR_NAME}" /></td> <!-- END avatar_local_col --> </tr> <tr> <!-- BEGIN avatar_local_option --> - <td class="row2" align="center"><input type="radio" class="radio" name="avatar_local_file" value="{avatar_local_col.avatar_local_option.S_OPTIONS_AVATAR}" /></td> + <td class="row2" align="center"><input type="radio" class="radio" name="avatar_local_file" id="av-{avatar_local_row.S_ROW_COUNT}-{avatar_local_row.avatar_local_col.S_ROW_COUNT}" value="{avatar_local_row.avatar_local_option.S_OPTIONS_AVATAR}" /></td> <!-- END avatar_local_option --> </tr> <!-- BEGINELSE --> <tr> <td class="row1" colspan="2">{L_NO_AVATAR_CATEGORY}</td> </tr> - <!-- END avatar_local_col --> + <!-- END avatar_local_row --> </table> </td> </tr> diff --git a/phpBB/styles/subsilver2/template/ucp_profile_autologin_keys.html b/phpBB/styles/subsilver2/template/ucp_profile_autologin_keys.html index 3f63319b59..087ae89743 100644 --- a/phpBB/styles/subsilver2/template/ucp_profile_autologin_keys.html +++ b/phpBB/styles/subsilver2/template/ucp_profile_autologin_keys.html @@ -16,9 +16,9 @@ </tr> <tr> <th>{L_LOGIN_KEY}</th> - <th>{L_IP}</th> - <th>{L_LOGIN_TIME}</th> - <th>{L_MARK}</th> + <th class="center">{L_IP}</th> + <th class="center">{L_LOGIN_TIME}</th> + <th class="center">{L_MARK}</th> </tr> <!-- BEGIN sessions --> <!-- IF sessions.S_ROW_COUNT is even --><tr class="row1"><!-- ELSE --><tr class="row2"><!-- ENDIF --> diff --git a/phpBB/styles/subsilver2/template/ucp_profile_profile_info.html b/phpBB/styles/subsilver2/template/ucp_profile_profile_info.html index 2d0140a15d..bfc2dd0244 100644 --- a/phpBB/styles/subsilver2/template/ucp_profile_profile_info.html +++ b/phpBB/styles/subsilver2/template/ucp_profile_profile_info.html @@ -12,6 +12,7 @@ <tr> <td class="row1" colspan="2"><span class="gensmall">{L_PROFILE_INFO_NOTICE}</span></td> </tr> +<!-- EVENT ucp_profile_profile_info_before --> <!-- IF S_JABBER_ENABLED --> <tr> <td class="row1" width="35%"><b class="genmed">{L_UCP_JABBER}{L_COLON} </b></td> @@ -34,6 +35,7 @@ <td class="row2">{profile_fields.FIELD}<!-- IF profile_fields.ERROR --><br /><span class="gensmall error">{profile_fields.ERROR}</span><!-- ENDIF --></td> </tr> <!-- END profile_fields --> +<!-- EVENT ucp_profile_profile_info_after --> <tr> <td class="cat" colspan="2" align="center">{S_HIDDEN_FIELDS}<input class="btnmain" type="submit" name="submit" value="{L_SUBMIT}" /> <input class="btnlite" type="reset" value="{L_RESET}" name="reset" /></td> </tr> diff --git a/phpBB/styles/subsilver2/template/ucp_profile_reg_details.html b/phpBB/styles/subsilver2/template/ucp_profile_reg_details.html index d8fe84bf79..090d729326 100644 --- a/phpBB/styles/subsilver2/template/ucp_profile_reg_details.html +++ b/phpBB/styles/subsilver2/template/ucp_profile_reg_details.html @@ -14,6 +14,7 @@ <td class="row3" colspan="2" align="center"><span class="gensmall error">{ERROR}</span></td> </tr> <!-- ENDIF --> +<!-- EVENT ucp_profile_register_details_before --> <tr> <td class="row1" width="35%"><b class="genmed">{L_USERNAME}{L_COLON} </b><br /><span class="gensmall">{L_USERNAME_EXPLAIN}</span></td> <td class="row2"><!-- IF S_CHANGE_USERNAME --><input type="text" class="post" name="username" size="30" value="{USERNAME}" /><!-- ELSE --><b class="gen">{USERNAME}</b><!-- ENDIF --></td> @@ -32,6 +33,7 @@ <td class="row2"><input type="password" class="post" name="password_confirm" size="30" maxlength="255" value="{PASSWORD_CONFIRM}" /></td> </tr> <!-- ENDIF --> +<!-- EVENT ucp_profile_register_details_after --> <tr> <th colspan="2">{L_CONFIRM_CHANGES}</th> </tr> diff --git a/phpBB/styles/subsilver2/template/viewtopic_body.html b/phpBB/styles/subsilver2/template/viewtopic_body.html index ff39515876..721aa5cb01 100644 --- a/phpBB/styles/subsilver2/template/viewtopic_body.html +++ b/phpBB/styles/subsilver2/template/viewtopic_body.html @@ -44,7 +44,7 @@ <!-- IF TOTAL_POSTS --> <td class="nav" valign="middle" nowrap="nowrap"> {PAGE_NUMBER}<br /></td> <td class="gensmall" nowrap="nowrap"> [ {TOTAL_POSTS} ] </td> - <td class="gensmall" width="100%" align="{S_CONTENT_FLOW_END}" nowrap="nowrap"><!-- INCLUDE pagination.html --></td> + <td class="gensmall" width="100%" align="{S_CONTENT_FLOW_END}" nowrap="nowrap"><!-- INCLUDE pagination.html --><!-- EVENT viewtopic_body_pagination_top_after --></td> <!-- ENDIF --> </tr> </table> diff --git a/phpBB/styles/subsilver2/theme/stylesheet.css b/phpBB/styles/subsilver2/theme/stylesheet.css index 3c7ff23db5..7764020567 100644 --- a/phpBB/styles/subsilver2/theme/stylesheet.css +++ b/phpBB/styles/subsilver2/theme/stylesheet.css @@ -322,6 +322,10 @@ th { padding: 7px 5px; } +th.center { + text-align: center; +} + td { padding: 2px; } diff --git a/phpBB/viewforum.php b/phpBB/viewforum.php index 92ac9171cb..cd55114bad 100644 --- a/phpBB/viewforum.php +++ b/phpBB/viewforum.php @@ -391,15 +391,29 @@ $sql_array = array( /** * Event to modify the SQL query before the topic data is retrieved * +* It may also be used to override the above assigned template vars +* * @event core.viewforum_get_topic_data * @var array forum_data Array with forum data * @var array sql_array The SQL array to get the data of all topics +* @var array forum_id The forum_id whose topics are being listed +* @var array topics_count The total number of topics for display +* @var array sort_days The oldest topic displayable in elapsed days +* @var array sort_key The sorting by. It is one of the first character of (in low case): +* Author, Post time, Replies, Subject, Views +* @var array sort_dir Either "a" for ascending or "d" for descending * @since 3.1.0-a1 * @change 3.1.0-RC4 Added forum_data var +* @change 3.1.4-RC1 Added forum_id, topics_count, sort_days, sort_key and sort_dir vars */ $vars = array( 'forum_data', 'sql_array', + 'forum_id', + 'topics_count', + 'sort_days', + 'sort_key', + 'sort_dir', ); extract($phpbb_dispatcher->trigger_event('core.viewforum_get_topic_data', compact($vars))); diff --git a/phpBB/viewtopic.php b/phpBB/viewtopic.php index 981941cea0..131230897f 100644 --- a/phpBB/viewtopic.php +++ b/phpBB/viewtopic.php @@ -1015,7 +1015,6 @@ else // Container for user details, only process once $post_list = $user_cache = $id_cache = $attachments = $attach_list = $rowset = $update_count = $post_edit_list = $post_delete_list = array(); $has_unapproved_attachments = $has_approved_attachments = $display_notice = false; -$bbcode_bitfield = ''; $i = $i_total = 0; // Go ahead and pull all data for this topic @@ -1181,15 +1180,6 @@ while ($row = $db->sql_fetchrow($result)) $rowset[$row['post_id']] = $rowset_data; - // Define the global bbcode bitfield, will be used to load bbcodes - $bbcode_bitfield = $bbcode_bitfield | base64_decode($row['bbcode_bitfield']); - - // Is a signature attached? Are we going to display it? - if ($row['enable_sig'] && $config['allow_sig'] && $user->optionget('viewsigs')) - { - $bbcode_bitfield = $bbcode_bitfield | base64_decode($row['user_sig_bbcode_bitfield']); - } - // Cache various user specific data ... so we don't have to recompute // this each time the same user appears on this page if (!isset($user_cache[$poster_id])) @@ -1463,12 +1453,6 @@ if (sizeof($attach_list)) } } -// Instantiate BBCode if need be -if ($bbcode_bitfield !== '') -{ - $bbcode = new bbcode(base64_encode($bbcode_bitfield)); -} - // Get the list of users who can receive private messages $can_receive_pm_list = $auth->acl_get_list(array_keys($user_cache), 'u_readpm'); $can_receive_pm_list = (empty($can_receive_pm_list) || !isset($can_receive_pm_list[0]['u_readpm'])) ? array() : $can_receive_pm_list[0]['u_readpm']; diff --git a/phpBB/web.config b/phpBB/web.config index a73c328626..99a1fe6023 100644 --- a/phpBB/web.config +++ b/phpBB/web.config @@ -1,6 +1,18 @@ <?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> + <rewrite> + <rules> + <rule name="Extension Routes" stopProcessing="true"> + <match url="^(.*)$" ignoreCase="true" /> + <conditions> + <add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" /> + <add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" /> + </conditions> + <action type="Rewrite" url="app.php" appendQueryString="true" /> + </rule> + </rules> + </rewrite> <security> <requestFiltering> <hiddenSegments> diff --git a/tests/functional/common_avatar_test_case.php b/tests/functional/common_avatar_test_case.php index 7278f23bcc..924eb1273c 100644 --- a/tests/functional/common_avatar_test_case.php +++ b/tests/functional/common_avatar_test_case.php @@ -62,7 +62,7 @@ abstract class phpbb_functional_common_avatar_test_case extends phpbb_functional { if (is_array($value)) { - $form[$key]->$value[0]($value[1]); + $form[$key]->{$value[0]}($value[1]); } else { diff --git a/tests/functional/download_test.php b/tests/functional/download_test.php index 4e4995c21e..1e863210e6 100644 --- a/tests/functional/download_test.php +++ b/tests/functional/download_test.php @@ -66,6 +66,11 @@ class phpbb_functional_download_test extends phpbb_functional_test_case public function test_download_accessible() { + if (!class_exists('finfo')) + { + $this->markTestSkipped('Unable to run test with fileinfo disabled'); + } + $this->load_ids(array( 'forums' => array( 'Download #1', @@ -118,6 +123,11 @@ class phpbb_functional_download_test extends phpbb_functional_test_case public function test_download_softdeleted_post() { + if (!class_exists('finfo')) + { + $this->markTestSkipped('Unable to run test with fileinfo disabled'); + } + $this->load_ids(array( 'forums' => array( 'Download #1', @@ -180,6 +190,11 @@ class phpbb_functional_download_test extends phpbb_functional_test_case public function test_download_softdeleted_topic() { + if (!class_exists('finfo')) + { + $this->markTestSkipped('Unable to run test with fileinfo disabled'); + } + $this->load_ids(array( 'forums' => array( 'Download #1', diff --git a/tests/functions/make_clickable_email_test.php b/tests/functions/make_clickable_email_test.php new file mode 100644 index 0000000000..4c802d0487 --- /dev/null +++ b/tests/functions/make_clickable_email_test.php @@ -0,0 +1,222 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +require_once dirname(__FILE__) . '/../../phpBB/includes/functions.php'; +require_once dirname(__FILE__) . '/../../phpBB/includes/functions_content.php'; + +class phpbb_functions_make_clickable_email_test extends phpbb_test_case +{ + protected function setUp() + { + parent::setUp(); + + global $config, $user, $request; + $user = new phpbb_mock_user(); + $request = new phpbb_mock_request(); + } + + /** + * 'e' tag for email addresses html + **/ + public function data_test_make_clickable_email_positive() + { + return array( + array( + 'nobody@phpbb.com', + '<!-- e --><a href="mailto:nobody@phpbb.com">nobody@phpbb.com</a><!-- e -->' + ), + array( + 'Nobody@sub.phpbb.com', + '<!-- e --><a href="mailto:Nobody@sub.phpbb.com">Nobody@sub.phpbb.com</a><!-- e -->' + ), + array( + 'alice.bob@foo.phpbb.com', + '<!-- e --><a href="mailto:alice.bob@foo.phpbb.com">alice.bob@foo.phpbb.com</a><!-- e -->' + ), + array( + 'alice-foo@bar.phpbb.com', + '<!-- e --><a href="mailto:alice-foo@bar.phpbb.com">alice-foo@bar.phpbb.com</a><!-- e -->' + ), + array( + 'alice_foo@bar.phpbb.com', + '<!-- e --><a href="mailto:alice_foo@bar.phpbb.com">alice_foo@bar.phpbb.com</a><!-- e -->' + ), + array( + 'alice+tag@foo.phpbb.com', + '<!-- e --><a href="mailto:alice+tag@foo.phpbb.com">alice+tag@foo.phpbb.com</a><!-- e -->' + ), + array( + 'alice&tag@foo.phpbb.com', + '<!-- e --><a href="mailto:alice&tag@foo.phpbb.com">alice&tag@foo.phpbb.com</a><!-- e -->' + ), + array( + 'alice@phpbb.australia', + '<!-- e --><a href="mailto:alice@phpbb.australia">alice@phpbb.australia</a><!-- e -->' + ), + + // Test shortened text for email > 55 characters long + // Email text should be turned into: first 39 chars + ' ... ' + last 10 chars + array( + 'alice@phpbb.topZlevelZdomainZnamesZcanZbeZupZtoZsixtyZthreeZcharactersZlong', + '<!-- e --><a href="mailto:alice@phpbb.topZlevelZdomainZnamesZcanZbeZupZtoZsixtyZthreeZcharactersZlong">alice@phpbb.topZlevelZdomainZnamesZcanZ ... ctersZlong</a><!-- e -->' + ), + array( + 'l3tt3rsAndNumb3rs@domain.com', + '<!-- e --><a href="mailto:l3tt3rsAndNumb3rs@domain.com">l3tt3rsAndNumb3rs@domain.com</a><!-- e -->' + ), + array( + 'has-dash@domain.com', + '<!-- e --><a href="mailto:has-dash@domain.com">has-dash@domain.com</a><!-- e -->' + ), + array( + 'hasApostrophe.o\'leary@domain.org', + '<!-- e --><a href="mailto:hasApostrophe.o\'leary@domain.org">hasApostrophe.o\'leary@domain.org</a><!-- e -->' + ), + array( + 'uncommonTLD@domain.museum', + '<!-- e --><a href="mailto:uncommonTLD@domain.museum">uncommonTLD@domain.museum</a><!-- e -->' + ), + array( + 'uncommonTLD@domain.travel', + '<!-- e --><a href="mailto:uncommonTLD@domain.travel">uncommonTLD@domain.travel</a><!-- e -->' + ), + array( + 'uncommonTLD@domain.mobi', + '<!-- e --><a href="mailto:uncommonTLD@domain.mobi">uncommonTLD@domain.mobi</a><!-- e -->' + ), + array( + 'countryCodeTLD@domain.uk', + '<!-- e --><a href="mailto:countryCodeTLD@domain.uk">countryCodeTLD@domain.uk</a><!-- e -->' + ), + array( + 'countryCodeTLD@domain.rw', + '<!-- e --><a href="mailto:countryCodeTLD@domain.rw">countryCodeTLD@domain.rw</a><!-- e -->' + ), + array( + 'numbersInDomain@911.com', + '<!-- e --><a href="mailto:numbersInDomain@911.com">numbersInDomain@911.com</a><!-- e -->' + ), + array( + 'underscore_inLocal@domain.net', + '<!-- e --><a href="mailto:underscore_inLocal@domain.net">underscore_inLocal@domain.net</a><!-- e -->' + ), + array( + 'IPInsteadOfDomain@127.0.0.1', + '<!-- e --><a href="mailto:IPInsteadOfDomain@127.0.0.1">IPInsteadOfDomain@127.0.0.1</a><!-- e -->' + ), + array( + 'IPAndPort@127.0.0.1:25', + '<!-- e --><a href="mailto:IPAndPort@127.0.0.1:25">IPAndPort@127.0.0.1:25</a><!-- e -->' + ), + array( + 'subdomain@sub.domain.com', + '<!-- e --><a href="mailto:subdomain@sub.domain.com">subdomain@sub.domain.com</a><!-- e -->' + ), + array( + 'local@dash-inDomain.com', + '<!-- e --><a href="mailto:local@dash-inDomain.com">local@dash-inDomain.com</a><!-- e -->' + ), + array( + 'dot.inLocal@foo.com', + '<!-- e --><a href="mailto:dot.inLocal@foo.com">dot.inLocal@foo.com</a><!-- e -->' + ), + array( + 'a@singleLetterLocal.org', + '<!-- e --><a href="mailto:a@singleLetterLocal.org">a@singleLetterLocal.org</a><!-- e -->' + ), + array( + 'singleLetterDomain@x.org', + '<!-- e --><a href="mailto:singleLetterDomain@x.org">singleLetterDomain@x.org</a><!-- e -->' + ), + array( + '&*=?^+{}\'~@validCharsInLocal.net', + '<!-- e --><a href="mailto:&*=?^+{}\'~@validCharsInLocal.net">&*=?^+{}\'~@validCharsInLocal.net</a><!-- e -->' + ), + array( + 'foor@bar.newTLD', + '<!-- e --><a href="mailto:foor@bar.newTLD">foor@bar.newTLD</a><!-- e -->' + ), + ); + } + + public function data_test_make_clickable_email_negative() + { + return array( + array('foo.example.com'), // @ is missing + array('.foo.example.com'), // . as first character + array('Foo.@example.com'), // . is last in local part + array('foo..123@example.com'), // . doubled + array('a@b@c@example.com'), // @ doubled + + // Emails with invalid characters + // (only 'valid' pieces having localparts prepended with one of the \n \t ( > chars should parsed if any) + array('()[]\;:,<>@example.com'), // invalid characters + array('abc(def@example.com', 'abc(<!-- e --><a href="mailto:def@example.com">def@example.com</a><!-- e -->'), // invalid character ( + array('abc)def@example.com'), // invalid character ) + array('abc[def@example.com'), // invalid character [ + array('abc]def@example.com'), // invalid character ] + array('abc\def@example.com'), // invalid character \ + array('abc;def@example.com'), // invalid character ; + array('abc:def@example.com'), // invalid character : + array('abc,def@example.com'), // invalid character , + array('abc<def@example.com'), // invalid character < + array('abc>def@example.com', 'abc><!-- e --><a href="mailto:def@example.com">def@example.com</a><!-- e -->'), // invalid character > + + // http://fightingforalostcause.net/misc/2006/compare-email-regex.php + array('missingDomain@.com'), + array('@missingLocal.org'), + array('missingatSign.net'), + array('missingDot@com'), + array('two@@signs.com'), + // Trailing colon is ignored + array('colonButNoPort@127.0.0.1:', '<!-- e --><a href="mailto:colonButNoPort@127.0.0.1">colonButNoPort@127.0.0.1</a><!-- e -->:'), + + array(''), + // Trailing part after the 3rd dot is ignored + array('someone-else@127.0.0.1.26', '<!-- e --><a href="mailto:someone-else@127.0.0.1">someone-else@127.0.0.1</a><!-- e -->.26'), + + array('.localStartsWithDot@domain.com'), + array('localEndsWithDot.@domain.com'), + array('two..consecutiveDots@domain.com'), + array('domainStartsWithDash@-domain.com'), + array('domainEndsWithDash@domain-.com'), + array('numbersInTLD@domain.c0m'), + array('missingTLD@domain.'), + array('! "#$%(),/;<>[]`|@invalidCharsInLocal.org'), + array('invalidCharsInDomain@! "#$%(),/;<>_[]`|.org'), + array('local@SecondLevelDomainNamesAreInvalidIfTheyAreLongerThan64Charactersss.org'), + // The domain zone name part after the 63rd char is ignored + array( + 'alice@phpbb.topZlevelZdomainZnamesZcanZbeZupZtoZsixtyZthreeZcharactersZlongZ', + '<!-- e --><a href="mailto:alice@phpbb.topZlevelZdomainZnamesZcanZbeZupZtoZsixtyZthreeZcharactersZlong">alice@phpbb.topZlevelZdomainZnamesZcanZ ... ctersZlong</a><!-- e -->Z' + ), + ); + } + + /** + * @dataProvider data_test_make_clickable_email_positive + */ + public function test_email_matching_positive($email, $expected) + { + $this->assertSame($expected, make_clickable($email)); + } + + /** + * @dataProvider data_test_make_clickable_email_negative + */ + public function test_email_matching_negative($email, $expected = null) + { + $expected = ($expected) ?: $email; + $this->assertSame($expected, make_clickable($email)); + } +} diff --git a/tests/test_framework/phpbb_functional_test_case.php b/tests/test_framework/phpbb_functional_test_case.php index b6769f08d0..844caa8f54 100644 --- a/tests/test_framework/phpbb_functional_test_case.php +++ b/tests/test_framework/phpbb_functional_test_case.php @@ -410,6 +410,18 @@ class phpbb_functional_test_case extends phpbb_test_case $form = $crawler->selectButton('Enable')->form(); $crawler = self::submit($form); $this->add_lang('acp/extensions'); + + $meta_refresh = $crawler->filter('meta[http-equiv="refresh"]'); + + // Wait for extension to be fully enabled + while (sizeof($meta_refresh)) + { + preg_match('#url=.+/(adm+.+)#', $meta_refresh->attr('content'), $match); + $url = $match[1]; + $crawler = self::request('POST', $url); + $meta_refresh = $crawler->filter('meta[http-equiv="refresh"]'); + } + $this->assertContainsLang('EXTENSION_ENABLE_SUCCESS', $crawler->filter('div.successbox')->text()); $this->logout(); diff --git a/tests/upload/filespec_test.php b/tests/upload/filespec_test.php index d8fa82e2b5..05547dcd00 100644 --- a/tests/upload/filespec_test.php +++ b/tests/upload/filespec_test.php @@ -266,6 +266,11 @@ class phpbb_filespec_test extends phpbb_test_case */ public function test_is_image_get_mimetype($filename, $mimetype, $expected) { + if (!class_exists('finfo') && strtolower(substr(PHP_OS, 0, 3)) === 'win') + { + $this->markTestSkipped('Unable to test mimetype guessing without fileinfo support on Windows'); + } + $filespec = $this->get_filespec(array('tmp_name' => $this->path . $filename, 'type' => $mimetype)); $filespec->get_mimetype($this->path . $filename); $this->assertEquals($expected, $filespec->is_image()); |