[ticket/11935] Merge remote-tracking branch 'upstream/develop'

PHPBB3-11935
This commit is contained in:
Matt Friedman 2013-10-29 19:12:32 -07:00
commit 16213c92fe
118 changed files with 3014 additions and 1091 deletions

View file

@ -10,18 +10,23 @@ env:
- DB=mysql - DB=mysql
- DB=postgres - DB=postgres
before_script: install:
- sh -c "if [ '$DB' = 'postgres' ]; then psql -c 'DROP DATABASE IF EXISTS phpbb_tests;' -U postgres; fi"
- sh -c "if [ '$DB' = 'postgres' ]; then psql -c 'create database phpbb_tests;' -U postgres; fi"
- sh -c "if [ '$DB' = 'mariadb' ]; then travis/setup-mariadb.sh; fi" - sh -c "if [ '$DB' = 'mariadb' ]; then travis/setup-mariadb.sh; fi"
- sh -c "if [ '$DB' = 'mysql' -o '$DB' = 'mariadb' ]; then mysql -e 'create database IF NOT EXISTS phpbb_tests;'; fi" - sh -c "if [ `php -r "echo (int) version_compare(PHP_VERSION, '5.3.19', '>=');"` = "1" ]; then travis/setup-webserver.sh; fi"
- travis/install-php-extensions.sh - travis/install-php-extensions.sh
- cd phpBB - cd phpBB
- php ../composer.phar install --dev --no-interaction --prefer-source - php ../composer.phar install --dev --no-interaction --prefer-source
- cd .. - cd ..
- sh -c "if [ `php -r "echo (int) version_compare(PHP_VERSION, '5.3.19', '>=');"` = "1" ]; then travis/setup-webserver.sh; fi"
before_script:
- sh -c "if [ '$DB' = 'postgres' ]; then psql -c 'DROP DATABASE IF EXISTS phpbb_tests;' -U postgres; fi"
- sh -c "if [ '$DB' = 'postgres' ]; then psql -c 'create database phpbb_tests;' -U postgres; fi"
- sh -c "if [ '$DB' = 'mysql' -o '$DB' = 'mariadb' ]; then mysql -e 'create database IF NOT EXISTS phpbb_tests;'; fi"
script: script:
- cd build
- sh -c "if [ '$TRAVIS_PHP_VERSION' = '5.5' -a '$DB' = 'mysql' ]; then ../phpBB/vendor/bin/phing sniff; fi"
- cd ..
- phpBB/vendor/bin/phpunit --configuration travis/phpunit-$DB-travis.xml - phpBB/vendor/bin/phpunit --configuration travis/phpunit-$DB-travis.xml
notifications: notifications:

View file

@ -26,8 +26,8 @@ To be able to run an installation from the repo (and not from a pre-built packag
## AUTOMATED TESTING ## AUTOMATED TESTING
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. 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 - [![Build Status](https://secure.travis-ci.org/phpbb/phpbb3.png?branch=develop)](http://travis-ci.org/phpbb/phpbb3) develop - [![Build Status](https://secure.travis-ci.org/phpbb/phpbb.png?branch=develop)](http://travis-ci.org/phpbb/phpbb)
develop-olympus - [![Build Status](https://secure.travis-ci.org/phpbb/phpbb3.png?branch=develop-olympus)](http://travis-ci.org/phpbb/phpbb3) develop-olympus - [![Build Status](https://secure.travis-ci.org/phpbb/phpbb.png?branch=develop-olympus)](http://travis-ci.org/phpbb/phpbb)
## LICENSE ## LICENSE

View file

@ -74,6 +74,30 @@
passthru="true" /> passthru="true" />
</target> </target>
<target name="sniff">
<exec command="phpBB/vendor/bin/phpcs
-s
--extensions=php
--standard=build/code_sniffer/ruleset-php-strict.xml
--ignore=phpBB/phpbb/db/migration/data/v30x/*
phpBB/phpbb"
dir="." checkreturn="true" passthru="true" />
<exec command="phpBB/vendor/bin/phpcs
-s
--extensions=php
--standard=build/code_sniffer/ruleset-php-legacy.xml
--ignore=phpBB/cache/*
--ignore=phpBB/develop/*
--ignore=phpBB/includes/diff/*.php
--ignore=phpBB/includes/sphinxapi.php
--ignore=phpBB/includes/utf/data/*
--ignore=phpBB/install/data/*
--ignore=phpBB/phpbb/*
--ignore=phpBB/vendor/*
phpBB"
dir="." checkreturn="true" passthru="true" />
</target>
<target name="docs"> <target name="docs">
<!-- only works if you setup phpdoctor: <!-- only works if you setup phpdoctor:
git clone https://github.com/peej/phpdoctor.git git clone https://github.com/peej/phpdoctor.git

View file

@ -0,0 +1,12 @@
<?xml version="1.0"?>
<ruleset name="phpBB Minimum Standard">
<description>phpBB minimum coding standard</description>
<!-- All code files MUST use only UTF-8 without BOM. -->
<rule ref="Generic.Files.ByteOrderMark" />
<!-- All code files MUST use the Unix LF (linefeed) line ending. -->
<rule ref="Generic.Files.LineEndings" />
</ruleset>

View file

@ -0,0 +1,23 @@
<?xml version="1.0"?>
<ruleset name="phpBB PHP Legacy Standard">
<description>phpBB legacy coding standard for PHP files</description>
<rule ref="./ruleset-minimum.xml" />
<!-- The body of each structure MUST be enclosed by braces. -->
<rule ref="Generic.ControlStructures.InlineControlStructure" />
<!-- Class constants MUST be declared in all upper case with underscore separators. -->
<rule ref="Generic.NamingConventions.UpperCaseConstantName" />
<!-- Only <?php, no short tags. -->
<rule ref="Generic.PHP.DisallowShortOpenTag.EchoFound" />
<!-- Method arguments with default values MUST go at the end of the argument list. -->
<rule ref="PEAR.Functions.ValidDefaultValue" />
<!-- The ?> closing tag MUST be omitted from files containing only PHP. -->
<rule ref="Zend.Files.ClosingTag" />
</ruleset>

View file

@ -0,0 +1,42 @@
<?xml version="1.0"?>
<ruleset name="phpBB PHP Strict Standard">
<description>phpBB coding standard for PHP files</description>
<rule ref="./ruleset-php-legacy.xml" />
<!-- There SHOULD NOT be more than 80 characters per line
There MUST NOT be more than 120 characters per line -->
<!--
<rule ref="Generic.Files.LineLength">
<properties>
<property name="lineLimit" value="80"/>
<property name="absoluteLineLimit" value="120"/>
</properties>
</rule>
-->
<!-- The PHP constants true, false, and null MUST be in lower case. -->
<rule ref="Generic.PHP.LowerCaseConstant" />
<!-- PHP keywords MUST be in lower case. -->
<rule ref="Generic.PHP.LowerCaseKeyword" />
<!-- There MUST NOT be trailing whitespace at the end of lines. -->
<rule ref="Squiz.WhiteSpace.SuperfluousWhitespace" />
<!-- There MUST NOT be whitespace before the first content of a file -->
<rule ref="Squiz.WhiteSpace.SuperfluousWhitespace.StartFile" />
<!-- There MUST NOT be whitespace after the last content of a file -->
<rule ref="Squiz.WhiteSpace.SuperfluousWhitespace.EndFile" />
<!-- Functions MUST NOT contain multiple empty lines in a row -->
<rule ref="Squiz.WhiteSpace.SuperfluousWhitespace.EmptyLines" />
<!-- When present, all use declarations MUST go after the namespace declaration.
There MUST be one use keyword per declaration.
There MUST be one blank line after the use block. -->
<rule ref="PSR2.Namespaces.UseDeclaration" />
</ruleset>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 796 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 175 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 788 B

View file

@ -8,18 +8,14 @@
</select>&nbsp;<input type="submit" value="{L_GO}" name="avatar_local_go" class="button2" /></dd> </select>&nbsp;<input type="submit" value="{L_GO}" name="avatar_local_go" class="button2" /></dd>
</dl> </dl>
<!-- IF AVATAR_LOCAL_SHOW --> <!-- IF AVATAR_LOCAL_SHOW -->
<table> <ul id="gallery">
<!-- BEGIN avatar_local_row --> <!-- BEGIN avatar_local_row -->
<tr>
<!-- BEGIN avatar_local_col --> <!-- BEGIN avatar_local_col -->
<td class="row1" style="text-align: center;"><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> <li>
<label for="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="" /><br />
<input type="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_col.AVATAR_FILE}" /></label>
</li>
<!-- END avatar_local_col --> <!-- END avatar_local_col -->
</tr>
<tr>
<!-- BEGIN avatar_local_option -->
<td class="row2" style="text-align: center;"><input type="radio" name="avatar_local_file" id="av-{avatar_local_row.S_ROW_COUNT}-{avatar_local_row.avatar_local_option.S_ROW_COUNT}" value="{avatar_local_row.avatar_local_option.AVATAR_FILE}" /></td>
<!-- END avatar_local_option -->
</tr>
<!-- END avatar_local_row --> <!-- END avatar_local_row -->
</table> </ul>
<!-- ENDIF --> <!-- ENDIF -->

View file

@ -440,19 +440,19 @@
<p><strong>{NAVIGATION}<!-- IF S_NO_FORUMS --> [<a href="{U_EDIT}">{L_EDIT}</a> | <a href="{U_DELETE}">{L_DELETE}</a><!-- IF not S_LINK --> | <a href="{U_SYNC}">{L_RESYNC}</a><!-- ENDIF -->]<!-- ENDIF --></strong></p> <p><strong>{NAVIGATION}<!-- IF S_NO_FORUMS --> [<a href="{U_EDIT}">{L_EDIT}</a> | <a href="{U_DELETE}">{L_DELETE}</a><!-- IF not S_LINK --> | <a href="{U_SYNC}">{L_RESYNC}</a><!-- ENDIF -->]<!-- ENDIF --></strong></p>
<!-- IF .forums --> <!-- IF .forums -->
<table class="table1"> <table class="table1 forums">
<col class="row1" /><col class="row1" /><col class="row2" /> <col class="row1" /><col class="row1" /><col class="row2" />
<tbody> <tbody>
<!-- BEGIN forums --> <!-- BEGIN forums -->
<tr data-down="{forums.U_MOVE_DOWN}" data-up="{forums.U_MOVE_UP}"> <tr data-down="{forums.U_MOVE_DOWN}" data-up="{forums.U_MOVE_UP}">
<td style="width: 5%; text-align: center;">{forums.FOLDER_IMAGE}</td> <td class="folder">{forums.FOLDER_IMAGE}</td>
<td> <td class="forum-desc">
<!-- IF forums.FORUM_IMAGE --><div style="float: {S_CONTENT_FLOW_BEGIN}; margin-right: 5px;">{forums.FORUM_IMAGE}</div><!-- ENDIF --> <!-- IF forums.FORUM_IMAGE --><div style="float: {S_CONTENT_FLOW_BEGIN}; margin-right: 5px;">{forums.FORUM_IMAGE}</div><!-- ENDIF -->
<strong><!-- IF forums.S_FORUM_LINK -->{forums.FORUM_NAME}<!-- ELSE --><a href="{forums.U_FORUM}">{forums.FORUM_NAME}</a><!-- ENDIF --></strong> <strong><!-- IF forums.S_FORUM_LINK -->{forums.FORUM_NAME}<!-- ELSE --><a href="{forums.U_FORUM}">{forums.FORUM_NAME}</a><!-- ENDIF --></strong>
<!-- IF forums.FORUM_DESCRIPTION --><br /><span>{forums.FORUM_DESCRIPTION}</span><!-- ENDIF --> <!-- IF forums.FORUM_DESCRIPTION --><br /><span>{forums.FORUM_DESCRIPTION}</span><!-- ENDIF -->
<!-- IF forums.S_FORUM_POST --><br /><br /><span>{L_TOPICS}{L_COLON} <strong>{forums.FORUM_TOPICS}</strong> / {L_POSTS}{L_COLON} <strong>{forums.FORUM_POSTS}</strong></span><!-- ENDIF --> <!-- IF forums.S_FORUM_POST --><br /><br /><span>{L_TOPICS}{L_COLON} <strong>{forums.FORUM_TOPICS}</strong> / {L_POSTS}{L_COLON} <strong>{forums.FORUM_POSTS}</strong></span><!-- ENDIF -->
</td> </td>
<td style="vertical-align: top; width: 100px; text-align: right; white-space: nowrap;"> <td class="actions">
<!-- IF forums.S_FIRST_ROW && not forums.S_LAST_ROW --> <!-- IF forums.S_FIRST_ROW && not forums.S_LAST_ROW -->
<span class="up">{ICON_MOVE_UP_DISABLED}</span> <span class="up">{ICON_MOVE_UP_DISABLED}</span>
<span class="down"><a href="{forums.U_MOVE_DOWN}" data-ajax="row_down" data-overlay="false">{ICON_MOVE_DOWN}</a></span> <span class="down"><a href="{forums.U_MOVE_DOWN}" data-ajax="row_down" data-overlay="false">{ICON_MOVE_DOWN}</a></span>

View file

@ -41,7 +41,7 @@
<tr data-down="{legend.U_MOVE_DOWN}" data-up="{legend.U_MOVE_UP}"> <tr data-down="{legend.U_MOVE_DOWN}" data-up="{legend.U_MOVE_UP}">
<td><strong<!-- IF legend.GROUP_COLOUR --> style="color: {legend.GROUP_COLOUR}"<!-- ENDIF -->>{legend.GROUP_NAME}</strong></td> <td><strong<!-- IF legend.GROUP_COLOUR --> style="color: {legend.GROUP_COLOUR}"<!-- ENDIF -->>{legend.GROUP_NAME}</strong></td>
<td style="text-align: center;">{legend.GROUP_TYPE}</td> <td style="text-align: center;">{legend.GROUP_TYPE}</td>
<td style="vertical-align: top; width: 100px; text-align: right; white-space: nowrap;"> <td class="actions">
<!-- IF legend.S_FIRST_ROW && not legend.S_LAST_ROW --> <!-- IF legend.S_FIRST_ROW && not legend.S_LAST_ROW -->
<span class="up">{ICON_MOVE_UP_DISABLED}</span> <span class="up">{ICON_MOVE_UP_DISABLED}</span>
<span class="down"><a href="{legend.U_MOVE_DOWN}" data-ajax="row_down" data-overlay="false">{ICON_MOVE_DOWN}</a></span> <span class="down"><a href="{legend.U_MOVE_DOWN}" data-ajax="row_down" data-overlay="false">{ICON_MOVE_DOWN}</a></span>
@ -136,7 +136,7 @@
</td> </td>
<td style="text-align: center;"><!-- IF teampage.GROUP_TYPE -->{teampage.GROUP_TYPE}<!-- ELSE -->-<!-- ENDIF --> <td style="text-align: center;"><!-- IF teampage.GROUP_TYPE -->{teampage.GROUP_TYPE}<!-- ELSE -->-<!-- ENDIF -->
</td></td> </td></td>
<td style="vertical-align: top; width: 100px; text-align: right; white-space: nowrap;"> <td class="actions">
<!-- IF teampage.S_FIRST_ROW && not teampage.S_LAST_ROW --> <!-- IF teampage.S_FIRST_ROW && not teampage.S_LAST_ROW -->
<span class="up">{ICON_MOVE_UP_DISABLED}</span> <span class="up">{ICON_MOVE_UP_DISABLED}</span>
<span class="down"><a href="{teampage.U_MOVE_DOWN}" data-ajax="row_down" data-overlay="false">{ICON_MOVE_DOWN}</a></span> <span class="down"><a href="{teampage.U_MOVE_DOWN}" data-ajax="row_down" data-overlay="false">{ICON_MOVE_DOWN}</a></span>

View file

@ -78,7 +78,7 @@
<!-- EVENT acp_main_notice_after --> <!-- EVENT acp_main_notice_after -->
<table class="table1"> <table class="table1 two-columns no-header" data-no-responsive-header="true">
<caption>{L_FORUM_STATS}</caption> <caption>{L_FORUM_STATS}</caption>
<col class="col1" /><col class="col2" /><col class="col1" /><col class="col2" /> <col class="col1" /><col class="col2" /><col class="col1" /><col class="col2" />
<thead> <thead>
@ -168,21 +168,21 @@
</dl> </dl>
</form> </form>
<form id="action_stats_form" method="post" action="{U_ACTION}" data-ajax="true"> <form id="action_stats_form" method="post" action="{U_ACTION}">
<dl> <dl>
<dt><label for="action_stats">{L_RESYNC_STATS}</label><br /><span>{L_RESYNC_STATS_EXPLAIN}</span></dt> <dt><label for="action_stats">{L_RESYNC_STATS}</label><br /><span>{L_RESYNC_STATS_EXPLAIN}</span></dt>
<dd><input type="hidden" name="action" value="stats" /><input class="button2" type="submit" id="action_stats" name="action_stats" value="{L_RUN}" /></dd> <dd><input type="hidden" name="action" value="stats" /><input class="button2" type="submit" id="action_stats" name="action_stats" value="{L_RUN}" /></dd>
</dl> </dl>
</form> </form>
<form id="action_user_form" method="post" action="{U_ACTION}" data-ajax="true"> <form id="action_user_form" method="post" action="{U_ACTION}">
<dl> <dl>
<dt><label for="action_user">{L_RESYNC_POSTCOUNTS}</label><br /><span>{L_RESYNC_POSTCOUNTS_EXPLAIN}</span></dt> <dt><label for="action_user">{L_RESYNC_POSTCOUNTS}</label><br /><span>{L_RESYNC_POSTCOUNTS_EXPLAIN}</span></dt>
<dd><input type="hidden" name="action" value="user" /><input class="button2" type="submit" id="action_user" name="action_user" value="{L_RUN}" /></dd> <dd><input type="hidden" name="action" value="user" /><input class="button2" type="submit" id="action_user" name="action_user" value="{L_RUN}" /></dd>
</dl> </dl>
</form> </form>
<form id="action_db_track_form" method="post" action="{U_ACTION}" data-ajax="true"> <form id="action_db_track_form" method="post" action="{U_ACTION}">
<dl> <dl>
<dt><label for="action_db_track">{L_RESYNC_POST_MARKING}</label><br /><span>{L_RESYNC_POST_MARKING_EXPLAIN}</span></dt> <dt><label for="action_db_track">{L_RESYNC_POST_MARKING}</label><br /><span>{L_RESYNC_POST_MARKING_EXPLAIN}</span></dt>
<dd><input type="hidden" name="action" value="db_track" /><input class="button2" type="submit" id="action_db_track" name="action_db_track" value="{L_RUN}" /></dd> <dd><input type="hidden" name="action" value="db_track" /><input class="button2" type="submit" id="action_db_track" name="action_db_track" value="{L_RUN}" /></dd>

View file

@ -90,9 +90,8 @@
</div> </div>
<!-- BEGIN auth --> <!-- BEGIN auth -->
<div class="permissions-panel" id="options00{auth.S_ROW_COUNT}"<!-- IF auth.S_FIRST_ROW --><!-- ELSE --> style="display: none;"<!-- ENDIF -->> <div class="permissions-panel" id="options00{auth.S_ROW_COUNT}"<!-- IF auth.S_FIRST_ROW --><!-- ELSE --> style="display: none;"<!-- ENDIF -->>
<span class="corners-top"><span></span></span>
<div class="tablewrap"> <div class="tablewrap">
<table id="table00{auth.S_ROW_COUNT}" class="table1"> <table id="table00{auth.S_ROW_COUNT}" class="table1 not-responsive">
<colgroup> <colgroup>
<col class="permissions-name" /> <col class="permissions-name" />
<col class="permissions-yes" /> <col class="permissions-yes" />
@ -120,7 +119,6 @@
</tbody> </tbody>
</table> </table>
</div> </div>
<span class="corners-bottom"><span></span></span>
</div> </div>
<!-- END auth --> <!-- END auth -->
</div> </div>

View file

@ -110,7 +110,7 @@
<!-- ELSEIF S_SELECT_USERGROUP --> <!-- ELSEIF S_SELECT_USERGROUP -->
<div style="float: {S_CONTENT_FLOW_BEGIN}; width: 48%;"> <div class="column1">
<!-- IF S_CAN_SELECT_USER --> <!-- IF S_CAN_SELECT_USER -->
@ -155,7 +155,7 @@
</div> </div>
<div style="float: {S_CONTENT_FLOW_END}; width: 48%"> <div class="column2">
<!-- IF S_CAN_SELECT_GROUP --> <!-- IF S_CAN_SELECT_GROUP -->
@ -200,7 +200,7 @@
<!-- ELSEIF S_SELECT_USERGROUP_VIEW --> <!-- ELSEIF S_SELECT_USERGROUP_VIEW -->
<div style="float: {S_CONTENT_FLOW_BEGIN}; width: 48%;"> <div class="column1">
<h1>{L_USERS}</h1> <h1>{L_USERS}</h1>
@ -241,7 +241,7 @@
</div> </div>
<div style="float: {S_CONTENT_FLOW_END}; width: 48%"> <div class="column2">
<h1>{L_USERGROUPS}</h1> <h1>{L_USERGROUPS}</h1>
@ -324,7 +324,7 @@
</form> </form>
<!-- ENDIF --> <!-- ENDIF -->
<br /><br /> <br class="responsive-hide" /><br class="responsive-hide" />
<!-- include tooltip file --> <!-- include tooltip file -->
<script type="text/javascript" src="style/tooltip.js"></script> <script type="text/javascript" src="style/tooltip.js"></script>
@ -340,7 +340,7 @@
<!-- INCLUDE permission_mask.html --> <!-- INCLUDE permission_mask.html -->
<br /><br /> <br class="responsive-hide" /><br class="responsive-hide" />
<fieldset class="quick" style="float: {S_CONTENT_FLOW_END};"> <fieldset class="quick" style="float: {S_CONTENT_FLOW_END};">
<input class="button1" type="submit" name="action[apply_all_permissions]" value="{L_APPLY_ALL_PERMISSIONS}" /> <input class="button1" type="submit" name="action[apply_all_permissions]" value="{L_APPLY_ALL_PERMISSIONS}" />
@ -348,7 +348,7 @@
{S_FORM_TOKEN} {S_FORM_TOKEN}
</fieldset> </fieldset>
<br /><br /> <br class="responsive-hide" /><br class="responsive-hide" />
</form> </form>

View file

@ -79,7 +79,7 @@
<!-- ENDIF --> <!-- ENDIF -->
<!-- IF .styles_list --> <!-- IF .styles_list -->
<table class="table1"> <table class="table1 styles">
<thead> <thead>
<tr> <tr>
<th>{L_STYLE_NAME}</th> <th>{L_STYLE_NAME}</th>
@ -97,9 +97,9 @@
<!-- ELSE --> <!-- ELSE -->
<!-- IF $ROW_CLASS == 'row2a' --><!-- DEFINE $ROW_CLASS = 'row2b' --><!-- ELSE --><!-- DEFINE $ROW_CLASS = 'row2a' --><!-- ENDIF --> <!-- IF $ROW_CLASS == 'row2a' --><!-- DEFINE $ROW_CLASS = 'row2b' --><!-- ELSE --><!-- DEFINE $ROW_CLASS = 'row2a' --><!-- ENDIF -->
<!-- ENDIF --> <!-- ENDIF -->
<td class="{$ROW_CLASS}" style="padding-left: {styles_list.PADDING}px;"> <td class="{$ROW_CLASS}" style="padding-{S_CONTENT_FLOW_BEGIN}: {styles_list.PADDING}px;">
<!-- IF styles_list.STYLE_ID and styles_list.COMMENT == '' and styles_list.STYLE_ACTIVE --> <!-- IF styles_list.STYLE_ID and styles_list.COMMENT == '' and styles_list.STYLE_ACTIVE -->
<div class="default-style" style="display: none; float: right;"> <div class="default-style" style="display: none; float: {S_CONTENT_FLOW_END};">
<input class="radio" type="radio" name="default" value="{styles_list.STYLE_ID}"<!-- IF styles_list.DEFAULT --> checked="checked"<!-- ELSE --><!-- DEFINE $S_DEFAULT = 1 --><!-- ENDIF --> title="{L_STYLE_DEFAULT}" /> <input class="radio" type="radio" name="default" value="{styles_list.STYLE_ID}"<!-- IF styles_list.DEFAULT --> checked="checked"<!-- ELSE --><!-- DEFINE $S_DEFAULT = 1 --><!-- ENDIF --> title="{L_STYLE_DEFAULT}" />
</div> </div>
<!-- ENDIF --> <!-- ENDIF -->
@ -117,9 +117,9 @@
<!-- ENDIF --> <!-- ENDIF -->
</td> </td>
<!-- IF not STYLES_LIST_HIDE_COUNT --> <!-- IF not STYLES_LIST_HIDE_COUNT -->
<td class="{$ROW_CLASS}" style="text-align: center;">{styles_list.USERS}</td> <td class="{$ROW_CLASS} users">{styles_list.USERS}</td>
<!-- ENDIF --> <!-- ENDIF -->
<td class="{$ROW_CLASS}" style="text-align: center;"> <td class="{$ROW_CLASS} actions">
<!-- BEGIN actions --> <!-- BEGIN actions -->
<!-- IF styles_list.actions.S_ROW_COUNT > 0 --> | <!-- ENDIF --> <!-- IF styles_list.actions.S_ROW_COUNT > 0 --> | <!-- ENDIF -->
<!-- IF styles_list.actions.U_ACTION --> <!-- IF styles_list.actions.U_ACTION -->
@ -129,7 +129,7 @@
<!-- END actions --> <!-- END actions -->
</td> </td>
{styles_list.EXTRA} {styles_list.EXTRA}
<td class="{$ROW_CLASS}" width="20" style="text-align: center;"> <td class="{$ROW_CLASS} mark" width="20">
<!-- IF styles_list.STYLE_ID --> <!-- IF styles_list.STYLE_ID -->
<input class="checkbox" type="checkbox" name="ids[]" value="{styles_list.STYLE_ID}" /> <input class="checkbox" type="checkbox" name="ids[]" value="{styles_list.STYLE_ID}" />
<!-- ELSE --> <!-- ELSE -->

File diff suppressed because it is too large Load diff

243
phpBB/adm/style/admin.js Normal file
View file

@ -0,0 +1,243 @@
/**
* phpBB3 ACP functions
*/
/**
* Parse document block
*/
function parse_document(container)
{
var test = document.createElement('div'),
oldBrowser = (typeof test.style.borderRadius == 'undefined');
delete test;
/**
* Navigation
*/
container.find('#menu').each(function() {
var menu = $(this),
blocks = menu.children('.menu-block');
if (!blocks.length) {
return;
}
// Set onclick event
blocks.children('a.header').click(function() {
var parent = $(this).parent();
if (!parent.hasClass('active')) {
parent.siblings().removeClass('active');
}
parent.toggleClass('active');
});
// Set active menu
menu.find('#activemenu').parents('.menu-block').addClass('active');
// Check if there is active menu
if (!blocks.filter('.active').length) {
blocks.filter(':first').addClass('active');
}
});
/**
* Responsive tables
*/
container.find('table').not('.not-responsive').each(function() {
var $this = $(this),
th = $this.find('thead > tr > th'),
columns = th.length,
headers = [],
totalHeaders = 0,
i, headersLength;
// Find columns
$this.find('colgroup:first').children().each(function(i) {
var column = $(this);
$this.find('td:nth-child(' + (i + 1) + ')').addClass(column.prop('className'));
});
// Styles table
if ($this.hasClass('styles')) {
$this.find('td:first-child[style]').each(function() {
var style = $(this).attr('style');
if (style.length) {
$(this).parent('tr').attr('style', style.toLowerCase().replace('padding', 'margin')).addClass('responsive-style-row');
}
});
}
// Find each header
if (!$this.data('no-responsive-header'))
{
th.each(function(column) {
var cell = $(this),
colspan = parseInt(cell.attr('colspan')),
dfn = cell.attr('data-dfn'),
text = dfn ? dfn : cell.text().trim();
if (text == '&nbsp;') text = '';
colspan = isNaN(colspan) || colspan < 1 ? 1 : colspan;
for (i=0; i<colspan; i++) {
headers.push(text);
}
totalHeaders ++;
if (dfn && !column) {
$this.addClass('show-header');
}
});
}
headersLength = headers.length;
// Add header text to each cell as <dfn>
$this.addClass('responsive');
if (totalHeaders < 2) {
$this.addClass('show-header');
return;
}
$this.find('tbody > tr').each(function() {
var row = $(this),
cells = row.children('td'),
column = 0;
if (cells.length == 1) {
row.addClass('big-column');
return;
}
cells.each(function() {
var cell = $(this),
colspan = parseInt(cell.attr('colspan')),
text = cell.text().trim();
if (headersLength <= column) {
return;
}
if ((text.length && text !== '-') || cell.children().length) {
if (headers[column] != '') {
cell.prepend('<dfn style="display: none;">' + headers[column] + '</dfn>');
}
}
else {
cell.addClass('empty');
}
colspan = isNaN(colspan) || colspan < 1 ? 1 : colspan;
column += colspan;
});
});
});
/**
* Hide empty responsive tables
*/
container.find('table.responsive > tbody').each(function() {
var items = $(this).children('tr');
if (items.length == 0)
{
$(this).parent('table:first').addClass('responsive-hide');
}
});
/**
* Fieldsets with empty <span>
*/
container.find('fieldset dt > span:last-child').each(function() {
var $this = $(this);
if ($this.html() == '&nbsp;') {
$this.addClass('responsive-hide');
}
});
/**
* Responsive tabs
*/
container.find('#tabs').not('[data-skip-responsive]').each(function() {
var $this = $(this),
$body = $('body'),
ul = $this.children(),
tabs = ul.children().not('[data-skip-responsive]'),
links = tabs.children('a'),
item = ul.append('<li class="responsive-tab" style="display:none;"><a href="javascript:void(0);" class="responsive-tab-link"><span>&nbsp;</span></a><div class="dropdown tab-dropdown" style="display: none;"><div class="pointer"><div class="pointer-inner" /></div><ul class="dropdown-contents" /></div></li>').find('li.responsive-tab'),
menu = item.find('.dropdown-contents'),
maxHeight = 0,
lastWidth = false,
responsive = false;
links.each(function() {
var link = $(this);
maxHeight = Math.max(maxHeight, Math.max(link.outerHeight(true), link.parent().outerHeight(true)));
})
function check() {
var width = $body.width(),
height = $this.height();
if (arguments.length == 0 && (!responsive || width <= lastWidth) && height <= maxHeight) {
return;
}
tabs.show();
item.hide();
lastWidth = width;
height = $this.height();
if (height <= maxHeight) {
responsive = false;
if (item.hasClass('dropdown-visible')) {
phpbb.toggleDropdown.call(item.find('a.responsive-tab-link').get(0));
}
return;
}
responsive = true;
item.show();
menu.html('');
var availableTabs = tabs.filter(':not(.activetab, .responsive-tab)'),
total = availableTabs.length,
i, tab;
for (i = total - 1; i >= 0; i --) {
tab = availableTabs.eq(i);
menu.prepend(tab.clone(true));
tab.hide();
if ($this.height() <= maxHeight) {
menu.find('a').click(function() { check(true); });
return;
}
}
menu.find('a').click(function() { check(true); });
}
phpbb.registerDropdown(item.find('a.responsive-tab-link'), item.find('.dropdown'), {visibleClass: 'activetab', verticalDirection: 'down'});
check(true);
$(window).resize(check);
});
}
/**
* Run onload functions
*/
(function($) {
$(document).ready(function() {
// Swap .nojs and .hasjs
$('body.nojs').toggleClass('nojs hasjs');
// Focus forms
$('form[data-focus]:first').each(function() {
$('#' + this.getAttribute('data-focus')).focus();
});
parse_document($('body'));
});
})(jQuery);

View file

@ -1,10 +1,7 @@
</div>
</div>
<span class="corners-bottom"><span></span></span>
<div class="clear"></div>
</div> </div>
</div><!-- /#main -->
</div> </div>
</div><!-- /#acp -->
</div> </div>
<div id="page-footer"> <div id="page-footer">
@ -14,6 +11,8 @@
<script type="text/javascript" src="{T_JQUERY_LINK}"></script> <script type="text/javascript" src="{T_JQUERY_LINK}"></script>
<!-- IF S_ALLOW_CDN --><script type="text/javascript">window.jQuery || document.write(unescape('%3Cscript src="{T_ASSETS_PATH}/javascript/jquery.js" type="text/javascript"%3E%3C/script%3E'));</script><!-- ENDIF --> <!-- IF S_ALLOW_CDN --><script type="text/javascript">window.jQuery || document.write(unescape('%3Cscript src="{T_ASSETS_PATH}/javascript/jquery.js" type="text/javascript"%3E%3C/script%3E'));</script><!-- ENDIF -->
<!-- INCLUDEJS admin.js -->
{$SCRIPTS}
</body> </body>
</html> </html>

View file

@ -2,6 +2,7 @@
<html dir="{S_CONTENT_DIRECTION}" lang="{S_USER_LANG}"> <html dir="{S_CONTENT_DIRECTION}" lang="{S_USER_LANG}">
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width" />
<!-- IF META -->{META}<!-- ENDIF --> <!-- IF META -->{META}<!-- ENDIF -->
<title>{PAGE_TITLE}</title> <title>{PAGE_TITLE}</title>
@ -34,7 +35,7 @@ function dE(n, s, type)
</head> </head>
<body class="{S_CONTENT_DIRECTION}"> <body class="{S_CONTENT_DIRECTION} nojs">
<div id="wrap"> <div id="wrap">
<div id="page-header"> <div id="page-header">
<h1>{L_INSTALL_PANEL}</h1> <h1>{L_INSTALL_PANEL}</h1>
@ -54,16 +55,15 @@ function dE(n, s, type)
<div id="tabs"> <div id="tabs">
<ul> <ul>
<!-- BEGIN t_block1 --> <!-- BEGIN t_block1 -->
<li<!-- IF t_block1.S_SELECTED --> id="activetab"<!-- ENDIF -->><a href="{t_block1.U_TITLE}"><span>{t_block1.L_TITLE}</span></a></li> <li<!-- IF t_block1.S_SELECTED --> class="activetab"<!-- ENDIF -->><a href="{t_block1.U_TITLE}"><span>{t_block1.L_TITLE}</span></a></li>
<!-- END t_block1 --> <!-- END t_block1 -->
</ul> </ul>
</div> </div>
<div id="acp"> <div id="acp">
<div class="panel">
<span class="corners-top"><span></span></span>
<div id="content"> <div id="content">
<div id="menu"> <div id="menu">
<div class="menu-block no-header">
<ul> <ul>
<!-- BEGIN l_block1 --> <!-- BEGIN l_block1 -->
<li<!-- IF l_block1.S_SELECTED --> id="activemenu"<!-- ENDIF -->><a href="{l_block1.U_TITLE}"><span>{l_block1.L_TITLE}</span></a></li> <li<!-- IF l_block1.S_SELECTED --> id="activemenu"<!-- ENDIF -->><a href="{l_block1.U_TITLE}"><span>{l_block1.L_TITLE}</span></a></li>
@ -73,5 +73,7 @@ function dE(n, s, type)
<!-- END l_block2 --> <!-- END l_block2 -->
</ul> </ul>
</div> </div>
</div>
<div id="main" class="install-body"> <div id="main" class="install-body">
<div class="main">

View file

@ -2,6 +2,7 @@
<html dir="{S_CONTENT_DIRECTION}" lang="{S_USER_LANG}"> <html dir="{S_CONTENT_DIRECTION}" lang="{S_USER_LANG}">
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width" />
<!-- IF META -->{META}<!-- ENDIF --> <!-- IF META -->{META}<!-- ENDIF -->
<title>{PAGE_TITLE}</title> <title>{PAGE_TITLE}</title>
@ -33,7 +34,7 @@ window.onresize = resize_panel;
<style type="text/css"> <style type="text/css">
/* <![CDATA[ */ /* <![CDATA[ */
#main { #main, .rtl #main {
font-size: 1em; font-size: 1em;
line-height: 0.7em; line-height: 0.7em;
margin: 0; margin: 0;
@ -43,6 +44,7 @@ window.onresize = resize_panel;
#diff_content { #diff_content {
padding: 30px 10px 10px; padding: 30px 10px 10px;
overflow: hidden;
} }
<!-- IF DIFF_MODE neq 'side_by_side' and DIFF_MODE neq 'raw' --> <!-- IF DIFF_MODE neq 'side_by_side' and DIFF_MODE neq 'raw' -->
@ -238,14 +240,12 @@ table.hrdiff caption span {
<div id="page-body"> <div id="page-body">
<div id="acp"> <div id="acp">
<div class="panel" id="codepanel"> <div id="codepanel">
<span class="corners-top"><span></span></span>
<div id="diff_content"> <div id="diff_content">
<div id="main"> <div id="main">
{DIFF_CONTENT} {DIFF_CONTENT}
</div> </div>
</div> </div>
<span class="corners-bottom"><span></span></span>
</div> </div>
</div> </div>
</div> </div>

View file

@ -1,10 +1,7 @@
</div>
</div>
<span class="corners-bottom"><span></span></span>
<div class="clear"></div>
</div> </div>
</div><!-- /#main -->
</div> </div>
</div><!-- /#acp -->
</div> </div>
<div id="page-footer"> <div id="page-footer">
@ -38,6 +35,7 @@
<!-- IF S_ALLOW_CDN --><script type="text/javascript">window.jQuery || document.write(unescape('%3Cscript src="{T_ASSETS_PATH}/javascript/jquery.js?assets_version={T_ASSETS_VERSION}" type="text/javascript"%3E%3C/script%3E'));</script><!-- ENDIF --> <!-- IF S_ALLOW_CDN --><script type="text/javascript">window.jQuery || document.write(unescape('%3Cscript src="{T_ASSETS_PATH}/javascript/jquery.js?assets_version={T_ASSETS_VERSION}" type="text/javascript"%3E%3C/script%3E'));</script><!-- ENDIF -->
<script type="text/javascript" src="{T_ASSETS_PATH}/javascript/core.js?assets_version={T_ASSETS_VERSION}"></script> <script type="text/javascript" src="{T_ASSETS_PATH}/javascript/core.js?assets_version={T_ASSETS_VERSION}"></script>
<!-- INCLUDEJS ajax.js --> <!-- INCLUDEJS ajax.js -->
<!-- INCLUDEJS admin.js -->
{$SCRIPTS} {$SCRIPTS}
<!-- EVENT acp_overall_footer_after --> <!-- EVENT acp_overall_footer_after -->

View file

@ -2,6 +2,7 @@
<html dir="{S_CONTENT_DIRECTION}" lang="{S_USER_LANG}"> <html dir="{S_CONTENT_DIRECTION}" lang="{S_USER_LANG}">
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width" />
<!-- IF META -->{META}<!-- ENDIF --> <!-- IF META -->{META}<!-- ENDIF -->
<title>{PAGE_TITLE}</title> <title>{PAGE_TITLE}</title>
@ -14,9 +15,6 @@ var on_page = '{ON_PAGE}';
var per_page = '{PER_PAGE}'; var per_page = '{PER_PAGE}';
var base_url = '{BASE_URL|e('js')}'; var base_url = '{BASE_URL|e('js')}';
var menu_state = 'shown';
/** /**
* Jump to page * Jump to page
*/ */
@ -103,62 +101,12 @@ function popup(url, width, height, name)
return false; return false;
} }
/**
* Hiding/Showing the side menu
*/
function switch_menu()
{
var menu = document.getElementById('menu');
var main = document.getElementById('main');
var toggle = document.getElementById('toggle');
var handle = document.getElementById('toggle-handle');
switch (menu_state)
{
// hide
case 'shown':
main.style.width = '93%';
menu_state = 'hidden';
menu.style.display = 'none';
toggle.style.width = '20px';
handle.style.backgroundImage = 'url(images/toggle.gif)';
handle.style.backgroundRepeat = 'no-repeat';
<!-- IF S_CONTENT_DIRECTION eq 'rtl' -->
handle.style.backgroundPosition = '0% 50%';
toggle.style.left = '96%';
<!-- ELSE -->
handle.style.backgroundPosition = '100% 50%';
toggle.style.left = '0';
<!-- ENDIF -->
break;
// show
case 'hidden':
main.style.width = '76%';
menu_state = 'shown';
menu.style.display = 'block';
toggle.style.width = '5%';
handle.style.backgroundImage = 'url(images/toggle.gif)';
handle.style.backgroundRepeat = 'no-repeat';
<!-- IF S_CONTENT_DIRECTION eq 'rtl' -->
handle.style.backgroundPosition = '100% 50%';
toggle.style.left = '75%';
<!-- ELSE -->
handle.style.backgroundPosition = '0% 50%';
toggle.style.left = '15%';
<!-- ENDIF -->
break;
}
}
// ]]> // ]]>
</script> </script>
<!-- EVENT acp_overall_header_head_append --> <!-- EVENT acp_overall_header_head_append -->
</head> </head>
<body class="{S_CONTENT_DIRECTION}"> <body class="{S_CONTENT_DIRECTION} nojs">
<div id="wrap"> <div id="wrap">
<div id="page-header"> <div id="page-header">
@ -171,29 +119,25 @@ function switch_menu()
<div id="tabs"> <div id="tabs">
<ul> <ul>
<!-- BEGIN t_block1 --> <!-- BEGIN t_block1 -->
<li<!-- IF t_block1.S_SELECTED --> id="activetab"<!-- ENDIF -->><a href="{t_block1.U_TITLE}"><span>{t_block1.L_TITLE}</span></a></li> <li<!-- IF t_block1.S_SELECTED --> class="activetab"<!-- ENDIF -->><a href="{t_block1.U_TITLE}"><span>{t_block1.L_TITLE}</span></a></li>
<!-- END t_block1 --> <!-- END t_block1 -->
</ul> </ul>
</div> </div>
<div id="acp"> <div id="acp">
<div class="panel">
<span class="corners-top"><span></span></span>
<div id="content"> <div id="content">
<!-- IF not S_USER_NOTICE -->
<div id="toggle">
<a id="toggle-handle" accesskey="m" title="{L_MENU_TOGGLE}" onclick="switch_menu(); return false;" href="#"></a></div>
<!-- ENDIF -->
<div id="menu"> <div id="menu">
<p>{L_LOGGED_IN_AS}<br /><strong>{USERNAME}</strong> [&nbsp;<a href="{U_LOGOUT}">{L_LOGOUT}</a>&nbsp;][&nbsp;<a href="{U_ADM_LOGOUT}">{L_ADM_LOGOUT}</a>&nbsp;]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p> <p>{L_LOGGED_IN_AS}<br /><strong>{USERNAME}</strong> [&nbsp;<a href="{U_LOGOUT}">{L_LOGOUT}</a>&nbsp;][&nbsp;<a href="{U_ADM_LOGOUT}">{L_ADM_LOGOUT}</a>&nbsp;]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<ul>
<!-- DEFINE $LI_USED = 0 --> <!-- DEFINE $LI_USED = 0 -->
<!-- BEGIN l_block1 --> <!-- BEGIN l_block1 -->
<!-- IF l_block1.S_SELECTED --> <!-- IF l_block1.S_SELECTED -->
<!-- BEGIN l_block2 --> <!-- BEGIN l_block2 -->
<!-- IF .l_block1.l_block2.l_block3 --> <!-- IF .l_block1.l_block2.l_block3 -->
<li class="header">{l_block1.l_block2.L_TITLE}</li> <!-- IF $LI_USED --></ul></div><!-- ENDIF -->
<div class="menu-block">
<a class="header" href="javascript:void(0);">{l_block1.l_block2.L_TITLE}</a>
<ul>
<!-- DEFINE $LI_USED = 1 --> <!-- DEFINE $LI_USED = 1 -->
<!-- ENDIF --> <!-- ENDIF -->
@ -205,10 +149,12 @@ function switch_menu()
<!-- ENDIF --> <!-- ENDIF -->
<!-- END l_block1 --> <!-- END l_block1 -->
<!-- IF not $LI_USED --> <!-- IF $LI_USED -->
<li></li> </ul>
</div>
<!-- ENDIF --> <!-- ENDIF -->
</ul> </ul>
</div> </div>
<div id="main"> <div id="main">
<div class="main">

View file

@ -75,9 +75,8 @@
<!-- BEGIN category --> <!-- BEGIN category -->
<div class="permissions-panel" id="options{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}{p_mask.f_mask.category.S_ROW_COUNT}" <!-- IF p_mask.S_FIRST_ROW and p_mask.f_mask.S_FIRST_ROW and p_mask.f_mask.category.S_FIRST_ROW --><!-- ELSE --> style="display: none;"<!-- ENDIF -->> <div class="permissions-panel" id="options{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}{p_mask.f_mask.category.S_ROW_COUNT}" <!-- IF p_mask.S_FIRST_ROW and p_mask.f_mask.S_FIRST_ROW and p_mask.f_mask.category.S_FIRST_ROW --><!-- ELSE --> style="display: none;"<!-- ENDIF -->>
<span class="corners-top"><span></span></span>
<div class="tablewrap"> <div class="tablewrap">
<table id="table{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}{p_mask.f_mask.category.S_ROW_COUNT}" class="table1"> <table id="table{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}{p_mask.f_mask.category.S_ROW_COUNT}" class="table1 not-responsive">
<colgroup> <colgroup>
<col class="permissions-name" /> <col class="permissions-name" />
<col class="permissions-yes" /> <col class="permissions-yes" />
@ -128,7 +127,6 @@
<!-- ENDIF --> <!-- ENDIF -->
<span class="corners-bottom"><span></span></span>
</div> </div>
<!-- END category --> <!-- END category -->
<div class="clearfix"></div> <div class="clearfix"></div>

View file

@ -27,12 +27,12 @@ phpbb.loadingAlert = function() {
} else { } else {
loadingAlert.show(); loadingAlert.show();
dark.fadeIn(phpbb.alertTime, function() { dark.fadeIn(phpbb.alertTime, function() {
// Wait five seconds and display an error if nothing has been returned by then. // Wait fifteen seconds and display an error if nothing has been returned by then.
phpbbAlertTimer = setTimeout(function() { phpbbAlertTimer = setTimeout(function() {
if (loadingAlert.is(':visible')) { if (loadingAlert.is(':visible')) {
phpbb.alert($('#phpbb_alert').attr('data-l-err'), $('#phpbb_alert').attr('data-l-timeout-processing-req')); phpbb.alert($('#phpbb_alert').attr('data-l-err'), $('#phpbb_alert').attr('data-l-timeout-processing-req'));
} }
}, 5000); }, 15000);
}); });
} }
@ -829,6 +829,132 @@ phpbb.applyCodeEditor = function(textarea) {
}); });
}; };
/**
* List of classes that toggle dropdown menu,
* list of classes that contain visible dropdown menu
*
* Add your own classes to strings with comma (probably you
* will never need to do that)
*/
phpbb.dropdownHandles = '.dropdown-container.dropdown-visible .dropdown-toggle';
phpbb.dropdownVisibleContainers = '.dropdown-container.dropdown-visible';
/**
* Dropdown toggle event handler
* This handler is used by phpBB.registerDropdown() and other functions
*/
phpbb.toggleDropdown = function() {
var $this = $(this),
options = $this.data('dropdown-options'),
parent = options.parent,
visible = parent.hasClass('dropdown-visible');
if (!visible) {
// Hide other dropdown menus
$(phpbb.dropdownHandles).each(phpbb.toggleDropdown);
// Figure out direction of dropdown
var direction = options.direction,
verticalDirection = options.verticalDirection,
offset = $this.offset();
if (direction == 'auto') {
if (($(window).width() - $this.outerWidth(true)) / 2 > offset.left) {
direction = 'right';
}
else {
direction = 'left';
}
}
parent.toggleClass(options.leftClass, direction == 'left').toggleClass(options.rightClass, direction == 'right');
if (verticalDirection == 'auto') {
var height = $(window).height(),
top = offset.top - $(window).scrollTop();
if (top < height * 0.7) {
verticalDirection = 'down';
}
else {
verticalDirection = 'up';
}
}
parent.toggleClass(options.upClass, verticalDirection == 'up').toggleClass(options.downClass, verticalDirection == 'down');
}
options.dropdown.toggle();
parent.toggleClass(options.visibleClass, !visible).toggleClass('dropdown-visible', !visible);
// Check dimensions when showing dropdown
// !visible because variable shows state of dropdown before it was toggled
if (!visible) {
options.dropdown.find('.dropdown-contents').each(function() {
var $this = $(this),
windowWidth = $(window).width();
$this.css({
marginLeft: 0,
left: 0,
maxWidth: (windowWidth - 4) + 'px'
});
var offset = $this.offset().left,
width = $this.outerWidth(true);
if (offset < 2) {
$this.css('left', (2 - offset) + 'px');
}
else if ((offset + width + 2) > windowWidth) {
$this.css('margin-left', (windowWidth - offset - width - 2) + 'px');
}
});
}
// Prevent event propagation
if (arguments.length > 0) {
try {
var e = arguments[0];
e.preventDefault();
e.stopPropagation();
}
catch (error) { }
}
return false;
};
/**
* Register dropdown menu
* Shows/hides dropdown, decides which side to open to
*
* @param {jQuery} toggle Link that toggles dropdown.
* @param {jQuery} dropdown Dropdown menu.
* @param {Object} options List of options. Optional.
*/
phpbb.registerDropdown = function(toggle, dropdown, options)
{
var ops = {
parent: toggle.parent(), // Parent item to add classes to
direction: 'auto', // Direction of dropdown menu. Possible values: auto, left, right
verticalDirection: 'auto', // Vertical direction. Possible values: auto, up, down
visibleClass: 'visible', // Class to add to parent item when dropdown is visible
leftClass: 'dropdown-left', // Class to add to parent item when dropdown opens to left side
rightClass: 'dropdown-right', // Class to add to parent item when dropdown opens to right side
upClass: 'dropdown-up', // Class to add to parent item when dropdown opens above menu item
downClass: 'dropdown-down' // Class to add to parent item when dropdown opens below menu item
};
if (options) {
ops = $.extend(ops, options);
}
ops.dropdown = dropdown;
ops.parent.addClass('dropdown-container');
toggle.addClass('dropdown-toggle');
toggle.data('dropdown-options', ops);
toggle.click(phpbb.toggleDropdown);
};
/** /**
* Apply code editor to all textarea elements with data-bbcode attribute * Apply code editor to all textarea elements with data-bbcode attribute
*/ */
@ -836,6 +962,14 @@ $(document).ready(function() {
$('textarea[data-bbcode]').each(function() { $('textarea[data-bbcode]').each(function() {
phpbb.applyCodeEditor(this); phpbb.applyCodeEditor(this);
}); });
// Hide active dropdowns when click event happens outside
$('body').click(function(e) {
var parents = $(e.target).parents();
if (!parents.is(phpbb.dropdownVisibleContainers)) {
$(phpbb.dropdownHandles).each(phpbb.toggleDropdown);
}
});
}); });
})(jQuery); // Avoid conflicts with other libraries })(jQuery); // Avoid conflicts with other libraries

View file

@ -62,6 +62,47 @@ function phpbb_plupload_clear_params(obj) {
} }
} }
/**
* Update hidden attachment inputs in posting form
* Pre-existing hidden inputs will be removed by comparing the old attachment
* data (old_data) to the new attachment data (data) that has been sent back
* by plupload.
*
* @param object form Posting form
* @param object data Current attachment_data
* @param object old_date Previous attachment_data (before submission)
*
* @return void
*/
phpbb.update_hidden_attachment_inputs = function(form, data, old_data) {
// Update already existing hidden inputs
for (var i = 0; i < form.length; i++) {
if (data.hasOwnProperty(form[i].name)) {
form[i].value = data[form[i].name];
delete data[form[i].name];
} else if (typeof old_data !== 'undefined' && old_data.hasOwnProperty(form[i].name)) {
var inputRegex = /\b^[a-z_]+[+[0-9]+]/;
var inputName = inputRegex.exec(form[i].name);
if (typeof inputName !== 'undefined' && inputName[0] !== '') {
$("input[type='hidden'][name^='" + inputName[0] + "']").remove();
}
}
}
// Append new inputs
for (var key in data) {
if (!data.hasOwnProperty(key)) {
continue;
}
var input = $('<input />')
.attr('type', 'hidden')
.attr('name', key)
.attr('value', data[key]);
$(form).append(input);
}
}
jQuery(function($) { jQuery(function($) {
$(phpbb.plupload.config.element_hook).pluploadQueue(phpbb.plupload.config); $(phpbb.plupload.config.element_hook).pluploadQueue(phpbb.plupload.config);
var uploader = $(phpbb.plupload.config.element_hook).pluploadQueue(); var uploader = $(phpbb.plupload.config.element_hook).pluploadQueue();
@ -208,26 +249,7 @@ jQuery(function($) {
var form = $(phpbb.plupload.config.form_hook)[0]; var form = $(phpbb.plupload.config.form_hook)[0];
var data = phpbb_plupload_attachment_data_serialize(); var data = phpbb_plupload_attachment_data_serialize();
// Update already existing hidden inputs phpbb.update_hidden_attachment_inputs(form, data);
for (var i = 0; i < form.length; i++) {
if (data.hasOwnProperty(form[i].name)) {
form[i].value = data[form[i].name];
delete data[form[i].name];
}
}
// Append new inputs
for (var key in data) {
if (!data.hasOwnProperty(key)) {
continue;
}
var input = $('<input />')
.attr('type', 'hidden')
.attr('name', key)
.attr('value', data[key]);
$(form).append(input);
}
files.forEach(function(file) { files.forEach(function(file) {
if (file.status !== plupload.DONE) { if (file.status !== plupload.DONE) {
@ -257,6 +279,7 @@ jQuery(function($) {
var done = function(response) { var done = function(response) {
up.removeFile(file); up.removeFile(file);
plupload.attachment_data = response; plupload.attachment_data = response;
phpbb.update_hidden_attachment_inputs(form, phpbb_plupload_attachment_data_serialize(), data);
phpbb_plupload_clear_params(up.settings.multipart_params); phpbb_plupload_clear_params(up.settings.multipart_params);
up.settings.multipart_params = $.extend( up.settings.multipart_params = $.extend(
up.settings.multipart_params, up.settings.multipart_params,

View file

@ -14,6 +14,7 @@
"fabpot/goutte": "1.0.*", "fabpot/goutte": "1.0.*",
"phpunit/dbunit": "1.2.*", "phpunit/dbunit": "1.2.*",
"phpunit/phpunit": "3.7.*", "phpunit/phpunit": "3.7.*",
"phing/phing": "2.4.*" "phing/phing": "2.4.*",
"squizlabs/php_codesniffer": "1.*"
} }
} }

74
phpBB/composer.lock generated
View file

@ -3,7 +3,7 @@
"This file locks the dependencies of your project to a known state", "This file locks the dependencies of your project to a known state",
"Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file" "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file"
], ],
"hash": "0bc0fd0d784720629ae0ba6d4be6a577", "hash": "7bcfe8f8ce4fa46cb53c276cf93dcd3e",
"packages": [ "packages": [
{ {
"name": "lusitanian/oauth", "name": "lusitanian/oauth",
@ -302,7 +302,7 @@
"Symfony\\Component\\EventDispatcher\\": "" "Symfony\\Component\\EventDispatcher\\": ""
} }
}, },
"notification-url": "http://packagist.org/downloads/", "notification-url": "https://packagist.org/downloads/",
"license": [ "license": [
"MIT" "MIT"
], ],
@ -1375,6 +1375,76 @@
], ],
"time": "2013-01-13 10:24:48" "time": "2013-01-13 10:24:48"
}, },
{
"name": "squizlabs/php_codesniffer",
"version": "1.5.0RC4",
"source": {
"type": "git",
"url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
"reference": "146a9b54e4adeaca0a3ae073e0a8a03570d6cc43"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/146a9b54e4adeaca0a3ae073e0a8a03570d6cc43",
"reference": "146a9b54e4adeaca0a3ae073e0a8a03570d6cc43",
"shasum": ""
},
"require": {
"ext-tokenizer": "*",
"php": ">=5.1.2"
},
"suggest": {
"phpunit/php-timer": "dev-master"
},
"bin": [
"scripts/phpcs"
],
"type": "library",
"autoload": {
"classmap": [
"CodeSniffer.php",
"CodeSniffer/CLI.php",
"CodeSniffer/Exception.php",
"CodeSniffer/File.php",
"CodeSniffer/Report.php",
"CodeSniffer/Reporting.php",
"CodeSniffer/Sniff.php",
"CodeSniffer/Tokens.php",
"CodeSniffer/Reports/",
"CodeSniffer/CommentParser/",
"CodeSniffer/Tokenizers/",
"CodeSniffer/DocGenerators/",
"CodeSniffer/Standards/AbstractPatternSniff.php",
"CodeSniffer/Standards/AbstractScopeSniff.php",
"CodeSniffer/Standards/AbstractVariableSniff.php",
"CodeSniffer/Standards/IncorrectPatternException.php",
"CodeSniffer/Standards/Generic/Sniffs/",
"CodeSniffer/Standards/MySource/Sniffs/",
"CodeSniffer/Standards/PEAR/Sniffs/",
"CodeSniffer/Standards/PSR1/Sniffs/",
"CodeSniffer/Standards/PSR2/Sniffs/",
"CodeSniffer/Standards/Squiz/Sniffs/",
"CodeSniffer/Standards/Zend/Sniffs/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Greg Sherwood",
"role": "lead"
}
],
"description": "PHP_CodeSniffer tokenises PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.",
"homepage": "http://www.squizlabs.com/php-codesniffer",
"keywords": [
"phpcs",
"standards"
],
"time": "2013-09-26 00:14:02"
},
{ {
"name": "symfony/browser-kit", "name": "symfony/browser-kit",
"version": "v2.3.4", "version": "v2.3.4",

View file

@ -5,6 +5,7 @@ services:
- @config - @config
- %core.root_path% - %core.root_path%
- %core.php_ext% - %core.php_ext%
- @path_helper
- @cache.driver - @cache.driver
calls: calls:
- [set_name, [avatar.driver.gravatar]] - [set_name, [avatar.driver.gravatar]]
@ -17,6 +18,7 @@ services:
- @config - @config
- %core.root_path% - %core.root_path%
- %core.php_ext% - %core.php_ext%
- @path_helper
- @cache.driver - @cache.driver
calls: calls:
- [set_name, [avatar.driver.local]] - [set_name, [avatar.driver.local]]
@ -29,6 +31,7 @@ services:
- @config - @config
- %core.root_path% - %core.root_path%
- %core.php_ext% - %core.php_ext%
- @path_helper
- @cache.driver - @cache.driver
calls: calls:
- [set_name, [avatar.driver.remote]] - [set_name, [avatar.driver.remote]]
@ -41,6 +44,7 @@ services:
- @config - @config
- %core.root_path% - %core.root_path%
- %core.php_ext% - %core.php_ext%
- @path_helper
- @cache.driver - @cache.driver
calls: calls:
- [set_name, [avatar.driver.upload]] - [set_name, [avatar.driver.upload]]

View file

@ -22,7 +22,6 @@ services:
arguments: arguments:
- @config - @config
- @avatar.driver_collection - @avatar.driver_collection
- @service_container
cache: cache:
class: phpbb\cache\service class: phpbb\cache\service

View file

@ -0,0 +1,307 @@
<?php
/**
*
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
if (php_sapi_name() != 'cli')
{
die("This program must be run from the command line.\n");
}
$phpEx = substr(strrchr(__FILE__, '.'), 1);
$phpbb_root_path = __DIR__ . '/../';
function usage()
{
echo "Usage: export_events_for_wiki.php COMMAND\n";
echo "\n";
echo "acp:\n";
echo " Export all events for files in the acp style.\n";
echo "\n";
echo "styles:\n";
echo " Export all events for files in the prosilver and subsilver2 styles.\n";
echo "\n";
echo "php:\n";
echo " Export all events for php-files.\n";
exit(2);
}
function export_from_eventsmd($phpbb_root_path, $filter)
{
$file_content = file_get_contents($phpbb_root_path . 'docs/events.md');
$events = explode("\n\n", $file_content);
foreach ($events as $event)
{
// Last row of the file
if (strpos($event, "\n===\n") === false) continue;
list($event_name, $details) = explode("\n===\n", $event);
if ($filter == 'acp' && strpos($event_name, 'acp_') !== 0) continue;
if ($filter == 'styles' && strpos($event_name, 'acp_') === 0) continue;
list($file_details, $details) = explode("\n* Since: ", $details);
list($version, $explanition) = explode("\n* Purpose: ", $details);
echo "|- id=\"{$event_name}\"\n";
echo "| [[#{$event_name}|{$event_name}]] || ";
if (strpos($file_details, "* Locations:\n + ") === 0)
{
$file_details = substr($file_details, strlen("* Locations:\n + "));
$files = explode("\n + ", $file_details);
$prosilver = $subsilver2 = array();
foreach ($files as $file)
{
if (strpos($file, 'styles/prosilver/template/') === 0)
{
$prosilver[] = substr($file, strlen('styles/prosilver/template/'));
}
if (strpos($file, 'styles/subsilver2/template/') === 0)
{
$subsilver2[] = substr($file, strlen('styles/subsilver2/template/'));
}
}
echo implode(', ', $prosilver) . ' || ' . implode(', ', $subsilver2);
}
else if ($filter == 'acp')
{
echo substr($file_details, strlen("* Location: adm/style/"));
}
echo " || {$version} || " . str_replace("\n", ' ', $explanition) . "\n";
}
}
function export_from_php($phpbb_root_path)
{
$files = get_file_list($phpbb_root_path);
$events = array();
foreach ($files as $file)
{
$file_events = check_for_events($phpbb_root_path, $file);
if (!empty($file_events))
{
$events = array_merge($events, $file_events);
}
}
ksort($events);
foreach ($events as $event)
{
echo '|- id="' . $event['event'] . '"' . "\n";
echo '| [[#' . $event['event'] . '|' . $event['event'] . ']] || ' . $event['file'] . ' || ' . implode(', ', $event['arguments']) . ' || ' . $event['since'] . ' || ' . $event['description'] . "\n";
}
}
function check_for_events($phpbb_root_path, $file)
{
$events = array();
$content = file_get_contents($phpbb_root_path . $file);
if (strpos($content, "phpbb_dispatcher->trigger_event('") || strpos($content, "phpbb_dispatcher->dispatch('"))
{
$lines = explode("\n", $content);
for ($i = 0, $num_lines = sizeof($lines); $i < $num_lines; $i++)
{
$event_line = 0;
if ($found_trigger_event = strpos($lines[$i], "phpbb_dispatcher->trigger_event('"))
{
$event_line = $i;
$event_name = $lines[$event_line];
$event_name = substr($event_name, $found_trigger_event + strlen("phpbb_dispatcher->trigger_event('"));
$event_name = substr($event_name, 0, strpos($event_name, "'"));
// Find $vars array lines
$find_varsarray_line = 1;
while (strpos($lines[$event_line - $find_varsarray_line], "vars = array('") === false)
{
$find_varsarray_line++;
if ($find_varsarray_line > min(50, $event_line))
{
throw new LogicException('Can not find "$vars = array()"-line for event "' . $event_name . '" in file "' . $file . '"');
}
}
$varsarray = substr(trim($lines[$event_line - $find_varsarray_line]), strlen("\$vars = array('"), -3);
$arguments = explode("', '", $varsarray);
// Validate $vars array with @var
$find_vars_line = 3;
$doc_vars = array();
while (strpos(trim($lines[$event_line - $find_vars_line]), '*') === 0)
{
$var_line = trim($lines[$event_line - $find_vars_line]);
$var_line = preg_replace('!\s+!', ' ', $var_line);
if (strpos($var_line, '* @var ') === 0)
{
$doc_line = explode(' ', $var_line);
if (isset($doc_line[3]))
{
$doc_vars[] = $doc_line[3];
}
}
$find_vars_line++;
}
if (sizeof($arguments) !== sizeof($doc_vars) && array_intersect($arguments, $doc_vars))
{
throw new LogicException('$vars array does not match the list of @var tags for event "' . $event_name . '" in file "' . $file . '"');
}
}
else if ($found_trigger_event = strpos($lines[$i], "phpbb_dispatcher->dispatch('"))
{
$event_line = $i;
$event_name = $lines[$event_line];
$event_name = substr($event_name, $found_trigger_event + strlen("phpbb_dispatcher->dispatch('"));
$event_name = substr($event_name, 0, strpos($event_name, "'"));
$arguments = array();
}
if ($event_line)
{
// Validate @event name
$find_event_line = 1;
while (strpos($lines[$event_line - $find_event_line], '* @event ') === false)
{
$find_event_line++;
if ($find_event_line > min(50, $event_line))
{
throw new LogicException('Can not find @event tag for event "' . $event_name . '" in file "' . $file . '"');
}
}
$event_name_tag = substr(trim($lines[$event_line - $find_event_line]), strlen('* @event '));
if ($event_name_tag !== $event_name)
{
throw new LogicException('Event name does not match @event tag for event "' . $event_name . '" in file "' . $file . '"');
}
// Find @since
$find_since_line = 1;
while (strpos($lines[$event_line - $find_since_line], '* @since ') === false)
{
$find_since_line++;
if ($find_since_line > min(50, $event_line))
{
throw new LogicException('Can not find @since tag for event "' . $event_name . '" in file "' . $file . '"');
}
}
$since = substr(trim($lines[$event_line - $find_since_line]), strlen('* @since '));
$since = ($since == '3.1-A1') ? '3.1.0-a1' : $since;
// Find event description line
$find_description_line = 3;
while (strpos(trim($lines[$event_line - $find_description_line]), '*') === 0)
{
$find_description_line++;
if ($find_description_line > min(50, $event_line))
{
throw new LogicException('Can not find description-line for event "' . $event_name . '" in file "' . $file . '"');
}
}
$description = substr(trim($lines[$event_line - $find_description_line + 1]), strlen('* '));
$events[$event_name] = array(
'event' => $event_name,
'file' => $file,
'arguments' => $arguments,
'since' => $since,
'description' => $description,
);
}
}
}
return $events;
}
/**
* Returns a list of files in that directory
*
* Works recursive with any depth
*
* @param string $dir Directory to go through
* @return array List of files (including directories from within $dir
*/
function get_file_list($dir, $path = '')
{
try
{
$iterator = new \DirectoryIterator($dir);
}
catch (Exception $e)
{
return array();
}
$files = array();
foreach ($iterator as $file_info)
{
if ($file_info->isDot())
{
continue;
}
// Do not scan some directories
if ($file_info->isDir() && (
($path == '' && in_array($file_info->getFilename(), array('cache', 'develop', 'ext', 'files', 'language', 'store', 'vendor')))
|| ($path == '/includes' && in_array($file_info->getFilename(), array('utf')))
|| ($path == '/phpbb/db/migration' && in_array($file_info->getFilename(), array('data')))
|| ($path == '/phpbb' && in_array($file_info->getFilename(), array('event')))
))
{
continue;
}
else if ($file_info->isDir())
{
$sub_dir = get_file_list($file_info->getPath() . '/' . $file_info->getFilename(), $path . '/' . $file_info->getFilename());
foreach ($sub_dir as $file)
{
$files[] = $file_info->getFilename() . '/' . $file;
}
}
else if ($file_info->getExtension() == 'php')
{
$files[] = $file_info->getFilename();
}
}
return $files;
}
function validate_argument_count($arguments, $count)
{
if ($arguments <= $count)
{
usage();
}
}
validate_argument_count($argc, 1);
$action = $argv[1];
switch ($action)
{
case 'acp':
export_from_eventsmd($phpbb_root_path, 'acp');
break;
case 'styles':
export_from_eventsmd($phpbb_root_path, 'styles');
break;
case 'php':
export_from_php($phpbb_root_path);
break;
default:
usage();
}

View file

@ -132,6 +132,7 @@
<li>A SQL database system, <strong>one of</strong>: <li>A SQL database system, <strong>one of</strong>:
<ul> <ul>
<li>MySQL 3.23 or above (MySQLi supported)</li> <li>MySQL 3.23 or above (MySQLi supported)</li>
<li>MariaDB 5.1 or above</li>
<li>PostgreSQL 8.3+</li> <li>PostgreSQL 8.3+</li>
<li>SQLite 2.8.2+ (SQLite 3 is not supported)</li> <li>SQLite 2.8.2+ (SQLite 3 is not supported)</li>
<li>Firebird 2.1+</li> <li>Firebird 2.1+</li>

View file

@ -323,7 +323,7 @@
<p>Please remember that running any application on a development (unstable, e.g. a beta release) version of PHP can lead to strange/unexpected results which may appear to be bugs in the application. Therefore, we recommend you upgrade to the newest stable version of PHP before running phpBB3. If you are running a development version of PHP please check any bugs you find on a system running a stable release before submitting.</p> <p>Please remember that running any application on a development (unstable, e.g. a beta release) version of PHP can lead to strange/unexpected results which may appear to be bugs in the application. Therefore, we recommend you upgrade to the newest stable version of PHP before running phpBB3. If you are running a development version of PHP please check any bugs you find on a system running a stable release before submitting.</p>
<p>This board has been developed and tested under Linux and Windows (amongst others) running Apache using MySQL 3.23, 4.x, 5.x, MSSQL Server 2000, PostgreSQL 8.x, Oracle 8, SQLite 2 and Firebird. Versions of PHP used range from 5.3.x to 5.4.x without problem.</p> <p>This board has been developed and tested under Linux and Windows (amongst others) running Apache using MySQL 3.23, 4.x, 5.x, MariaDB 5.x, MSSQL Server 2000, PostgreSQL 8.x, Oracle 8, SQLite 2 and Firebird. Versions of PHP used range from 5.3.x to 5.4.x without problem.</p>
<a name="phpsec"></a><h3>7.i. Notice on PHP security issues</h3> <a name="phpsec"></a><h3>7.i. Notice on PHP security issues</h3>

View file

@ -1,41 +1,49 @@
acp_forums_normal_settings_append acp_forums_normal_settings_append
=== ===
* Location: adm/style/acp_forums.html * Location: adm/style/acp_forums.html
* Since: 3.1.0-a1
* Purpose: Add settings to forums * Purpose: Add settings to forums
acp_main_actions_append acp_main_actions_append
=== ===
* Location: adm/style/acp_main.html * Location: adm/style/acp_main.html
* Since: 3.1.0-a1
* Purpose: Add actions to the ACP main page below the cache purge action * Purpose: Add actions to the ACP main page below the cache purge action
acp_main_notice_after acp_main_notice_after
=== ===
* Location: adm/style/acp_main.html * Location: adm/style/acp_main.html
* Since: 3.1.0-a1
* Purpose: Add notices or other blocks in the ACP below other configuration notices * Purpose: Add notices or other blocks in the ACP below other configuration notices
acp_overall_footer_after acp_overall_footer_after
=== ===
* Location: adm/style/overall_footer.html * Location: adm/style/overall_footer.html
* Since: 3.1.0-a1
* Purpose: Add content below the footer in the ACP * Purpose: Add content below the footer in the ACP
acp_overall_header_head_append acp_overall_header_head_append
=== ===
* Location: adm/style/overall_header.html * Location: adm/style/overall_header.html
* Add assets within the `<head>` tags in the ACP * Since: 3.1.0-a1
* Purpose: Add assets within the `<head>` tags in the ACP
acp_simple_footer_after acp_simple_footer_after
=== ===
* Location: adm/style/simple_footer.html * Location: adm/style/simple_footer.html
* Since: 3.1.0-a1
* Purpose: Add content below the simple footer in the ACP * Purpose: Add content below the simple footer in the ACP
acp_simple_header_head_append acp_simple_header_head_append
=== ===
* Location: adm/style/overall_header.html * Location: adm/style/overall_header.html
* Add assets within the `<head>` tags in the simple header of the ACP * Since: 3.1.0-a1
* Purpose: Add assets within the `<head>` tags in the simple header of the ACP
acp_users_overview_options_append acp_users_overview_options_append
=== ===
* Location: adm/style/acp_users.html * Location: adm/style/acp_users.html
* Since: 3.1.0-a1
* Purpose: Add options and settings on user overview page * Purpose: Add options and settings on user overview page
forumlist_body_last_post_title_prepend forumlist_body_last_post_title_prepend
@ -43,6 +51,7 @@ forumlist_body_last_post_title_prepend
* Locations: * Locations:
+ styles/prosilver/template/forumlist_body.html + styles/prosilver/template/forumlist_body.html
+ styles/subsilver2/template/forumlist_body.html + styles/subsilver2/template/forumlist_body.html
* Since: 3.1.0-a1
* Purpose: Add content before the post title of the latest post in a forum on the forum list. * Purpose: Add content before the post title of the latest post in a forum on the forum list.
index_body_stat_blocks_before index_body_stat_blocks_before
@ -50,6 +59,7 @@ index_body_stat_blocks_before
* Locations: * Locations:
+ styles/prosilver/template/index_body.html + styles/prosilver/template/index_body.html
+ styles/subsilver2/template/index_body.html + styles/subsilver2/template/index_body.html
* Since: 3.1.0-a1
* Purpose: Add new statistic blocks above the Who Is Online and Board Statistics blocks * Purpose: Add new statistic blocks above the Who Is Online and Board Statistics blocks
memberlist_body_username_append memberlist_body_username_append
@ -57,6 +67,7 @@ memberlist_body_username_append
* Locations: * Locations:
+ styles/prosilver/template/memberlist_body.html + styles/prosilver/template/memberlist_body.html
+ styles/subsilver2/template/memberlist_body.html + styles/subsilver2/template/memberlist_body.html
* Since: 3.1.0-a1
* Purpose: Add information after every username in the memberlist. Works in * Purpose: Add information after every username in the memberlist. Works in
all display modes (leader, group and normal memberlist). all display modes (leader, group and normal memberlist).
@ -65,6 +76,7 @@ memberlist_body_username_prepend
* Locations: * Locations:
+ styles/prosilver/template/memberlist_body.html + styles/prosilver/template/memberlist_body.html
+ styles/subsilver2/template/memberlist_body.html + styles/subsilver2/template/memberlist_body.html
* Since: 3.1.0-a1
* Purpose: Add information before every username in the memberlist. Works in * Purpose: Add information before every username in the memberlist. Works in
all display modes (leader, group and normal memberlist). all display modes (leader, group and normal memberlist).
@ -73,6 +85,7 @@ memberlist_view_user_statistics_after
* Locations: * Locations:
+ styles/prosilver/template/memberlist_view.html + styles/prosilver/template/memberlist_view.html
+ styles/subsilver2/template/memberlist_view.html + styles/subsilver2/template/memberlist_view.html
* Since: 3.1.0-a1
* Purpose: Add entries after the user statistics part of any user profile * Purpose: Add entries after the user statistics part of any user profile
memberlist_view_user_statistics_before memberlist_view_user_statistics_before
@ -80,6 +93,7 @@ memberlist_view_user_statistics_before
* Locations: * Locations:
+ styles/prosilver/template/memberlist_view.html + styles/prosilver/template/memberlist_view.html
+ styles/subsilver2/template/memberlist_view.html + styles/subsilver2/template/memberlist_view.html
* Since: 3.1.0-a1
* Purpose: Add entries before the user statistics part of any user profile * Purpose: Add entries before the user statistics part of any user profile
overall_footer_after overall_footer_after
@ -87,11 +101,14 @@ overall_footer_after
* Locations: * Locations:
+ styles/prosilver/template/overall_footer.html + styles/prosilver/template/overall_footer.html
+ styles/subsilver2/template/overall_footer.html + styles/subsilver2/template/overall_footer.html
* Since: 3.1.0-a1
* Purpose: Add content at the end of the file, directly prior to the `</body>` tag * Purpose: Add content at the end of the file, directly prior to the `</body>` tag
overall_footer_breadcrumb_append overall_footer_breadcrumb_append
=== ===
* Location: styles/prosilver/template/overall_footer.html * Locations:
+ styles/prosilver/template/overall_footer.html
* Since: 3.1.0-a1
* Purpose: Add links to the list of breadcrumbs in the footer * Purpose: Add links to the list of breadcrumbs in the footer
overall_footer_copyright_append overall_footer_copyright_append
@ -99,6 +116,7 @@ overall_footer_copyright_append
* Locations: * Locations:
+ styles/prosilver/template/overall_footer.html + styles/prosilver/template/overall_footer.html
+ styles/subsilver2/template/overall_footer.html + styles/subsilver2/template/overall_footer.html
* Since: 3.1.0-a1
* Purpose: Add content after the copyright line (no new line by default), before the ACP link * Purpose: Add content after the copyright line (no new line by default), before the ACP link
overall_footer_copyright_prepend overall_footer_copyright_prepend
@ -106,6 +124,7 @@ overall_footer_copyright_prepend
* Locations: * Locations:
+ styles/prosilver/template/overall_footer.html + styles/prosilver/template/overall_footer.html
+ styles/subsilver2/template/overall_footer.html + styles/subsilver2/template/overall_footer.html
* Since: 3.1.0-a1
* Purpose: Add content before the copyright line * Purpose: Add content before the copyright line
overall_header_breadcrumb_append overall_header_breadcrumb_append
@ -113,6 +132,7 @@ overall_header_breadcrumb_append
* Locations: * Locations:
+ styles/prosilver/template/overall_header.html + styles/prosilver/template/overall_header.html
+ styles/subsilver2/template/breadcrumbs.html + styles/subsilver2/template/breadcrumbs.html
* Since: 3.1.0-a1
* Purpose: Add links to the list of breadcrumbs in the header * Purpose: Add links to the list of breadcrumbs in the header
overall_header_head_append overall_header_head_append
@ -120,16 +140,21 @@ overall_header_head_append
* Locations: * Locations:
+ styles/prosilver/template/overall_header.html + styles/prosilver/template/overall_header.html
+ styles/subsilver2/template/overall_header.html + styles/subsilver2/template/overall_header.html
* Since: 3.1.0-a1
* Purpose: Add asset calls directly before the `</head>` tag * Purpose: Add asset calls directly before the `</head>` tag
overall_header_navigation_append overall_header_navigation_append
=== ===
* Location: styles/prosilver/template/overall_header.html * Locations:
+ styles/prosilver/template/overall_header.html
* Since: 3.1.0-a1
* Purpose: Add links after the navigation links in the header * Purpose: Add links after the navigation links in the header
overall_header_navigation_prepend overall_header_navigation_prepend
=== ===
* Location: styles/prosilver/template/overall_header.html * Locations:
+ styles/prosilver/template/overall_header.html
* Since: 3.1.0-a1
* Purpose: Add links before the navigation links in the header * Purpose: Add links before the navigation links in the header
posting_editor_options_prepend posting_editor_options_prepend
@ -137,11 +162,14 @@ posting_editor_options_prepend
* Locations: * Locations:
+ styles/prosilver/template/posting_editor.html + styles/prosilver/template/posting_editor.html
+ styles/prosilver/template/posting_body.html + styles/prosilver/template/posting_body.html
* Since: 3.1.0-a1
* Purpose: Add posting options on the posting screen * Purpose: Add posting options on the posting screen
simple_footer_after simple_footer_after
=== ===
* Location: styles/prosilver/template/simple_footer.html * Locations:
+ styles/prosilver/template/simple_footer.html
* Since: 3.1.0-a1
* Purpose: Add content directly prior to the `</body>` tag of the simple footer * Purpose: Add content directly prior to the `</body>` tag of the simple footer
topiclist_row_prepend topiclist_row_prepend
@ -151,6 +179,7 @@ topiclist_row_prepend
+ styles/prosilver/template/viewforum_body.html + styles/prosilver/template/viewforum_body.html
+ styles/subsilver2/template/search_results.html + styles/subsilver2/template/search_results.html
+ styles/subsilver2/template/viewforum_body.html + styles/subsilver2/template/viewforum_body.html
* Since: 3.1.0-a1
* Purpose: Add content into topic rows (inside the elements containing topic titles) * Purpose: Add content into topic rows (inside the elements containing topic titles)
topiclist_row_append topiclist_row_append
@ -160,23 +189,30 @@ topiclist_row_append
+ styles/prosilver/template/viewforum_body.html + styles/prosilver/template/viewforum_body.html
+ styles/subsilver2/template/search_results.html + styles/subsilver2/template/search_results.html
+ styles/subsilver2/template/viewforum_body.html + styles/subsilver2/template/viewforum_body.html
* Since: 3.1.0-a1
* Purpose: Add content into topic rows (inside the elements containing topic titles) * Purpose: Add content into topic rows (inside the elements containing topic titles)
ucp_pm_viewmessage_custom_fields_after ucp_pm_viewmessage_custom_fields_after
=== ===
* Location: styles/prosilver/template/ucp_pm_viewmessage.html * Locations:
+ styles/prosilver/template/ucp_pm_viewmessage.html
* Since: 3.1.0-a1
* Purpose: Add data after the custom fields on the user profile when viewing * Purpose: Add data after the custom fields on the user profile when viewing
a private message a private message
ucp_pm_viewmessage_custom_fields_before ucp_pm_viewmessage_custom_fields_before
=== ===
* Location: styles/prosilver/template/ucp_pm_viewmessage.html * Locations:
+ styles/prosilver/template/ucp_pm_viewmessage.html
* Since: 3.1.0-a1
* Purpose: Add data before the custom fields on the user profile when viewing * Purpose: Add data before the custom fields on the user profile when viewing
a private message a private message
ucp_pm_viewmessage_print_head_append ucp_pm_viewmessage_print_head_append
=== ===
* Location: styles/prosilver/template/ucp_pm_viewmessage_print.html * Locations:
+ styles/prosilver/template/ucp_pm_viewmessage_print.html
* Since: 3.1.0-a1
* Purpose: Add asset calls directly before the `</head>` tag of the Print PM screen * Purpose: Add asset calls directly before the `</head>` tag of the Print PM screen
ucp_prefs_personal_prepend ucp_prefs_personal_prepend
@ -184,6 +220,7 @@ ucp_prefs_personal_prepend
* Locations: * Locations:
+ styles/prosilver/template/ucp_prefs_personal.html + styles/prosilver/template/ucp_prefs_personal.html
+ styles/subsilver2/template/ucp_prefs_personal.html + styles/subsilver2/template/ucp_prefs_personal.html
* Since: 3.1.0-a1
* Purpose: Add user options to the top of the Edit Global Settings block * Purpose: Add user options to the top of the Edit Global Settings block
ucp_prefs_personal_append ucp_prefs_personal_append
@ -191,6 +228,7 @@ ucp_prefs_personal_append
* Locations: * Locations:
+ styles/prosilver/template/ucp_prefs_personal.html + styles/prosilver/template/ucp_prefs_personal.html
+ styles/subsilver2/template/ucp_prefs_personal.html + styles/subsilver2/template/ucp_prefs_personal.html
* Since: 3.1.0-a1
* Purpose: Add user options to the bottom of the Edit Global Settings block * Purpose: Add user options to the bottom of the Edit Global Settings block
ucp_prefs_post_prepend ucp_prefs_post_prepend
@ -198,6 +236,7 @@ ucp_prefs_post_prepend
* Locations: * Locations:
+ styles/prosilver/template/ucp_prefs_post.html + styles/prosilver/template/ucp_prefs_post.html
+ styles/subsilver2/template/ucp_prefs_post.html + styles/subsilver2/template/ucp_prefs_post.html
* Since: 3.1.0-a1
* Purpose: Add user options to the top of the Edit Posting Defaults block * Purpose: Add user options to the top of the Edit Posting Defaults block
ucp_prefs_post_append ucp_prefs_post_append
@ -205,6 +244,7 @@ ucp_prefs_post_append
* Locations: * Locations:
+ styles/prosilver/template/ucp_prefs_post.html + styles/prosilver/template/ucp_prefs_post.html
+ styles/subsilver2/template/ucp_prefs_post.html + styles/subsilver2/template/ucp_prefs_post.html
* Since: 3.1.0-a1
* Purpose: Add user options to the bottom of the Edit Posting Defaults block * Purpose: Add user options to the bottom of the Edit Posting Defaults block
ucp_prefs_view_radio_buttons_prepend ucp_prefs_view_radio_buttons_prepend
@ -212,6 +252,7 @@ ucp_prefs_view_radio_buttons_prepend
* Locations: * Locations:
+ styles/prosilver/template/ucp_prefs_view.html + styles/prosilver/template/ucp_prefs_view.html
+ styles/subsilver2/template/ucp_prefs_view.html + styles/subsilver2/template/ucp_prefs_view.html
* Since: 3.1.0-a1
* Purpose: Add options to the top of the radio buttons block of the Edit * Purpose: Add options to the top of the radio buttons block of the Edit
Display Options screen Display Options screen
@ -220,6 +261,7 @@ ucp_prefs_view_radio_buttons_append
* Locations: * Locations:
+ styles/prosilver/template/ucp_prefs_view.html + styles/prosilver/template/ucp_prefs_view.html
+ styles/subsilver2/template/ucp_prefs_view.html + styles/subsilver2/template/ucp_prefs_view.html
* Since: 3.1.0-a1
* Purpose: Add options to the bottom of the radio buttons block of the Edit * Purpose: Add options to the bottom of the radio buttons block of the Edit
Display Options screen Display Options screen
@ -228,6 +270,7 @@ ucp_prefs_view_select_menu_prepend
* Locations: * Locations:
+ styles/prosilver/template/ucp_prefs_view.html + styles/prosilver/template/ucp_prefs_view.html
+ styles/subsilver2/template/ucp_prefs_view.html + styles/subsilver2/template/ucp_prefs_view.html
* Since: 3.1.0-a1
* Purpose: Add options to the top of the drop-down lists block of the Edit * Purpose: Add options to the top of the drop-down lists block of the Edit
Display Options screen Display Options screen
@ -236,12 +279,15 @@ ucp_prefs_view_select_menu_append
* Locations: * Locations:
+ styles/prosilver/template/ucp_prefs_view.html + styles/prosilver/template/ucp_prefs_view.html
+ styles/subsilver2/template/ucp_prefs_view.html + styles/subsilver2/template/ucp_prefs_view.html
* Since: 3.1.0-a1
* Purpose: Add options to the bottom of the drop-down lists block of the Edit * Purpose: Add options to the bottom of the drop-down lists block of the Edit
Display Options screen Display Options screen
viewtopic_print_head_append viewtopic_print_head_append
=== ===
* Location: styles/prosilver/template/viewtopic_print.html * Locations:
+ styles/prosilver/template/viewtopic_print.html
* Since: 3.1.0-a1
* Purpose: Add asset calls directly before the `</head>` tag of the Print Topic screen * Purpose: Add asset calls directly before the `</head>` tag of the Print Topic screen
viewtopic_body_footer_before viewtopic_body_footer_before
@ -249,6 +295,7 @@ viewtopic_body_footer_before
* Locations: * Locations:
+ styles/prosilver/template/viewtopic_body.html + styles/prosilver/template/viewtopic_body.html
+ styles/subsilver2/template/viewtopic_body.html + styles/subsilver2/template/viewtopic_body.html
* Since: 3.1.0-a1
* Purpose: Add content to the bottom of the View topic screen below the posts * Purpose: Add content to the bottom of the View topic screen below the posts
and quick reply, directly before the jumpbox in Prosilver, breadcrumbs in and quick reply, directly before the jumpbox in Prosilver, breadcrumbs in
Subsilver2. Subsilver2.
@ -258,6 +305,7 @@ viewtopic_body_post_buttons_after
* Locations: * Locations:
+ styles/prosilver/template/viewtopic_body.html + styles/prosilver/template/viewtopic_body.html
+ styles/subsilver2/template/viewtopic_body.html + styles/subsilver2/template/viewtopic_body.html
* Since: 3.1.0-a1
* Purpose: Add post button to posts (next to edit, quote etc), at the end of * Purpose: Add post button to posts (next to edit, quote etc), at the end of
the list. the list.
@ -266,6 +314,7 @@ viewtopic_body_post_buttons_before
* Locations: * Locations:
+ styles/prosilver/template/viewtopic_body.html + styles/prosilver/template/viewtopic_body.html
+ styles/subsilver2/template/viewtopic_body.html + styles/subsilver2/template/viewtopic_body.html
* Since: 3.1.0-a1
* Purpose: Add post button to posts (next to edit, quote etc), at the start of * Purpose: Add post button to posts (next to edit, quote etc), at the start of
the list. the list.
@ -274,6 +323,7 @@ viewtopic_body_postrow_custom_fields_after
* Locations: * Locations:
+ styles/prosilver/template/viewtopic_body.html + styles/prosilver/template/viewtopic_body.html
+ styles/subsilver2/template/viewtopic_body.html + styles/subsilver2/template/viewtopic_body.html
* Since: 3.1.0-a1
* Purpose: Add data after the custom fields on the user profile when viewing * Purpose: Add data after the custom fields on the user profile when viewing
a post a post
@ -282,6 +332,7 @@ viewtopic_body_postrow_custom_fields_before
* Locations: * Locations:
+ styles/prosilver/template/viewtopic_body.html + styles/prosilver/template/viewtopic_body.html
+ styles/subsilver2/template/viewtopic_body.html + styles/subsilver2/template/viewtopic_body.html
* Since: 3.1.0-a1
* Purpose: Add data before the custom fields on the user profile when viewing * Purpose: Add data before the custom fields on the user profile when viewing
a post a post
@ -290,4 +341,5 @@ viewtopic_topic_title_prepend
* Locations: * Locations:
+ styles/prosilver/template/viewtopic_body.html + styles/prosilver/template/viewtopic_body.html
+ styles/subsilver2/template/viewtopic_body.html + styles/subsilver2/template/viewtopic_body.html
* Since: 3.1.0-a1
* Purpose: Add content directly before the topic title link on the View topic screen * Purpose: Add content directly before the topic title link on the View topic screen

View file

@ -181,7 +181,7 @@ else
trigger_error('NO_ATTACHMENT_SELECTED'); trigger_error('NO_ATTACHMENT_SELECTED');
} }
$sql = 'SELECT attach_id, post_msg_id, topic_id, in_message, is_orphan, physical_filename, real_filename, extension, mimetype, filesize, filetime $sql = 'SELECT attach_id, post_msg_id, topic_id, in_message, poster_id, is_orphan, physical_filename, real_filename, extension, mimetype, filesize, filetime
FROM ' . ATTACHMENTS_TABLE . " FROM ' . ATTACHMENTS_TABLE . "
WHERE $sql_where"; WHERE $sql_where";
$result = $db->sql_query($sql); $result = $db->sql_query($sql);

View file

@ -94,29 +94,29 @@ class acp_database
case 'mysqli': case 'mysqli':
case 'mysql4': case 'mysql4':
case 'mysql': case 'mysql':
$extractor = new mysql_extractor($download, $store, $format, $filename, $time); $extractor = new mysql_extractor($format, $filename, $time, $download, $store);
break; break;
case 'sqlite': case 'sqlite':
$extractor = new sqlite_extractor($download, $store, $format, $filename, $time); $extractor = new sqlite_extractor($format, $filename, $time, $download, $store);
break; break;
case 'postgres': case 'postgres':
$extractor = new postgres_extractor($download, $store, $format, $filename, $time); $extractor = new postgres_extractor($format, $filename, $time, $download, $store);
break; break;
case 'oracle': case 'oracle':
$extractor = new oracle_extractor($download, $store, $format, $filename, $time); $extractor = new oracle_extractor($format, $filename, $time, $download, $store);
break; break;
case 'mssql': case 'mssql':
case 'mssql_odbc': case 'mssql_odbc':
case 'mssqlnative': case 'mssqlnative':
$extractor = new mssql_extractor($download, $store, $format, $filename, $time); $extractor = new mssql_extractor($format, $filename, $time, $download, $store);
break; break;
case 'firebird': case 'firebird':
$extractor = new firebird_extractor($download, $store, $format, $filename, $time); $extractor = new firebird_extractor($format, $filename, $time, $download, $store);
break; break;
} }
@ -488,7 +488,7 @@ class base_extractor
var $format; var $format;
var $run_comp = false; var $run_comp = false;
function base_extractor($download = false, $store = false, $format, $filename, $time) function base_extractor($format, $filename, $time, $download = false, $store = false)
{ {
global $request; global $request;

View file

@ -1470,7 +1470,7 @@ class acp_forums
/** /**
* Event when we move content from one forum to another * Event when we move content from one forum to another
* *
* @event core.acp_manage_forums_move_children * @event core.acp_manage_forums_move_content
* @var int from_id If of the current parent forum * @var int from_id If of the current parent forum
* @var int to_id If of the new parent forum * @var int to_id If of the new parent forum
* @var bool sync Shall we sync the "to"-forum's data * @var bool sync Shall we sync the "to"-forum's data

View file

@ -888,7 +888,11 @@ class acp_styles
protected function list_style(&$style, $level) protected function list_style(&$style, $level)
{ {
// Mark row as shown // Mark row as shown
if (!empty($style['_shown'])) return; if (!empty($style['_shown']))
{
return;
}
$style['_shown'] = true; $style['_shown'] = true;
// Generate template variables // Generate template variables

View file

@ -506,7 +506,7 @@ class auth_admin extends \phpbb\auth\auth
'FORUM_ID' => $forum_id) 'FORUM_ID' => $forum_id)
); );
$this->assign_cat_array($ug_array, $tpl_pmask . '.' . $tpl_fmask . '.' . $tpl_category, $tpl_mask, $ug_id, $forum_id, $show_trace, ($mode == 'view')); $this->assign_cat_array($ug_array, $tpl_pmask . '.' . $tpl_fmask . '.' . $tpl_category, $tpl_mask, $ug_id, $forum_id, ($mode == 'view'), $show_trace);
unset($content_array[$ug_id]); unset($content_array[$ug_id]);
} }
@ -593,7 +593,7 @@ class auth_admin extends \phpbb\auth\auth
'FORUM_ID' => $forum_id) 'FORUM_ID' => $forum_id)
); );
$this->assign_cat_array($forum_array, $tpl_pmask . '.' . $tpl_fmask . '.' . $tpl_category, $tpl_mask, $ug_id, $forum_id, $show_trace, ($mode == 'view')); $this->assign_cat_array($forum_array, $tpl_pmask . '.' . $tpl_fmask . '.' . $tpl_category, $tpl_mask, $ug_id, $forum_id, ($mode == 'view'), $show_trace);
} }
unset($hold_ary[$ug_id], $ug_names_ary[$ug_id]); unset($hold_ary[$ug_id], $ug_names_ary[$ug_id]);
@ -1099,7 +1099,7 @@ class auth_admin extends \phpbb\auth\auth
* Assign category to template * Assign category to template
* used by display_mask() * used by display_mask()
*/ */
function assign_cat_array(&$category_array, $tpl_cat, $tpl_mask, $ug_id, $forum_id, $show_trace = false, $s_view) function assign_cat_array(&$category_array, $tpl_cat, $tpl_mask, $ug_id, $forum_id, $s_view, $show_trace = false)
{ {
global $template, $user, $phpbb_admin_path, $phpEx, $phpbb_container; global $template, $user, $phpbb_admin_path, $phpEx, $phpbb_container;

View file

@ -184,7 +184,7 @@ class captcha
for ($x = 1; $x <= $full_x; ++$x) for ($x = 1; $x <= $full_x; ++$x)
{ {
$cur_height = $this->wave_height($x, $y, $subdivision_factor) + $this->grid_height($x, $y, 1, $x_grid, $y_grid); $cur_height = $this->wave_height($x, $y, $subdivision_factor) + $this->grid_height($x, $y, $x_grid, $y_grid, 1);
// height is a z-factor, not a y-factor // height is a z-factor, not a y-factor
$offset = $cur_height - $prev_height; $offset = $cur_height - $prev_height;
@ -264,7 +264,7 @@ class captcha
return ((sin($x / (3 * $factor)) + sin($y / (3 * $factor))) * 10 * $tweak); return ((sin($x / (3 * $factor)) + sin($y / (3 * $factor))) * 10 * $tweak);
} }
function grid_height($x, $y, $factor = 1, $x_grid, $y_grid) function grid_height($x, $y, $x_grid, $y_grid, $factor = 1)
{ {
return ((!($x % ($x_grid * $factor)) || !($y % ($y_grid * $factor))) ? 3 : 0); return ((!($x % ($x_grid * $factor)) || !($y % ($y_grid * $factor))) ? 3 : 0);
} }

View file

@ -5597,14 +5597,14 @@ function garbage_collection()
global $cache, $db; global $cache, $db;
global $phpbb_dispatcher; global $phpbb_dispatcher;
if (!empty($phpbb_dispatcher))
{
/** /**
* Unload some objects, to free some memory, before we finish our task * Unload some objects, to free some memory, before we finish our task
* *
* @event core.garbage_collection * @event core.garbage_collection
* @since 3.1-A1 * @since 3.1-A1
*/ */
if (!empty($phpbb_dispatcher))
{
$phpbb_dispatcher->dispatch('core.garbage_collection'); $phpbb_dispatcher->dispatch('core.garbage_collection');
} }

View file

@ -46,7 +46,7 @@ class compress
if (is_file($phpbb_root_path . $src)) if (is_file($phpbb_root_path . $src))
{ {
$this->data($src_path, file_get_contents("$phpbb_root_path$src"), false, stat("$phpbb_root_path$src")); $this->data($src_path, file_get_contents("$phpbb_root_path$src"), stat("$phpbb_root_path$src"), false);
} }
else if (is_dir($phpbb_root_path . $src)) else if (is_dir($phpbb_root_path . $src))
{ {
@ -86,7 +86,7 @@ class compress
continue; continue;
} }
$this->data("$src_path$path$file", file_get_contents("$phpbb_root_path$src$path$file"), false, stat("$phpbb_root_path$src$path$file")); $this->data("$src_path$path$file", file_get_contents("$phpbb_root_path$src$path$file"), stat("$phpbb_root_path$src$path$file"), false);
} }
} }
} }
@ -109,7 +109,7 @@ class compress
return false; return false;
} }
$this->data($filename, file_get_contents($src), false, stat($src)); $this->data($filename, file_get_contents($src), stat($src), false);
return true; return true;
} }
@ -123,7 +123,7 @@ class compress
$stat[4] = $stat[5] = 0; $stat[4] = $stat[5] = 0;
$stat[7] = strlen($src); $stat[7] = strlen($src);
$stat[9] = time(); $stat[9] = time();
$this->data($name, $src, false, $stat); $this->data($name, $src, $stat, false);
return true; return true;
} }
@ -395,7 +395,7 @@ class compress_zip extends compress
/** /**
* Create the structures ... note we assume version made by is MSDOS * Create the structures ... note we assume version made by is MSDOS
*/ */
function data($name, $data, $is_dir = false, $stat) function data($name, $data, $stat, $is_dir = false)
{ {
$name = str_replace('\\', '/', $name); $name = str_replace('\\', '/', $name);
$name = $this->unique_filename($name); $name = $this->unique_filename($name);
@ -669,7 +669,7 @@ class compress_tar extends compress
/** /**
* Create the structures * Create the structures
*/ */
function data($name, $data, $is_dir = false, $stat) function data($name, $data, $stat, $is_dir = false)
{ {
$name = $this->unique_filename($name); $name = $this->unique_filename($name);
$this->wrote = true; $this->wrote = true;

View file

@ -1414,7 +1414,7 @@ class smtp_class
$result = false; $result = false;
$stream_meta = stream_get_meta_data($this->socket); $stream_meta = stream_get_meta_data($this->socket);
if (socket_set_blocking($this->socket, 1)); if (socket_set_blocking($this->socket, 1))
{ {
$result = stream_socket_enable_crypto($this->socket, true, STREAM_CRYPTO_METHOD_TLS_CLIENT); $result = stream_socket_enable_crypto($this->socket, true, STREAM_CRYPTO_METHOD_TLS_CLIENT);
socket_set_blocking($this->socket, (int) $stream_meta['blocked']); socket_set_blocking($this->socket, (int) $stream_meta['blocked']);

View file

@ -32,7 +32,7 @@ function phpbb_get_url_matcher(\phpbb\extension\finder $finder, RequestContext $
{ {
if (defined('DEBUG')) if (defined('DEBUG'))
{ {
return phpbb_create_url_matcher($finder, $context); return phpbb_create_url_matcher($finder, $context, $root_path);
} }
if (!phpbb_url_matcher_dumped($root_path, $php_ext)) if (!phpbb_url_matcher_dumped($root_path, $php_ext))
@ -54,7 +54,7 @@ function phpbb_get_url_matcher(\phpbb\extension\finder $finder, RequestContext $
function phpbb_create_dumped_url_matcher(\phpbb\extension\finder $finder, $root_path, $php_ext) function phpbb_create_dumped_url_matcher(\phpbb\extension\finder $finder, $root_path, $php_ext)
{ {
$provider = new \phpbb\controller\provider(); $provider = new \phpbb\controller\provider();
$routes = $provider->import_paths_from_finder($finder)->find(); $routes = $provider->import_paths_from_finder($finder)->find($root_path);
$dumper = new PhpMatcherDumper($routes); $dumper = new PhpMatcherDumper($routes);
$cached_url_matcher_dump = $dumper->dump(array( $cached_url_matcher_dump = $dumper->dump(array(
'class' => 'phpbb_url_matcher', 'class' => 'phpbb_url_matcher',
@ -70,10 +70,10 @@ function phpbb_create_dumped_url_matcher(\phpbb\extension\finder $finder, $root_
* @param RequestContext $context Symfony RequestContext object * @param RequestContext $context Symfony RequestContext object
* @return UrlMatcher * @return UrlMatcher
*/ */
function phpbb_create_url_matcher(\phpbb\extension\finder $finder, RequestContext $context) function phpbb_create_url_matcher(\phpbb\extension\finder $finder, RequestContext $context, $root_path)
{ {
$provider = new \phpbb\controller\provider(); $provider = new \phpbb\controller\provider();
$routes = $provider->import_paths_from_finder($finder)->find(); $routes = $provider->import_paths_from_finder($finder)->find($root_path);
return new UrlMatcher($routes, $context); return new UrlMatcher($routes, $context);
} }

View file

@ -78,9 +78,9 @@ class ucp_notifications
trigger_error($message); trigger_error($message);
} }
$this->output_notification_methods('notification_methods', $phpbb_notifications, $template, $user); $this->output_notification_methods($phpbb_notifications, $template, $user, 'notification_methods');
$this->output_notification_types($subscriptions, 'notification_types', $phpbb_notifications, $template, $user); $this->output_notification_types($subscriptions, $phpbb_notifications, $template, $user, 'notification_types');
$this->tpl_name = 'ucp_notifications'; $this->tpl_name = 'ucp_notifications';
$this->page_title = 'UCP_NOTIFICATION_OPTIONS'; $this->page_title = 'UCP_NOTIFICATION_OPTIONS';
@ -162,12 +162,12 @@ class ucp_notifications
/** /**
* Output all the notification types to the template * Output all the notification types to the template
* *
* @param string $block
* @param \phpbb\notification\manager $phpbb_notifications * @param \phpbb\notification\manager $phpbb_notifications
* @param \phpbb\template\template $template * @param \phpbb\template\template $template
* @param \phpbb\user $user * @param \phpbb\user $user
* @param string $block
*/ */
public function output_notification_types($subscriptions, $block = 'notification_types', \phpbb\notification\manager $phpbb_notifications, \phpbb\template\template $template, \phpbb\user $user) public function output_notification_types($subscriptions, \phpbb\notification\manager $phpbb_notifications, \phpbb\template\template $template, \phpbb\user $user, $block = 'notification_types')
{ {
$notification_methods = $phpbb_notifications->get_subscription_methods(); $notification_methods = $phpbb_notifications->get_subscription_methods();
@ -209,12 +209,12 @@ class ucp_notifications
/** /**
* Output all the notification methods to the template * Output all the notification methods to the template
* *
* @param string $block
* @param \phpbb\notification\manager $phpbb_notifications * @param \phpbb\notification\manager $phpbb_notifications
* @param \phpbb\template\template $template * @param \phpbb\template\template $template
* @param \phpbb\user $user * @param \phpbb\user $user
* @param string $block
*/ */
public function output_notification_methods($block = 'notification_methods', \phpbb\notification\manager $phpbb_notifications, \phpbb\template\template $template, \phpbb\user $user) public function output_notification_methods(\phpbb\notification\manager $phpbb_notifications, \phpbb\template\template $template, \phpbb\user $user, $block = 'notification_methods')
{ {
$notification_methods = $phpbb_notifications->get_subscription_methods(); $notification_methods = $phpbb_notifications->get_subscription_methods();

View file

@ -64,7 +64,7 @@ class ucp_zebra
* @var array user_ids User ids we remove * @var array user_ids User ids we remove
* @since 3.1-A1 * @since 3.1-A1
*/ */
$vars = array('user_ids'); $vars = array('mode', 'user_ids');
extract($phpbb_dispatcher->trigger_event('core.ucp_remove_zebra', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.ucp_remove_zebra', compact($vars)));
$sql = 'DELETE FROM ' . ZEBRA_TABLE . ' $sql = 'DELETE FROM ' . ZEBRA_TABLE . '

View file

@ -97,7 +97,6 @@ class ldap extends \phpbb\auth\provider\base
@ldap_close($ldap); @ldap_close($ldap);
if (!is_array($result) || sizeof($result) < 2) if (!is_array($result) || sizeof($result) < 2)
{ {
return sprintf($this->user->lang['LDAP_NO_IDENTITY'], $this->user->data['username']); return sprintf($this->user->lang['LDAP_NO_IDENTITY'], $this->user->data['username']);

View file

@ -179,7 +179,7 @@ class oauth extends \phpbb\auth\provider\base
$storage = new \phpbb\auth\provider\oauth\token_storage($this->db, $this->user, $this->auth_provider_oauth_token_storage_table); $storage = new \phpbb\auth\provider\oauth\token_storage($this->db, $this->user, $this->auth_provider_oauth_token_storage_table);
$query = 'mode=login&login=external&oauth_service=' . $service_name_original; $query = 'mode=login&login=external&oauth_service=' . $service_name_original;
$service = $this->get_service($service_name_original, $storage, $service_credentials, $this->service_providers[$service_name]->get_auth_scope(), $query); $service = $this->get_service($service_name_original, $storage, $service_credentials, $query, $this->service_providers[$service_name]->get_auth_scope());
if ($this->request->is_set('code', \phpbb\request\request_interface::GET)) if ($this->request->is_set('code', \phpbb\request\request_interface::GET))
{ {
@ -273,13 +273,13 @@ class oauth extends \phpbb\auth\provider\base
* @param string $service_name The name of the service * @param string $service_name The name of the service
* @param \phpbb\auth\provider\oauth\token_storage $storage * @param \phpbb\auth\provider\oauth\token_storage $storage
* @param array $service_credentials {@see \phpbb\auth\provider\oauth\oauth::get_service_credentials} * @param array $service_credentials {@see \phpbb\auth\provider\oauth\oauth::get_service_credentials}
* @param array $scope The scope of the request against
* the api.
* @param string $query The query string of the * @param string $query The query string of the
* current_uri used in redirection * current_uri used in redirection
* @param array $scope The scope of the request against
* the api.
* @return \OAuth\Common\Service\ServiceInterface * @return \OAuth\Common\Service\ServiceInterface
*/ */
protected function get_service($service_name, \phpbb\auth\provider\oauth\token_storage $storage, array $service_credentials, array $scopes = array(), $query) protected function get_service($service_name, \phpbb\auth\provider\oauth\token_storage $storage, array $service_credentials, $query, array $scopes = array())
{ {
$current_uri = $this->get_current_uri($service_name, $query); $current_uri = $this->get_current_uri($service_name, $query);
@ -458,7 +458,7 @@ class oauth extends \phpbb\auth\provider\base
// Prepare for an authentication request // Prepare for an authentication request
$service_credentials = $this->service_providers[$service_name]->get_service_credentials(); $service_credentials = $this->service_providers[$service_name]->get_service_credentials();
$scopes = $this->service_providers[$service_name]->get_auth_scope(); $scopes = $this->service_providers[$service_name]->get_auth_scope();
$service = $this->get_service(strtolower($link_data['oauth_service']), $storage, $service_credentials, $scopes, $query); $service = $this->get_service(strtolower($link_data['oauth_service']), $storage, $service_credentials, $query, $scopes);
$this->service_providers[$service_name]->set_external_service_provider($service); $this->service_providers[$service_name]->set_external_service_provider($service);
// The user has already authenticated successfully, request to authenticate again // The user has already authenticated successfully, request to authenticate again
@ -491,7 +491,7 @@ class oauth extends \phpbb\auth\provider\base
$query = 'i=ucp_auth_link&mode=auth_link&link=1&oauth_service=' . strtolower($link_data['oauth_service']); $query = 'i=ucp_auth_link&mode=auth_link&link=1&oauth_service=' . strtolower($link_data['oauth_service']);
$service_credentials = $this->service_providers[$service_name]->get_service_credentials(); $service_credentials = $this->service_providers[$service_name]->get_service_credentials();
$scopes = $this->service_providers[$service_name]->get_auth_scope(); $scopes = $this->service_providers[$service_name]->get_auth_scope();
$service = $this->get_service(strtolower($link_data['oauth_service']), $storage, $service_credentials, $scopes, $query); $service = $this->get_service(strtolower($link_data['oauth_service']), $storage, $service_credentials, $query, $scopes);
if ($this->request->is_set('code', \phpbb\request\request_interface::GET)) if ($this->request->is_set('code', \phpbb\request\request_interface::GET))
{ {

View file

@ -78,7 +78,7 @@ class token_storage implements TokenStorageInterface
{ {
$service = $this->get_service_name_for_db($service); $service = $this->get_service_name_for_db($service);
if ($this->cachedToken instanceOf TokenInterface) if ($this->cachedToken instanceof TokenInterface)
{ {
return $this->cachedToken; return $this->cachedToken;
} }
@ -238,7 +238,7 @@ class token_storage implements TokenStorageInterface
{ {
$service = $this->get_service_name_for_db($service); $service = $this->get_service_name_for_db($service);
if ($this->cachedToken instanceOf TokenInterface) { if ($this->cachedToken instanceof TokenInterface) {
return $this->cachedToken; return $this->cachedToken;
} }

View file

@ -47,6 +47,12 @@ abstract class driver implements \phpbb\avatar\driver\driver_interface
*/ */
protected $php_ext; protected $php_ext;
/**
* Path Helper
* @var \phpbb\path_helper
*/
protected $path_helper;
/** /**
* Cache driver * Cache driver
* @var \phpbb\cache\driver\driver_interface * @var \phpbb\cache\driver\driver_interface
@ -75,13 +81,15 @@ abstract class driver implements \phpbb\avatar\driver\driver_interface
* @param \phpbb\request\request $request Request object * @param \phpbb\request\request $request Request object
* @param string $phpbb_root_path Path to the phpBB root * @param string $phpbb_root_path Path to the phpBB root
* @param string $php_ext PHP file extension * @param string $php_ext PHP file extension
* @param \phpbb_path_helper $path_helper phpBB path helper
* @param \phpbb\cache\driver\driver_interface $cache Cache driver * @param \phpbb\cache\driver\driver_interface $cache Cache driver
*/ */
public function __construct(\phpbb\config\config $config, $phpbb_root_path, $php_ext, \phpbb\cache\driver\driver_interface $cache = null) public function __construct(\phpbb\config\config $config, $phpbb_root_path, $php_ext, \phpbb\path_helper $path_helper, \phpbb\cache\driver\driver_interface $cache = null)
{ {
$this->config = $config; $this->config = $config;
$this->phpbb_root_path = $phpbb_root_path; $this->phpbb_root_path = $phpbb_root_path;
$this->php_ext = $php_ext; $this->php_ext = $php_ext;
$this->path_helper = $path_helper;
$this->cache = $cache; $this->cache = $cache;
} }

View file

@ -29,7 +29,7 @@ class local extends \phpbb\avatar\driver\driver
public function get_data($row) public function get_data($row)
{ {
return array( return array(
'src' => $this->phpbb_root_path . $this->config['avatar_gallery_path'] . '/' . $row['avatar'], 'src' => $this->path_helper->get_web_root_path() . $this->config['avatar_gallery_path'] . '/' . $row['avatar'],
'width' => $row['avatar_width'], 'width' => $row['avatar_width'],
'height' => $row['avatar_height'], 'height' => $row['avatar_height'],
); );

View file

@ -29,7 +29,7 @@ class upload extends \phpbb\avatar\driver\driver
public function get_data($row, $ignore_config = false) public function get_data($row, $ignore_config = false)
{ {
return array( return array(
'src' => $this->phpbb_root_path . 'download/file.' . $this->php_ext . '?avatar=' . $row['avatar'], 'src' => $this->path_helper->get_web_root_path() . 'download/file.' . $this->php_ext . '?avatar=' . $row['avatar'],
'width' => $row['avatar_width'], 'width' => $row['avatar_width'],
'height' => $row['avatar_height'], 'height' => $row['avatar_height'],
); );

View file

@ -41,12 +41,6 @@ class manager
*/ */
protected $avatar_drivers; protected $avatar_drivers;
/**
* Service container object
* @var object
*/
protected $container;
/** /**
* Default avatar data row * Default avatar data row
* @var array * @var array
@ -63,13 +57,27 @@ class manager
* *
* @param \phpbb\config\config $config phpBB configuration * @param \phpbb\config\config $config phpBB configuration
* @param array $avatar_drivers Avatar drivers passed via the service container * @param array $avatar_drivers Avatar drivers passed via the service container
* @param object $container Container object
*/ */
public function __construct(\phpbb\config\config $config, $avatar_drivers, $container) public function __construct(\phpbb\config\config $config, $avatar_drivers)
{ {
$this->config = $config; $this->config = $config;
$this->avatar_drivers = $avatar_drivers; $this->register_avatar_drivers($avatar_drivers);
$this->container = $container; }
/**
* Register avatar drivers
*
* @param array $avatar_drivers Service collection of avatar drivers
*/
protected function register_avatar_drivers($avatar_drivers)
{
if (!empty($avatar_drivers))
{
foreach ($avatar_drivers as $driver)
{
$this->avatar_drivers[$driver->get_name()] = $driver;
}
}
} }
/** /**
@ -112,7 +120,7 @@ class manager
* There is no need to handle invalid avatar types as the following code * There is no need to handle invalid avatar types as the following code
* will cause a ServiceNotFoundException if the type does not exist * will cause a ServiceNotFoundException if the type does not exist
*/ */
$driver = $this->container->get($avatar_type); $driver = $this->avatar_drivers[$avatar_type];
return $driver; return $driver;
} }

View file

@ -31,17 +31,17 @@ class provider
* YAML file(s) containing route information * YAML file(s) containing route information
* @var array * @var array
*/ */
protected $routing_paths; protected $routing_files;
/** /**
* Construct method * Construct method
* *
* @param array() $routing_paths Array of strings containing paths * @param array() $routing_files Array of strings containing paths
* to YAML files holding route information * to YAML files holding route information
*/ */
public function __construct($routing_paths = array()) public function __construct($routing_files = array())
{ {
$this->routing_paths = $routing_paths; $this->routing_files = $routing_files;
} }
/** /**
@ -54,12 +54,11 @@ class provider
{ {
// We hardcode the path to the core config directory // We hardcode the path to the core config directory
// because the finder cannot find it // because the finder cannot find it
$this->routing_paths = array_merge(array('config'), array_map('dirname', array_keys($finder $this->routing_files = array_merge(array('config/routing.yml'), array_keys($finder
->directory('config') ->directory('config')
->prefix('routing') ->suffix('routing.yml')
->suffix('yml')
->find() ->find()
))); ));
return $this; return $this;
} }
@ -73,10 +72,10 @@ class provider
public function find($base_path = '') public function find($base_path = '')
{ {
$routes = new RouteCollection; $routes = new RouteCollection;
foreach ($this->routing_paths as $path) foreach ($this->routing_files as $file_path)
{ {
$loader = new YamlFileLoader(new FileLocator($base_path . $path)); $loader = new YamlFileLoader(new FileLocator($base_path));
$routes->addCollection($loader->load('routing.yml')); $routes->addCollection($loader->load($file_path));
} }
return $routes; return $routes;

View file

@ -259,7 +259,7 @@ class mssql extends \phpbb\db\driver\driver
{ {
foreach ($row as $key => $value) foreach ($row as $key => $value)
{ {
$row[$key] = ($value === ' ' || $value === NULL) ? '' : $value; $row[$key] = ($value === ' ' || $value === null) ? '' : $value;
} }
} }

View file

@ -195,7 +195,7 @@ class result_mssqlnative
*/ */
class mssqlnative extends \phpbb\db\driver\mssql_base class mssqlnative extends \phpbb\db\driver\mssql_base
{ {
var $m_insert_id = NULL; var $m_insert_id = null;
var $last_query_text = ''; var $last_query_text = '';
var $query_options = array(); var $query_options = array();
var $connect_error = ''; var $connect_error = '';
@ -427,7 +427,7 @@ class mssqlnative extends \phpbb\db\driver\mssql_base
{ {
foreach ($row as $key => $value) foreach ($row as $key => $value)
{ {
$row[$key] = ($value === ' ' || $value === NULL) ? '' : $value; $row[$key] = ($value === ' ' || $value === null) ? '' : $value;
} }
// remove helper values from LIMIT queries // remove helper values from LIMIT queries

View file

@ -47,11 +47,11 @@ class mysqli extends \phpbb\db\driver\mysql_base
$this->server = ($this->persistency) ? 'p:' . (($sqlserver) ? $sqlserver : 'localhost') : $sqlserver; $this->server = ($this->persistency) ? 'p:' . (($sqlserver) ? $sqlserver : 'localhost') : $sqlserver;
$this->dbname = $database; $this->dbname = $database;
$port = (!$port) ? NULL : $port; $port = (!$port) ? null : $port;
// If port is set and it is not numeric, most likely mysqli socket is set. // If port is set and it is not numeric, most likely mysqli socket is set.
// Try to map it to the $socket parameter. // Try to map it to the $socket parameter.
$socket = NULL; $socket = null;
if ($port) if ($port)
{ {
if (is_numeric($port)) if (is_numeric($port))
@ -61,7 +61,7 @@ class mysqli extends \phpbb\db\driver\mysql_base
else else
{ {
$socket = $port; $socket = $port;
$port = NULL; $port = null;
} }
} }

View file

@ -328,7 +328,7 @@ class postgres extends \phpbb\db\driver\driver
return false; return false;
} }
$temp_result = @pg_fetch_assoc($temp_q_id, NULL); $temp_result = @pg_fetch_assoc($temp_q_id, null);
@pg_free_result($query_id); @pg_free_result($query_id);
return ($temp_result) ? $temp_result['last_value'] : false; return ($temp_result) ? $temp_result['last_value'] : false;
@ -456,7 +456,7 @@ class postgres extends \phpbb\db\driver\driver
if ($result = @pg_query($this->db_connect_id, "EXPLAIN $explain_query")) if ($result = @pg_query($this->db_connect_id, "EXPLAIN $explain_query"))
{ {
while ($row = @pg_fetch_assoc($result, NULL)) while ($row = @pg_fetch_assoc($result, null))
{ {
$html_table = $this->sql_report('add_select_row', $query, $html_table, $row); $html_table = $this->sql_report('add_select_row', $query, $html_table, $row);
} }
@ -476,7 +476,7 @@ class postgres extends \phpbb\db\driver\driver
$endtime = $endtime[0] + $endtime[1]; $endtime = $endtime[0] + $endtime[1];
$result = @pg_query($this->db_connect_id, $query); $result = @pg_query($this->db_connect_id, $query);
while ($void = @pg_fetch_assoc($result, NULL)) while ($void = @pg_fetch_assoc($result, null))
{ {
// Take the time spent on parsing rows into account // Take the time spent on parsing rows into account
} }

View file

@ -34,7 +34,7 @@ class notifications extends \phpbb\db\migration\migration
), ),
$this->table_prefix . 'notifications' => array( $this->table_prefix . 'notifications' => array(
'COLUMNS' => array( 'COLUMNS' => array(
'notification_id' => array('UINT', NULL, 'auto_increment'), 'notification_id' => array('UINT', null, 'auto_increment'),
'item_type' => array('VCHAR:255', ''), 'item_type' => array('VCHAR:255', ''),
'item_id' => array('UINT', 0), 'item_id' => array('UINT', 0),
'item_parent_id' => array('UINT', 0), 'item_parent_id' => array('UINT', 0),

View file

@ -26,7 +26,7 @@ class notifications_schema_fix extends \phpbb\db\migration\migration
'add_tables' => array( 'add_tables' => array(
$this->table_prefix . 'notification_types' => array( $this->table_prefix . 'notification_types' => array(
'COLUMNS' => array( 'COLUMNS' => array(
'notification_type_id' => array('USINT', NULL, 'auto_increment'), 'notification_type_id' => array('USINT', null, 'auto_increment'),
'notification_type_name' => array('VCHAR:255', ''), 'notification_type_name' => array('VCHAR:255', ''),
'notification_type_enabled' => array('BOOL', 1), 'notification_type_enabled' => array('BOOL', 1),
), ),
@ -37,7 +37,7 @@ class notifications_schema_fix extends \phpbb\db\migration\migration
), ),
$this->table_prefix . 'notifications' => array( $this->table_prefix . 'notifications' => array(
'COLUMNS' => array( 'COLUMNS' => array(
'notification_id' => array('UINT:10', NULL, 'auto_increment'), 'notification_id' => array('UINT:10', null, 'auto_increment'),
'notification_type_id' => array('USINT', 0), 'notification_type_id' => array('USINT', 0),
'item_id' => array('UINT', 0), 'item_id' => array('UINT', 0),
'item_parent_id' => array('UINT', 0), 'item_parent_id' => array('UINT', 0),
@ -73,7 +73,7 @@ class notifications_schema_fix extends \phpbb\db\migration\migration
), ),
$this->table_prefix . 'notifications' => array( $this->table_prefix . 'notifications' => array(
'COLUMNS' => array( 'COLUMNS' => array(
'notification_id' => array('UINT', NULL, 'auto_increment'), 'notification_id' => array('UINT', null, 'auto_increment'),
'item_type' => array('VCHAR:255', ''), 'item_type' => array('VCHAR:255', ''),
'item_id' => array('UINT', 0), 'item_id' => array('UINT', 0),
'item_parent_id' => array('UINT', 0), 'item_parent_id' => array('UINT', 0),

View file

@ -56,7 +56,7 @@ class style_update_p2 extends \phpbb\db\migration\migration
'add_tables' => array( 'add_tables' => array(
$this->table_prefix . 'styles_imageset' => array( $this->table_prefix . 'styles_imageset' => array(
'COLUMNS' => array( 'COLUMNS' => array(
'imageset_id' => array('UINT', NULL, 'auto_increment'), 'imageset_id' => array('UINT', null, 'auto_increment'),
'imageset_name' => array('VCHAR_UNI:255', ''), 'imageset_name' => array('VCHAR_UNI:255', ''),
'imageset_copyright' => array('VCHAR_UNI', ''), 'imageset_copyright' => array('VCHAR_UNI', ''),
'imageset_path' => array('VCHAR:100', ''), 'imageset_path' => array('VCHAR:100', ''),
@ -68,7 +68,7 @@ class style_update_p2 extends \phpbb\db\migration\migration
), ),
$this->table_prefix . 'styles_imageset_data' => array( $this->table_prefix . 'styles_imageset_data' => array(
'COLUMNS' => array( 'COLUMNS' => array(
'image_id' => array('UINT', NULL, 'auto_increment'), 'image_id' => array('UINT', null, 'auto_increment'),
'image_name' => array('VCHAR:200', ''), 'image_name' => array('VCHAR:200', ''),
'image_filename' => array('VCHAR:200', ''), 'image_filename' => array('VCHAR:200', ''),
'image_lang' => array('VCHAR:30', ''), 'image_lang' => array('VCHAR:30', ''),
@ -83,7 +83,7 @@ class style_update_p2 extends \phpbb\db\migration\migration
), ),
$this->table_prefix . 'styles_template' => array( $this->table_prefix . 'styles_template' => array(
'COLUMNS' => array( 'COLUMNS' => array(
'template_id' => array('UINT', NULL, 'auto_increment'), 'template_id' => array('UINT', null, 'auto_increment'),
'template_name' => array('VCHAR_UNI:255', ''), 'template_name' => array('VCHAR_UNI:255', ''),
'template_copyright' => array('VCHAR_UNI', ''), 'template_copyright' => array('VCHAR_UNI', ''),
'template_path' => array('VCHAR:100', ''), 'template_path' => array('VCHAR:100', ''),
@ -112,7 +112,7 @@ class style_update_p2 extends \phpbb\db\migration\migration
), ),
$this->table_prefix . 'styles_theme' => array( $this->table_prefix . 'styles_theme' => array(
'COLUMNS' => array( 'COLUMNS' => array(
'theme_id' => array('UINT', NULL, 'auto_increment'), 'theme_id' => array('UINT', null, 'auto_increment'),
'theme_name' => array('VCHAR_UNI:255', ''), 'theme_name' => array('VCHAR_UNI:255', ''),
'theme_copyright' => array('VCHAR_UNI', ''), 'theme_copyright' => array('VCHAR_UNI', ''),
'theme_path' => array('VCHAR:100', ''), 'theme_path' => array('VCHAR:100', ''),

View file

@ -27,7 +27,7 @@ class teampage extends \phpbb\db\migration\migration
'add_tables' => array( 'add_tables' => array(
$this->table_prefix . 'teampage' => array( $this->table_prefix . 'teampage' => array(
'COLUMNS' => array( 'COLUMNS' => array(
'teampage_id' => array('UINT', NULL, 'auto_increment'), 'teampage_id' => array('UINT', null, 'auto_increment'),
'group_id' => array('UINT', 0), 'group_id' => array('UINT', 0),
'teampage_name' => array('VCHAR_UNI:255', ''), 'teampage_name' => array('VCHAR_UNI:255', ''),
'teampage_position' => array('UINT', 0), 'teampage_position' => array('UINT', 0),

View file

@ -33,7 +33,7 @@ class tools
/** /**
* @var object DB object * @var object DB object
*/ */
var $db = NULL; var $db = null;
/** /**
* The Column types for every database we support * The Column types for every database we support

View file

@ -72,7 +72,6 @@ class kernel_exception_subscriber implements EventSubscriberInterface
page_footer(true, false, false); page_footer(true, false, false);
$status_code = $exception instanceof HttpException ? $exception->getStatusCode() : 500; $status_code = $exception instanceof HttpException ? $exception->getStatusCode() : 500;
$response = new Response($this->template->assign_display('body'), $status_code); $response = new Response($this->template->assign_display('body'), $status_code);
$event->setResponse($response); $event->setResponse($response);

View file

@ -234,7 +234,9 @@ class manager
*/ */
public function enable($name) public function enable($name)
{ {
// @codingStandardsIgnoreStart
while ($this->enable_step($name)); while ($this->enable_step($name));
// @codingStandardsIgnoreEnd
} }
/** /**
@ -311,7 +313,9 @@ class manager
*/ */
public function disable($name) public function disable($name)
{ {
// @codingStandardsIgnoreStart
while ($this->disable_step($name)); while ($this->disable_step($name));
// @codingStandardsIgnoreEnd
} }
/** /**
@ -388,7 +392,9 @@ class manager
*/ */
public function purge($name) public function purge($name)
{ {
// @codingStandardsIgnoreStart
while ($this->purge_step($name)); while ($this->purge_step($name));
// @codingStandardsIgnoreEnd
} }
/** /**

View file

@ -169,7 +169,7 @@ class metadata_manager
throw new \phpbb\extension\exception('file_get_contents failed on ' . $this->metadata_file); throw new \phpbb\extension\exception('file_get_contents failed on ' . $this->metadata_file);
} }
if (($metadata = json_decode($file_contents, true)) === NULL) if (($metadata = json_decode($file_contents, true)) === null)
{ {
throw new \phpbb\extension\exception('json_decode failed on ' . $this->metadata_file); throw new \phpbb\extension\exception('json_decode failed on ' . $this->metadata_file);
} }

View file

@ -150,7 +150,7 @@ abstract class base
*/ */
function get($key) function get($key)
{ {
return (isset($this->keys[$key])) ? $this->keys[$key] : NULL; return (isset($this->keys[$key])) ? $this->keys[$key] : null;
} }
function get_readable_forums() function get_readable_forums()

View file

@ -850,7 +850,6 @@ class fulltext_native extends \phpbb\search\base
} }
$this->db->sql_freeresult($result); $this->db->sql_freeresult($result);
// if we use mysql and the total result count is not cached yet, retrieve it from the db // if we use mysql and the total result count is not cached yet, retrieve it from the db
if (!$total_results && $is_mysql) if (!$total_results && $is_mysql)
{ {

View file

@ -1235,7 +1235,6 @@ class session
$this->session_create(ANONYMOUS); $this->session_create(ANONYMOUS);
} }
// Determine which message to output // Determine which message to output
$till_date = ($ban_row['ban_end']) ? $this->format_date($ban_row['ban_end']) : ''; $till_date = ($ban_row['ban_end']) ? $this->format_date($ban_row['ban_end']) : '';
$message = ($ban_row['ban_end']) ? 'BOARD_BAN_TIME' : 'BOARD_BAN_PERM'; $message = ($ban_row['ban_end']) ? 'BOARD_BAN_TIME' : 'BOARD_BAN_PERM';

View file

@ -285,7 +285,7 @@ class context
// Search array to get correct position // Search array to get correct position
list($search_key, $search_value) = @each($key); list($search_key, $search_value) = @each($key);
$key = NULL; $key = null;
foreach ($block as $i => $val_ary) foreach ($block as $i => $val_ary)
{ {
if ($val_ary[$search_key] === $search_value) if ($val_ary[$search_key] === $search_value)
@ -296,7 +296,7 @@ class context
} }
// key/value pair not found // key/value pair not found
if ($key === NULL) if ($key === null)
{ {
return false; return false;
} }

View file

@ -23,7 +23,7 @@ class includephp extends \Twig_Node
/** @var Twig_Environment */ /** @var Twig_Environment */
protected $environment; protected $environment;
public function __construct(\Twig_Node_Expression $expr, \phpbb\template\twig\environment $environment, $ignoreMissing = false, $lineno, $tag = null) public function __construct(\Twig_Node_Expression $expr, \phpbb\template\twig\environment $environment, $lineno, $ignoreMissing = false, $tag = null)
{ {
$this->environment = $environment; $this->environment = $environment;

View file

@ -43,7 +43,7 @@ class includephp extends \Twig_TokenParser
$stream->expect(\Twig_Token::BLOCK_END_TYPE); $stream->expect(\Twig_Token::BLOCK_END_TYPE);
return new \phpbb\template\twig\node\includephp($expr, $this->parser->getEnvironment(), $ignoreMissing, $token->getLine(), $this->getTag()); return new \phpbb\template\twig\node\includephp($expr, $this->parser->getEnvironment(), $token->getLine(), $ignoreMissing, $this->getTag());
} }
/** /**

View file

@ -343,7 +343,6 @@ class user extends \phpbb\session
} }
} }
// Does the user need to change their password? If so, redirect to the // Does the user need to change their password? If so, redirect to the
// ucp profile reg_details page ... of course do not redirect if we're already in the ucp // ucp profile reg_details page ... of course do not redirect if we're already in the ucp
if (!defined('IN_ADMIN') && !defined('ADMIN_START') && $config['chg_passforce'] && !empty($this->data['is_registered']) && $auth->acl_get('u_chgpasswd') && $this->data['user_passchg'] < time() - ($config['chg_passforce'] * 86400)) if (!defined('IN_ADMIN') && !defined('ADMIN_START') && $config['chg_passforce'] && !empty($this->data['is_registered']) && $auth->acl_get('u_chgpasswd') && $this->data['user_passchg'] < time() - ($config['chg_passforce'] * 86400))

View file

@ -1525,7 +1525,7 @@ $template->assign_vars(array(
* @event core.posting_modify_template_vars * @event core.posting_modify_template_vars
* @since 3.1-A1 * @since 3.1-A1
*/ */
$phpbb_dispatcher->trigger_event('core.posting_modify_template_vars'); $phpbb_dispatcher->dispatch('core.posting_modify_template_vars');
// Build custom bbcodes array // Build custom bbcodes array
display_custom_bbcodes(); display_custom_bbcodes();

View file

@ -13,26 +13,31 @@
<div class="<!-- IF not S_PRIVMSGS -->forumbg<!-- ELSE -->panel<!-- ENDIF -->"> <div class="<!-- IF not S_PRIVMSGS -->forumbg<!-- ELSE -->panel<!-- ENDIF -->">
<div class="inner"> <div class="inner">
<ul class="topiclist"> <ul class="topiclist two-long-columns">
<li class="header"> <li class="header">
<dl> <dl>
<dt>{L_LOAD_DRAFT}</dt> <dt>{L_LOAD_DRAFT}</dt>
<dd class="posted">{L_SAVE_DATE}</dd> <dd class="info">{L_SAVE_DATE}</dd>
</dl> </dl>
</li> </li>
</ul> </ul>
<ul class="topiclist<!-- IF not S_PRIVMSGS --> topics<!-- ELSE --> cplist<!-- ENDIF -->"> <ul class="topiclist two-long-columns<!-- IF not S_PRIVMSGS --> topics<!-- ELSE --> cplist<!-- ENDIF -->">
<!-- BEGIN draftrow --> <!-- BEGIN draftrow -->
<li class="row<!-- IF draftrow.S_ROW_COUNT is even --> bg1<!-- ELSE --> bg2<!-- ENDIF -->"> <li class="row<!-- IF draftrow.S_ROW_COUNT is even --> bg1<!-- ELSE --> bg2<!-- ENDIF -->">
<dl> <dl>
<dt> <dt>
<div class="list-inner">
<a href="{draftrow.U_INSERT}" title="{L_LOAD_DRAFT}" class="topictitle">{draftrow.DRAFT_SUBJECT}</a><br /> <a href="{draftrow.U_INSERT}" title="{L_LOAD_DRAFT}" class="topictitle">{draftrow.DRAFT_SUBJECT}</a><br />
<!-- IF not S_PRIVMSGS --><!-- IF draftrow.S_LINK_TOPIC -->{L_TOPIC}{L_COLON} <a href="{draftrow.U_VIEW}">{draftrow.TITLE}</a> <!-- IF not S_PRIVMSGS --><!-- IF draftrow.S_LINK_TOPIC -->{L_TOPIC}{L_COLON} <a href="{draftrow.U_VIEW}">{draftrow.TITLE}</a>
<!-- ELSEIF draftrow.S_LINK_FORUM -->{L_FORUM}{L_COLON} <a href="{draftrow.U_VIEW}">{draftrow.TITLE}</a> <!-- ELSEIF draftrow.S_LINK_FORUM -->{L_FORUM}{L_COLON} <a href="{draftrow.U_VIEW}">{draftrow.TITLE}</a>
<!-- ELSE -->{L_NO_TOPIC_FORUM}<!-- ENDIF --><!-- ENDIF --> <!-- ELSE -->{L_NO_TOPIC_FORUM}<!-- ENDIF --><!-- ENDIF -->
<div class="responsive-show" style="display: none;">
{L_SAVE_DATE}{L_COLON} <strong>{draftrow.DATE}</strong>
</div>
</div>
</dt> </dt>
<dd class="posted">{draftrow.DATE}</dd> <dd class="info"><span>{draftrow.DATE}</span></dd>
</dl> </dl>
</li> </li>
<!-- END draftrow --> <!-- END draftrow -->

View file

@ -410,46 +410,44 @@ function insert_single_user(formId, user)
} }
/** /**
* Run onload functions * Parse document block
*/ */
(function($) { function parse_document(container)
$(document).ready(function() { {
// Swap .nojs and .hasjs var test = document.createElement('div'),
$('#phpbb.nojs').toggleClass('nojs hasjs'); oldBrowser = (typeof test.style.borderRadius == 'undefined');
// Focus forms delete test;
$('form[data-focus]:first').each(function() {
$('#' + this.getAttribute('data-focus')).focus();
});
// Reset avatar dimensions when changing URL or EMAIL /**
$('input[data-reset-on-edit]').bind('keyup', function() { * Reset avatar dimensions when changing URL or EMAIL
*/
container.find('input[data-reset-on-edit]').bind('keyup', function() {
$(this.getAttribute('data-reset-on-edit')).val(''); $(this.getAttribute('data-reset-on-edit')).val('');
}); });
// Pagination /**
$('a.pagination-trigger').click(function() { * Pagination
*/
container.find('a.pagination-trigger').click(function() {
jumpto($(this)); jumpto($(this));
}); });
// Adjust HTML code for IE8 and older versions /**
var test = document.createElement('div'), * Adjust HTML code for IE8 and older versions
oldBrowser = (typeof test.style.borderRadius == 'undefined'); */
delete test;
if (oldBrowser) { if (oldBrowser) {
// Fix .linklist.bulletin lists // Fix .linklist.bulletin lists
$('ul.linklist.bulletin li:first-child, ul.linklist.bulletin li.rightside:last-child').addClass('no-bulletin'); container.find('ul.linklist.bulletin li:first-child, ul.linklist.bulletin li.rightside:last-child').addClass('no-bulletin');
// Do not run functions below for old browsers // Do not run functions below for old browsers
return; return;
} }
// Adjust topiclist lists with check boxes /**
$('ul.topiclist dd.mark').siblings('dt').children('.list-inner').addClass('with-mark'); * Resize navigation block to keep all links on same line
*/
// Resize navigation block to keep all links on same line container.find('.navlinks').each(function() {
$('.navlinks').each(function() {
var $this = $(this), var $this = $(this),
left = $this.children().not('.rightside'), left = $this.children().not('.rightside'),
right = $this.children('.rightside'); right = $this.children('.rightside');
@ -470,23 +468,20 @@ function insert_single_user(formId, user)
$(window).resize(resize); $(window).resize(resize);
}); });
// Responsive breadcrumbs /**
$('.breadcrumbs:not(.skip-responsive, .linklist.leftside .breadcrumbs)').each(function() { * Makes breadcrumbs responsive
*/
container.find('.breadcrumbs:not([data-skip-responsive])').each(function() {
var $this = $(this), var $this = $(this),
$body = $('body'), $body = $('body'),
links = $this.find('.crumb'), links = $this.find('.crumb'),
length = links.length, length = links.length,
classes = ['wrapped-wide', 'wrapped-medium', 'wrapped-small'], classes = ['wrapped-max', 'wrapped-wide', 'wrapped-medium', 'wrapped-small', 'wrapped-tiny'],
classesLength = classes.length, classesLength = classes.length,
maxHeight = 0, maxHeight = 0,
lastWidth = false, lastWidth = false,
wrapped = false; wrapped = false;
// Test height by setting nowrap
$this.css('white-space', 'nowrap');
maxHeight = $this.height() + 1;
$this.css('white-space', '');
// Set tooltips // Set tooltips
$this.find('a').each(function() { $this.find('a').each(function() {
var $link = $(this); var $link = $(this);
@ -499,6 +494,13 @@ function insert_single_user(formId, user)
width = $body.width(), width = $body.width(),
link, i, j; link, i, j;
maxHeight = parseInt($this.css('line-height')) | 0;
links.each(function() {
if ($(this).height() > 0) {
maxHeight = Math.max(maxHeight, $(this).outerHeight(true));
}
});
if (height <= maxHeight) { if (height <= maxHeight) {
if (!wrapped || lastWidth === false || lastWidth >= width) { if (!wrapped || lastWidth === false || lastWidth >= width) {
lastWidth = width; lastWidth = width;
@ -536,8 +538,111 @@ function insert_single_user(formId, user)
$(window).resize(check); $(window).resize(check);
}); });
// Responsive tables /**
$('table.table1').not('.not-responsive').each(function() { * Adjust topiclist lists with check boxes
*/
container.find('ul.topiclist dd.mark').siblings('dt').children('.list-inner').addClass('with-mark');
/**
* Appends contents of all extra columns to first column in
* .topiclist lists for mobile devices. Copies contents as is.
*
* To add that functionality to .topiclist list simply add
* responsive-show-all to list of classes
*/
container.find('.topiclist.responsive-show-all > li > dl').each(function() {
var $this = $(this),
block = $this.find('dt .responsive-show:last-child'),
first = true;
// Create block that is visible only on mobile devices
if (!block.length) {
$this.find('dt > .list-inner').append('<div class="responsive-show" style="display:none;" />');
block = $this.find('dt .responsive-show:last-child');
}
else {
first = (block.text().trim().length == 0);
}
// Copy contents of each column
$this.find('dd').not('.mark').each(function() {
var column = $(this),
children = column.children(),
html = column.html();
if (children.length == 1 && children.text() == column.text()) {
html = children.html();
}
block.append((first ? '' : '<br />') + html);
first = false;
});
});
/**
* Same as above, but prepends text from header to each
* column before contents of that column.
*
* To add that functionality to .topiclist list simply add
* responsive-show-columns to list of classes
*/
container.find('.topiclist.responsive-show-columns').each(function() {
var list = $(this),
headers = [],
headersLength = 0;
// Find all headers, get contents
list.prev('.topiclist').find('li.header dd').not('.mark').each(function() {
headers.push($(this).text());
headersLength ++;
});
if (!headersLength) {
return;
}
// Parse each row
list.find('dl').each(function() {
var $this = $(this),
block = $this.find('dt .responsive-show:last-child'),
first = true;
// Create block that is visible only on mobile devices
if (!block.length) {
$this.find('dt > .list-inner').append('<div class="responsive-show" style="display:none;" />');
block = $this.find('dt .responsive-show:last-child');
}
else {
first = (block.text().trim().length == 0);
}
// Copy contents of each column
$this.find('dd').not('.mark').each(function(i) {
var column = $(this),
children = column.children(),
html = column.html();
if (children.length == 1 && children.text() == column.text()) {
html = children.html();
}
// Prepend contents of matching header before contents of column
if (i < headersLength) {
html = headers[i] + ': <strong>' + html + '</strong>';
}
block.append((first ? '' : '<br />') + html);
first = false;
});
});
});
/**
* Responsive tables
*/
container.find('table.table1').not('.not-responsive').each(function() {
var $this = $(this), var $this = $(this),
th = $this.find('thead > tr > th'), th = $this.find('thead > tr > th'),
columns = th.length, columns = th.length,
@ -546,7 +651,7 @@ function insert_single_user(formId, user)
i, headersLength; i, headersLength;
// Find each header // Find each header
th.each(function() { th.each(function(column) {
var cell = $(this), var cell = $(this),
colspan = parseInt(cell.attr('colspan')), colspan = parseInt(cell.attr('colspan')),
dfn = cell.attr('data-dfn'), dfn = cell.attr('data-dfn'),
@ -558,6 +663,10 @@ function insert_single_user(formId, user)
headers.push(text); headers.push(text);
} }
totalHeaders ++; totalHeaders ++;
if (dfn && !column) {
$this.addClass('show-header');
}
}); });
headersLength = headers.length; headersLength = headers.length;
@ -589,7 +698,7 @@ function insert_single_user(formId, user)
return; return;
} }
if (text.length && text !== '-') { if ((text.length && text !== '-') || cell.children().length) {
cell.prepend('<dfn style="display: none;">' + headers[column] + '</dfn>'); cell.prepend('<dfn style="display: none;">' + headers[column] + '</dfn>');
} }
else { else {
@ -602,15 +711,29 @@ function insert_single_user(formId, user)
}); });
}); });
// Responsive link lists /**
$('.linklist:not(.navlinks, .skip-responsive), .postbody ul.profile-icons:not(.skip-responsive)').each(function() { * Hide empty responsive tables
*/
container.find('table.responsive > tbody').each(function() {
var items = $(this).children('tr');
if (items.length == 0)
{
$(this).parent('table:first').addClass('responsive-hide');
}
});
/**
* Responsive link lists
*/
container.find('.linklist:not(.navlinks, [data-skip-responsive]), .postbody ul.profile-icons:not([data-skip-responsive])').each(function() {
var $this = $(this), var $this = $(this),
$body = $('body'), $body = $('body'),
links = $this.children().not('.skip-responsive'), filterSkip = '.breadcrumbs, [data-skip-responsive]',
html = '<li class="responsive-menu" style="display:none;"><a href="javascript:void(0);" class="responsive-menu-link">&nbsp;</a><ul class="responsive-popup" style="display:none;" /></li>', filterLast = '.pagination, .icon-notifications, .icon-pm, .icon-logout, .icon-login, .mark-read, .edit-icon, .quote-icon',
// List of items that should be hidden last allLinks = $this.children(),
filterString = '.pagination, .icon-notifications, .icon-pm, .icon-logout, .icon-login, .mark-read, .breadcrumbs, .edit-icon, .quote-icon', links = allLinks.not(filterSkip),
filtered = links.filter(filterString); html = '<li class="responsive-menu" style="display:none;"><a href="javascript:void(0);" class="responsive-menu-link">&nbsp;</a><div class="dropdown" style="display:none;"><div class="pointer"><div class="pointer-inner" /></div><ul class="dropdown-contents" /></div></li>',
filterLastList = links.filter(filterLast);
if (links.is('.rightside')) if (links.is('.rightside'))
{ {
@ -621,9 +744,8 @@ function insert_single_user(formId, user)
$this.append(html); $this.append(html);
} }
var toggle = $this.children('.responsive-menu'), var item = $this.children('.responsive-menu'),
toggleLink = toggle.find('a.responsive-menu-link'), menu = item.find('.dropdown-contents'),
menu = toggle.find('ul.responsive-popup'),
lastWidth = false, lastWidth = false,
compact = false, compact = false,
responsive = false, responsive = false,
@ -640,7 +762,7 @@ function insert_single_user(formId, user)
responsive = false; responsive = false;
$this.removeClass('responsive'); $this.removeClass('responsive');
links.css('display', ''); links.css('display', '');
toggle.css('display', 'none'); item.css('display', 'none');
} }
if (compact) { if (compact) {
@ -650,7 +772,7 @@ function insert_single_user(formId, user)
// Find tallest element // Find tallest element
var maxHeight = 0; var maxHeight = 0;
links.each(function() { allLinks.each(function() {
if (!$(this).height()) return; if (!$(this).height()) return;
maxHeight = Math.max(maxHeight, $(this).outerHeight(true)); maxHeight = Math.max(maxHeight, $(this).outerHeight(true));
}); });
@ -661,8 +783,6 @@ function insert_single_user(formId, user)
// Nothing to resize if block's height is not bigger than tallest element's height // Nothing to resize if block's height is not bigger than tallest element's height
if ($this.height() <= maxHeight) { if ($this.height() <= maxHeight) {
toggle.removeClass('visible');
menu.hide();
return; return;
} }
@ -671,14 +791,12 @@ function insert_single_user(formId, user)
$this.addClass('compact'); $this.addClass('compact');
var compactMaxHeight = 0; var compactMaxHeight = 0;
links.each(function() { allLinks.each(function() {
if (!$(this).height()) return; if (!$(this).height()) return;
compactMaxHeight = Math.max(compactMaxHeight, $(this).outerHeight(true)); compactMaxHeight = Math.max(compactMaxHeight, $(this).outerHeight(true));
}); });
if ($this.height() <= maxHeight) { if ($this.height() <= maxHeight) {
toggle.removeClass('visible');
menu.hide();
return; return;
} }
@ -688,10 +806,11 @@ function insert_single_user(formId, user)
responsive = true; responsive = true;
if (!copied) { if (!copied) {
if (menu.parents().is('.rightside')) { var clone = links.clone(true);
menu.addClass('responsive-rightside'); clone.filter('.rightside').each(function() {
} menu.prepend(this);
menu.append(links.clone(true)); });
menu.prepend(clone.not('.rightside'));
menu.find('li.leftside, li.rightside').removeClass('leftside rightside'); menu.find('li.leftside, li.rightside').removeClass('leftside rightside');
menu.find('.inputbox').parents('li:first').css('white-space', 'normal'); menu.find('.inputbox').parents('li:first').css('white-space', 'normal');
copied = true; copied = true;
@ -700,21 +819,21 @@ function insert_single_user(formId, user)
menu.children().css('display', ''); menu.children().css('display', '');
} }
toggle.css('display', ''); item.css('display', '');
$this.addClass('responsive'); $this.addClass('responsive');
// Try to not hide filtered items // Try to not hide filtered items
if (filtered.length) { if (filterLastList.length) {
links.not(filterString).css('display', 'none'); links.not(filterLast).css('display', 'none');
maxHeight = 0; maxHeight = 0;
filtered.each(function() { filterLastList.each(function() {
if (!$(this).height()) return; if (!$(this).height()) return;
maxHeight = Math.max(maxHeight, $(this).outerHeight(true)); maxHeight = Math.max(maxHeight, $(this).outerHeight(true));
}); });
if ($this.height() <= maxHeight) { if ($this.height() <= maxHeight) {
menu.children().filter(filterString).css('display', 'none'); menu.children().filter(filterLast).css('display', 'none');
return; return;
} }
} }
@ -722,36 +841,30 @@ function insert_single_user(formId, user)
links.css('display', 'none'); links.css('display', 'none');
} }
toggleLink.click(function() { phpbb.registerDropdown(item.find('a.responsive-menu-link'), item.find('.dropdown'));
if (!responsive) return;
if (!toggle.hasClass('visible')) {
// Hide other popups
$('.responsive-menu.visible').removeClass('visible').find('.responsive-popup').hide();
}
toggle.toggleClass('visible');
menu.toggle();
});
check(); check();
$(window).resize(check); $(window).resize(check);
}); });
// Responsive tabs /**
$('#tabs, #minitabs').not('.skip-responsive').each(function() { * Responsive tabs
*/
container.find('#tabs, #minitabs').not('[data-skip-responsive]').each(function() {
var $this = $(this), var $this = $(this),
$body = $('body'), $body = $('body'),
ul = $this.children(), ul = $this.children(),
tabs = ul.children().not('.skip-responsive'), tabs = ul.children().not('[data-skip-responsive]'),
links = tabs.children('a'), links = tabs.children('a'),
toggle = ul.append('<li class="responsive-tab" style="display:none;"><a href="javascript:void(0);" class="responsive-tab-link"><span>&nbsp;</span></a><ul class="responsive-tabs" style="display:none;" /></li>').find('li.responsive-tab'), item = ul.append('<li class="responsive-tab" style="display:none;"><a href="javascript:void(0);" class="responsive-tab-link"><span>&nbsp;</span></a><div class="dropdown tab-dropdown" style="display: none;"><div class="pointer"><div class="pointer-inner" /></div><ul class="dropdown-contents" /></div></li>').find('li.responsive-tab'),
toggleLink = toggle.find('a.responsive-tab-link'), menu = item.find('.dropdown-contents'),
menu = toggle.find('ul.responsive-tabs'),
maxHeight = 0, maxHeight = 0,
lastWidth = false, lastWidth = false,
responsive = false; responsive = false;
links.each(function() { links.each(function() {
maxHeight = Math.max(maxHeight, $(this).outerHeight(true)); var link = $(this);
maxHeight = Math.max(maxHeight, Math.max(link.outerHeight(true), link.parent().outerHeight(true)));
}) })
function check() { function check() {
@ -763,18 +876,21 @@ function insert_single_user(formId, user)
} }
tabs.show(); tabs.show();
toggle.hide(); item.hide();
lastWidth = width; lastWidth = width;
height = $this.height(); height = $this.height();
if (height <= maxHeight) { if (height <= maxHeight) {
responsive = false; responsive = false;
if (item.hasClass('dropdown-visible')) {
phpbb.toggleDropdown.call(item.find('a.responsive-tab-link').get(0));
}
return; return;
} }
responsive = true; responsive = true;
toggle.show(); item.show();
menu.hide().html(''); menu.html('');
var availableTabs = tabs.filter(':not(.activetab, .responsive-tab)'), var availableTabs = tabs.filter(':not(.activetab, .responsive-tab)'),
total = availableTabs.length, total = availableTabs.length,
@ -792,28 +908,16 @@ function insert_single_user(formId, user)
menu.find('a').click(function() { check(true); }); menu.find('a').click(function() { check(true); });
} }
toggleLink.click(function() { phpbb.registerDropdown(item.find('a.responsive-tab-link'), item.find('.dropdown'), {visibleClass: 'activetab'});
if (!responsive) return;
menu.toggle();
});
check(true); check(true);
$(window).resize(check); $(window).resize(check);
}); });
// Hide responsive menu and tabs /**
$('#phpbb').click(function(e) { * Hide UCP/MCP navigation if there is only 1 item
var parents = $(e.target).parents(); */
if (!parents.is('.responsive-menu.visible')) { container.find('#navigation').each(function() {
$('.responsive-menu.visible').removeClass('visible').find('.responsive-popup').hide();
}
if (!parents.is('.responsive-tab')) {
$('.responsive-tabs').hide();
}
});
// Hide *CP navigation if there is only 1 item
$('#navigation').each(function() {
var items = $(this).children('ol, ul').children('li'); var items = $(this).children('ol, ul').children('li');
if (items.length == 1) if (items.length == 1)
{ {
@ -821,13 +925,45 @@ function insert_single_user(formId, user)
} }
}); });
// Hide empty responsive tables /**
$('table.responsive > tbody').each(function() { * Replace responsive text
var items = $(this).children('tr'); */
if (items.length == 0) container.find('[data-responsive-text]').each(function() {
{ var $this = $(this),
$(this).parent('table:first').addClass('responsive-hide'); fullText = $this.text(),
responsiveText = $this.attr('data-responsive-text'),
responsive = false;
function check() {
if ($(window).width() > 700) {
if (!responsive) return;
$this.text(fullText);
responsive = false;
return;
} }
if (responsive) return;
$this.text(responsiveText);
responsive = true;
}
check();
$(window).resize(check);
}); });
}
/**
* Run onload functions
*/
(function($) {
$(document).ready(function() {
// Swap .nojs and .hasjs
$('#phpbb.nojs').toggleClass('nojs hasjs');
// Focus forms
$('form[data-focus]:first').each(function() {
$('#' + this.getAttribute('data-focus')).focus();
});
parse_document($('body'));
}); });
})(jQuery); })(jQuery);

View file

@ -42,6 +42,16 @@
<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 -->,<!-- ENDIF --> <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 -->,<!-- ENDIF -->
<!-- END subforum --> <!-- END subforum -->
<!-- ENDIF --> <!-- ENDIF -->
<!-- IF not S_IS_BOT -->
<div class="responsive-show" style="display: none;">
<!-- IF forumrow.CLICKS -->
{L_REDIRECTS}{L_COLON} <strong>{forumrow.CLICKS}</strong>
<!-- ELSEIF not forumrow.S_IS_LINK and forumrow.TOPICS -->
{L_TOPICS}{L_COLON} <strong>{forumrow.TOPICS}</strong>
<!-- ENDIF -->
</div>
<!-- ENDIF -->
</div> </div>
</dt> </dt>
<!-- IF forumrow.CLICKS --> <!-- IF forumrow.CLICKS -->

View file

@ -1,7 +1,7 @@
<!-- INCLUDE overall_header.html --> <!-- INCLUDE overall_header.html -->
<p class="{S_CONTENT_FLOW_END} responsive-center<!-- IF S_USER_LOGGED_IN --> rightside<!-- ENDIF -->"><!-- IF S_USER_LOGGED_IN -->{LAST_VISIT_DATE}<!-- ELSE -->{CURRENT_TIME}<!-- ENDIF --></p> <p class="{S_CONTENT_FLOW_END} responsive-center<!-- IF S_USER_LOGGED_IN --> rightside<!-- ENDIF -->"><!-- IF S_USER_LOGGED_IN -->{LAST_VISIT_DATE}<!-- ELSE -->{CURRENT_TIME}<!-- ENDIF --></p>
<!-- IF U_MCP --><p class="responsive-center">{CURRENT_TIME} <br />[&nbsp;<a href="{U_MCP}">{L_MCP}</a>&nbsp;]</p><!-- ELSEIF S_USER_LOGGED_IN --><p>{CURRENT_TIME}</p><!-- ENDIF --> <!-- IF U_MCP --><p class="responsive-center">{CURRENT_TIME} <br />[&nbsp;<a href="{U_MCP}">{L_MCP}</a>&nbsp;]</p><!-- ELSEIF S_USER_LOGGED_IN --><p class="responsive-center">{CURRENT_TIME}</p><!-- ENDIF -->
<!-- IF S_DISPLAY_SEARCH or (S_USER_LOGGED_IN and not S_IS_BOT) --> <!-- IF S_DISPLAY_SEARCH or (S_USER_LOGGED_IN and not S_IS_BOT) -->
<ul class="linklist bulletin"> <ul class="linklist bulletin">
@ -25,10 +25,10 @@
<form method="post" action="{S_LOGIN_ACTION}" class="headerspace"> <form method="post" action="{S_LOGIN_ACTION}" class="headerspace">
<h3><a href="{U_LOGIN_LOGOUT}">{L_LOGIN_LOGOUT}</a><!-- IF S_REGISTER_ENABLED -->&nbsp; &bull; &nbsp;<a href="{U_REGISTER}">{L_REGISTER}</a><!-- ENDIF --></h3> <h3><a href="{U_LOGIN_LOGOUT}">{L_LOGIN_LOGOUT}</a><!-- IF S_REGISTER_ENABLED -->&nbsp; &bull; &nbsp;<a href="{U_REGISTER}">{L_REGISTER}</a><!-- ENDIF --></h3>
<fieldset class="quick-login"> <fieldset class="quick-login">
<label for="username">{L_USERNAME}{L_COLON}</label>&nbsp;<input type="text" name="username" id="username" size="10" class="inputbox" title="{L_USERNAME}" /> <label for="username"><span>{L_USERNAME}{L_COLON}</span> <input type="text" name="username" id="username" size="10" class="inputbox" title="{L_USERNAME}" /></label>
<label for="password">{L_PASSWORD}{L_COLON}</label>&nbsp;<input type="password" name="password" id="password" size="10" class="inputbox" title="{L_PASSWORD}" /> <label for="password"><span>{L_PASSWORD}{L_COLON}</span> <input type="password" name="password" id="password" size="10" class="inputbox" title="{L_PASSWORD}" /></label>
<!-- IF S_AUTOLOGIN_ENABLED --> <!-- IF S_AUTOLOGIN_ENABLED -->
| <label for="autologin">{L_LOG_ME_IN} <input type="checkbox" name="autologin" id="autologin" /></label> <span class="responsive-hide">|</span> <label for="autologin">{L_LOG_ME_IN} <input type="checkbox" name="autologin" id="autologin" /></label>
<!-- ENDIF --> <!-- ENDIF -->
<input type="submit" name="login" value="{L_LOGIN}" class="button2" /> <input type="submit" name="login" value="{L_LOGIN}" class="button2" />
{S_LOGIN_REDIRECT} {S_LOGIN_REDIRECT}

View file

@ -63,7 +63,15 @@
</ul> </ul>
</div> </div>
<!-- ENDIF --> <!-- ENDIF -->
<!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF -->{L_POST_BY_AUTHOR} {topicrow.TOPIC_AUTHOR_FULL} &raquo; {topicrow.FIRST_POST_TIME} <div class="responsive-hide">
<!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF -->
{L_POST_BY_AUTHOR} {topicrow.TOPIC_AUTHOR_FULL} &raquo; {topicrow.FIRST_POST_TIME}
</div>
<div class="responsive-show" style="display: none;">
<!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF -->
{L_LAST_POST} {L_POST_BY_AUTHOR} {topicrow.LAST_POST_AUTHOR_FULL} &laquo; {topicrow.LAST_POST_TIME}<br />
{L_REPLIES}{L_COLON} <strong>{topicrow.REPLIES}</strong>
</div>
</div> </div>
</dt> </dt>

View file

@ -21,7 +21,7 @@
</dl> </dl>
</li> </li>
</ul> </ul>
<ul class="topiclist cplist missing-column"> <ul class="topiclist cplist missing-column responsive-show-all">
<!-- BEGIN unapproved --> <!-- BEGIN unapproved -->
<li class="row<!-- IF unapproved.S_ROW_COUNT is odd --> bg1<!-- ELSE --> bg2<!-- ENDIF -->"> <li class="row<!-- IF unapproved.S_ROW_COUNT is odd --> bg1<!-- ELSE --> bg2<!-- ENDIF -->">
@ -75,7 +75,7 @@
</dl> </dl>
</li> </li>
</ul> </ul>
<ul class="topiclist cplist two-long-columns"> <ul class="topiclist cplist two-long-columns responsive-show-all">
<!-- BEGIN report --> <!-- BEGIN report -->
<li class="row<!-- IF report.S_ROW_COUNT is odd --> bg1<!-- ELSE --> bg2<!-- ENDIF -->"> <li class="row<!-- IF report.S_ROW_COUNT is odd --> bg1<!-- ELSE --> bg2<!-- ENDIF -->">
@ -116,7 +116,7 @@
</dl> </dl>
</li> </li>
</ul> </ul>
<ul class="topiclist cplist two-long-columns"> <ul class="topiclist cplist two-long-columns responsive-show-all">
<!-- BEGIN pm_report --> <!-- BEGIN pm_report -->
<li class="row<!-- IF pm_report.S_ROW_COUNT is odd --> bg1<!-- ELSE --> bg2<!-- ENDIF -->"> <li class="row<!-- IF pm_report.S_ROW_COUNT is odd --> bg1<!-- ELSE --> bg2<!-- ENDIF -->">

View file

@ -35,7 +35,7 @@
</dl> </dl>
</li> </li>
</ul> </ul>
<ul class="topiclist cplist missing-column"> <ul class="topiclist cplist missing-column responsive-show-all">
<!-- BEGIN postrow --> <!-- BEGIN postrow -->

View file

@ -48,6 +48,9 @@
<a href="{postrow.U_VIEW_DETAILS}" class="topictitle">{postrow.PM_SUBJECT}</a> {postrow.ATTACH_ICON_IMG}<br /> <a href="{postrow.U_VIEW_DETAILS}" class="topictitle">{postrow.PM_SUBJECT}</a> {postrow.ATTACH_ICON_IMG}<br />
<span>{L_MESSAGE_BY_AUTHOR} {postrow.PM_AUTHOR_FULL} &raquo; {postrow.PM_TIME}</span><br /> <span>{L_MESSAGE_BY_AUTHOR} {postrow.PM_AUTHOR_FULL} &raquo; {postrow.PM_TIME}</span><br />
<span>{L_MESSAGE_TO} {postrow.RECIPIENTS}</span> <span>{L_MESSAGE_TO} {postrow.RECIPIENTS}</span>
<div class="responsive-show" style="display: none;">
{L_REPORTER}{L_COLON} {postrow.REPORTER_FULL} &laquo; {postrow.REPORT_TIME}
</div>
</div> </div>
</dt> </dt>
<dd class="moderation"> <dd class="moderation">
@ -58,6 +61,10 @@
<div class="list-inner"> <div class="list-inner">
<a href="{postrow.U_VIEW_DETAILS}" class="topictitle">{postrow.POST_SUBJECT}</a> {postrow.ATTACH_ICON_IMG}<br /> <a href="{postrow.U_VIEW_DETAILS}" class="topictitle">{postrow.POST_SUBJECT}</a> {postrow.ATTACH_ICON_IMG}<br />
<span>{L_POSTED} {L_POST_BY_AUTHOR} {postrow.POST_AUTHOR_FULL} &raquo; {postrow.POST_TIME}</span> <span>{L_POSTED} {L_POST_BY_AUTHOR} {postrow.POST_AUTHOR_FULL} &raquo; {postrow.POST_TIME}</span>
<div class="responsive-show" style="display: none;">
{L_REPORTER}{L_COLON} {postrow.REPORTER_FULL} &laquo; {postrow.REPORT_TIME}<br />
<!-- IF postrow.U_VIEWFORUM -->{L_FORUM}{L_COLON} <a href="{postrow.U_VIEWFORUM}">{postrow.FORUM_NAME}</a><!-- ELSE -->{postrow.FORUM_NAME}<!-- ENDIF -->
</div>
</div> </div>
</dt> </dt>
<dd class="moderation"> <dd class="moderation">

View file

@ -5,7 +5,7 @@
<div class="navbar"> <div class="navbar">
<div class="inner"> <div class="inner">
<ul class="linklist leftside bulletin"> <ul class="linklist bulletin">
<li class="icon-home breadcrumbs"><!-- IF U_SITE_HOME --><span class="crumb"><a href="{U_SITE_HOME}">{L_SITE_HOME}</a> <strong>&#8249;</strong></span> <!-- ENDIF --><span class="crumb"><a href="{U_INDEX}" accesskey="h">{L_INDEX}</a></span> <li class="icon-home breadcrumbs"><!-- IF U_SITE_HOME --><span class="crumb"><a href="{U_SITE_HOME}">{L_SITE_HOME}</a> <strong>&#8249;</strong></span> <!-- ENDIF --><span class="crumb"><a href="{U_INDEX}" accesskey="h">{L_INDEX}</a></span>
<!-- EVENT overall_footer_breadcrumb_append --> <!-- EVENT overall_footer_breadcrumb_append -->
</li> </li>
@ -15,11 +15,9 @@
<!-- IF U_BOOKMARK_TOPIC --><li class="icon-bookmark"><a href="{U_BOOKMARK_TOPIC}" title="{L_BOOKMARK_TOPIC}" data-ajax="alt_text" data-alt-text="{S_BOOKMARK_TOGGLE}">{S_BOOKMARK_TOPIC}</a></li><!-- ENDIF --> <!-- IF U_BOOKMARK_TOPIC --><li class="icon-bookmark"><a href="{U_BOOKMARK_TOPIC}" title="{L_BOOKMARK_TOPIC}" data-ajax="alt_text" data-alt-text="{S_BOOKMARK_TOGGLE}">{S_BOOKMARK_TOPIC}</a></li><!-- ENDIF -->
<!-- IF U_BUMP_TOPIC --><li class="icon-bump"><a href="{U_BUMP_TOPIC}" title="{L_BUMP_TOPIC}" data-ajax="true">{L_BUMP_TOPIC}</a></li><!-- ENDIF --> <!-- IF U_BUMP_TOPIC --><li class="icon-bump"><a href="{U_BUMP_TOPIC}" title="{L_BUMP_TOPIC}" data-ajax="true">{L_BUMP_TOPIC}</a></li><!-- ENDIF -->
<!-- ENDIF --> <!-- ENDIF -->
</ul> <li class="rightside">{S_TIMEZONE}</li>
<ul class="linklist rightside bulletin"> <!-- IF not S_IS_BOT --><li class="rightside"><a href="{U_DELETE_COOKIES}" data-ajax="true" data-refresh="true">{L_DELETE_COOKIES}</a></li><!-- ENDIF -->
<!-- IF U_TEAM --><li><a href="{U_TEAM}">{L_THE_TEAM}</a><!-- ENDIF --> <!-- IF U_TEAM --><li class="rightside"><a href="{U_TEAM}">{L_THE_TEAM}</a><!-- ENDIF -->
<!-- IF not S_IS_BOT --><li><a href="{U_DELETE_COOKIES}" data-ajax="true" data-refresh="true">{L_DELETE_COOKIES}</a></li><!-- ENDIF -->
<li>{S_TIMEZONE}</li>
</ul> </ul>
</div> </div>

View file

@ -29,7 +29,7 @@
<!-- IF S_ALLOW_CDN --><link href="//fonts.googleapis.com/css?family=Open+Sans:600&amp;subset=latin,cyrillic-ext,latin-ext,cyrillic,greek-ext,greek,vietnamese" rel="stylesheet" type="text/css" media="screen, projection" /><!-- ENDIF --> <!-- IF S_ALLOW_CDN --><link href="//fonts.googleapis.com/css?family=Open+Sans:600&amp;subset=latin,cyrillic-ext,latin-ext,cyrillic,greek-ext,greek,vietnamese" rel="stylesheet" type="text/css" media="screen, projection" /><!-- ENDIF -->
<link href="{T_STYLESHEET_LINK}" rel="stylesheet" type="text/css" media="screen, projection" /> <link href="{T_STYLESHEET_LINK}" rel="stylesheet" type="text/css" media="screen, projection" />
<link href="{T_STYLESHEET_LANG_LINK}" rel="stylesheet" type="text/css" media="screen, projection" /> <link href="{T_STYLESHEET_LANG_LINK}" rel="stylesheet" type="text/css" media="screen, projection" />
<link href="{T_THEME_PATH}/responsive.css" rel="stylesheet" type="text/css" media="only screen and (max-width: 700px), only screen and (max-device-width: 700px)" /> <link href="{T_THEME_PATH}/responsive.css?assets_version={T_ASSETS_VERSION}" rel="stylesheet" type="text/css" media="only screen and (max-width: 700px), only screen and (max-device-width: 700px)" />
<!-- IF S_CONTENT_DIRECTION eq 'rtl' --> <!-- IF S_CONTENT_DIRECTION eq 'rtl' -->
<link href="{T_THEME_PATH}/bidi.css?assets_version={T_ASSETS_VERSION}" rel="stylesheet" type="text/css" media="screen, projection" /> <link href="{T_THEME_PATH}/bidi.css?assets_version={T_ASSETS_VERSION}" rel="stylesheet" type="text/css" media="screen, projection" />
@ -97,13 +97,14 @@
<!-- IF S_DISPLAY_SEARCH and not S_IN_SEARCH --><li class="responsive-search rightside" style="display: none;"><a href="{U_SEARCH}" title="{L_SEARCH_ADV_EXPLAIN}">{L_SEARCH}</a></li><!-- ENDIF --> <!-- IF S_DISPLAY_SEARCH and not S_IN_SEARCH --><li class="responsive-search rightside" style="display: none;"><a href="{U_SEARCH}" title="{L_SEARCH_ADV_EXPLAIN}">{L_SEARCH}</a></li><!-- ENDIF -->
</ul> </ul>
<ul class="linklist bulletin">
<!-- IF not S_IS_BOT and S_USER_LOGGED_IN --> <!-- IF not S_IS_BOT and S_USER_LOGGED_IN -->
<ul class="linklist leftside bulletin">
<!-- IF S_NOTIFICATIONS_DISPLAY --> <!-- IF S_NOTIFICATIONS_DISPLAY -->
<li class="icon-notification skip-responsive"> <li class="icon-notification" data-skip-responsive="true">
<a href="{U_VIEW_ALL_NOTIFICATIONS}" id="notification_list_button"><span>{L_NOTIFICATIONS} [</span><strong>{NOTIFICATIONS_COUNT}</strong><span>]</span></a> <a href="{U_VIEW_ALL_NOTIFICATIONS}" id="notification_list_button"><span>{L_NOTIFICATIONS} [</span><strong>{NOTIFICATIONS_COUNT}</strong><span>]</span></a>
<div id="notification_list" class="notification_list"> <div id="notification_list" class="dropdown notification_list">
<div class="pointer"><div class="pointer_inner"></div></div> <div class="pointer"><div class="pointer-inner"></div></div>
<div class="dropdown-contents">
<div class="header"> <div class="header">
{L_NOTIFICATIONS} {L_NOTIFICATIONS}
<span class="header_settings"><a href="{U_NOTIFICATION_SETTINGS}">{L_SETTINGS}</a></span> <span class="header_settings"><a href="{U_NOTIFICATION_SETTINGS}">{L_SETTINGS}</a></span>
@ -136,6 +137,7 @@
<a href="{U_VIEW_ALL_NOTIFICATIONS}"><span>{L_SEE_ALL}</span></a> <a href="{U_VIEW_ALL_NOTIFICATIONS}"><span>{L_SEE_ALL}</span></a>
</div> </div>
</div> </div>
</div>
</li> </li>
<!-- ENDIF --> <!-- ENDIF -->
<!-- IF S_DISPLAY_PM --> <!-- IF S_DISPLAY_PM -->
@ -152,18 +154,16 @@
<!-- IF U_RESTORE_PERMISSIONS --> <!-- IF U_RESTORE_PERMISSIONS -->
<li class="icon-restore-permissions"><a href="{U_RESTORE_PERMISSIONS}">{L_RESTORE_PERMISSIONS}</a></li> <li class="icon-restore-permissions"><a href="{U_RESTORE_PERMISSIONS}">{L_RESTORE_PERMISSIONS}</a></li>
<!-- ENDIF --> <!-- ENDIF -->
</ul>
<!-- ENDIF --> <!-- ENDIF -->
<ul class="linklist rightside<!-- IF S_IS_BOT or not S_USER_LOGGED_IN --> fullwidth<!-- ENDIF -->">
<!-- EVENT overall_header_navigation_prepend -->
<li class="icon-faq"><a href="{U_FAQ}" title="{L_FAQ_EXPLAIN}">{L_FAQ}</a></li>
<!-- IF not S_IS_BOT -->
<!-- IF S_DISPLAY_MEMBERLIST --><li class="icon-members"><a href="{U_MEMBERLIST}" title="{L_MEMBERLIST_EXPLAIN}">{L_MEMBERLIST}</a></li><!-- ENDIF -->
<!-- IF not S_USER_LOGGED_IN and S_REGISTER_ENABLED and not (S_SHOW_COPPA or S_REGISTRATION) --><li class="icon-register"><a href="{U_REGISTER}">{L_REGISTER}</a></li><!-- ENDIF -->
<li class="icon-logout"><a href="{U_LOGIN_LOGOUT}" title="{L_LOGIN_LOGOUT}" accesskey="x">{L_LOGIN_LOGOUT}</a></li>
<!-- ENDIF -->
<!-- EVENT overall_header_navigation_append --> <!-- EVENT overall_header_navigation_append -->
<!-- IF not S_IS_BOT -->
<li class="icon-logout rightside no-bulletin"><a href="{U_LOGIN_LOGOUT}" title="{L_LOGIN_LOGOUT}" accesskey="x">{L_LOGIN_LOGOUT}</a></li>
<!-- IF not S_USER_LOGGED_IN and S_REGISTER_ENABLED and not (S_SHOW_COPPA or S_REGISTRATION) --><li class="icon-register rightside no-bulletin"><a href="{U_REGISTER}">{L_REGISTER}</a></li><!-- ENDIF -->
<!-- IF S_DISPLAY_MEMBERLIST --><li class="icon-members rightside no-bulletin"><a href="{U_MEMBERLIST}" title="{L_MEMBERLIST_EXPLAIN}">{L_MEMBERLIST}</a></li><!-- ENDIF -->
<!-- ENDIF -->
<li class="icon-faq rightside no-bulletin"><a href="{U_FAQ}" title="{L_FAQ_EXPLAIN}">{L_FAQ}</a></li>
<!-- EVENT overall_header_navigation_prepend -->
</ul> </ul>
</div> </div>

View file

@ -12,7 +12,7 @@
<!-- IF S_ALLOW_CDN --><link href="//fonts.googleapis.com/css?family=Open+Sans:600&amp;subset=latin,cyrillic-ext,latin-ext,cyrillic,greek-ext,greek,vietnamese" rel="stylesheet" type="text/css" media="screen, projection" /><!-- ENDIF --> <!-- IF S_ALLOW_CDN --><link href="//fonts.googleapis.com/css?family=Open+Sans:600&amp;subset=latin,cyrillic-ext,latin-ext,cyrillic,greek-ext,greek,vietnamese" rel="stylesheet" type="text/css" media="screen, projection" /><!-- ENDIF -->
<link href="{T_STYLESHEET_LINK}" rel="stylesheet" type="text/css" media="screen, projection" /> <link href="{T_STYLESHEET_LINK}" rel="stylesheet" type="text/css" media="screen, projection" />
<link href="{T_STYLESHEET_LANG_LINK}" rel="stylesheet" type="text/css" media="screen, projection" /> <link href="{T_STYLESHEET_LANG_LINK}" rel="stylesheet" type="text/css" media="screen, projection" />
<link href="{T_THEME_PATH}/responsive.css" rel="stylesheet" type="text/css" media="only screen and (max-width: 700px), only screen and (max-device-width: 700px)" /> <link href="{T_THEME_PATH}/responsive.css?assets_version={T_ASSETS_VERSION}" rel="stylesheet" type="text/css" media="only screen and (max-width: 700px), only screen and (max-device-width: 700px)" />
<!-- IF S_CONTENT_DIRECTION eq 'rtl' --> <!-- IF S_CONTENT_DIRECTION eq 'rtl' -->
<link href="{T_THEME_PATH}/bidi.css?assets_version={T_ASSETS_VERSION}" rel="stylesheet" type="text/css" media="screen, projection" /> <link href="{T_THEME_PATH}/bidi.css?assets_version={T_ASSETS_VERSION}" rel="stylesheet" type="text/css" media="screen, projection" />

View file

@ -31,7 +31,7 @@
</dl> </dl>
</li> </li>
</ul> </ul>
<ul class="topiclist cplist"> <ul class="topiclist cplist responsive-show-columns">
<!-- BEGIN attachrow --> <!-- BEGIN attachrow -->
<li class="row<!-- IF attachrow.S_ROW_COUNT is odd --> bg1<!-- ELSE --> bg2<!-- ENDIF -->"> <li class="row<!-- IF attachrow.S_ROW_COUNT is odd --> bg1<!-- ELSE --> bg2<!-- ENDIF -->">

View file

@ -20,7 +20,7 @@
<dt>&nbsp;</dt> <dt>&nbsp;</dt>
<dd><input type="submit" name="submit" tabindex="6" value="{L_UCP_AUTH_LINK_LINK}" class="button1" /></dd> <dd><input type="submit" name="submit" tabindex="6" value="{L_UCP_AUTH_LINK_LINK}" class="button1" /></dd>
</dl> </dl>
<!-- ENDIF--> <!-- ENDIF -->
</fieldset> </fieldset>
{oauth.HIDDEN_FIELDS} {oauth.HIDDEN_FIELDS}
{S_HIDDEN_FIELDS} {S_HIDDEN_FIELDS}

View file

@ -214,7 +214,7 @@
</dl> </dl>
</li> </li>
</ul> </ul>
<ul class="topiclist cplist two-long-columns"> <ul class="topiclist cplist two-long-columns responsive-show-all">
<!-- BEGIN leader --> <!-- BEGIN leader -->
<li class="row<!-- IF attachrow.S_ROW_COUNT is odd --> bg1<!-- ELSE --> bg2<!-- ENDIF -->"> <li class="row<!-- IF attachrow.S_ROW_COUNT is odd --> bg1<!-- ELSE --> bg2<!-- ENDIF -->">

View file

@ -54,7 +54,15 @@
</ul> </ul>
</div> </div>
<!-- ENDIF --> <!-- ENDIF -->
<!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF -->{L_POST_BY_AUTHOR} {topicrow.TOPIC_AUTHOR_FULL} &raquo; {topicrow.FIRST_POST_TIME} <div class="responsive-hide">
<!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF -->
{L_POST_BY_AUTHOR} {topicrow.TOPIC_AUTHOR_FULL} &raquo; {topicrow.FIRST_POST_TIME}
</div>
<div class="responsive-show" style="display: none;">
<!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF -->
{L_LAST_POST} {L_POST_BY_AUTHOR} {topicrow.LAST_POST_AUTHOR_FULL} &laquo;
<a href="{topicrow.U_LAST_POST}">{topicrow.LAST_POST_TIME}</a>
</div>
</div> </div>
</dt> </dt>
<dd class="lastpost"><span><dfn>{L_LAST_POST} </dfn>{L_POST_BY_AUTHOR} {topicrow.LAST_POST_AUTHOR_FULL} <dd class="lastpost"><span><dfn>{L_LAST_POST} </dfn>{L_POST_BY_AUTHOR} {topicrow.LAST_POST_AUTHOR_FULL}

View file

@ -45,6 +45,10 @@
<!-- ELSEIF draftrow.S_LINK_FORUM -->{L_FORUM}{L_COLON} <a href="{draftrow.U_VIEW}">{draftrow.TITLE}</a> <!-- ELSEIF draftrow.S_LINK_FORUM -->{L_FORUM}{L_COLON} <a href="{draftrow.U_VIEW}">{draftrow.TITLE}</a>
<!-- ELSEIF S_PRIVMSGS --> <!-- ELSEIF S_PRIVMSGS -->
<!-- ELSE -->{L_NO_TOPIC_FORUM}<!-- ENDIF --> <!-- ELSE -->{L_NO_TOPIC_FORUM}<!-- ENDIF -->
<div class="responsive-show" style="display: none;">
{L_SAVE_DATE}{L_COLON} <strong>{draftrow.DATE}</strong><br />
<!-- IF draftrow.U_INSERT --><a href="{draftrow.U_INSERT}">{L_LOAD_DRAFT}</a> &bull; <!-- ENDIF --><a href="{draftrow.U_VIEW_EDIT}">{L_VIEW_EDIT}</a>
</div>
</div> </div>
</dt> </dt>
<dd class="info"><span>{draftrow.DATE}<br /><!-- IF draftrow.U_INSERT --><a href="{draftrow.U_INSERT}">{L_LOAD_DRAFT}</a> &bull; <!-- ENDIF --><a href="{draftrow.U_VIEW_EDIT}">{L_VIEW_EDIT}</a></span></dd> <dd class="info"><span>{draftrow.DATE}<br /><!-- IF draftrow.U_INSERT --><a href="{draftrow.U_INSERT}">{L_LOAD_DRAFT}</a> &bull; <!-- ENDIF --><a href="{draftrow.U_VIEW_EDIT}">{L_VIEW_EDIT}</a></span></dd>

View file

@ -31,7 +31,14 @@
</ul> </ul>
</div> </div>
<!-- ENDIF --> <!-- ENDIF -->
<!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF -->{L_POST_BY_AUTHOR} {topicrow.TOPIC_AUTHOR_FULL} &raquo; {topicrow.FIRST_POST_TIME} <div class="responsive-hide">
<!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF -->
{L_POST_BY_AUTHOR} {topicrow.TOPIC_AUTHOR_FULL} &raquo; {topicrow.FIRST_POST_TIME}
</div>
<div class="responsive-show" style="display: none;">
<!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF -->
{L_LAST_POST} {L_POST_BY_AUTHOR} {topicrow.LAST_POST_AUTHOR_FULL} &laquo; <a href="{topicrow.U_LAST_POST}">{topicrow.LAST_POST_TIME}</a>
</div>
</div> </div>
</dt> </dt>
<dd class="lastpost"><span>{L_LAST_POST} {L_POST_BY_AUTHOR} {topicrow.LAST_POST_AUTHOR_FULL} <dd class="lastpost"><span>{L_LAST_POST} {L_POST_BY_AUTHOR} {topicrow.LAST_POST_AUTHOR_FULL}

View file

@ -23,7 +23,17 @@
<!-- BEGIN forumrow --> <!-- BEGIN forumrow -->
<li class="row<!-- IF forumrow.S_ROW_COUNT is odd --> bg1<!-- ELSE --> bg2<!-- ENDIF -->"> <li class="row<!-- IF forumrow.S_ROW_COUNT is odd --> bg1<!-- ELSE --> bg2<!-- ENDIF -->">
<dl class="icon {forumrow.FORUM_IMG_STYLE}"> <dl class="icon {forumrow.FORUM_IMG_STYLE}">
<dt><div class="list-inner"><a href="{forumrow.U_VIEWFORUM}" class="forumtitle">{forumrow.FORUM_NAME}</a><br />{forumrow.FORUM_DESC}</div></dt> <dt>
<div class="list-inner">
<a href="{forumrow.U_VIEWFORUM}" class="forumtitle">{forumrow.FORUM_NAME}</a><br />
{forumrow.FORUM_DESC}
<!-- IF forumrow.LAST_POST_TIME -->
<div class="responsive-show" style="display: none;">
{L_LAST_POST} {L_POST_BY_AUTHOR} {forumrow.LAST_POST_AUTHOR_FULL} &laquo; <a href="{topicrow.U_LAST_POST}">{forumrow.LAST_POST_TIME}</a>
</div>
<!-- ENDIF -->
</div>
</dt>
<dd class="lastpost"><!-- IF forumrow.LAST_POST_TIME --><span><dfn>{L_LAST_POST} </dfn>{L_POST_BY_AUTHOR} {forumrow.LAST_POST_AUTHOR_FULL} <dd class="lastpost"><!-- IF forumrow.LAST_POST_TIME --><span><dfn>{L_LAST_POST} </dfn>{L_POST_BY_AUTHOR} {forumrow.LAST_POST_AUTHOR_FULL}
<a href="{topicrow.U_LAST_POST}">{LAST_POST_IMG}</a> <br />{forumrow.LAST_POST_TIME}</span> <a href="{topicrow.U_LAST_POST}">{LAST_POST_IMG}</a> <br />{forumrow.LAST_POST_TIME}</span>
<!-- ELSE -->{L_NO_POSTS}<br />&nbsp;<!-- ENDIF --> <!-- ELSE -->{L_NO_POSTS}<br />&nbsp;<!-- ENDIF -->
@ -79,7 +89,14 @@
</ul> </ul>
</div> </div>
<!-- ENDIF --> <!-- ENDIF -->
<!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF -->{L_POST_BY_AUTHOR} {topicrow.TOPIC_AUTHOR_FULL} &raquo; {topicrow.FIRST_POST_TIME} <div class="responsive-hide">
<!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF -->
{L_POST_BY_AUTHOR} {topicrow.TOPIC_AUTHOR_FULL} &raquo; {topicrow.FIRST_POST_TIME}
</div>
<div class="responsive-show" style="display: none;">
<!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF -->
{L_LAST_POST} {L_POST_BY_AUTHOR} {topicrow.LAST_POST_AUTHOR_FULL} &laquo; <a href="{topicrow.U_LAST_POST}">{topicrow.LAST_POST_TIME}</a>
</div>
</div> </div>
</dt> </dt>
<dd class="lastpost"><span><dfn>{L_LAST_POST} </dfn>{L_POST_BY_AUTHOR} {topicrow.LAST_POST_AUTHOR_FULL} <dd class="lastpost"><span><dfn>{L_LAST_POST} </dfn>{L_POST_BY_AUTHOR} {topicrow.LAST_POST_AUTHOR_FULL}

View file

@ -53,7 +53,7 @@
</dl> </dl>
</li> </li>
</ul> </ul>
<ul class="topiclist cplist pmlist <!-- IF S_SHOW_RECIPIENTS -->missing-column<!-- ELSE -->two-columns<!-- ENDIF -->"> <ul class="topiclist cplist pmlist responsive-show-all <!-- IF S_SHOW_RECIPIENTS -->missing-column<!-- ELSE -->two-columns<!-- ENDIF -->">
<!-- BEGIN messagerow --> <!-- BEGIN messagerow -->
<li class="row<!-- IF messagerow.S_ROW_COUNT is odd --> bg1<!-- ELSE --> bg2<!-- ENDIF --><!-- IF messagerow.PM_CLASS --> {messagerow.PM_CLASS}<!-- ENDIF -->"> <li class="row<!-- IF messagerow.S_ROW_COUNT is odd --> bg1<!-- ELSE --> bg2<!-- ENDIF --><!-- IF messagerow.PM_CLASS --> {messagerow.PM_CLASS}<!-- ENDIF -->">

Some files were not shown because too many files have changed in this diff Show more