Merge branch 'develop-ascraeus' of github.com:phpbb/phpbb into ticket/12407

* 'develop-ascraeus' of github.com:phpbb/phpbb: (424 commits)
  [ticket/12428] Use the database to store the original version number
  [ticket/12493] Add functional test
  [ticket/12493] Fix sql query for selection of users that have disabled PM
  [ticket/12513] Add asset include support to simple header/footer in ACP
  [ticket/12513] Add simple_header head event with support for CSS assets calls
  [ticket/12511] Add missing titles for profile fields in members group view
  [ticket/12428] Incorrect from version in database update log entry
  [ticket/12510] Convert & to & in build_url() when no params are stripped.
  [ticket/12402] CAPTCHA plugin migration fails to detect missing plugins
  [ticket/12440] Use a more generic approach for replacing the URL.
  [ticket/12507] Move the 'require' statement
  [ticket/12507] Add console command to purge the cache
  [ticket/12421] Rebase and enable tests
  [ticket/12421] Don't parse [attachment] tags if user can't view them
  [ticket/12325] Use \RecursiveDirectoryIterator
  [ticket/12325] Doc blocks
  [ticket/12440] Set browser URL to point to specific post when using view=unread
  [ticket/12357] Support routes in generate_smilies() function.
  [ticket/12459] Change language strings
  [ticket/12504] Use local variables where possible
  ...

Conflicts:
	phpBB/posting.php
This commit is contained in:
Marc Alexander 2014-05-08 18:43:46 +02:00
commit 8121f87f08
327 changed files with 10520 additions and 1946 deletions

8
.gitignore vendored
View file

@ -5,15 +5,13 @@
/phpBB/cache/*.php /phpBB/cache/*.php
/phpBB/cache/*.lock /phpBB/cache/*.lock
/phpBB/composer.phar /phpBB/composer.phar
/phpBB/config.php /phpBB/config*.php
/phpBB/config_dev.php
/phpBB/config_test.php
/phpBB/ext/* /phpBB/ext/*
/phpBB/files/* /phpBB/files/*
/phpBB/images/avatars/gallery/* /phpBB/images/avatars/gallery/*
/phpBB/images/avatars/upload/* /phpBB/images/avatars/upload/*
/phpBB/store/* /phpBB/store/*
/phpBB/vendor /phpBB/vendor
/tests/phpbb_unit_tests.sqlite2 /tests/phpbb_unit_tests.sqlite*
/tests/test_config.php /tests/test_config*.php
/tests/tmp/* /tests/tmp/*

View file

@ -14,23 +14,13 @@ services:
- redis-server - redis-server
install: install:
- sh -c "if [ '$DB' = 'mariadb' ]; then travis/setup-mariadb.sh; fi" - travis/setup-phpbb.sh $DB $TRAVIS_PHP_VERSION
- sh -c "if [ '$TRAVIS_PHP_VERSION' != 'hhvm' ]; then travis/setup-php-extensions.sh; fi"
- sh -c "if [ `php -r "echo (int) version_compare(PHP_VERSION, '5.3.19', '>=');"` = "1" ]; then travis/setup-webserver.sh; fi"
- cd phpBB
- php ../composer.phar install --dev --no-interaction --prefer-source
- cd ..
before_script: before_script:
- sh -c "if [ '$DB' = 'postgres' ]; then psql -c 'DROP DATABASE IF EXISTS phpbb_tests;' -U postgres; fi" - travis/setup-database.sh $DB $TRAVIS_PHP_VERSION
- sh -c "if [ '$DB' = 'postgres' ]; then psql -c 'create database phpbb_tests;' -U postgres; fi"
- sh -c "if [ '$TRAVIS_PHP_VERSION' = '5.3' -a '$DB' = 'mysql' ]; then mysql -e 'SET GLOBAL storage_engine=MyISAM;'; fi"
- sh -c "if [ '$DB' = 'mysql' -o '$DB' = 'mariadb' ]; then mysql -e 'create database IF NOT EXISTS phpbb_tests;'; fi"
script: script:
- cd build - travis/phing-sniff.sh $DB $TRAVIS_PHP_VERSION
- 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
- sh -c "if [ '$TRAVIS_PHP_VERSION' = '5.5' -a '$DB' = 'mysql' -a '$TRAVIS_PULL_REQUEST' != 'false' ]; then git-tools/commit-msg-hook-range.sh origin/$TRAVIS_BRANCH..FETCH_HEAD; fi" - sh -c "if [ '$TRAVIS_PHP_VERSION' = '5.5' -a '$DB' = 'mysql' -a '$TRAVIS_PULL_REQUEST' != 'false' ]; then git-tools/commit-msg-hook-range.sh origin/$TRAVIS_BRANCH..FETCH_HEAD; fi"
@ -40,3 +30,8 @@ matrix:
env: DB=mariadb env: DB=mariadb
- php: 5.4 - php: 5.4
env: DB=postgres env: DB=postgres
- php: 5.4
env: DB=sqlite3
allow_failures:
- php: hhvm
fast_finish: true

View file

@ -2,9 +2,9 @@
<project name="phpBB" description="The phpBB forum software" default="all" basedir="../"> <project name="phpBB" description="The phpBB forum software" default="all" basedir="../">
<!-- a few settings for the build --> <!-- a few settings for the build -->
<property name="newversion" value="3.1.0-b3-dev" /> <property name="newversion" value="3.1.0-b4-dev" />
<property name="prevversion" value="3.1.0-b2" /> <property name="prevversion" value="3.1.0-b3" />
<property name="olderversions" value="3.0.12, 3.1.0-a1, 3.1.0-a2, 3.1.0-a3, 3.1.0-b1" /> <property name="olderversions" value="3.0.12, 3.1.0-a1, 3.1.0-a2, 3.1.0-a3, 3.1.0-b1, 3.1.0-b2" />
<!-- no configuration should be needed beyond this point --> <!-- no configuration should be needed beyond this point -->
<property name="oldversions" value="${olderversions}, ${prevversion}" /> <property name="oldversions" value="${olderversions}, ${prevversion}" />
@ -141,6 +141,7 @@
<exec dir="build/old_versions" command="LC_ALL=C diff -crNEBwd release-${version} release-${newversion} > <exec dir="build/old_versions" command="LC_ALL=C diff -crNEBwd release-${version} release-${newversion} >
../new_version/patches/phpBB-${version}_to_${newversion}.patch" escape="false" /> ../new_version/patches/phpBB-${version}_to_${newversion}.patch" escape="false" />
<exec dir="build/old_versions" command="LC_ALL=C diff -qr release-${version} release-${newversion} | grep 'Only in release-${version}' > ../new_version/patches/phpBB-${version}_to_${newversion}.deleted" escape="false" />
</target> </target>
<target name="prepare-new-version"> <target name="prepare-new-version">
@ -273,6 +274,10 @@
<delete dir="${dir}/develop" /> <delete dir="${dir}/develop" />
<delete dir="${dir}/install/data" /> <delete dir="${dir}/install/data" />
<phingcall target="clean-vendor-dir">
<property name="dir" value="${dir}" />
</phingcall>
<echo msg="Setting permissions for checkout of ${revision} in ${dir}" /> <echo msg="Setting permissions for checkout of ${revision} in ${dir}" />
<!-- set permissions of all files to 644, directories to 755 --> <!-- set permissions of all files to 644, directories to 755 -->
<exec dir="${dir}" command="find . -type f|xargs chmod 644" escape="false" /> <exec dir="${dir}" command="find . -type f|xargs chmod 644" escape="false" />
@ -284,6 +289,91 @@
<chmod mode="0777" file="${dir}/images/avatars/upload" /> <chmod mode="0777" file="${dir}/images/avatars/upload" />
</target> </target>
<target name="clean-vendor-dir">
<!-- Delete unrelated files from vendor/, see PHPBB3-12390 -->
<delete dir="${dir}/vendor/lusitanian/oauth/examples" />
<delete dir="${dir}/vendor/lusitanian/oauth/tests" />
<delete file="${dir}/vendor/lusitanian/oauth/.gitignore" />
<delete file="${dir}/vendor/lusitanian/oauth/.travis.yml" />
<delete file="${dir}/vendor/lusitanian/oauth/phpunit.xml.dist" />
<delete file="${dir}/vendor/lusitanian/oauth/README.md" />
<delete dir="${dir}/vendor/psr/log/Psr/Log/Test" />
<delete file="${dir}/vendor/psr/log/.gitignore" />
<delete file="${dir}/vendor/psr/log/README.md" />
<delete dir="${dir}/vendor/symfony/config/Symfony/Component/Config/Tests" />
<delete file="${dir}/vendor/symfony/config/Symfony/Component/Config/.gitignore" />
<delete file="${dir}/vendor/symfony/config/Symfony/Component/Config/CHANGELOG.md" />
<delete file="${dir}/vendor/symfony/config/Symfony/Component/Config/README.md" />
<delete file="${dir}/vendor/symfony/config/Symfony/Component/Config/phpunit.xml.dist" />
<delete dir="${dir}/vendor/symfony/console/Symfony/Component/Console/Tests" />
<delete file="${dir}/vendor/symfony/console/Symfony/Component/Console/.gitignore" />
<delete file="${dir}/vendor/symfony/console/Symfony/Component/Console/CHANGELOG.md" />
<delete file="${dir}/vendor/symfony/console/Symfony/Component/Console/README.md" />
<delete file="${dir}/vendor/symfony/console/Symfony/Component/Console/phpunit.xml.dist" />
<delete dir="${dir}/vendor/symfony/debug/Symfony/Component/Debug/Tests" />
<delete file="${dir}/vendor/symfony/debug/Symfony/Component/Debug/.gitignore" />
<delete file="${dir}/vendor/symfony/debug/Symfony/Component/Debug/CHANGELOG.md" />
<delete file="${dir}/vendor/symfony/debug/Symfony/Component/Debug/README.md" />
<delete file="${dir}/vendor/symfony/debug/Symfony/Component/Debug/phpunit.xml.dist" />
<delete dir="${dir}/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests" />
<delete file="${dir}/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/.gitignore" />
<delete file="${dir}/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/CHANGELOG.md" />
<delete file="${dir}/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/README.md" />
<delete file="${dir}/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/phpunit.xml.dist" />
<delete dir="${dir}/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests" />
<delete file="${dir}/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/.gitignore" />
<delete file="${dir}/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/CHANGELOG.md" />
<delete file="${dir}/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/README.md" />
<delete file="${dir}/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/phpunit.xml.dist" />
<delete dir="${dir}/vendor/symfony/filesystem/Symfony/Component/Filesystem/Tests" />
<delete file="${dir}/vendor/symfony/filesystem/Symfony/Component/Filesystem/.gitignore" />
<delete file="${dir}/vendor/symfony/filesystem/Symfony/Component/Filesystem/CHANGELOG.md" />
<delete file="${dir}/vendor/symfony/filesystem/Symfony/Component/Filesystem/README.md" />
<delete file="${dir}/vendor/symfony/filesystem/Symfony/Component/Filesystem/phpunit.xml.dist" />
<delete dir="${dir}/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests" />
<delete file="${dir}/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/.gitignore" />
<delete file="${dir}/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/CHANGELOG.md" />
<delete file="${dir}/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/README.md" />
<delete file="${dir}/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/phpunit.xml.dist" />
<delete dir="${dir}/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Tests" />
<delete file="${dir}/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/.gitignore" />
<delete file="${dir}/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/CHANGELOG.md" />
<delete file="${dir}/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/README.md" />
<delete file="${dir}/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/phpunit.xml.dist" />
<delete dir="${dir}/vendor/symfony/routing/Symfony/Component/Routing/Tests" />
<delete file="${dir}/vendor/symfony/routing/Symfony/Component/Routing/.gitignore" />
<delete file="${dir}/vendor/symfony/routing/Symfony/Component/Routing/CHANGELOG.md" />
<delete file="${dir}/vendor/symfony/routing/Symfony/Component/Routing/README.md" />
<delete file="${dir}/vendor/symfony/routing/Symfony/Component/Routing/phpunit.xml.dist" />
<delete dir="${dir}/vendor/symfony/yaml/Symfony/Component/Yaml/Tests" />
<delete file="${dir}/vendor/symfony/yaml/Symfony/Component/Yaml/.gitignore" />
<delete file="${dir}/vendor/symfony/yaml/Symfony/Component/Yaml/CHANGELOG.md" />
<delete file="${dir}/vendor/symfony/yaml/Symfony/Component/Yaml/README.md" />
<delete file="${dir}/vendor/symfony/yaml/Symfony/Component/Yaml/phpunit.xml.dist" />
<delete dir="${dir}/vendor/twig/twig/doc" />
<delete dir="${dir}/vendor/twig/twig/ext" />
<delete dir="${dir}/vendor/twig/twig/test" />
<delete file="${dir}/vendor/twig/twig/.editorconfig" />
<delete file="${dir}/vendor/twig/twig/.gitignore" />
<delete file="${dir}/vendor/twig/twig/.travis.yml" />
<delete file="${dir}/vendor/twig/twig/AUTHORS" />
<delete file="${dir}/vendor/twig/twig/CHANGELOG" />
<delete file="${dir}/vendor/twig/twig/phpunit.xml.dist" />
<delete file="${dir}/vendor/twig/twig/README.markdown" />
</target>
<target name="clean-diff-dir"> <target name="clean-diff-dir">
<delete dir="${dir}/cache" /> <delete dir="${dir}/cache" />
<delete dir="${dir}/docs" /> <delete dir="${dir}/docs" />

View file

@ -312,4 +312,63 @@ class build_package
return $result; return $result;
} }
/**
* Collect the list of the deleted files from a list of deleted files and folders.
*
* @param string $deleted_filename The full path to a file containing the list of deleted files and directories
* @param string $package_name The name of the package
* @return array
*/
public function collect_deleted_files($deleted_filename, $package_name)
{
$result = array();
$file_contents = file($deleted_filename);
foreach ($file_contents as $filename)
{
$filename = trim($filename);
if (!$filename)
{
continue;
}
$filename = str_replace('Only in ' . $package_name, '', $filename);
$filename = ltrim($filename, '/');
if (substr($filename, 0, 1) == ':')
{
$replace = '';
}
else
{
$replace = '/';
}
$filename = str_replace(': ', $replace, $filename);
if (is_dir("{$this->locations['old_versions']}{$package_name}/{$filename}"))
{
$iterator = new \RecursiveIteratorIterator(
new \RecursiveDirectoryIterator(
"{$this->locations['old_versions']}{$package_name}/{$filename}",
\FilesystemIterator::UNIX_PATHS | \FilesystemIterator::SKIP_DOTS
),
\RecursiveIteratorIterator::LEAVES_ONLY
);
foreach ($iterator as $file_info)
{
$result[] = "{$filename}/{$iterator->getSubPathname()}";
}
}
else
{
$result[] = $filename;
}
}
return $result;
}
} }

View file

@ -41,6 +41,18 @@
</rule> </rule>
<rule ref="Squiz.Functions.FunctionDeclarationArgumentSpacing.SpacingAfterHint" /> <rule ref="Squiz.Functions.FunctionDeclarationArgumentSpacing.SpacingAfterHint" />
<!-- 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" />
<!-- The ?> closing tag MUST be omitted from files containing only PHP. --> <!-- The ?> closing tag MUST be omitted from files containing only PHP. -->
<rule ref="Zend.Files.ClosingTag" /> <rule ref="Zend.Files.ClosingTag" />

View file

@ -22,18 +22,6 @@
<!-- PHP keywords MUST be in lower case. --> <!-- PHP keywords MUST be in lower case. -->
<rule ref="Generic.PHP.LowerCaseKeyword" /> <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" />
<!-- Classes etc. MUST be namespaced --> <!-- Classes etc. MUST be namespaced -->
<rule ref="PSR1.Classes.ClassDeclaration.MissingNamespace" /> <rule ref="PSR1.Classes.ClassDeclaration.MissingNamespace" />

View file

@ -45,6 +45,10 @@ if (sizeof($package->old_packages))
$package->get('patch_directory') . '/phpBB-' . $dest_package_filename . $package->get('new_version_number') . '.patch', $package->get('patch_directory') . '/phpBB-' . $dest_package_filename . $package->get('new_version_number') . '.patch',
$_package_name $_package_name
); );
$diff_file_changes[$_package_name]['deleted'] = $package->collect_deleted_files(
$package->get('patch_directory') . '/phpBB-' . $dest_package_filename . $package->get('new_version_number') . '.deleted',
$_package_name
);
} }
// Now put those files determined within the correct directories // Now put those files determined within the correct directories
@ -292,6 +296,15 @@ $update_info = array(
$index_contents .= "\t'binary' => array(),\n"; $index_contents .= "\t'binary' => array(),\n";
} }
if (sizeof($file_contents['deleted']))
{
$index_contents .= "\t'deleted' => array(\n\t\t'" . implode("',\n\t\t'", $file_contents['deleted']) . "',\n\t),\n";
}
else
{
$index_contents .= "\t'deleted' => array(),\n";
}
$index_contents .= ");\n"; $index_contents .= ");\n";
$fp = fopen($dest_filename_dir . '/install/update/index.php', 'wt'); $fp = fopen($dest_filename_dir . '/install/update/index.php', 'wt');

View file

@ -26,12 +26,50 @@ RewriteRule ^(.*)$ app.php [QSA,L]
#Options +FollowSymLinks #Options +FollowSymLinks
</IfModule> </IfModule>
<Files "config.php"> # With Apache 2.4 the "Order, Deny" syntax has been deprecated and moved from
Order Allow,Deny # module mod_authz_host to a new module called mod_access_compat (which may be
Deny from All # disabled) and a new "Require" syntax has been introduced to mod_authz_host.
</Files> # We could just conditionally provide both versions, but unfortunately Apache
# does not explicitly tell us its version if the module mod_version is not
<Files "common.php"> # available. In this case, we check for the availability of module
Order Allow,Deny # mod_authz_core (which should be on 2.4 or higher only) as a best guess.
Deny from All <IfModule mod_version.c>
</Files> <IfVersion < 2.4>
<Files "config.php">
Order Allow,Deny
Deny from All
</Files>
<Files "common.php">
Order Allow,Deny
Deny from All
</Files>
</IfVersion>
<IfVersion >= 2.4>
<Files "config.php">
Require all denied
</Files>
<Files "common.php">
Require all denied
</Files>
</IfVersion>
</IfModule>
<IfModule !mod_version.c>
<IfModule !mod_authz_core.c>
<Files "config.php">
Order Allow,Deny
Deny from All
</Files>
<Files "common.php">
Order Allow,Deny
Deny from All
</Files>
</IfModule>
<IfModule mod_authz_core.c>
<Files "config.php">
Require all denied
</Files>
<Files "common.php">
Require all denied
</Files>
</IfModule>
</IfModule>

View file

@ -331,15 +331,15 @@
<fieldset class="tabulated"> <fieldset class="tabulated">
<legend>{L_TITLE}</legend> <legend>{L_TITLE}</legend>
<table class="table1 zebra-table"> <table class="table1 zebra-table fixed-width-table">
<thead> <thead>
<tr> <tr>
<th>{L_FILENAME}</th> <th>{L_FILENAME}</th>
<th>{L_FILEDATE}</th> <th style="width: 15%;">{L_FILEDATE}</th>
<th>{L_FILESIZE}</th> <th style="width: 15%;">{L_FILESIZE}</th>
<th>{L_ATTACH_POST_ID}</th> <th style="width: 15%;">{L_ATTACH_POST_ID}</th>
<th>{L_ATTACH_TO_POST}</th> <th style="width: 15%;">{L_ATTACH_TO_POST}</th>
<th>{L_DELETE}</th> <th style="width: 15%;">{L_DELETE}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -348,7 +348,7 @@
<td><a href="{orphan.U_FILE}">{orphan.REAL_FILENAME}</a></td> <td><a href="{orphan.U_FILE}">{orphan.REAL_FILENAME}</a></td>
<td>{orphan.FILETIME}</td> <td>{orphan.FILETIME}</td>
<td>{orphan.FILESIZE}</td> <td>{orphan.FILESIZE}</td>
<td><strong>{L_ATTACH_ID}{L_COLON} </strong><input type="number" name="post_id[{orphan.ATTACH_ID}]" size="7" maxlength="10" value="{orphan.POST_ID}" /></td> <td><strong>{L_ATTACH_ID}{L_COLON} </strong><input type="number" name="post_id[{orphan.ATTACH_ID}]" maxlength="10" value="{orphan.POST_ID}" style="width: 75%;" /></td>
<td><input type="checkbox" class="radio" name="add[{orphan.ATTACH_ID}]" /></td> <td><input type="checkbox" class="radio" name="add[{orphan.ATTACH_ID}]" /></td>
<td><input type="checkbox" class="radio" name="delete[{orphan.ATTACH_ID}]" /></td> <td><input type="checkbox" class="radio" name="delete[{orphan.ATTACH_ID}]" /></td>
</tr> </tr>
@ -378,7 +378,7 @@
<fieldset class="tabulated"> <fieldset class="tabulated">
<legend>{L_TITLE}</legend> <legend>{L_TITLE}</legend>
<div class="pagination"> <div class="pagination top-pagination">
<!-- IF .pagination or TOTAL_FILES --> <!-- IF .pagination or TOTAL_FILES -->
{L_NUMBER_FILES}{L_COLON} {TOTAL_FILES} &bull; {L_TOTAL_SIZE}{L_COLON} {TOTAL_SIZE} {L_NUMBER_FILES}{L_COLON} {TOTAL_FILES} &bull; {L_TOTAL_SIZE}{L_COLON} {TOTAL_SIZE}
<!-- IF .pagination --> <!-- IF .pagination -->
@ -389,13 +389,14 @@
<!-- ENDIF --> <!-- ENDIF -->
</div> </div>
<table class="table1 zebra-table"> <!-- IF .attachments -->
<table class="table1 zebra-table fixed-width-table">
<thead> <thead>
<tr> <tr>
<th>{L_FILENAME}</th> <th>{L_FILENAME}</th>
<th>{L_POSTED}</th> <th style="width: 15%;">{L_POSTED}</th>
<th>{L_FILESIZE}</th> <th style="width: 15%;" class="centered-text">{L_FILESIZE}</th>
<th>{L_DELETE}</th> <th style="width: 10%;" class="centered-text">{L_MARK}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -406,25 +407,19 @@
<!-- ELSE --><a href="{attachments.U_FILE}" style="font-weight: bold;">{attachments.REAL_FILENAME}</a><br /><!-- IF attachments.COMMENT -->{attachments.COMMENT}<br /><!-- ENDIF -->{attachments.L_DOWNLOAD_COUNT}<br />{L_TOPIC}{L_COLON} <a href="{attachments.U_VIEW_TOPIC}">{attachments.TOPIC_TITLE}</a><!-- ENDIF --> <!-- ELSE --><a href="{attachments.U_FILE}" style="font-weight: bold;">{attachments.REAL_FILENAME}</a><br /><!-- IF attachments.COMMENT -->{attachments.COMMENT}<br /><!-- ENDIF -->{attachments.L_DOWNLOAD_COUNT}<br />{L_TOPIC}{L_COLON} <a href="{attachments.U_VIEW_TOPIC}">{attachments.TOPIC_TITLE}</a><!-- ENDIF -->
</td> </td>
<td>{attachments.FILETIME}<br />{L_POST_BY_AUTHOR} {attachments.ATTACHMENT_POSTER}</td> <td>{attachments.FILETIME}<br />{L_POST_BY_AUTHOR} {attachments.ATTACHMENT_POSTER}</td>
<td>{attachments.FILESIZE}</td> <td class="centered-text">{attachments.FILESIZE}</td>
<td><input type="checkbox" class="radio" name="delete[{attachments.ATTACH_ID}]" /></td> <td class="centered-text"><input type="checkbox" class="radio" name="delete[{attachments.ATTACH_ID}]" /></td>
</tr> </tr>
<!-- END attachments --> <!-- END attachments -->
<tr class="row4">
<td colspan="3">&nbsp;</td>
<td class="small"><a href="#" onclick="marklist('attachments', 'delete', true); return false;">{L_MARK_ALL}</a> :: <a href="#" onclick="marklist('attachments', 'delete', false); return false;">{L_UNMARK_ALL}</a></td>
</tr>
</tbody> </tbody>
</table> </table>
<!-- ELSE -->
<div class="errorbox">
<p>{L_NO_ATTACHMENTS}</p>
</div>
<!-- ENDIF -->
<!-- IF TOTAL_FILES --> <!-- IF TOTAL_FILES -->
<fieldset class="display-options">
{L_DISPLAY_LOG}{L_COLON} &nbsp;{S_LIMIT_DAYS}&nbsp;{L_SORT_BY}{L_COLON} {S_SORT_KEY} {S_SORT_DIR}
<input class="button2" type="submit" value="{L_GO}" name="sort" />
</fieldset>
<hr />
<div class="pagination"> <div class="pagination">
{L_NUMBER_FILES}{L_COLON} {TOTAL_FILES} &bull; {L_TOTAL_SIZE}{L_COLON} {TOTAL_SIZE} {L_NUMBER_FILES}{L_COLON} {TOTAL_FILES} &bull; {L_TOTAL_SIZE}{L_COLON} {TOTAL_SIZE}
<!-- IF .pagination --> <!-- IF .pagination -->
@ -435,10 +430,22 @@
</div> </div>
<!-- ENDIF --> <!-- ENDIF -->
<p class="submit-buttons"> <fieldset class="display-options">
<input class="button1" type="submit" id="submit" name="submit" value="{L_SUBMIT}" />&nbsp; {L_DISPLAY_LOG}{L_COLON} &nbsp;{S_LIMIT_DAYS}&nbsp;{L_SORT_BY}{L_COLON} {S_SORT_KEY} {S_SORT_DIR}
<input class="button2" type="reset" id="reset" name="reset" value="{L_RESET}" /> <input class="button2" type="submit" value="{L_GO}" name="sort" />
</fieldset>
<hr />
<!-- IF .attachments -->
<fieldset class="quick">
<input class="button2" type="submit" name="submit" value="{L_DELETE_MARKED}" /><br />
<p class="small">
<a href="#" onclick="marklist('attachments', 'delete', true); return false;">{L_MARK_ALL}</a> &bull;
<a href="#" onclick="marklist('attachments', 'delete', false); return false;">{L_UNMARK_ALL}</a>
</p> </p>
</fieldset>
<!-- ENDIF -->
{S_FORM_TOKEN} {S_FORM_TOKEN}
</fieldset> </fieldset>
</form> </form>

View file

@ -13,7 +13,7 @@
</fieldset> </fieldset>
<!-- IF .pagination --> <!-- IF .pagination -->
<div class="pagination" style="float: right; margin: 15px 0 2px 0"> <div class="pagination top-pagination">
<!-- INCLUDE pagination.html --> <!-- INCLUDE pagination.html -->
</div> </div>
<!-- ENDIF --> <!-- ENDIF -->
@ -22,15 +22,15 @@
<div><br style="clear: both;" /></div> <div><br style="clear: both;" /></div>
<!-- IF .log --> <!-- IF .log -->
<table class="table1 zebra-table"> <table class="table1 zebra-table fixed-width-table">
<thead> <thead>
<tr> <tr>
<th>{L_USERNAME}</th> <th style="width: 15%;">{L_USERNAME}</th>
<th>{L_IP}</th> <th style="width: 15%;">{L_IP}</th>
<th>{L_TIME}</th> <th style="width: 20%;">{L_TIME}</th>
<th>{L_ACTION}</th> <th>{L_ACTION}</th>
<!-- IF S_CLEARLOGS --> <!-- IF S_CLEARLOGS -->
<th>{L_MARK}</th> <th style="width: 50px;">{L_MARK}</th>
<!-- ENDIF --> <!-- ENDIF -->
</tr> </tr>
</thead> </thead>

View file

@ -164,14 +164,14 @@
</div> </div>
<!-- IF .attach --> <!-- IF .attach -->
<table class="table1 zebra-table"> <table class="table1 zebra-table fixed-width-table">
<thead> <thead>
<tr> <tr>
<th>{L_FILENAME}</th> <th>{L_FILENAME}</th>
<th>{L_POST_TIME}</th> <th style="width: 20%;">{L_POST_TIME}</th>
<th>{L_FILESIZE}</th> <th style="width: 20%;">{L_FILESIZE}</th>
<th>{L_DOWNLOADS}</th> <th style="width: 20%;">{L_DOWNLOADS}</th>
<th>{L_MARK}</th> <th style="width: 50px;">{L_MARK}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>

View file

@ -5,9 +5,10 @@
</script> </script>
<form id="user_prefs" method="post" action="{U_ACTION}"> <form id="user_prefs" method="post" action="{U_ACTION}">
<!-- EVENT acp_users_prefs_prepend -->
<fieldset> <fieldset>
<legend>{L_UCP_PREFS_PERSONAL}</legend> <legend>{L_UCP_PREFS_PERSONAL}</legend>
<!-- EVENT acp_users_prefs_personal_prepend -->
<dl> <dl>
<dt><label for="viewemail">{L_SHOW_EMAIL}{L_COLON}</label></dt> <dt><label for="viewemail">{L_SHOW_EMAIL}{L_COLON}</label></dt>
<dd><label><input type="radio" class="radio" name="viewemail" value="1"<!-- IF VIEW_EMAIL --> id="viewemail" checked="checked"<!-- ENDIF --> /> {L_YES}</label> <dd><label><input type="radio" class="radio" name="viewemail" value="1"<!-- IF VIEW_EMAIL --> id="viewemail" checked="checked"<!-- ENDIF --> /> {L_YES}</label>
@ -53,10 +54,12 @@
<dd><select name="dateoptions" id="dateoptions" onchange="if(this.value=='custom'){phpbb.toggleDisplay('custom_date',1);}else{phpbb.toggleDisplay('custom_date',-1);} if (this.value == 'custom') { document.getElementById('dateformat').value = default_dateformat; } else { document.getElementById('dateformat').value = this.value; }">{S_DATEFORMAT_OPTIONS}</select></dd> <dd><select name="dateoptions" id="dateoptions" onchange="if(this.value=='custom'){phpbb.toggleDisplay('custom_date',1);}else{phpbb.toggleDisplay('custom_date',-1);} if (this.value == 'custom') { document.getElementById('dateformat').value = default_dateformat; } else { document.getElementById('dateformat').value = this.value; }">{S_DATEFORMAT_OPTIONS}</select></dd>
<dd><div id="custom_date"<!-- IF not S_CUSTOM_DATEFORMAT --> style="display:none;"<!-- ENDIF -->><input type="text" name="dateformat" id="dateformat" value="{DATE_FORMAT}" maxlength="30" /></div></dd> <dd><div id="custom_date"<!-- IF not S_CUSTOM_DATEFORMAT --> style="display:none;"<!-- ENDIF -->><input type="text" name="dateformat" id="dateformat" value="{DATE_FORMAT}" maxlength="30" /></div></dd>
</dl> </dl>
<!-- EVENT acp_users_prefs_personal_append -->
</fieldset> </fieldset>
<fieldset> <fieldset>
<legend>{L_UCP_PREFS_POST}</legend> <legend>{L_UCP_PREFS_POST}</legend>
<!-- EVENT acp_users_prefs_post_prepend -->
<dl> <dl>
<dt><label for="bbcode">{L_DEFAULT_BBCODE}{L_COLON}</label></dt> <dt><label for="bbcode">{L_DEFAULT_BBCODE}{L_COLON}</label></dt>
<dd><label><input type="radio" class="radio" name="bbcode" value="1"<!-- IF BBCODE --> id="bbcode" checked="checked"<!-- ENDIF --> /> {L_YES}</label> <dd><label><input type="radio" class="radio" name="bbcode" value="1"<!-- IF BBCODE --> id="bbcode" checked="checked"<!-- ENDIF --> /> {L_YES}</label>
@ -77,10 +80,12 @@
<dd><label><input type="radio" class="radio" name="notify" value="1"<!-- IF NOTIFY --> id="notify" checked="checked"<!-- ENDIF --> /> {L_YES}</label> <dd><label><input type="radio" class="radio" name="notify" value="1"<!-- IF NOTIFY --> id="notify" checked="checked"<!-- ENDIF --> /> {L_YES}</label>
<label><input type="radio" class="radio" name="notify" value="0"<!-- IF not NOTIFY --> id="notify" checked="checked"<!-- ENDIF --> /> {L_NO}</label></dd> <label><input type="radio" class="radio" name="notify" value="0"<!-- IF not NOTIFY --> id="notify" checked="checked"<!-- ENDIF --> /> {L_NO}</label></dd>
</dl> </dl>
<!-- EVENT acp_users_prefs_post_append -->
</fieldset> </fieldset>
<fieldset> <fieldset>
<legend>{L_UCP_PREFS_VIEW}</legend> <legend>{L_UCP_PREFS_VIEW}</legend>
<!-- EVENT acp_users_prefs_view_prepend -->
<dl> <dl>
<dt><label for="view_images">{L_VIEW_IMAGES}{L_COLON}</label></dt> <dt><label for="view_images">{L_VIEW_IMAGES}{L_COLON}</label></dt>
<dd><label><input type="radio" class="radio" name="view_images" value="1"<!-- IF VIEW_IMAGES --> id="view_images" checked="checked"<!-- ENDIF --> /> {L_YES}</label> <dd><label><input type="radio" class="radio" name="view_images" value="1"<!-- IF VIEW_IMAGES --> id="view_images" checked="checked"<!-- ENDIF --> /> {L_YES}</label>
@ -135,8 +140,9 @@
<dt><label>{L_VIEW_POSTS_DIR}{L_COLON}</label></dt> <dt><label>{L_VIEW_POSTS_DIR}{L_COLON}</label></dt>
<dd>{S_POST_SORT_DIR}</dd> <dd>{S_POST_SORT_DIR}</dd>
</dl> </dl>
<!-- EVENT acp_users_prefs_view_append -->
</fieldset> </fieldset>
<!-- EVENT acp_users_prefs_append -->
<fieldset class="quick"> <fieldset class="quick">
<input class="button1" type="submit" name="update" value="{L_SUBMIT}" /> <input class="button1" type="submit" name="update" value="{L_SUBMIT}" />
{S_FORM_TOKEN} {S_FORM_TOKEN}

View file

@ -102,6 +102,10 @@ hr {
height: 1px; height: 1px;
} }
.centered-text {
text-align: center;
}
.small { .small {
font-size: 0.85em; font-size: 0.85em;
} }
@ -907,6 +911,11 @@ table.styles td.users, table td.mark {
text-align: center; text-align: center;
} }
table.fixed-width-table {
table-layout: fixed;
word-break: break-word;
}
@media only screen and (max-width: 700px), only screen and (max-device-width: 700px) @media only screen and (max-width: 700px), only screen and (max-device-width: 700px)
{ {
table.responsive, table.responsive tbody, table.responsive tr, table.responsive td { table.responsive, table.responsive tbody, table.responsive tr, table.responsive td {
@ -1126,11 +1135,14 @@ input.langvalue, textarea.langvalue {
} }
optgroup, select { optgroup, select {
background-color: #FAFAFA;
border: 1px solid #666666;
font-family: Verdana, Helvetica, Arial, sans-serif; font-family: Verdana, Helvetica, Arial, sans-serif;
font-size: 0.85em; font-size: 0.85em;
font-weight: normal; font-weight: normal;
font-style: normal; font-style: normal;
cursor: pointer; cursor: pointer;
padding: 1px;
vertical-align: middle; vertical-align: middle;
width: auto; width: auto;
color: #000; color: #000;
@ -1238,7 +1250,7 @@ fieldset.display-options {
border: none; border: none;
background-color: transparent; background-color: transparent;
text-align: center; text-align: center;
font-size: 0.75em; font-size: 0.85em;
} }
fieldset.display-options select, fieldset.display-options input, fieldset.display-options label { fieldset.display-options select, fieldset.display-options input, fieldset.display-options label {
@ -1663,11 +1675,16 @@ input.button1:focus, input.button2:focus {
/* Pagination /* Pagination
---------------------------------------- */ ---------------------------------------- */
.pagination { .pagination {
font-size: .85em;
height: 1%; /* IE tweak (holly hack) */ height: 1%; /* IE tweak (holly hack) */
width: auto; width: auto;
text-align: right; text-align: right;
margin-top: 5px; margin-top: 5px;
}
.top-pagination {
float: right; float: right;
margin: 15px 0 2px 0;
} }
.rtl .pagination { .rtl .pagination {

View file

@ -21,6 +21,7 @@
<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>
<!-- EVENT acp_simple_footer_after --> <!-- EVENT acp_simple_footer_after -->
{$SCRIPTS}
</body> </body>
</html> </html>

View file

@ -83,6 +83,7 @@ function find_username(url)
// ]]> // ]]>
</script> </script>
<!-- EVENT acp_simple_header_head_append --> <!-- EVENT acp_simple_header_head_append -->
{$STYLESHEETS}
</head> </head>
<body class="{S_CONTENT_DIRECTION} {BODY_CLASS}"> <body class="{S_CONTENT_DIRECTION} {BODY_CLASS}">

View file

@ -26,6 +26,7 @@ phpbb.loadingIndicator = function() {
if (!loadingIndicator.is(':visible')) { if (!loadingIndicator.is(':visible')) {
loadingIndicator.fadeIn(phpbb.alertTime); loadingIndicator.fadeIn(phpbb.alertTime);
// Wait fifteen 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.
phpbb.clearLoadingTimeout();
phpbbAlertTimer = setTimeout(function() { phpbbAlertTimer = setTimeout(function() {
if (loadingIndicator.is(':visible')) { if (loadingIndicator.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'));
@ -248,7 +249,16 @@ phpbb.ajaxify = function(options) {
callback = options.callback, callback = options.callback,
overlay = (typeof options.overlay !== 'undefined') ? options.overlay : true, overlay = (typeof options.overlay !== 'undefined') ? options.overlay : true,
isForm = elements.is('form'), isForm = elements.is('form'),
eventName = isForm ? 'submit' : 'click'; isText = elements.is('input[type="text"], textarea'),
eventName;
if (isForm) {
eventName = 'submit';
} else if (isText) {
eventName = 'keyup';
} else {
eventName = 'click';
}
elements.bind(eventName, function(event) { elements.bind(eventName, function(event) {
var action, method, data, submit, that = this, $this = $(this); var action, method, data, submit, that = this, $this = $(this);
@ -315,7 +325,7 @@ phpbb.ajaxify = function(options) {
refresh = false; refresh = false;
} }
setTimeout(function() { phpbbAlertTimer = setTimeout(function() {
if (refresh) { if (refresh) {
window.location = res.REFRESH_DATA.url; window.location = res.REFRESH_DATA.url;
} }
@ -348,6 +358,7 @@ phpbb.ajaxify = function(options) {
// If the element is a form, POST must be used and some extra data must // If the element is a form, POST must be used and some extra data must
// be taken from the form. // be taken from the form.
var runFilter = (typeof options.filter === 'function'); var runFilter = (typeof options.filter === 'function');
var data = {};
if (isForm) { if (isForm) {
action = $this.attr('action').replace('&amp;', '&'); action = $this.attr('action').replace('&amp;', '&');
@ -361,18 +372,18 @@ phpbb.ajaxify = function(options) {
value: submit.val() value: submit.val()
}); });
} }
} else if (isText) {
var name = ($this.attr('data-name') !== undefined) ? $this.attr('data-name') : this['name'];
action = $this.attr('data-url').replace('&amp;', '&');
data[name] = this.value;
method = 'POST';
} else { } else {
action = this.href; action = this.href;
data = null; data = null;
method = 'GET'; method = 'GET';
} }
// If filter function returns false, cancel the AJAX functionality, var sendRequest = function() {
// and return true (meaning that the HTTP request will be sent normally).
if (runFilter && !options.filter.call(this, data)) {
return;
}
if (overlay && (typeof $this.attr('data-overlay') === 'undefined' || $this.attr('data-overlay') === 'true')) { if (overlay && (typeof $this.attr('data-overlay') === 'undefined' || $this.attr('data-overlay') === 'true')) {
phpbb.loadingIndicator(); phpbb.loadingIndicator();
} }
@ -387,7 +398,15 @@ phpbb.ajaxify = function(options) {
request.always(function() { request.always(function() {
loadingIndicator.fadeOut(phpbb.alertTime); loadingIndicator.fadeOut(phpbb.alertTime);
}); });
};
// If filter function returns false, cancel the AJAX functionality,
// and return true (meaning that the HTTP request will be sent normally).
if (runFilter && !options.filter.call(this, data, event, sendRequest)) {
return;
}
sendRequest();
event.preventDefault(); event.preventDefault();
}); });
@ -403,6 +422,346 @@ phpbb.ajaxify = function(options) {
return this; return this;
}; };
phpbb.search = {cache: {data: []}, tpl: [], container: []};
/**
* Get cached search data.
*
* @param string id Search ID.
* @return bool|object. Cached data object. Returns false if no data exists.
*/
phpbb.search.cache.get = function(id) {
if (this.data[id]) {
return this.data[id];
}
return false;
};
/**
* Set search cache data value.
*
* @param string id Search ID.
* @param string key Data key.
* @param string value Data value.
*
* @return undefined
*/
phpbb.search.cache.set = function(id, key, value) {
if (!this.data[id]) {
this.data[id] = {results: []};
}
this.data[id][key] = value;
};
/**
* Cache search result.
*
* @param string id Search ID.
* @param string keyword Keyword.
* @param array results Search results.
*
* @return undefined
*/
phpbb.search.cache.setResults = function(id, keyword, value) {
this.data[id]['results'][keyword] = value;
};
/**
* Trim spaces from keyword and lower its case.
*
* @param string keyword Search keyword to clean.
* @return string Cleaned string.
*/
phpbb.search.cleanKeyword = function(keyword) {
return $.trim(keyword).toLowerCase();
};
/**
* Get clean version of search keyword. If textarea supports several keywords
* (one per line), it fetches the current keyword based on the caret position.
*
* @param jQuery el Search input|textarea.
* @param string keyword Input|textarea value.
* @param bool multiline Whether textarea supports multiple search keywords.
*
* @return string Clean string.
*/
phpbb.search.getKeyword = function(el, keyword, multiline) {
if (multiline) {
var line = phpbb.search.getKeywordLine(el);
keyword = keyword.split("\n").splice(line, 1);
}
return phpbb.search.cleanKeyword(keyword);
};
/**
* Get the textarea line number on which the keyword resides - for textareas
* that support multiple keywords (one per line).
*
* @param jQuery el Search textarea.
* @return int
*/
phpbb.search.getKeywordLine = function (el) {
return el.val().substr(0, el.get(0).selectionStart).split("\n").length - 1;
};
/**
* Set the value on the input|textarea. If textarea supports multiple
* keywords, only the active keyword is replaced.
*
* @param jQuery el Search input|textarea.
* @param string value Value to set.
* @param bool multiline Whether textarea supports multiple search keywords.
*
* @return undefined
*/
phpbb.search.setValue = function(el, value, multiline) {
if (multiline) {
var line = phpbb.search.getKeywordLine(el),
lines = el.val().split("\n");
lines[line] = value;
value = lines.join("\n");
}
el.val(value);
};
/**
* Sets the onclick event to set the value on the input|textarea to the selected search result.
*
* @param jQuery el Search input|textarea.
* @param object value Result object.
* @param object container jQuery object for the search container.
*
* @return undefined
*/
phpbb.search.setValueOnClick = function(el, value, row, container) {
row.click(function() {
phpbb.search.setValue(el, value.result, el.attr('data-multiline'));
container.hide();
});
};
/**
* Runs before the AJAX search request is sent and determines whether
* there is a need to contact the server. If there are cached results
* already, those are displayed instead. Executes the AJAX request function
* itself due to the need to use a timeout to limit the number of requests.
*
* @param array data Data to be sent to the server.
* @param object event Onkeyup event object.
* @param function sendRequest Function to execute AJAX request.
*
* @return bool Returns false.
*/
phpbb.search.filter = function(data, event, sendRequest) {
var el = $(this),
dataName = (el.attr('data-name') !== undefined) ? el.attr('data-name') : el.attr('name'),
minLength = parseInt(el.attr('data-min-length')),
searchID = el.attr('data-results'),
keyword = phpbb.search.getKeyword(el, data[dataName], el.attr('data-multiline')),
cache = phpbb.search.cache.get(searchID),
proceed = true;
data[dataName] = keyword;
if (cache['timeout']) {
clearTimeout(cache['timeout']);
}
var timeout = setTimeout(function() {
// Check min length and existence of cache.
if (minLength > keyword.length) {
proceed = false;
} else if (cache['last_search']) {
// Has the keyword actually changed?
if (cache['last_search'] === keyword) {
proceed = false;
} else {
// Do we already have results for this?
if (cache['results'][keyword]) {
var response = {keyword: keyword, results: cache['results'][keyword]};
phpbb.search.handleResponse(response, el, true);
proceed = false;
}
// If the previous search didn't yield results and the string only had characters added to it,
// then we won't bother sending a request.
if (keyword.indexOf(cache['last_search']) === 0 && cache['results'][cache['last_search']].length === 0) {
phpbb.search.cache.set(searchID, 'last_search', keyword);
phpbb.search.cache.setResults(searchID, keyword, []);
proceed = false;
}
}
}
if (proceed) {
sendRequest.call(this);
}
}, 350);
phpbb.search.cache.set(searchID, 'timeout', timeout);
return false;
};
/**
* Handle search result response.
*
* @param object res Data received from server.
* @param jQuery el Search input|textarea.
* @param bool fromCache Whether the results are from the cache.
* @param function callback Optional callback to run when assigning each search result.
*
* @return undefined
*/
phpbb.search.handleResponse = function(res, el, fromCache, callback) {
if (typeof res !== 'object') {
return;
}
var searchID = el.attr('data-results'),
container = $(searchID);
if (this.cache.get(searchID)['callback']) {
callback = this.cache.get(searchID)['callback'];
} else if (typeof callback === 'function') {
this.cache.set(searchID, 'callback', callback);
}
if (!fromCache) {
this.cache.setResults(searchID, res.keyword, res.results);
}
this.cache.set(searchID, 'last_search', res.keyword);
this.showResults(res.results, el, container, callback);
};
/**
* Show search results.
*
* @param array results Search results.
* @param jQuery el Search input|textarea.
* @param jQuery container Search results container element.
* @param function callback Optional callback to run when assigning each search result.
*
* @return undefined
*/
phpbb.search.showResults = function(results, el, container, callback) {
var resultContainer = $('.search-results', container);
this.clearResults(resultContainer);
if (!results.length) {
container.hide();
return;
}
var searchID = container.attr('id'),
tpl,
row;
if (!this.tpl[searchID]) {
tpl = $('.search-result-tpl', container);
this.tpl[searchID] = tpl.clone().removeClass('search-result-tpl');
tpl.remove();
}
tpl = this.tpl[searchID];
$.each(results, function(i, item) {
row = tpl.clone();
row.find('.search-result').html(item.display);
if (typeof callback === 'function') {
callback.call(this, el, item, row, container);
}
row.appendTo(resultContainer).show();
});
container.show();
};
/**
* Clear search results.
*
* @param jQuery container Search results container.
* @return undefined
*/
phpbb.search.clearResults = function(container) {
container.children(':not(.search-result-tpl)').remove();
};
$('#phpbb').click(function(e) {
var target = $(e.target);
if (!target.is('.live-search') && !target.parents().is('.live-search')) {
$('.live-search').hide();
}
});
phpbb.history = {};
/**
* Check whether a method in the native history object is supported.
*
* @param string fn Method name.
* @return bool Returns true if the method is supported.
*/
phpbb.history.isSupported = function(fn) {
if (typeof history === 'undefined' || typeof history[fn] === 'undefined') {
return false;
}
return true;
};
/**
* Wrapper for the pushState and replaceState methods of the
* native history object.
*
* @param string mode Mode. Either push or replace.
* @param string url New URL.
* @param string title Optional page title.
* @patam object obj Optional state object.
*
* @return undefined
*/
phpbb.history.alterUrl = function(mode, url, title, obj) {
var fn = mode + 'State';
if (!url || !phpbb.history.isSupported(fn)) {
return;
}
if (!title) {
title = document.title;
}
if (!obj) {
obj = null;
}
history[fn](obj, title, url);
};
/**
* Wrapper for the native history.replaceState method.
*
* @param string url New URL.
* @param string title Optional page title.
* @patam object obj Optional state object.
*
* @return undefined
*/
phpbb.history.replaceUrl = function(url, title, obj) {
phpbb.history.alterUrl('replace', url, title, obj);
};
/**
* Wrapper for the native history.pushState method.
*
* @param string url New URL.
* @param string title Optional page title.
* @patam object obj Optional state object.
*
* @return undefined
*/
phpbb.history.pushUrl = function(url, title, obj) {
phpbb.history.alterUrl('push', url, title, obj);
};
/** /**
* Hide the optgroups that are not the selected timezone * Hide the optgroups that are not the selected timezone
* *
@ -542,6 +901,12 @@ phpbb.addAjaxCallback = function(id, callback) {
return this; return this;
}; };
/**
* This callback handles live member searches.
*/
phpbb.addAjaxCallback('member_search', function(res) {
phpbb.search.handleResponse(res, $(this), false, phpbb.getFunctionByName('phpbb.search.setValueOnClick'));
});
/** /**
* This callback alternates text - it replaces the current text with the text in * This callback alternates text - it replaces the current text with the text in
@ -917,9 +1282,10 @@ phpbb.toggleDropdown = function() {
// Check dimensions when showing dropdown // Check dimensions when showing dropdown
// !visible because variable shows state of dropdown before it was toggled // !visible because variable shows state of dropdown before it was toggled
if (!visible) { if (!visible) {
var windowWidth = $(window).width();
options.dropdown.find('.dropdown-contents').each(function() { options.dropdown.find('.dropdown-contents').each(function() {
var $this = $(this), var $this = $(this);
windowWidth = $(window).width();
$this.css({ $this.css({
marginLeft: 0, marginLeft: 0,
@ -937,6 +1303,13 @@ phpbb.toggleDropdown = function() {
$this.css('margin-left', (windowWidth - offset - width - 2) + 'px'); $this.css('margin-left', (windowWidth - offset - width - 2) + 'px');
} }
}); });
var freeSpace = parent.offset().left - 4;
if (direction == 'left') {
options.dropdown.css('margin-left', '-' + freeSpace + 'px');
} else {
options.dropdown.css('margin-right', '-' + (windowWidth + freeSpace) + 'px');
}
} }
// Prevent event propagation // Prevent event propagation
@ -1102,6 +1475,24 @@ phpbb.toggleDisplay = function(id, action, type) {
$('#' + id).css('display', ((action === 1) ? type : 'none')); $('#' + id).css('display', ((action === 1) ? type : 'none'));
} }
/**
* Get function from name.
* Based on http://stackoverflow.com/a/359910
*
* @param string functionName Function to get.
* @return function
*/
phpbb.getFunctionByName = function (functionName) {
var namespaces = functionName.split('.'),
func = namespaces.pop(),
context = window;
for (var i = 0; i < namespaces.length; i++) {
context = context[namespaces[i]];
}
return context[func];
};
/** /**
* Apply code editor to all textarea elements with data-bbcode attribute * Apply code editor to all textarea elements with data-bbcode attribute
*/ */
@ -1121,6 +1512,10 @@ $(document).ready(function() {
$('#color_palette_placeholder').each(function() { $('#color_palette_placeholder').each(function() {
phpbb.registerPalette($(this)); phpbb.registerPalette($(this));
}); });
// Update browser history URL to point to specific post in viewtopic.php
// when using view=unread#unread link.
phpbb.history.replaceUrl($('#unread[data-url]').data('url'));
}); });
})(jQuery); // Avoid conflicts with other libraries })(jQuery); // Avoid conflicts with other libraries

View file

@ -21,7 +21,9 @@ require($phpbb_root_path . 'includes/startup.' . $phpEx);
require($phpbb_root_path . 'config.' . $phpEx); require($phpbb_root_path . 'config.' . $phpEx);
require($phpbb_root_path . 'includes/constants.' . $phpEx); require($phpbb_root_path . 'includes/constants.' . $phpEx);
require($phpbb_root_path . 'includes/functions.' . $phpEx); require($phpbb_root_path . 'includes/functions.' . $phpEx);
require($phpbb_root_path . 'includes/functions_admin.' . $phpEx);
require($phpbb_root_path . 'includes/functions_container.' . $phpEx); require($phpbb_root_path . 'includes/functions_container.' . $phpEx);
require($phpbb_root_path . 'includes/utf/utf_tools.' . $phpEx);
require($phpbb_root_path . 'phpbb/class_loader.' . $phpEx); require($phpbb_root_path . 'phpbb/class_loader.' . $phpEx);
$phpbb_class_loader = new \phpbb\class_loader('phpbb\\', "{$phpbb_root_path}phpbb/", $phpEx); $phpbb_class_loader = new \phpbb\class_loader('phpbb\\', "{$phpbb_root_path}phpbb/", $phpEx);
@ -30,6 +32,8 @@ $phpbb_class_loader_ext = new \phpbb\class_loader('\\', "{$phpbb_root_path}ext/"
$phpbb_class_loader_ext->register(); $phpbb_class_loader_ext->register();
$phpbb_container = phpbb_create_update_container($phpbb_root_path, $phpEx, "$phpbb_root_path/config"); $phpbb_container = phpbb_create_update_container($phpbb_root_path, $phpEx, "$phpbb_root_path/config");
$phpbb_container->get('request')->enable_super_globals();
require($phpbb_root_path . 'includes/compatibility_globals.' . $phpEx);
$application = new \phpbb\console\application('phpBB Console', PHPBB_VERSION); $application = new \phpbb\console\application('phpBB Console', PHPBB_VERSION);
$application->register_container_commands($phpbb_container); $application->register_container_commands($phpbb_container);

View file

@ -96,34 +96,7 @@ $phpbb_container = phpbb_create_default_container($phpbb_root_path, $phpEx);
$phpbb_class_loader->set_cache($phpbb_container->get('cache.driver')); $phpbb_class_loader->set_cache($phpbb_container->get('cache.driver'));
$phpbb_class_loader_ext->set_cache($phpbb_container->get('cache.driver')); $phpbb_class_loader_ext->set_cache($phpbb_container->get('cache.driver'));
// set up caching require($phpbb_root_path . 'includes/compatibility_globals.' . $phpEx);
$cache = $phpbb_container->get('cache');
// Instantiate some basic classes
$phpbb_dispatcher = $phpbb_container->get('dispatcher');
$request = $phpbb_container->get('request');
$user = $phpbb_container->get('user');
$auth = $phpbb_container->get('auth');
$db = $phpbb_container->get('dbal.conn');
// make sure request_var uses this request instance
request_var('', 0, false, false, $request); // "dependency injection" for a function
// Grab global variables, re-cache if necessary
$config = $phpbb_container->get('config');
set_config(null, null, null, $config);
set_config_count(null, null, null, $config);
$phpbb_log = $phpbb_container->get('log');
$symfony_request = $phpbb_container->get('symfony_request');
$phpbb_filesystem = $phpbb_container->get('filesystem');
$phpbb_path_helper = $phpbb_container->get('path_helper');
// load extensions
$phpbb_extension_manager = $phpbb_container->get('ext.manager');
$phpbb_subscriber_loader = $phpbb_container->get('event.subscriber_loader');
$template = $phpbb_container->get('template');
// Add own hook handler // Add own hook handler
require($phpbb_root_path . 'includes/hooks/index.' . $phpEx); require($phpbb_root_path . 'includes/hooks/index.' . $phpEx);
@ -151,6 +124,6 @@ if (!$config['use_system_cron'])
* please use the core.user_setup event instead! * please use the core.user_setup event instead!
* *
* @event core.common * @event core.common
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$phpbb_dispatcher->dispatch('core.common'); $phpbb_dispatcher->dispatch('core.common');

View file

@ -1,5 +1,8 @@
{ {
"minimum-stability": "beta", "_readme": [
"You MUST update the clean-vendor-dir target in build/build.xml",
"accordingly when adding or upgrading dependencies."
],
"require": { "require": {
"lusitanian/oauth": "0.2.*", "lusitanian/oauth": "0.2.*",
"symfony/config": "2.3.*", "symfony/config": "2.3.*",
@ -13,8 +16,8 @@
}, },
"require-dev": { "require-dev": {
"fabpot/goutte": "1.0.*", "fabpot/goutte": "1.0.*",
"phpunit/dbunit": "1.2.*", "phpunit/dbunit": "1.3.*",
"phpunit/phpunit": "3.7.*", "phpunit/phpunit": "4.1.*",
"phing/phing": "2.4.*", "phing/phing": "2.4.*",
"squizlabs/php_codesniffer": "1.*" "squizlabs/php_codesniffer": "1.*"
} }

623
phpBB/composer.lock generated

File diff suppressed because it is too large Load diff

View file

@ -1,4 +1,15 @@
services: services:
console.command.cache.purge:
class: phpbb\console\command\cache\purge
arguments:
- @cache.driver
- @dbal.conn
- @auth
- @log
- @user
tags:
- { name: console.command }
console.command.config.delete: console.command.config.delete:
class: phpbb\console\command\config\delete class: phpbb\console\command\config\delete
arguments: arguments:
@ -34,6 +45,18 @@ services:
tags: tags:
- { name: console.command } - { name: console.command }
console.command.db.migrate:
class: phpbb\console\command\db\migrate
arguments:
- @migrator
- @ext.manager
- @config
- @cache
- @log
- @user
tags:
- { name: console.command }
console.command.extension.disable: console.command.extension.disable:
class: phpbb\console\command\extension\disable class: phpbb\console\command\extension\disable
arguments: arguments:

View file

@ -4,6 +4,7 @@ services:
arguments: arguments:
- @auth - @auth
- @dbal.conn - @dbal.conn
- @dispatcher
- @request - @request
- @template - @template
- @profilefields.type_collection - @profilefields.type_collection

View file

@ -95,6 +95,7 @@ services:
- @user - @user
- @config - @config
- @controller.provider - @controller.provider
- @ext.manager
- %core.root_path% - %core.root_path%
- %core.php_ext% - %core.php_ext%
@ -107,8 +108,6 @@ services:
controller.provider: controller.provider:
class: phpbb\controller\provider class: phpbb\controller\provider
arguments:
- @ext.finder
calls: calls:
- [find, [%core.root_path%]] - [find, [%core.root_path%]]
@ -175,16 +174,6 @@ services:
- %core.php_ext% - %core.php_ext%
- @cache.driver - @cache.driver
ext.finder:
class: phpbb\extension\finder
arguments:
- @ext.manager
- @filesystem
- %core.root_path%
- @cache.driver
- %core.php_ext%
- _ext_finder
filesystem: filesystem:
class: phpbb\filesystem class: phpbb\filesystem
@ -217,7 +206,7 @@ services:
kernel_request_subscriber: kernel_request_subscriber:
class: phpbb\event\kernel_request_subscriber class: phpbb\event\kernel_request_subscriber
arguments: arguments:
- @ext.finder - @ext.manager
- %core.root_path% - %core.root_path%
- %core.php_ext% - %core.php_ext%
tags: tags:

View file

@ -376,6 +376,7 @@ function mass_auth($ug_type, $forum_id, $ug_id, $acl_list, $setting)
case 'mssql': case 'mssql':
case 'sqlite': case 'sqlite':
case 'sqlite3':
$sql = implode(' UNION ALL ', preg_replace('#^(.*?)$#', 'SELECT \1', $sql_subary)); $sql = implode(' UNION ALL ', preg_replace('#^(.*?)$#', 'SELECT \1', $sql_subary));
break; break;

View file

@ -70,6 +70,7 @@ foreach ($supported_dbms as $dbms)
case 'mysql_41': case 'mysql_41':
case 'firebird': case 'firebird':
case 'sqlite': case 'sqlite':
case 'sqlite3':
fwrite($fp, "# DO NOT EDIT THIS FILE, IT IS GENERATED\n"); fwrite($fp, "# DO NOT EDIT THIS FILE, IT IS GENERATED\n");
fwrite($fp, "#\n"); fwrite($fp, "#\n");
fwrite($fp, "# To change the contents of this file, edit\n"); fwrite($fp, "# To change the contents of this file, edit\n");

View file

@ -16,291 +16,28 @@ $phpbb_root_path = __DIR__ . '/../';
function usage() function usage()
{ {
echo "Usage: export_events_for_wiki.php COMMAND\n"; echo "Usage: export_events_for_wiki.php COMMAND [EXTENSION]\n";
echo "\n"; echo "\n";
echo "acp:\n"; echo "COMMAND:\n";
echo " Export all events for files in the acp style.\n"; echo " all:\n";
echo " Generate the complete wikipage for https://wiki.phpbb.com/Event_List\n";
echo "\n"; echo "\n";
echo "styles:\n"; echo " php:\n";
echo " Export all events for files in the prosilver and subsilver2 styles.\n"; echo " Generate the PHP event section of Event_List\n";
echo "\n";
echo " adm:\n";
echo " Generate the ACP Template event section of Event_List\n";
echo "\n";
echo " styles:\n";
echo " Generate the Styles Template event section of Event_List\n";
echo "\n";
echo "EXTENSION (Optional):\n";
echo " If not given, only core events will be exported.\n";
echo " Otherwise only events from the extension will be exported.\n";
echo "\n"; echo "\n";
echo "php:\n";
echo " Export all events for php-files.\n";
exit(2); 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 = $adm = 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/'));
}
if (strpos($file, 'adm/style/') === 0)
{
$adm[] = substr($file, strlen('adm/style/'));
}
}
if ($filter == 'acp')
{
echo implode(', ', $adm);
}
else
{
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;
$found_trigger_event = strpos($lines[$i], "phpbb_dispatcher->trigger_event('");
if ($found_trigger_event !== false)
{
$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, "'"));
$current_line = trim($lines[$event_line]);
$arguments = array();
$found_inline_array = strpos($current_line, "', compact(array('");
if ($found_inline_array !== false)
{
$varsarray = substr($current_line, $found_inline_array + strlen("', compact(array('"), -6);
$arguments = explode("', '", $varsarray);
}
if (empty($arguments))
{
// 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 . '"');
}
}
$found_dispatch = strpos($lines[$i], "phpbb_dispatcher->dispatch('");
if ($found_dispatch !== false)
{
$event_line = $i;
$event_name = $lines[$event_line];
$event_name = substr($event_name, $found_dispatch + 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 (substr($file_info->getFilename(), -4) == '.php')
{
$files[] = $file_info->getFilename();
}
}
return $files;
}
function validate_argument_count($arguments, $count) function validate_argument_count($arguments, $count)
{ {
if ($arguments <= $count) if ($arguments <= $count)
@ -312,19 +49,50 @@ function validate_argument_count($arguments, $count)
validate_argument_count($argc, 1); validate_argument_count($argc, 1);
$action = $argv[1]; $action = $argv[1];
$extension = isset($argv[2]) ? $argv[2] : null;
require __DIR__ . '/../phpbb/event/php_exporter.' . $phpEx;
require __DIR__ . '/../phpbb/event/md_exporter.' . $phpEx;
require __DIR__ . '/../phpbb/event/recursive_event_filter_iterator.' . $phpEx;
require __DIR__ . '/../phpbb/recursive_dot_prefix_filter_iterator.' . $phpEx;
switch ($action) switch ($action)
{ {
case 'acp': case 'all':
export_from_eventsmd($phpbb_root_path, 'acp'); echo '__FORCETOC__' . "\n";
break;
case 'styles':
export_from_eventsmd($phpbb_root_path, 'styles');
break;
case 'php': case 'php':
export_from_php($phpbb_root_path); $exporter = new \phpbb\event\php_exporter($phpbb_root_path, $extension);
$exporter->crawl_phpbb_directory_php();
echo $exporter->export_events_for_wiki();
if ($action === 'php')
{
break;
}
echo "\n";
// no break;
case 'styles':
$exporter = new \phpbb\event\md_exporter($phpbb_root_path, $extension);
$exporter->crawl_phpbb_directory_styles('docs/events.md');
echo $exporter->export_events_for_wiki();
if ($action === 'styles')
{
break;
}
echo "\n";
// no break;
case 'adm':
$exporter = new \phpbb\event\md_exporter($phpbb_root_path, $extension);
$exporter->crawl_phpbb_directory_adm('docs/events.md');
echo $exporter->export_events_for_wiki();
if ($action === 'all')
{
echo "\n" . '[[Category:Events and Listeners]]' . "\n";
}
break; break;
default: default:

View file

@ -26,6 +26,7 @@ phpBB Developers: bantu (Andreas Fischer)
dhruv.goel92 (Dhruv Goel) dhruv.goel92 (Dhruv Goel)
EXreaction (Nathan Guse) EXreaction (Nathan Guse)
imkingdavid (David King) imkingdavid (David King)
marc1706 (Marc Alexander)
nickvergessen (Joas Schilling) nickvergessen (Joas Schilling)
prototech (Cesar Gallegos) prototech (Cesar Gallegos)

View file

@ -46,6 +46,7 @@
<ol> <ol>
<li><a href="#changelog">Changelog</a> <li><a href="#changelog">Changelog</a>
<ol style="list-style-type: lower-roman;"> <ol style="list-style-type: lower-roman;">
<li><a href="#v310b2">Changes since 3.1.0-b2</a></li>
<li><a href="#v310b1">Changes since 3.1.0-b1</a></li> <li><a href="#v310b1">Changes since 3.1.0-b1</a></li>
<li><a href="#v310a3">Changes since 3.1.0-a3</a></li> <li><a href="#v310a3">Changes since 3.1.0-a3</a></li>
<li><a href="#v310a2">Changes since 3.1.0-a2</a></li> <li><a href="#v310a2">Changes since 3.1.0-a2</a></li>
@ -91,7 +92,172 @@
<div class="content"> <div class="content">
<a name="v310b1"></a><h3>1.i. Changes since 3.1.0-b1</h3> <a name="v310b2"></a><h3>1.i. Changes since 3.1.0-b2</h3>
<h4>Bug</h4>
<ul>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-7707">PHPBB3-7707</a>] - Missing occurrences of get_username_string</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-8323">PHPBB3-8323</a>] - Banned User (PMs and Mails)</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-8558">PHPBB3-8558</a>] - Board Emails not setting a correct email header</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-8700">PHPBB3-8700</a>] - Language file &quot;acp/styles.php&quot; contains many unused language entries</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-8960">PHPBB3-8960</a>] - Allow changing allow_avatar_remote when images/avatars/upload is not writable</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-10423">PHPBB3-10423</a>] - Searching for the term &quot;test *&quot; will highlight nearly every word and displays htmlspecialchars as htmlentities.</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-10687">PHPBB3-10687</a>] - UNABLE_GET_IMAGE_SIZE text misleading for remote avatars</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-10851">PHPBB3-10851</a>] - HTML files containing certain tags being rejected as possible attack vectors with &quot;Check attachment file&quot; set to &quot;No&quot;</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11098">PHPBB3-11098</a>] - New persistent login keys list should have (un)select all and order options.</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11339">PHPBB3-11339</a>] - Using AJAX calls one after another</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11352">PHPBB3-11352</a>] - Disapproving topic takes you to quick reply for that topic</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11431">PHPBB3-11431</a>] - All topic notifications are deleted if one reply is edited and needs to be approved</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11508">PHPBB3-11508</a>] - General error &quot;not allowed as quickmod&quot; when changing the forum while merging two topics</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11772">PHPBB3-11772</a>] - New topic notification triggered when editing an existing post with post-approval enabled</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11860">PHPBB3-11860</a>] - .htaccess not working for Apache 2.4</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11881">PHPBB3-11881</a>] - Timezone migration can take a long time</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11917">PHPBB3-11917</a>] - &quot;Manage external account&quot; shows when not activated</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11978">PHPBB3-11978</a>] - Text field for topic-search</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12004">PHPBB3-12004</a>] - Support empty routes to app.php/ in path_helper</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12012">PHPBB3-12012</a>] - DB Tools should correctly remove columns that are part of indexes</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12043">PHPBB3-12043</a>] - Sort Extensions by Name in ACP Ext Mgr</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12052">PHPBB3-12052</a>] - Post edited by user on moderation queue is not marked as unapproved.</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12083">PHPBB3-12083</a>] - &quot;Select all&quot; selects nothing in Webkit Browsers with only one character in [code] -</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12097">PHPBB3-12097</a>] - The validate_data() function doesn't work with class method</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12113">PHPBB3-12113</a>] - Deleting warnings does not use plurals correctly</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12121">PHPBB3-12121</a>] - Update process doesn't preserve total redirects for links</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12130">PHPBB3-12130</a>] - Bullet character disappears on mouse-over in IE8</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12186">PHPBB3-12186</a>] - MCP should open &quot;Reported posts&quot; instead of PM Reports</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12191">PHPBB3-12191</a>] - UCP should open with global settings instead of notification settings</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12193">PHPBB3-12193</a>] - Broken HTML when an SQL error occurs during migration</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12211">PHPBB3-12211</a>] - Attachment file names are run through htmlspecialchars twice</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12254">PHPBB3-12254</a>] - Language switching on Registration page doesn't work for Extensions</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12265">PHPBB3-12265</a>] - Contact profile fields icons should be hidden in a dropdown</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12286">PHPBB3-12286</a>] - Fix coding guidelines</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12331">PHPBB3-12331</a>] - Fix DB error in update_profile_field_data() with disabled fields</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12342">PHPBB3-12342</a>] - Javascript Bugs and Fixes</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12348">PHPBB3-12348</a>] - Make create_schema_files.php runnable when phpBB is not installed yet</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12350">PHPBB3-12350</a>] - tests/extension/modules_test.php can not be run alone</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12351">PHPBB3-12351</a>] - Ajax &quot;Mark topics read&quot; does not give feedback</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12353">PHPBB3-12353</a>] - User attachments in ACP are not displaying every attachment</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12354">PHPBB3-12354</a>] - passwords_manager_test::test_unique_id fails from time to time</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12355">PHPBB3-12355</a>] - Topic Tools not updated fully updated when subscribing/bookmarking</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12356">PHPBB3-12356</a>] - Plupload does not load in PM editor</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12358">PHPBB3-12358</a>] - data-refresh not working as expected for routes</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12359">PHPBB3-12359</a>] - Day and Month of Birthday Misaligned When Editing</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12360">PHPBB3-12360</a>] - User is displayed twice in online list after second login</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12362">PHPBB3-12362</a>] - Infinite loop in schema generator if dependency can't be resolved</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12367">PHPBB3-12367</a>] - Travis fails in phpbb_wrapper_gmgetdate_test::test_gmgetdate()</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12372">PHPBB3-12372</a>] - dE() function does not toggle in ACP</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12373">PHPBB3-12373</a>] - Add to/from forum ids to LOG_MOVE entries </li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12375">PHPBB3-12375</a>] - Attachment deletion broken after jQuery update</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12378">PHPBB3-12378</a>] - Prosilver common.css has duplicate entries</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12379">PHPBB3-12379</a>] - Plupload labels duplicated when responsive</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12380">PHPBB3-12380</a>] - “Remember Me” login keys are not sorted in UCP</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12381">PHPBB3-12381</a>] - Broken error message when selecting invalid DB driver</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12382">PHPBB3-12382</a>] - Template event listners can not access subloops when loop is defined in the original file</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12386">PHPBB3-12386</a>] - Add DEBUG_EXTRA again and use it for container creation</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12388">PHPBB3-12388</a>] - Log entries without log_data display language key instead of translated string</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12391">PHPBB3-12391</a>] - core.posting_modify_template_vars pass some variables to listeners</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12395">PHPBB3-12395</a>] - Pagination tests fail on travis with postgresql</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12397">PHPBB3-12397</a>] - db_tools::sql_unique_index_exists() has wrong doc block</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12398">PHPBB3-12398</a>] - Prune shadow topics tests fail due to wrong forum_last_post_id</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12405">PHPBB3-12405</a>] - create_user() in functional tests uses invalid timezone and no dateformat</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12406">PHPBB3-12406</a>] - Fix description of page_title var in core.viewtopic_modify_page_title</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12412">PHPBB3-12412</a>] - Styling issue with pagination numbering for smilies and icons</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12413">PHPBB3-12413</a>] - Fatal error &quot;Call to undefined method phpbb\feed\*::fetch_attachments()&quot; for topic based feeds</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12418">PHPBB3-12418</a>] - Notice displayed for feed.php </li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12422">PHPBB3-12422</a>] - Log searches error due to plural arrays in language files</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12429">PHPBB3-12429</a>] - Update phpunit to 3.8+</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12432">PHPBB3-12432</a>] - Migrator should not automatically revert custom functions defined in update_data()</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12436">PHPBB3-12436</a>] - Functional test framework's add_style() should not use sql_multi_insert()</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12444">PHPBB3-12444</a>] - The logs message aren't filled correctly when some values are missing.</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12455">PHPBB3-12455</a>] - Remove unused strings EXTENSION_CONTROLLER_MISSING and EXTENSION_CLASS_WRONG_TYPE from common.php</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12456">PHPBB3-12456</a>] - Missing new lines at the end of file in language files</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12467">PHPBB3-12467</a>] - Add config_*.php and tests_config_*.php to .gitignore</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12469">PHPBB3-12469</a>] - Convert Timezone test fails because of outdated schema</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12470">PHPBB3-12470</a>] - Move commands from .travis.yml to separate files to allow reuse</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12472">PHPBB3-12472</a>] - Set fast finish for .travis.yml</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12474">PHPBB3-12474</a>] - The console command for updating/migrating the db should display the error with the &lt;error&gt; tag</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12475">PHPBB3-12475</a>] - Undefined variable $log in db:migrate console command</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12477">PHPBB3-12477</a>] - PM link no longer displays in viewtopic</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12478">PHPBB3-12478</a>] - ucp_pm_viewmessage_contact_fields_before/after missing in PM page</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12480">PHPBB3-12480</a>] - \phpbb\extension\finder is finding too many routing files</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12482">PHPBB3-12482</a>] - Undefined variable: data in viewtopic when not logged in</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12485">PHPBB3-12485</a>] - Broken tests due to absolute exclude</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12494">PHPBB3-12494</a>] - Undefined index: user_type on viewtopic.php</li>
</ul>
<h4>Improvement</h4>
<ul>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-9758">PHPBB3-9758</a>] - Make users avatar available to the template</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-10521">PHPBB3-10521</a>] - Override Board Language via URL</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11962">PHPBB3-11962</a>] - Resize images to 100% with in viewtopic</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12150">PHPBB3-12150</a>] - Automatically prune shadow topics</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12201">PHPBB3-12201</a>] - Clean up ACP attachment management page</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12273">PHPBB3-12273</a>] - Add a test to run the event exporter on travis</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12282">PHPBB3-12282</a>] - Add an interface for dbal driver to ensure that functions are there</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12283">PHPBB3-12283</a>] - Online status on posting review page.</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12322">PHPBB3-12322</a>] - Add CSS classes for post-profile &lt;dd&gt; elements</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12323">PHPBB3-12323</a>] - Add Template Event search_results_author_prepend</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12327">PHPBB3-12327</a>] - Changing poll result-bars width from absolute % to relative</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12328">PHPBB3-12328</a>] - Add Template Event index_body_stat_blocks_after</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12329">PHPBB3-12329</a>] - Add &lt;div&gt; container to index blocks (online-list, birthday-list, statistics)</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12333">PHPBB3-12333</a>] - Add Template Event overall_header_page_body_before</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12335">PHPBB3-12335</a>] - Add Events to phpbb\profilefields\manager (grab &amp; show)</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12336">PHPBB3-12336</a>] - Add functions_module.php core events to allow adjusting parameters for custom ACP, MCP, UCP modules</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12337">PHPBB3-12337</a>] - Update jQuery to version 1.11.0</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12338">PHPBB3-12338</a>] - Add Template Event overall_footer_page_body_after</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12339">PHPBB3-12339</a>] - Add Event core.page_header_after</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12344">PHPBB3-12344</a>] - Add event to submit_pm()</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12345">PHPBB3-12345</a>] - Improve search flood interval message</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12346">PHPBB3-12346</a>] - Add Template Event overall_header_navlink_append/prepend</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12347">PHPBB3-12347</a>] - Move breadcrumb seperator from template to CSS</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12361">PHPBB3-12361</a>] - Replace the Google logo with the phpBB logo in the BBCode FAQ</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12364">PHPBB3-12364</a>] - Add template identifier var to all missing pages</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12365">PHPBB3-12365</a>] - Do not crop image attachment heights at 350px</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12366">PHPBB3-12366</a>] - Add Event core.search_get_posts_data</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12369">PHPBB3-12369</a>] - Add template variable for extensions to add classes to &lt;body&gt; element without JS</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12374">PHPBB3-12374</a>] - Add Template events index_body_block_&lt;blockname&gt;_append</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12376">PHPBB3-12376</a>] - Add template events viewtopic_body_polls</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12377">PHPBB3-12377</a>] - Move navbars to separate template files</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12389">PHPBB3-12389</a>] - Move &quot;print topic&quot; &amp; &quot;email topic&quot; icons (and PM versions) to topic tools</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12392">PHPBB3-12392</a>] - Include $profile_fields in core.memberlist_view_profile event</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12396">PHPBB3-12396</a>] - Add Template events viewforum_forum_name_append/prepend</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12400">PHPBB3-12400</a>] - Add viewforum.php core event to allow modifying topics data before display the page</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12401">PHPBB3-12401</a>] - Add $topic_data array to core.viewtopic_modify_post_row event in viewtopic.php</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12403">PHPBB3-12403</a>] - Add template events to acp_users_prefs.html</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12409">PHPBB3-12409</a>] - Add acp_users.php core events to modify users preferences data</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12410">PHPBB3-12410</a>] - Add Template events search_results_post_before/after</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12411">PHPBB3-12411</a>] - Expand dispatch vars of event: core.search_modify_tpl_ary</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12419">PHPBB3-12419</a>] - Improve font size in notifications drop-down</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12437">PHPBB3-12437</a>] - Clean up redundant &quot;clear&quot; elements &amp; &quot;corners&quot;</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12438">PHPBB3-12438</a>] - Add Template event memberlist_view_content_prepend</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12442">PHPBB3-12442</a>] - Add CSS classes to heading elements</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12473">PHPBB3-12473</a>] - Add console command for updating/migrating database</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12484">PHPBB3-12484</a>] - Template event ucp_agreement_terms_before/after</li>
</ul>
<h4>New Feature</h4>
<ul>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-9728">PHPBB3-9728</a>] - Support for sqlite version 3</li>
</ul>
<h4>Sub-task</h4>
<ul>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12349">PHPBB3-12349</a>] - License in migrations header not linking to version 2 of GNU GPL</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12370">PHPBB3-12370</a>] - Editing a post removes topic notifications</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12371">PHPBB3-12371</a>] - Notifications are incorrectly updated when a post is deleted or moved to ModerationQueue</li>
</ul>
<h4>Task</h4>
<ul>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12071">PHPBB3-12071</a>] - Test suite fails if Fileinfo isn't installed</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12199">PHPBB3-12199</a>] - Move deprecated functions to functions_compatibility.php</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12318">PHPBB3-12318</a>] - Correctly setup HHVM functional tests on Travis CI</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12320">PHPBB3-12320</a>] - No longer allow Travis CI HHVM environment to fail</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12341">PHPBB3-12341</a>] - Add tests for get_username_string()</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12390">PHPBB3-12390</a>] - Released packages MUST NOT contain vendor tests or other non-library code</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12417">PHPBB3-12417</a>] - hhvm-nightly 2014.04.16~precise breaks tests</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12423">PHPBB3-12423</a>] - Increase composer minimum-stability from beta to stable</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12424">PHPBB3-12424</a>] - Update Symfony Dependencies to latest 2.3 releaes</li>
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12458">PHPBB3-12458</a>] - Apply Squiz.WhiteSpace.SuperfluousWhitespace.* sniffs to legacy codebase</li>
</ul>
<a name="v310b1"></a><h3>1.ii. Changes since 3.1.0-b1</h3>
<h4>Bug</h4> <h4>Bug</h4>
<ul> <ul>
@ -159,7 +325,7 @@
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12302">PHPBB3-12302</a>] - Upgrade composer.phar to 1.0.0-alpha8</li> <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12302">PHPBB3-12302</a>] - Upgrade composer.phar to 1.0.0-alpha8</li>
</ul> </ul>
<a name="v310a3"></a><h3>1.ii. Changes since 3.1.0-a3</h3> <a name="v310a3"></a><h3>1.iii. Changes since 3.1.0-a3</h3>
<h4>Bug</h4> <h4>Bug</h4>
<ul> <ul>
@ -306,7 +472,7 @@
</ul> </ul>
<a name="v310a2"></a><h3>1.iii. Changes since 3.1.0-a2</h3> <a name="v310a2"></a><h3>1.iv. Changes since 3.1.0-a2</h3>
<h4>Bug</h4> <h4>Bug</h4>
<ul> <ul>
@ -414,7 +580,7 @@
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12147">PHPBB3-12147</a>] - Remove Travis CI notification configuration</li> <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12147">PHPBB3-12147</a>] - Remove Travis CI notification configuration</li>
</ul> </ul>
<a name="v310a1"></a><h3>1.iv. Changes since 3.1.0-a1</h3> <a name="v310a1"></a><h3>1.v. Changes since 3.1.0-a1</h3>
<h4>Bug</h4> <h4>Bug</h4>
<ul> <ul>
@ -490,7 +656,7 @@
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11998">PHPBB3-11998</a>] - Add console / command line client environment </li> <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11998">PHPBB3-11998</a>] - Add console / command line client environment </li>
</ul> </ul>
<a name="v30x"></a><h3>1.v. Changes since 3.0.x</h3> <a name="v30x"></a><h3>1.vi. Changes since 3.0.x</h3>
<h4>Bug</h4> <h4>Bug</h4>
<ul> <ul>
@ -1171,7 +1337,7 @@
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11913">PHPBB3-11913</a>] - Apply reorganisation of download.phpbb.com to build_announcement.php</li> <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11913">PHPBB3-11913</a>] - Apply reorganisation of download.phpbb.com to build_announcement.php</li>
</ul> </ul>
<a name="v3011"></a><h3>1.vi. Changes since 3.0.11</h3> <a name="v3011"></a><h3>1.vii. Changes since 3.0.11</h3>
<h4>Bug</h4> <h4>Bug</h4>
<ul> <ul>
@ -1326,7 +1492,7 @@
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11753">PHPBB3-11753</a>] - Upgrade mysql_upgrader.php schema data.</li> <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11753">PHPBB3-11753</a>] - Upgrade mysql_upgrader.php schema data.</li>
</ul> </ul>
<a name="v3010"></a><h3>1.vii. Changes since 3.0.10</h3> <a name="v3010"></a><h3>1.viii. Changes since 3.0.10</h3>
<h4>Bug</h4> <h4>Bug</h4>
<ul> <ul>
@ -1451,7 +1617,7 @@
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-10909">PHPBB3-10909</a>] - Update Travis Test Configuration: Travis no longer supports PHP 5.3.2</li> <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-10909">PHPBB3-10909</a>] - Update Travis Test Configuration: Travis no longer supports PHP 5.3.2</li>
</ul> </ul>
<a name="v309"></a><h3>1.viii. Changes since 3.0.9</h3> <a name="v309"></a><h3>1.ix. Changes since 3.0.9</h3>
<h4>Bug</h4> <h4>Bug</h4>
<ul> <ul>
@ -1587,7 +1753,7 @@
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-10480">PHPBB3-10480</a>] - Automate changelog building</li> <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-10480">PHPBB3-10480</a>] - Automate changelog building</li>
</ul> </ul>
<a name="v308"></a><h3>1.ix. Changes since 3.0.8</h3> <a name="v308"></a><h3>1.x. Changes since 3.0.8</h3>
<h4> Bug <h4> Bug
</h4> </h4>
@ -1955,7 +2121,7 @@
</ul> </ul>
<a name="v307-PL1"></a><h3>1.x. Changes since 3.0.7-PL1</h3> <a name="v307-PL1"></a><h3>1.xi. Changes since 3.0.7-PL1</h3>
<h4> Security <h4> Security
</h4> </h4>
<ul> <ul>
@ -2413,13 +2579,13 @@
</ul> </ul>
<a name="v307"></a><h3>1.xi. Changes since 3.0.7</h3> <a name="v307"></a><h3>1.xii. Changes since 3.0.7</h3>
<ul> <ul>
<li>[Sec] Do not expose forum content of forums with ACL entries but no actual permission in ATOM Feeds. (Bug #58595)</li> <li>[Sec] Do not expose forum content of forums with ACL entries but no actual permission in ATOM Feeds. (Bug #58595)</li>
</ul> </ul>
<a name="v306"></a><h3>1.xii. Changes since 3.0.6</h3> <a name="v306"></a><h3>1.xiii. Changes since 3.0.6</h3>
<ul> <ul>
<li>[Fix] Allow ban reason and length to be selected and copied in ACP and subsilver2 MCP. (Bug #51095)</li> <li>[Fix] Allow ban reason and length to be selected and copied in ACP and subsilver2 MCP. (Bug #51095)</li>
@ -2523,7 +2689,7 @@
</ul> </ul>
<a name="v305"></a><h3>1.xiii. Changes since 3.0.5</h3> <a name="v305"></a><h3>1.xiv. Changes since 3.0.5</h3>
<ul> <ul>
<li>[Fix] Allow whitespaces in avatar gallery names. (Bug #44955)</li> <li>[Fix] Allow whitespaces in avatar gallery names. (Bug #44955)</li>
@ -2745,7 +2911,7 @@
<li>[Feature] Send anonymous statistical information to phpBB on installation and update (optional).</li> <li>[Feature] Send anonymous statistical information to phpBB on installation and update (optional).</li>
</ul> </ul>
<a name="v304"></a><h3>1.xiv. Changes since 3.0.4</h3> <a name="v304"></a><h3>1.xv. Changes since 3.0.4</h3>
<ul> <ul>
<li>[Fix] Delete user entry from ban list table upon user deletion (Bug #40015 - Patch by TerraFrost)</li> <li>[Fix] Delete user entry from ban list table upon user deletion (Bug #40015 - Patch by TerraFrost)</li>
@ -2834,7 +3000,7 @@
<li>[Sec] Only use forum id supplied for posting if global announcement detected. (Reported by nickvergessen)</li> <li>[Sec] Only use forum id supplied for posting if global announcement detected. (Reported by nickvergessen)</li>
</ul> </ul>
<a name="v303"></a><h3>1.xv. Changes since 3.0.3</h3> <a name="v303"></a><h3>1.xvi. Changes since 3.0.3</h3>
<ul> <ul>
<li>[Fix] Allow mixed-case template directories to be inherited (Bug #36725)</li> <li>[Fix] Allow mixed-case template directories to be inherited (Bug #36725)</li>
@ -2866,7 +3032,7 @@
<li>[Sec] Ask for forum password if post within passworded forum quoted in private message. (Reported by nickvergessen)</li> <li>[Sec] Ask for forum password if post within passworded forum quoted in private message. (Reported by nickvergessen)</li>
</ul> </ul>
<a name="v302"></a><h3>1.xvi. Changes since 3.0.2</h3> <a name="v302"></a><h3>1.xvii. Changes since 3.0.2</h3>
<ul> <ul>
<li>[Fix] Correctly set topic starter if first post in topic removed (Bug #30575 - Patch by blueray2048)</li> <li>[Fix] Correctly set topic starter if first post in topic removed (Bug #30575 - Patch by blueray2048)</li>
@ -2965,7 +3131,7 @@
<li>[Sec Precaution] Stricter validation of the HTTP_HOST header (Thanks to Techie-Micheal et al for pointing out possible issues in derived code)</li> <li>[Sec Precaution] Stricter validation of the HTTP_HOST header (Thanks to Techie-Micheal et al for pointing out possible issues in derived code)</li>
</ul> </ul>
<a name="v301"></a><h3>1.xvii. Changes since 3.0.1</h3> <a name="v301"></a><h3>1.xviii. Changes since 3.0.1</h3>
<ul> <ul>
<li>[Fix] Ability to set permissions on non-mysql dbms (Bug #24955)</li> <li>[Fix] Ability to set permissions on non-mysql dbms (Bug #24955)</li>
@ -3013,7 +3179,7 @@
<li>[Sec] Only allow urls gone through redirect() being used within login_box(). (thanks nookieman)</li> <li>[Sec] Only allow urls gone through redirect() being used within login_box(). (thanks nookieman)</li>
</ul> </ul>
<a name="v300"></a><h3>1.xviii. Changes since 3.0.0</h3> <a name="v300"></a><h3>1.xix. Changes since 3.0.0</h3>
<ul> <ul>
<li>[Change] Validate birthdays (Bug #15004)</li> <li>[Change] Validate birthdays (Bug #15004)</li>
@ -3084,7 +3250,7 @@
<li>[Fix] Find and display colliding usernames correctly when converting from one database to another (Bug #23925)</li> <li>[Fix] Find and display colliding usernames correctly when converting from one database to another (Bug #23925)</li>
</ul> </ul>
<a name="v30rc8"></a><h3>1.xix. Changes since 3.0.RC8</h3> <a name="v30rc8"></a><h3>1.xx. Changes since 3.0.RC8</h3>
<ul> <ul>
<li>[Fix] Cleaned usernames contain only single spaces, so &quot;a_name&quot; and &quot;a__name&quot; are treated as the same name (Bug #15634)</li> <li>[Fix] Cleaned usernames contain only single spaces, so &quot;a_name&quot; and &quot;a__name&quot; are treated as the same name (Bug #15634)</li>
@ -3093,7 +3259,7 @@
<li>[Fix] Call garbage_collection() within database updater to correctly close connections (affects Oracle for example)</li> <li>[Fix] Call garbage_collection() within database updater to correctly close connections (affects Oracle for example)</li>
</ul> </ul>
<a name="v30rc7"></a><h3>1.xx. Changes since 3.0.RC7</h3> <a name="v30rc7"></a><h3>1.xxi. Changes since 3.0.RC7</h3>
<ul> <ul>
<li>[Fix] Fixed MSSQL related bug in the update system</li> <li>[Fix] Fixed MSSQL related bug in the update system</li>
@ -3128,7 +3294,7 @@
<li>[Fix] No duplication of active topics (Bug #15474)</li> <li>[Fix] No duplication of active topics (Bug #15474)</li>
</ul> </ul>
<a name="v30rc6"></a><h3>1.xxi. Changes since 3.0.RC6</h3> <a name="v30rc6"></a><h3>1.xxii. Changes since 3.0.RC6</h3>
<ul> <ul>
<li>[Fix] Submitting language changes using acp_language (Bug #14736)</li> <li>[Fix] Submitting language changes using acp_language (Bug #14736)</li>
@ -3138,7 +3304,7 @@
<li>[Fix] Able to request new password (Bug #14743)</li> <li>[Fix] Able to request new password (Bug #14743)</li>
</ul> </ul>
<a name="v30rc5"></a><h3>1.xxii. Changes since 3.0.RC5</h3> <a name="v30rc5"></a><h3>1.xxiii. Changes since 3.0.RC5</h3>
<ul> <ul>
<li>[Feature] Removing constant PHPBB_EMBEDDED in favor of using an exit_handler(); the constant was meant to achive this more or less.</li> <li>[Feature] Removing constant PHPBB_EMBEDDED in favor of using an exit_handler(); the constant was meant to achive this more or less.</li>
@ -3201,7 +3367,7 @@
<li>[Sec] New password hashing mechanism for storing passwords (#i42)</li> <li>[Sec] New password hashing mechanism for storing passwords (#i42)</li>
</ul> </ul>
<a name="v30rc4"></a><h3>1.xxiii. Changes since 3.0.RC4</h3> <a name="v30rc4"></a><h3>1.xxiv. Changes since 3.0.RC4</h3>
<ul> <ul>
<li>[Fix] MySQL, PostgreSQL and SQLite related database fixes (Bug #13862)</li> <li>[Fix] MySQL, PostgreSQL and SQLite related database fixes (Bug #13862)</li>
@ -3252,7 +3418,7 @@
<li>[Fix] odbc_autocommit causing existing result sets to be dropped (Bug #14182)</li> <li>[Fix] odbc_autocommit causing existing result sets to be dropped (Bug #14182)</li>
</ul> </ul>
<a name="v30rc3"></a><h3>1.xxiv. Changes since 3.0.RC3</h3> <a name="v30rc3"></a><h3>1.xxv. Changes since 3.0.RC3</h3>
<ul> <ul>
<li>[Fix] Fixing some subsilver2 and prosilver style issues</li> <li>[Fix] Fixing some subsilver2 and prosilver style issues</li>
@ -3361,7 +3527,7 @@
</ul> </ul>
<a name="v30rc2"></a><h3>1.xxv. Changes since 3.0.RC2</h3> <a name="v30rc2"></a><h3>1.xxvi. Changes since 3.0.RC2</h3>
<ul> <ul>
<li>[Fix] Re-allow searching within the memberlist</li> <li>[Fix] Re-allow searching within the memberlist</li>
@ -3407,7 +3573,7 @@
</ul> </ul>
<a name="v30rc1"></a><h3>1.xxvi. Changes since 3.0.RC1</h3> <a name="v30rc1"></a><h3>1.xxvii. Changes since 3.0.RC1</h3>
<ul> <ul>
<li>[Fix] (X)HTML issues within the templates (Bug #11255, #11255)</li> <li>[Fix] (X)HTML issues within the templates (Bug #11255, #11255)</li>

View file

@ -134,7 +134,8 @@
<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>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+</li>
<li>SQLite 3.6.15+</li>
<li>Firebird 2.1+</li> <li>Firebird 2.1+</li>
<li>MS SQL Server 2000 or above (directly or via ODBC or the native adapter)</li> <li>MS SQL Server 2000 or above (directly or via ODBC or the native adapter)</li>
<li>Oracle</li> <li>Oracle</li>

View file

@ -66,16 +66,64 @@ acp_simple_header_body_before
acp_simple_header_head_append acp_simple_header_head_append
=== ===
* Location: adm/style/overall_header.html * Location: adm/style/simple_header.html
* Since: 3.1.0-a1 * Since: 3.1.0-a1
* Purpose: Add assets within the `<head>` tags in the simple header of the ACP * 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_overview.html
* Since: 3.1.0-a1 * Since: 3.1.0-a1
* Purpose: Add options and settings on user overview page * Purpose: Add options and settings on user overview page
acp_users_prefs_append
===
* Location: adm/style/acp_users_prefs.html
* Since: 3.1.0-b3
* Purpose: Add user options fieldset to the bottom of ACP users prefs settings
acp_users_prefs_prepend
===
* Location: adm/style/acp_users_prefs.html
* Since: 3.1.0-b3
* Purpose: Add user options fieldset to the top of ACP users prefs settings
acp_users_prefs_personal_append
===
* Location: adm/style/acp_users_prefs.html
* Since: 3.1.0-b3
* Purpose: Add user options fieldset to the bottom of ACP users personal prefs settings
acp_users_prefs_personal_prepend
===
* Location: adm/style/acp_users_prefs.html
* Since: 3.1.0-b3
* Purpose: Add user options fieldset to the top of ACP users personal prefs settings
acp_users_prefs_post_append
===
* Location: adm/style/acp_users_prefs.html
* Since: 3.1.0-b3
* Purpose: Add user options fieldset to the bottom of ACP users post prefs settings
acp_users_prefs_post_prepend
===
* Location: adm/style/acp_users_prefs.html
* Since: 3.1.0-b3
* Purpose: Add user options fieldset to the top of ACP users post prefs settings
acp_users_prefs_view_append
===
* Location: adm/style/acp_users_prefs.html
* Since: 3.1.0-b3
* Purpose: Add user options fieldset to the bottom of ACP users view prefs settings
acp_users_prefs_view_prepend
===
* Location: adm/style/acp_users_prefs.html
* Since: 3.1.0-b3
* Purpose: Add user options fieldset to the top of ACP users view prefs settings
acp_users_signature_editor_buttons_after acp_users_signature_editor_buttons_after
=== ===
* Locations: * Locations:
@ -91,7 +139,7 @@ acp_users_signature_editor_buttons_before
* Purpose: Add content before BBCode posting buttons in the ACP user signature * Purpose: Add content before BBCode posting buttons in the ACP user signature
forumlist_body_category_header_after forumlist_body_category_header_after
==== ===
* 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
@ -99,7 +147,7 @@ forumlist_body_category_header_after
* Purpose: Add content after the header of the category on the forum list. * Purpose: Add content after the header of the category on the forum list.
forumlist_body_category_header_before forumlist_body_category_header_before
==== ===
* 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
@ -107,7 +155,7 @@ forumlist_body_category_header_before
* Purpose: Add content before the header of the category on the forum list. * Purpose: Add content before the header of the category on the forum list.
forumlist_body_last_post_title_prepend 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
@ -115,7 +163,7 @@ forumlist_body_last_post_title_prepend
* 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.
forumlist_body_subforums_after forumlist_body_subforums_after
==== ===
* 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
@ -123,7 +171,7 @@ forumlist_body_subforums_after
* Purpose: Add content after the list of subforums (if any) for each forum on the forum list. * Purpose: Add content after the list of subforums (if any) for each forum on the forum list.
forumlist_body_subforums_before forumlist_body_subforums_before
==== ===
* 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
@ -131,13 +179,61 @@ forumlist_body_subforums_before
* Purpose: Add content before the list of subforums (if any) for each forum on the forum list. * Purpose: Add content before the list of subforums (if any) for each forum on the forum list.
forumlist_body_last_row_after forumlist_body_last_row_after
==== ===
* 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-b2 * Since: 3.1.0-b2
* Purpose: Add content after the very last row of the forum list. * Purpose: Add content after the very last row of the forum list.
index_body_block_birthday_append
===
* Locations:
+ styles/prosilver/template/index_body.html
+ styles/subsilver2/template/index_body.html
* Since: 3.1.0-b3
* Purpose: Append content to the birthday list on the Board index
index_body_block_birthday_prepend
===
* Locations:
+ styles/prosilver/template/index_body.html
+ styles/subsilver2/template/index_body.html
* Since: 3.1.0-b3
* Purpose: Prepend content to the birthday list on the Board index
index_body_block_online_append
===
* Locations:
+ styles/prosilver/template/index_body.html
+ styles/subsilver2/template/index_body.html
* Since: 3.1.0-b3
* Purpose: Append content to the online list on the Board index
index_body_block_online_prepend
===
* Locations:
+ styles/prosilver/template/index_body.html
+ styles/subsilver2/template/index_body.html
* Since: 3.1.0-b3
* Purpose: Prepend content to the online list on the Board index
index_body_block_stats_append
===
* Locations:
+ styles/prosilver/template/index_body.html
+ styles/subsilver2/template/index_body.html
* Since: 3.1.0-b3
* Purpose: Append content to the statistics list on the Board index
index_body_block_stats_prepend
===
* Locations:
+ styles/prosilver/template/index_body.html
+ styles/subsilver2/template/index_body.html
* Since: 3.1.0-b3
* Purpose: Prepend content to the statistics list on the Board index
index_body_linklist_after index_body_linklist_after
=== ===
* Locations: * Locations:
@ -212,6 +308,14 @@ memberlist_view_content_append
* Since: 3.1.0-b2 * Since: 3.1.0-b2
* Purpose: Add custom content to the user profile view after the main content * Purpose: Add custom content to the user profile view after the main content
memberlist_view_content_prepend
===
* Locations:
+ styles/prosilver/template/memberlist_view.html
+ styles/subsilver2/template/memberlist_view.html
* Since: 3.1.0-b3
* Purpose: Add custom content to the user profile view before the main content
memberlist_view_user_statistics_after memberlist_view_user_statistics_after
=== ===
* Locations: * Locations:
@ -275,6 +379,38 @@ overall_footer_page_body_after
* Since: 3.1.0-b3 * Since: 3.1.0-b3
* Purpose: Add content after the page-body, but before the footer * Purpose: Add content after the page-body, but before the footer
overall_footer_teamlink_after
===
* Locations:
+ styles/prosilver/template/navbar_footer.html
+ styles/subsilver2/template/index_body.html
* Since: 3.1.0-b3
* Purpose: Add contents after the team-link in the footer
overall_footer_teamlink_before
===
* Locations:
+ styles/prosilver/template/navbar_footer.html
+ styles/subsilver2/template/index_body.html
* Since: 3.1.0-b3
* Purpose: Add contents before the team-link in the footer
overall_footer_timezone_after
===
* Locations:
+ styles/prosilver/template/navbar_footer.html
+ styles/subsilver2/template/breadcrumbs.html
* Since: 3.1.0-b3
* Purpose: Add content to the navbar in the page footer, after "Timezone"
overall_footer_timezone_before
===
* Locations:
+ styles/prosilver/template/navbar_footer.html
+ styles/subsilver2/template/breadcrumbs.html
* Since: 3.1.0-b3
* Purpose: Add content to the navbar in the page footer, before "Timezone"
overall_header_body_before overall_header_body_before
=== ===
* Locations: * Locations:
@ -323,6 +459,22 @@ overall_header_navigation_prepend
* Since: 3.1.0-a1 * 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
overall_header_navlink_append
===
* Locations:
+ styles/prosilver/template/navbar_header.html
+ styles/subsilver2/template/breadcrumbs.html
* Since: 3.1.0-b3
* Purpose: Add content after each individual navlink (breadcrumb)
overall_header_navlink_prepend
===
* Locations:
+ styles/prosilver/template/navbar_header.html
+ styles/subsilver2/template/breadcrumbs.html
* Since: 3.1.0-b3
* Purpose: Add content before each individual navlink (breadcrumb)
overall_header_page_body_before overall_header_page_body_before
=== ===
* Locations: * Locations:
@ -419,10 +571,41 @@ quickreply_editor_message_before
* Since: 3.1.0-a4 * Since: 3.1.0-a4
* Purpose: Add content before the quick reply textbox * Purpose: Add content before the quick reply textbox
search_results_post_after
===
* Locations:
+ styles/prosilver/template/search_results.html
+ styles/subsilver2/template/search_results.html
* Since: 3.1.0-b3
* Purpose: Add data after search result posts
search_results_post_before
===
* Locations:
+ styles/prosilver/template/search_results.html
+ styles/subsilver2/template/search_results.html
* Since: 3.1.0-b3
* Purpose: Add data before search result posts
search_results_postprofile_after
===
* Locations:
+ styles/prosilver/template/search_results.html
* Since: 3.1.0-b3
* Purpose: Add content after the post author and stats in search results (posts view mode)
search_results_postprofile_before
===
* Locations:
+ styles/prosilver/template/search_results.html
* Since: 3.1.0-b3
* Purpose: Add content directly before the post author in search results (posts view mode)
simple_footer_after simple_footer_after
=== ===
* Locations: * Locations:
+ styles/prosilver/template/simple_footer.html + styles/prosilver/template/simple_footer.html
+ styles/subsilver2/template/simple_footer.html
* Since: 3.1.0-a1 * 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
@ -434,6 +617,14 @@ simple_header_body_before
* Since: 3.1.0-b2 * Since: 3.1.0-b2
* Purpose: Add content to the header body * Purpose: Add content to the header body
simple_header_head_append
===
* Locations:
+ styles/prosilver/template/simple_header.html
+ styles/subsilver2/template/simple_header.html
* Since: 3.1.0-b4
* Purpose: Add asset calls directly before the `</head>` tag
topiclist_row_prepend topiclist_row_prepend
=== ===
* Locations: * Locations:
@ -454,6 +645,38 @@ topiclist_row_append
* Since: 3.1.0-a1 * 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_agreement_terms_after
===
* Locations:
+ styles/prosilver/template/ucp_agreement.html
+ styles/subsilver2/template/ucp_agreement.html
* Since: 3.1.0-b3
* Purpose: Add content after the terms of agreement text at user registration
ucp_agreement_terms_before
===
* Locations:
+ styles/prosilver/template/ucp_agreement.html
+ styles/subsilver2/template/ucp_agreement.html
* Since: 3.1.0-b3
* Purpose: Add content before the terms of agreement text at user registration
ucp_pm_viewmessage_contact_fields_after
===
* Locations:
+ styles/prosilver/template/ucp_pm_viewmessage.html
* Since: 3.1.0-b1
* Purpose: Add data after the contact fields on the user profile when viewing
a private message
ucp_pm_viewmessage_contact_fields_before
===
* Locations:
+ styles/prosilver/template/ucp_pm_viewmessage.html
* Since: 3.1.0-b1
* Purpose: Add data before the contact fields on the user profile when viewing
a private message
ucp_pm_viewmessage_custom_fields_after ucp_pm_viewmessage_custom_fields_after
=== ===
* Locations: * Locations:
@ -562,6 +785,22 @@ ucp_friend_list_after
* Since: 3.1.0-a4 * Since: 3.1.0-a4
* Purpose: Add optional elements after list of friends in UCP * Purpose: Add optional elements after list of friends in UCP
viewforum_forum_name_append
===
* Locations:
+ styles/prosilver/template/viewforum_body.html
+ styles/subsilver2/template/viewforum_body.html
* Since: 3.1.0-b3
* Purpose: Add content directly after the forum name link on the View forum screen
viewforum_forum_name_prepend
===
* Locations:
+ styles/prosilver/template/viewforum_body.html
+ styles/subsilver2/template/viewforum_body.html
* Since: 3.1.0-b3
* Purpose: Add content directly before the forum name link on the View forum screen
viewtopic_print_head_append viewtopic_print_head_append
=== ===
* Locations: * Locations:
@ -570,6 +809,22 @@ viewtopic_print_head_append
* Since: 3.1.0-a1 * 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_contact_fields_after
===
* Locations:
+ styles/prosilver/template/viewtopic_body.html
* Since: 3.1.0-b3
* Purpose: Add data after the contact fields on the user profile when viewing
a post
viewtopic_body_contact_fields_before
===
* Locations:
+ styles/prosilver/template/viewtopic_body.html
* Since: 3.1.0-b3
* Purpose: Add data before the contact fields on the user profile when viewing
a post
viewtopic_body_footer_before viewtopic_body_footer_before
=== ===
* Locations: * Locations:
@ -580,6 +835,40 @@ viewtopic_body_footer_before
and quick reply, directly before the jumpbox in Prosilver, breadcrumbs in and quick reply, directly before the jumpbox in Prosilver, breadcrumbs in
Subsilver2. Subsilver2.
viewtopic_body_poll_option_after
===
* Locations:
+ styles/prosilver/template/viewtopic_body.html
+ styles/subsilver2/template/viewtopic_body.html
* Since: 3.1.0-b3
* Purpose: Add content after the poll option
the list.
viewtopic_body_poll_option_before
===
* Locations:
+ styles/prosilver/template/viewtopic_body.html
+ styles/subsilver2/template/viewtopic_body.html
* Since: 3.1.0-b3
* Purpose: Add content before the poll option
the list.
viewtopic_body_poll_question_append
===
* Locations:
+ styles/prosilver/template/viewtopic_body.html
+ styles/subsilver2/template/viewtopic_body.html
* Since: 3.1.0-b3
* Purpose: Add content directly after the poll question on the View topic screen
viewtopic_body_poll_question_prepend
===
* Locations:
+ styles/prosilver/template/viewtopic_body.html
+ styles/subsilver2/template/viewtopic_body.html
* Since: 3.1.0-b3
* Purpose: Add content directly before the poll question on the View topic screen
viewtopic_body_post_buttons_after viewtopic_body_post_buttons_after
=== ===
* Locations: * Locations:
@ -656,6 +945,14 @@ viewtopic_body_topic_actions_before
* Since: 3.1.0-a4 * Since: 3.1.0-a4
* Purpose: Add data before the topic actions buttons (after the posts sorting options) * Purpose: Add data before the topic actions buttons (after the posts sorting options)
viewtopic_topic_title_append
===
* Locations:
+ styles/prosilver/template/viewtopic_body.html
+ styles/subsilver2/template/viewtopic_body.html
* Since: 3.1.0-b3
* Purpose: Add content directly after the topic title link on the View topic screen
viewtopic_topic_title_prepend viewtopic_topic_title_prepend
=== ===
* Locations: * Locations:

View file

@ -37,7 +37,7 @@ if (!empty($config['feed_http_auth']) && request_var('auth', '') == 'http')
} }
$auth->acl($user->data); $auth->acl($user->data);
$user->setup(); $user->setup('viewtopic');
// Initial var setup // Initial var setup
$forum_id = request_var('f', 0); $forum_id = request_var('f', 0);
@ -73,9 +73,6 @@ if ($feed === false)
trigger_error('NO_FEED'); trigger_error('NO_FEED');
} }
// Get attachments for this feed
$feed->fetch_attachments();
// Open Feed // Open Feed
$feed->open(); $feed->open();
@ -103,6 +100,8 @@ while ($row = $feed->get_item())
$published = ($feed->get('published') !== NULL) ? (int) $row[$feed->get('published')] : 0; $published = ($feed->get('published') !== NULL) ? (int) $row[$feed->get('published')] : 0;
$updated = ($feed->get('updated') !== NULL) ? (int) $row[$feed->get('updated')] : 0; $updated = ($feed->get('updated') !== NULL) ? (int) $row[$feed->get('updated')] : 0;
$display_attachments = ($auth->acl_get('u_download') && $auth->acl_get('f_download', $row['forum_id']) && isset($row['post_attachment']) && $row['post_attachment']) ? true : false;
$item_row = array( $item_row = array(
'author' => ($feed->get('creator') !== NULL) ? $row[$feed->get('creator')] : '', 'author' => ($feed->get('creator') !== NULL) ? $row[$feed->get('creator')] : '',
'published' => ($published > 0) ? $phpbb_feed_helper->format_date($published) : '', 'published' => ($published > 0) ? $phpbb_feed_helper->format_date($published) : '',
@ -111,7 +110,7 @@ while ($row = $feed->get_item())
'title' => censor_text($title), 'title' => censor_text($title),
'category' => ($config['feed_item_statistics'] && !empty($row['forum_id'])) ? $board_url . '/viewforum.' . $phpEx . '?f=' . $row['forum_id'] : '', 'category' => ($config['feed_item_statistics'] && !empty($row['forum_id'])) ? $board_url . '/viewforum.' . $phpEx . '?f=' . $row['forum_id'] : '',
'category_name' => ($config['feed_item_statistics'] && isset($row['forum_name'])) ? $row['forum_name'] : '', 'category_name' => ($config['feed_item_statistics'] && isset($row['forum_name'])) ? $row['forum_name'] : '',
'description' => censor_text($phpbb_feed_helper->generate_content($row[$feed->get('text')], $row[$feed->get('bbcode_uid')], $row[$feed->get('bitfield')], $options, $row['forum_id'], (($row['post_attachment']) ? $feed->attachments[$row['post_id']] : array()))), 'description' => censor_text($phpbb_feed_helper->generate_content($row[$feed->get('text')], $row[$feed->get('bbcode_uid')], $row[$feed->get('bitfield')], $options, $row['forum_id'], ($display_attachments ? $feed->get_attachments($row['post_id']) : array()))),
'statistics' => '', 'statistics' => '',
); );

View file

@ -147,7 +147,6 @@ class acp_attachments
'secure_allow_empty_referer' => array('lang' => 'SECURE_EMPTY_REFERRER', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true), 'secure_allow_empty_referer' => array('lang' => 'SECURE_EMPTY_REFERRER', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'check_attachment_content' => array('lang' => 'CHECK_CONTENT', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true), 'check_attachment_content' => array('lang' => 'CHECK_CONTENT', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'legend2' => $l_legend_cat_images, 'legend2' => $l_legend_cat_images,
'img_display_inlined' => array('lang' => 'DISPLAY_INLINED', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true), 'img_display_inlined' => array('lang' => 'DISPLAY_INLINED', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'img_create_thumbnail' => array('lang' => 'CREATE_THUMBNAIL', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true), 'img_create_thumbnail' => array('lang' => 'CREATE_THUMBNAIL', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
@ -1115,11 +1114,6 @@ class acp_attachments
if ($stats_error) if ($stats_error)
{ {
$error[] = $stats_error; $error[] = $stats_error;
// Show option to resync stats
$this->template->assign_vars(array(
'S_ACTION_OPTIONS' => $auth->acl_get('a_board'),
));
} }
$template->assign_vars(array( $template->assign_vars(array(
@ -1228,7 +1222,7 @@ class acp_attachments
'ATTACHMENT_POSTER' => get_username_string('full', (int) $row['poster_id'], (string) $row['username'], (string) $row['user_colour'], (string) $row['username']), 'ATTACHMENT_POSTER' => get_username_string('full', (int) $row['poster_id'], (string) $row['username'], (string) $row['user_colour'], (string) $row['username']),
'FILESIZE' => get_formatted_filesize((int) $row['filesize']), 'FILESIZE' => get_formatted_filesize((int) $row['filesize']),
'FILETIME' => $user->format_date((int) $row['filetime']), 'FILETIME' => $user->format_date((int) $row['filetime']),
'REAL_FILENAME' => (!$row['in_message']) ? utf8_wordwrap(utf8_basename((string) $row['real_filename']), 40, '<br />', true) : '', 'REAL_FILENAME' => (!$row['in_message']) ? utf8_basename((string) $row['real_filename']) : '',
'PHYSICAL_FILENAME' => utf8_basename((string) $row['physical_filename']), 'PHYSICAL_FILENAME' => utf8_basename((string) $row['physical_filename']),
'EXT_GROUP_NAME' => (!empty($extensions[$row['extension']]['group_name'])) ? $user->lang['EXT_GROUP_' . $extensions[$row['extension']]['group_name']] : '', 'EXT_GROUP_NAME' => (!empty($extensions[$row['extension']]['group_name'])) ? $user->lang['EXT_GROUP_' . $extensions[$row['extension']]['group_name']] : '',
'COMMENT' => $comment, 'COMMENT' => $comment,
@ -1321,7 +1315,15 @@ class acp_attachments
if (($num_files != $stats['num_files']) || ($total_size != $stats['upload_dir_size'])) if (($num_files != $stats['num_files']) || ($total_size != $stats['upload_dir_size']))
{ {
return $this->user->lang('FILES_STATS_WRONG', (int) $stats['num_files'], get_formatted_filesize($stats['upload_dir_size'])); $u_resync = $this->u_action . '&amp;action=stats';
return $this->user->lang(
'FILES_STATS_WRONG',
(int) $stats['num_files'],
get_formatted_filesize($stats['upload_dir_size']),
'<a href="' . $u_resync . '">',
'</a>'
);
} }
return false; return false;
} }

View file

@ -159,7 +159,16 @@ class acp_bbcodes
* submitting form when $warn_text is true * submitting form when $warn_text is true
* @since 3.1.0-a3 * @since 3.1.0-a3
*/ */
$vars = array('action', 'sql_ary', 'bbcode_id', 'display_on_posting', 'bbcode_match', 'bbcode_tpl', 'bbcode_helpline', 'hidden_fields'); $vars = array(
'action',
'sql_ary',
'bbcode_id',
'display_on_posting',
'bbcode_match',
'bbcode_tpl',
'bbcode_helpline',
'hidden_fields',
);
extract($phpbb_dispatcher->trigger_event('core.acp_bbcodes_modify_create', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.acp_bbcodes_modify_create', compact($vars)));
$warn_text = preg_match('%<[^>]*\{text[\d]*\}[^>]*>%i', $bbcode_tpl); $warn_text = preg_match('%<[^>]*\{text[\d]*\}[^>]*>%i', $bbcode_tpl);
@ -210,7 +219,6 @@ class acp_bbcodes
trigger_error($user->lang['BBCODE_TAG_DEF_TOO_LONG'] . adm_back_link($this->u_action), E_USER_WARNING); trigger_error($user->lang['BBCODE_TAG_DEF_TOO_LONG'] . adm_back_link($this->u_action), E_USER_WARNING);
} }
if (strlen($bbcode_helpline) > 255) if (strlen($bbcode_helpline) > 255)
{ {
trigger_error($user->lang['BBCODE_HELPLINE_TOO_LONG'] . adm_back_link($this->u_action), E_USER_WARNING); trigger_error($user->lang['BBCODE_HELPLINE_TOO_LONG'] . adm_back_link($this->u_action), E_USER_WARNING);

View file

@ -345,6 +345,7 @@ class acp_board
'load_user_activity' => array('lang' => 'LOAD_USER_ACTIVITY', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true), 'load_user_activity' => array('lang' => 'LOAD_USER_ACTIVITY', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'load_tplcompile' => array('lang' => 'RECOMPILE_STYLES', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true), 'load_tplcompile' => array('lang' => 'RECOMPILE_STYLES', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'allow_cdn' => array('lang' => 'ALLOW_CDN', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true), 'allow_cdn' => array('lang' => 'ALLOW_CDN', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'allow_live_searches' => array('lang' => 'ALLOW_LIVE_SEARCHES', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'legend3' => 'CUSTOM_PROFILE_FIELDS', 'legend3' => 'CUSTOM_PROFILE_FIELDS',
'load_cpf_memberlist' => array('lang' => 'LOAD_CPF_MEMBERLIST', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => false), 'load_cpf_memberlist' => array('lang' => 'LOAD_CPF_MEMBERLIST', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => false),
@ -434,6 +435,7 @@ class acp_board
'email_function_name' => array('lang' => 'EMAIL_FUNCTION_NAME', 'validate' => 'string', 'type' => 'text:20:50', 'explain' => true), 'email_function_name' => array('lang' => 'EMAIL_FUNCTION_NAME', 'validate' => 'string', 'type' => 'text:20:50', 'explain' => true),
'email_package_size' => array('lang' => 'EMAIL_PACKAGE_SIZE', 'validate' => 'int:0', 'type' => 'number:0:99999', 'explain' => true), 'email_package_size' => array('lang' => 'EMAIL_PACKAGE_SIZE', 'validate' => 'int:0', 'type' => 'number:0:99999', 'explain' => true),
'board_contact' => array('lang' => 'CONTACT_EMAIL', 'validate' => 'email', 'type' => 'email:25:100', 'explain' => true), 'board_contact' => array('lang' => 'CONTACT_EMAIL', 'validate' => 'email', 'type' => 'email:25:100', 'explain' => true),
'board_contact_name' => array('lang' => 'CONTACT_EMAIL_NAME', 'validate' => 'string', 'type' => 'text:25:50', 'explain' => true),
'board_email' => array('lang' => 'ADMIN_EMAIL', 'validate' => 'email', 'type' => 'email:25:100', 'explain' => true), 'board_email' => array('lang' => 'ADMIN_EMAIL', 'validate' => 'email', 'type' => 'email:25:100', 'explain' => true),
'board_email_sig' => array('lang' => 'EMAIL_SIG', 'validate' => 'string', 'type' => 'textarea:5:30', 'explain' => true), 'board_email_sig' => array('lang' => 'EMAIL_SIG', 'validate' => 'string', 'type' => 'textarea:5:30', 'explain' => true),
'board_hide_emails' => array('lang' => 'BOARD_HIDE_EMAILS', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true), 'board_hide_emails' => array('lang' => 'BOARD_HIDE_EMAILS', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),

View file

@ -220,7 +220,6 @@ class acp_bots
trigger_error($user->lang['NO_BOT_GROUP'] . adm_back_link($this->u_action . "&amp;id=$bot_id&amp;action=$action"), E_USER_WARNING); trigger_error($user->lang['NO_BOT_GROUP'] . adm_back_link($this->u_action . "&amp;id=$bot_id&amp;action=$action"), E_USER_WARNING);
} }
$user_id = user_add(array( $user_id = user_add(array(
'user_type' => (int) USER_IGNORE, 'user_type' => (int) USER_IGNORE,
'group_id' => (int) $group_row['group_id'], 'group_id' => (int) $group_row['group_id'],

View file

@ -36,7 +36,6 @@ class acp_captcha
$selected = (isset($captchas['available'][$selected]) || isset($captchas['unavailable'][$selected])) ? $selected : $config['captcha_plugin']; $selected = (isset($captchas['available'][$selected]) || isset($captchas['unavailable'][$selected])) ? $selected : $config['captcha_plugin'];
$configure = request_var('configure', false); $configure = request_var('configure', false);
// Oh, they are just here for the view // Oh, they are just here for the view
if (isset($_GET['captcha_demo'])) if (isset($_GET['captcha_demo']))
{ {

View file

@ -101,6 +101,10 @@ class acp_database
$extractor = new sqlite_extractor($format, $filename, $time, $download, $store); $extractor = new sqlite_extractor($format, $filename, $time, $download, $store);
break; break;
case 'sqlite3':
$extractor = new sqlite3_extractor($format, $filename, $time, $download, $store);
break;
case 'postgres': case 'postgres':
$extractor = new postgres_extractor($format, $filename, $time, $download, $store); $extractor = new postgres_extractor($format, $filename, $time, $download, $store);
break; break;
@ -135,6 +139,7 @@ class acp_database
switch ($db->sql_layer) switch ($db->sql_layer)
{ {
case 'sqlite': case 'sqlite':
case 'sqlite3':
case 'firebird': case 'firebird':
$extractor->flush('DELETE FROM ' . $table_name . ";\n"); $extractor->flush('DELETE FROM ' . $table_name . ";\n");
break; break;
@ -325,6 +330,7 @@ class acp_database
case 'mysql4': case 'mysql4':
case 'mysqli': case 'mysqli':
case 'sqlite': case 'sqlite':
case 'sqlite3':
while (($sql = $fgetd($fp, ";\n", $read, $seek, $eof)) !== false) while (($sql = $fgetd($fp, ";\n", $read, $seek, $eof)) !== false)
{ {
$db->sql_query($sql); $db->sql_query($sql);
@ -1049,6 +1055,112 @@ class sqlite_extractor extends base_extractor
} }
} }
/**
* @package acp
*/
class sqlite3_extractor extends base_extractor
{
function write_start($prefix)
{
$sql_data = "--\n";
$sql_data .= "-- phpBB Backup Script\n";
$sql_data .= "-- Dump of tables for $prefix\n";
$sql_data .= "-- DATE : " . gmdate("d-m-Y H:i:s", $this->time) . " GMT\n";
$sql_data .= "--\n";
$sql_data .= "BEGIN TRANSACTION;\n";
$this->flush($sql_data);
}
function write_table($table_name)
{
global $db;
$sql_data = '-- Table: ' . $table_name . "\n";
$sql_data .= "DROP TABLE $table_name;\n";
$sql = "SELECT sql
FROM sqlite_master
WHERE type = 'table'
AND name = '" . $db->sql_escape($table_name) . "'
ORDER BY name ASC;";
$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
// Create Table
$sql_data .= $row['sql'] . ";\n";
$result = $db->sql_query("PRAGMA index_list('" . $db->sql_escape($table_name) . "');");
while ($row = $db->sql_fetchrow($result))
{
if (strpos($row['name'], 'autoindex') !== false)
{
continue;
}
$result2 = $db->sql_query("PRAGMA index_info('" . $db->sql_escape($row['name']) . "');");
$fields = array();
while ($row2 = $db->sql_fetchrow($result2))
{
$fields[] = $row2['name'];
}
$db->sql_freeresult($result2);
$sql_data .= 'CREATE ' . ($row['unique'] ? 'UNIQUE ' : '') . 'INDEX ' . $row['name'] . ' ON ' . $table_name . ' (' . implode(', ', $fields) . ");\n";
}
$db->sql_freeresult($result);
$this->flush($sql_data . "\n");
}
function write_data($table_name)
{
global $db;
$result = $db->sql_query("PRAGMA table_info('" . $db->sql_escape($table_name) . "');");
$col_types = array();
while ($row = $db->sql_fetchrow($result))
{
$col_types[$row['name']] = $row['type'];
}
$db->sql_freeresult($result);
$sql_insert = 'INSERT INTO ' . $table_name . ' (' . implode(', ', array_keys($col_types)) . ') VALUES (';
$sql = "SELECT *
FROM $table_name";
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{
foreach ($row as $column_name => $column_data)
{
if (is_null($column_data))
{
$row[$column_name] = 'NULL';
}
else if ($column_data === '')
{
$row[$column_name] = "''";
}
else if (stripos($col_types[$column_name], 'text') !== false || stripos($col_types[$column_name], 'char') !== false || stripos($col_types[$column_name], 'blob') !== false)
{
$row[$column_name] = sanitize_data_generic(str_replace("'", "''", $column_data));
}
}
$this->flush($sql_insert . implode(', ', $row) . ");\n");
}
}
function write_end()
{
$this->flush("COMMIT;\n");
parent::write_end();
}
}
/** /**
* @package acp * @package acp
*/ */
@ -1180,7 +1292,6 @@ class postgres_extractor extends base_extractor
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
// Get the listing of primary keys. // Get the listing of primary keys.
$sql_pri_keys = "SELECT ic.relname as index_name, bc.relname as tab_name, ta.attname as column_name, i.indisunique as unique_key, i.indisprimary as primary_key $sql_pri_keys = "SELECT ic.relname as index_name, bc.relname as tab_name, ta.attname as column_name, i.indisunique as unique_key, i.indisprimary as primary_key
FROM pg_class bc, pg_class ic, pg_index i, pg_attribute ta, pg_attribute ia FROM pg_class bc, pg_class ic, pg_index i, pg_attribute ta, pg_attribute ia
@ -1280,7 +1391,6 @@ class postgres_extractor extends base_extractor
$ary_type[] = pg_field_type($result, $i); $ary_type[] = pg_field_type($result, $i);
$ary_name[] = pg_field_name($result, $i); $ary_name[] = pg_field_name($result, $i);
$sql = "SELECT pg_get_expr(d.adbin, d.adrelid) as rowdefault $sql = "SELECT pg_get_expr(d.adbin, d.adrelid) as rowdefault
FROM pg_attrdef d, pg_class c FROM pg_attrdef d, pg_class c
WHERE (c.relname = '{$table_name}') WHERE (c.relname = '{$table_name}')

View file

@ -158,7 +158,7 @@ class acp_forums
* @event core.acp_manage_forums_request_data * @event core.acp_manage_forums_request_data
* @var string action Type of the action: add|edit * @var string action Type of the action: add|edit
* @var array forum_data Array with new forum data * @var array forum_data Array with new forum data
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('action', 'forum_data'); $vars = array('action', 'forum_data');
extract($phpbb_dispatcher->trigger_event('core.acp_manage_forums_request_data', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.acp_manage_forums_request_data', compact($vars)));
@ -484,7 +484,7 @@ class acp_forums
* empty when creating new forum * empty when creating new forum
* @var array forum_data Array with new forum data * @var array forum_data Array with new forum data
* @var string parents_list List of parent options * @var string parents_list List of parent options
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('action', 'update', 'forum_id', 'row', 'forum_data', 'parents_list'); $vars = array('action', 'update', 'forum_id', 'row', 'forum_data', 'parents_list');
extract($phpbb_dispatcher->trigger_event('core.acp_manage_forums_initialise_data', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.acp_manage_forums_initialise_data', compact($vars)));
@ -705,9 +705,18 @@ class acp_forums
* ensure to update the template variables * ensure to update the template variables
* S_ERROR and ERROR_MSG to display it * S_ERROR and ERROR_MSG to display it
* @var array template_data Array with new forum data * @var array template_data Array with new forum data
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('action', 'update', 'forum_id', 'row', 'forum_data', 'parents_list', 'errors', 'template_data'); $vars = array(
'action',
'update',
'forum_id',
'row',
'forum_data',
'parents_list',
'errors',
'template_data',
);
extract($phpbb_dispatcher->trigger_event('core.acp_manage_forums_display_form', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.acp_manage_forums_display_form', compact($vars)));
$template->assign_vars($template_data); $template->assign_vars($template_data);
@ -946,7 +955,7 @@ class acp_forums
* @var array forum_data Array with new forum data * @var array forum_data Array with new forum data
* @var array errors Array of errors, should be strings and not * @var array errors Array of errors, should be strings and not
* language key. * language key.
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('forum_data', 'errors'); $vars = array('forum_data', 'errors');
extract($phpbb_dispatcher->trigger_event('core.acp_manage_forums_validate_data', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.acp_manage_forums_validate_data', compact($vars)));
@ -1054,7 +1063,7 @@ class acp_forums
* @var array forum_data_sql Array with data we are going to update * @var array forum_data_sql Array with data we are going to update
* If forum_data_sql[forum_id] is set, we update * If forum_data_sql[forum_id] is set, we update
* that forum, otherwise a new one is created. * that forum, otherwise a new one is created.
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('forum_data', 'forum_data_sql'); $vars = array('forum_data', 'forum_data_sql');
extract($phpbb_dispatcher->trigger_event('core.acp_manage_forums_update_data_before', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.acp_manage_forums_update_data_before', compact($vars)));
@ -1347,7 +1356,7 @@ class acp_forums
* ensure to set forum_data_sql[forum_id] * ensure to set forum_data_sql[forum_id]
* @var array errors Array of errors, should be strings and not * @var array errors Array of errors, should be strings and not
* language key. * language key.
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('forum_data', 'forum_data_sql', 'is_new_forum', 'errors'); $vars = array('forum_data', 'forum_data_sql', 'is_new_forum', 'errors');
extract($phpbb_dispatcher->trigger_event('core.acp_manage_forums_update_data_after', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.acp_manage_forums_update_data_after', compact($vars)));
@ -1385,7 +1394,7 @@ class acp_forums
* @var int to_id If of the new parent forum * @var int to_id If of the new parent forum
* @var array errors Array of errors, should be strings and not * @var array errors Array of errors, should be strings and not
* language key. * language key.
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('from_id', 'to_id', 'errors'); $vars = array('from_id', 'to_id', 'errors');
extract($phpbb_dispatcher->trigger_event('core.acp_manage_forums_move_children', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.acp_manage_forums_move_children', compact($vars)));
@ -1489,7 +1498,7 @@ class acp_forums
* @var array errors Array of errors, should be strings and not * @var array errors Array of errors, should be strings and not
* language key. If this array is not empty, * language key. If this array is not empty,
* The content will not be moved. * The content will not be moved.
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('from_id', 'to_id', 'sync', 'errors'); $vars = array('from_id', 'to_id', 'sync', 'errors');
extract($phpbb_dispatcher->trigger_event('core.acp_manage_forums_move_content', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.acp_manage_forums_move_content', compact($vars)));

View file

@ -53,7 +53,6 @@ class acp_groups
$start = request_var('start', 0); $start = request_var('start', 0);
$update = (isset($_POST['update'])) ? true : false; $update = (isset($_POST['update'])) ? true : false;
// Clear some vars // Clear some vars
$group_row = array(); $group_row = array();
@ -331,7 +330,6 @@ class acp_groups
} }
} }
// Did we submit? // Did we submit?
if ($update) if ($update)
{ {

View file

@ -203,7 +203,6 @@ class acp_icons
unset($_images[$row[$fields . '_url']]); unset($_images[$row[$fields . '_url']]);
} }
if ($row[$fields . '_id'] == $icon_id) if ($row[$fields . '_id'] == $icon_id)
{ {
$after = true; $after = true;
@ -539,6 +538,7 @@ class acp_icons
switch ($db->sql_layer) switch ($db->sql_layer)
{ {
case 'sqlite': case 'sqlite':
case 'sqlite3':
case 'firebird': case 'firebird':
$db->sql_query('DELETE FROM ' . $table); $db->sql_query('DELETE FROM ' . $table);
break; break;

View file

@ -271,6 +271,7 @@ class acp_main
switch ($db->sql_layer) switch ($db->sql_layer)
{ {
case 'sqlite': case 'sqlite':
case 'sqlite3':
case 'firebird': case 'firebird':
$db->sql_query('DELETE FROM ' . TOPICS_POSTED_TABLE); $db->sql_query('DELETE FROM ' . TOPICS_POSTED_TABLE);
break; break;
@ -376,6 +377,7 @@ class acp_main
switch ($db->sql_layer) switch ($db->sql_layer)
{ {
case 'sqlite': case 'sqlite':
case 'sqlite3':
case 'firebird': case 'firebird':
$db->sql_query("DELETE FROM $table"); $db->sql_query("DELETE FROM $table");
break; break;

View file

@ -330,7 +330,6 @@ class acp_permissions
} }
} }
// Setting permissions screen // Setting permissions screen
$s_hidden_fields = build_hidden_fields(array( $s_hidden_fields = build_hidden_fields(array(
'user_id' => $user_id, 'user_id' => $user_id,

View file

@ -114,6 +114,7 @@ class acp_profile
switch ($db->sql_layer) switch ($db->sql_layer)
{ {
case 'sqlite': case 'sqlite':
case 'sqlite3':
$sql = "SELECT sql $sql = "SELECT sql
FROM sqlite_master FROM sqlite_master
WHERE type = 'table' WHERE type = 'table'
@ -485,7 +486,6 @@ class acp_profile
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
$sql = 'SELECT lang_id, lang_name, lang_explain, lang_default_value $sql = 'SELECT lang_id, lang_name, lang_explain, lang_default_value
FROM ' . PROFILE_LANG_TABLE . ' FROM ' . PROFILE_LANG_TABLE . '
WHERE lang_id <> ' . $this->edit_lang_id . " WHERE lang_id <> ' . $this->edit_lang_id . "
@ -1116,7 +1116,6 @@ class acp_profile
} }
} }
$db->sql_transaction('begin'); $db->sql_transaction('begin');
if ($action == 'create') if ($action == 'create')
@ -1206,7 +1205,8 @@ class acp_profile
break; break;
case 'sqlite': case 'sqlite':
if (version_compare(sqlite_libversion(), '3.0') == -1) case 'sqlite3':
if (version_compare($db->sql_server_info(true), '3.0') == -1)
{ {
$sql = "SELECT sql $sql = "SELECT sql
FROM sqlite_master FROM sqlite_master

View file

@ -533,7 +533,7 @@ class acp_prune
WHERE u.user_id <> ' . ANONYMOUS . ' WHERE u.user_id <> ' . ANONYMOUS . '
AND u.user_type <> ' . USER_FOUNDER . AND u.user_type <> ' . USER_FOUNDER .
((!empty($user_ids)) ? 'AND ' . $db->sql_in_set('p.poster_id', $user_ids) : '') . ' ((!empty($user_ids)) ? 'AND ' . $db->sql_in_set('p.poster_id', $user_ids) : '') . '
AND p.post_visibility = ' . ITEM_UNAPPROVED . ' AND ' . $db->sql_in_set('p.post_visibility', array(ITEM_UNAPPROVED, ITEM_REAPPROVE)) . '
AND u.user_id = p.poster_id AND u.user_id = p.poster_id
GROUP BY p.poster_id GROUP BY p.poster_id
HAVING queue_posts ' . $key_match[$queue_select] . ' ' . $posts_on_queue; HAVING queue_posts ' . $key_match[$queue_select] . ' ' . $posts_on_queue;

View file

@ -214,7 +214,6 @@ class acp_ranks
'MIN_POSTS' => (isset($ranks['rank_min']) && !$ranks['rank_special']) ? $ranks['rank_min'] : 0) 'MIN_POSTS' => (isset($ranks['rank_min']) && !$ranks['rank_special']) ? $ranks['rank_min'] : 0)
); );
return; return;
break; break;

View file

@ -253,6 +253,7 @@ class acp_reasons
case 'oracle': case 'oracle':
case 'firebird': case 'firebird':
case 'sqlite': case 'sqlite':
case 'sqlite3':
// Change the reports using this reason to 'other' // Change the reports using this reason to 'other'
$sql = 'UPDATE ' . REPORTS_TABLE . ' $sql = 'UPDATE ' . REPORTS_TABLE . '
SET reason_id = ' . $other_reason_id . ", report_text = '" . $db->sql_escape($reason_row['reason_description']) . "\n\n' || report_text SET reason_id = ' . $other_reason_id . ", report_text = '" . $db->sql_escape($reason_row['reason_description']) . "\n\n' || report_text

View file

@ -657,6 +657,7 @@ class acp_users
{ {
if ($topic_id_ary[$row['topic_id']][ITEM_APPROVED] == $row['topic_posts_approved'] if ($topic_id_ary[$row['topic_id']][ITEM_APPROVED] == $row['topic_posts_approved']
&& $topic_id_ary[$row['topic_id']][ITEM_UNAPPROVED] == $row['topic_posts_unapproved'] && $topic_id_ary[$row['topic_id']][ITEM_UNAPPROVED] == $row['topic_posts_unapproved']
&& $topic_id_ary[$row['topic_id']][ITEM_REAPPROVE] == $row['topic_posts_unapproved']
&& $topic_id_ary[$row['topic_id']][ITEM_DELETED] == $row['topic_posts_softdeleted']) && $topic_id_ary[$row['topic_id']][ITEM_DELETED] == $row['topic_posts_softdeleted'])
{ {
$move_topic_ary[] = $row['topic_id']; $move_topic_ary[] = $row['topic_id'];
@ -735,7 +736,6 @@ class acp_users
sync('forum', 'forum_id', $forum_id_ary, false, true); sync('forum', 'forum_id', $forum_id_ary, false, true);
} }
add_log('admin', 'LOG_USER_MOVE_POSTS', $user_row['username'], $forum_info['forum_name']); add_log('admin', 'LOG_USER_MOVE_POSTS', $user_row['username'], $forum_info['forum_name']);
add_log('user', $user_id, 'LOG_USER_MOVE_POSTS_USER', $forum_info['forum_name']); add_log('user', $user_id, 'LOG_USER_MOVE_POSTS_USER', $forum_info['forum_name']);
@ -772,7 +772,7 @@ class acp_users
* @event core.acp_users_overview_run_quicktool * @event core.acp_users_overview_run_quicktool
* @var array user_row Current user data * @var array user_row Current user data
* @var string action Quick tool that should be run * @var string action Quick tool that should be run
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('action', 'user_row'); $vars = array('action', 'user_row');
extract($phpbb_dispatcher->trigger_event('core.acp_users_overview_run_quicktool', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.acp_users_overview_run_quicktool', compact($vars)));
@ -893,7 +893,7 @@ class acp_users
* @var array user_row Current user data * @var array user_row Current user data
* @var array data Submitted user data * @var array data Submitted user data
* @var array sql_ary User data we udpate * @var array sql_ary User data we udpate
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('user_row', 'data', 'sql_ary'); $vars = array('user_row', 'data', 'sql_ary');
extract($phpbb_dispatcher->trigger_event('core.acp_users_overview_modify_data', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.acp_users_overview_modify_data', compact($vars)));
@ -1008,7 +1008,7 @@ class acp_users
* @event core.acp_users_display_overview * @event core.acp_users_display_overview
* @var array user_row Array with user data * @var array user_row Array with user data
* @var array quick_tool_ary Ouick tool options * @var array quick_tool_ary Ouick tool options
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('user_row', 'quick_tool_ary'); $vars = array('user_row', 'quick_tool_ary');
extract($phpbb_dispatcher->trigger_event('core.acp_users_display_overview', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.acp_users_display_overview', compact($vars)));
@ -1050,7 +1050,7 @@ class acp_users
$sql = 'SELECT COUNT(post_id) as posts_in_queue $sql = 'SELECT COUNT(post_id) as posts_in_queue
FROM ' . POSTS_TABLE . ' FROM ' . POSTS_TABLE . '
WHERE poster_id = ' . $user_id . ' WHERE poster_id = ' . $user_id . '
AND post_visibility = ' . ITEM_UNAPPROVED; AND ' . $db->sql_in_set('post_visibility', array(ITEM_UNAPPROVED, ITEM_REAPPROVE));
$result = $db->sql_query($sql); $result = $db->sql_query($sql);
$user_row['posts_in_queue'] = (int) $db->sql_fetchfield('posts_in_queue'); $user_row['posts_in_queue'] = (int) $db->sql_fetchfield('posts_in_queue');
$db->sql_freeresult($result); $db->sql_freeresult($result);
@ -1329,7 +1329,6 @@ class acp_users
} }
} }
$template->assign_block_vars('warn', array( $template->assign_block_vars('warn', array(
'ID' => $row['warning_id'], 'ID' => $row['warning_id'],
'USERNAME' => ($row['log_operation']) ? get_username_string('full', $row['mod_user_id'], $row['mod_username'], $row['mod_user_colour']) : '-', 'USERNAME' => ($row['log_operation']) ? get_username_string('full', $row['mod_user_id'], $row['mod_username'], $row['mod_user_colour']) : '-',
@ -1379,7 +1378,6 @@ class acp_users
$data['bday_year'] = request_var('bday_year', $data['bday_year']); $data['bday_year'] = request_var('bday_year', $data['bday_year']);
$data['user_birthday'] = sprintf('%2d-%2d-%4d', $data['bday_day'], $data['bday_month'], $data['bday_year']); $data['user_birthday'] = sprintf('%2d-%2d-%4d', $data['bday_day'], $data['bday_month'], $data['bday_year']);
if ($submit) if ($submit)
{ {
$error = validate_data($data, array( $error = validate_data($data, array(
@ -1503,6 +1501,17 @@ class acp_users
'notify' => request_var('notify', $user_row['user_notify']), 'notify' => request_var('notify', $user_row['user_notify']),
); );
/**
* Modify users preferences data
*
* @event core.acp_users_prefs_modify_data
* @var array data Array with users preferences data
* @var array user_row Array with user data
* @since 3.1.0-b3
*/
$vars = array('data', 'user_row');
extract($phpbb_dispatcher->trigger_event('core.acp_users_prefs_modify_data', compact($vars)));
if ($submit) if ($submit)
{ {
$error = validate_data($data, array( $error = validate_data($data, array(
@ -1559,6 +1568,21 @@ class acp_users
'user_notify' => $data['notify'], 'user_notify' => $data['notify'],
); );
/**
* Modify SQL query before users preferences are updated
*
* @event core.acp_users_prefs_modify_sql
* @var array data Array with users preferences data
* @var array user_row Array with user data
* @var array sql_ary SQL array with users preferences data to update
* @var array error Array with errors data
* @since 3.1.0-b3
*/
$vars = array('data', 'user_row', 'sql_ary', 'error');
extract($phpbb_dispatcher->trigger_event('core.acp_users_prefs_modify_sql', compact($vars)));
if (!sizeof($error))
{
$sql = 'UPDATE ' . USERS_TABLE . ' $sql = 'UPDATE ' . USERS_TABLE . '
SET ' . $db->sql_build_array('UPDATE', $sql_ary) . " SET ' . $db->sql_build_array('UPDATE', $sql_ary) . "
WHERE user_id = $user_id"; WHERE user_id = $user_id";
@ -1591,6 +1615,7 @@ class acp_users
trigger_error($user->lang['USER_PREFS_UPDATED'] . adm_back_link($this->u_action . '&amp;u=' . $user_id)); trigger_error($user->lang['USER_PREFS_UPDATED'] . adm_back_link($this->u_action . '&amp;u=' . $user_id));
} }
}
// Replace "error" strings with their real, localised form // Replace "error" strings with their real, localised form
$error = array_map(array($user, 'lang'), $error); $error = array_map(array($user, 'lang'), $error);
@ -1653,7 +1678,7 @@ class acp_users
} }
$timezone_selects = phpbb_timezone_select($user, $data['tz'], true); $timezone_selects = phpbb_timezone_select($user, $data['tz'], true);
$template->assign_vars(array( $user_prefs_data = array(
'S_PREFS' => true, 'S_PREFS' => true,
'S_JABBER_DISABLED' => ($config['jab_enable'] && $user_row['user_jabber'] && @extension_loaded('xml')) ? false : true, 'S_JABBER_DISABLED' => ($config['jab_enable'] && $user_row['user_jabber'] && @extension_loaded('xml')) ? false : true,
@ -1693,9 +1718,22 @@ class acp_users
'S_STYLE_OPTIONS' => style_select($data['style']), 'S_STYLE_OPTIONS' => style_select($data['style']),
'S_TZ_OPTIONS' => $timezone_selects['tz_select'], 'S_TZ_OPTIONS' => $timezone_selects['tz_select'],
'S_TZ_DATE_OPTIONS' => $timezone_selects['tz_dates'], 'S_TZ_DATE_OPTIONS' => $timezone_selects['tz_dates'],
)
); );
/**
* Modify users preferences data before assigning it to the template
*
* @event core.acp_users_prefs_modify_template_data
* @var array data Array with users preferences data
* @var array user_row Array with user data
* @var array user_prefs_data Array with users preferences data to be assigned to the template
* @since 3.1.0-b3
*/
$vars = array('data', 'user_row', 'user_prefs_data');
extract($phpbb_dispatcher->trigger_event('core.acp_users_prefs_modify_template_data', compact($vars)));
$template->assign_vars($user_prefs_data);
break; break;
case 'avatar': case 'avatar':
@ -2243,7 +2281,6 @@ class acp_users
$error = array(); $error = array();
} }
$sql = 'SELECT ug.*, g.* $sql = 'SELECT ug.*, g.*
FROM ' . GROUPS_TABLE . ' g, ' . USER_GROUP_TABLE . " ug FROM ' . GROUPS_TABLE . ' g, ' . USER_GROUP_TABLE . " ug
WHERE ug.user_id = $user_id WHERE ug.user_id = $user_id

View file

@ -162,7 +162,6 @@ class acp_words
break; break;
} }
$template->assign_vars(array( $template->assign_vars(array(
'U_ACTION' => $this->u_action, 'U_ACTION' => $this->u_action,
'S_HIDDEN_FIELDS' => $s_hidden_fields) 'S_HIDDEN_FIELDS' => $s_hidden_fields)

View file

@ -139,7 +139,6 @@ class auth_admin extends \phpbb\auth\auth
$auth2 = &$auth; $auth2 = &$auth;
} }
$hold_ary[$userdata['user_id']] = array(); $hold_ary[$userdata['user_id']] = array();
foreach ($forum_ids as $f_id) foreach ($forum_ids as $f_id)
{ {

View file

@ -2352,7 +2352,6 @@ class colour_manager
$colour3[0] += 180; $colour3[0] += 180;
$colour4[0] += 210; $colour4[0] += 210;
$results[] = $this->allocate($colour2, $mode); $results[] = $this->allocate($colour2, $mode);
$results[] = $this->allocate($colour3, $mode); $results[] = $this->allocate($colour3, $mode);
$results[] = $this->allocate($colour4, $mode); $results[] = $this->allocate($colour4, $mode);

View file

@ -0,0 +1,44 @@
<?php
/**
*
* @package phpBB3
* @copyright (c) 2014 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
/**
*/
if (!defined('IN_PHPBB'))
{
exit;
}
// set up caching
$cache = $phpbb_container->get('cache');
// Instantiate some basic classes
$phpbb_dispatcher = $phpbb_container->get('dispatcher');
$request = $phpbb_container->get('request');
$user = $phpbb_container->get('user');
$auth = $phpbb_container->get('auth');
$db = $phpbb_container->get('dbal.conn');
// make sure request_var uses this request instance
request_var('', 0, false, false, $request); // "dependency injection" for a function
// Grab global variables, re-cache if necessary
$config = $phpbb_container->get('config');
set_config(null, null, null, $config);
set_config_count(null, null, null, $config);
$phpbb_log = $phpbb_container->get('log');
$symfony_request = $phpbb_container->get('symfony_request');
$phpbb_filesystem = $phpbb_container->get('filesystem');
$phpbb_path_helper = $phpbb_container->get('path_helper');
// load extensions
$phpbb_extension_manager = $phpbb_container->get('ext.manager');
$phpbb_subscriber_loader = $phpbb_container->get('event.subscriber_loader');
$template = $phpbb_container->get('template');

View file

@ -24,7 +24,7 @@ if (!defined('IN_PHPBB'))
*/ */
// phpBB Version // phpBB Version
define('PHPBB_VERSION', '3.1.0-b3-dev'); define('PHPBB_VERSION', '3.1.0-b4-dev');
// QA-related // QA-related
// define('PHPBB_QA', 1); // define('PHPBB_QA', 1);
@ -46,10 +46,10 @@ define('USER_INACTIVE', 1);
define('USER_IGNORE', 2); define('USER_IGNORE', 2);
define('USER_FOUNDER', 3); define('USER_FOUNDER', 3);
define('INACTIVE_REGISTER', 1); define('INACTIVE_REGISTER', 1); // Newly registered account
define('INACTIVE_PROFILE', 2); define('INACTIVE_PROFILE', 2); // Profile details changed
define('INACTIVE_MANUAL', 3); define('INACTIVE_MANUAL', 3); // Account deactivated by administrator
define('INACTIVE_REMIND', 4); define('INACTIVE_REMIND', 4); // Forced user account reactivation
// ACL // ACL
define('ACL_NEVER', 0); define('ACL_NEVER', 0);
@ -91,6 +91,7 @@ define('ITEM_MOVED', 2);
define('ITEM_UNAPPROVED', 0); // => has not yet been approved define('ITEM_UNAPPROVED', 0); // => has not yet been approved
define('ITEM_APPROVED', 1); // => has been approved, and has not been soft deleted define('ITEM_APPROVED', 1); // => has been approved, and has not been soft deleted
define('ITEM_DELETED', 2); // => has been soft deleted define('ITEM_DELETED', 2); // => has been soft deleted
define('ITEM_REAPPROVE', 3); // => has been edited and needs to be re-approved
// Forum Flags // Forum Flags
define('FORUM_FLAG_LINK_TRACK', 1); define('FORUM_FLAG_LINK_TRACK', 1);

View file

@ -1004,24 +1004,6 @@ function phpbb_get_timezone_identifiers($selected_timezone)
return $timezones; return $timezones;
} }
/**
* Pick a timezone
*
* @param string $default A timezone to select
* @param boolean $truncate Shall we truncate the options text
*
* @return string Returns the options for timezone selector only
*
* @deprecated
*/
function tz_select($default = '', $truncate = false)
{
global $user;
$timezone_select = phpbb_timezone_select($user, $default, $truncate);
return $timezone_select['tz_select'];
}
/** /**
* Options to pick a timezone and date/time * Options to pick a timezone and date/time
* *
@ -2022,7 +2004,7 @@ function append_sid($url, $params = false, $is_amp = true, $session_id = false)
* the global one (false) * the global one (false)
* @var bool|string append_sid_overwrite Overwrite function (string * @var bool|string append_sid_overwrite Overwrite function (string
* URL) or not (false) * URL) or not (false)
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('url', 'params', 'is_amp', 'session_id', 'append_sid_overwrite'); $vars = array('url', 'params', 'is_amp', 'session_id', 'append_sid_overwrite');
extract($phpbb_dispatcher->trigger_event('core.append_sid', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.append_sid', compact($vars)));
@ -2344,8 +2326,9 @@ function reapply_sid($url)
*/ */
function build_url($strip_vars = false) function build_url($strip_vars = false)
{ {
global $config, $user, $phpEx, $phpbb_root_path; global $config, $user, $phpbb_path_helper;
$php_ext = $phpbb_path_helper->get_php_ext();
$page = $user->page['page']; $page = $user->page['page'];
// We need to be cautious here. // We need to be cautious here.
@ -2358,71 +2341,27 @@ function build_url($strip_vars = false)
if ($url_parts === false || empty($url_parts['scheme']) || empty($url_parts['host'])) if ($url_parts === false || empty($url_parts['scheme']) || empty($url_parts['host']))
{ {
// Remove 'app.php/' from the page, when rewrite is enabled // Remove 'app.php/' from the page, when rewrite is enabled
if ($config['enable_mod_rewrite'] && strpos($page, 'app.' . $phpEx . '/') === 0) if ($config['enable_mod_rewrite'] && strpos($page, 'app.' . $php_ext . '/') === 0)
{ {
$page = substr($page, strlen('app.' . $phpEx . '/')); $page = substr($page, strlen('app.' . $php_ext . '/'));
} }
$page = $phpbb_root_path . $page; $page = $phpbb_path_helper->get_phpbb_root_path() . $page;
} }
// Append SID // Append SID
$redirect = append_sid($page, false, false); $redirect = append_sid($page, false, false);
// Add delimiter if not there... if ($strip_vars !== false)
if (strpos($redirect, '?') === false)
{ {
$redirect .= '?'; $redirect = $phpbb_path_helper->strip_url_params($redirect, $strip_vars, false);
}
else
{
$redirect = str_replace('&', '&amp;', $redirect);
} }
// Strip vars... return $redirect . ((strpos($redirect, '?') === false) ? '?' : '');
if ($strip_vars !== false && strpos($redirect, '?') !== false)
{
if (!is_array($strip_vars))
{
$strip_vars = array($strip_vars);
}
$query = $_query = array();
$args = substr($redirect, strpos($redirect, '?') + 1);
$args = ($args) ? explode('&', $args) : array();
$redirect = substr($redirect, 0, strpos($redirect, '?'));
foreach ($args as $argument)
{
$arguments = explode('=', $argument);
$key = $arguments[0];
unset($arguments[0]);
if ($key === '')
{
continue;
}
$query[$key] = implode('=', $arguments);
}
// Strip the vars off
foreach ($strip_vars as $strip)
{
if (isset($query[$strip]))
{
unset($query[$strip]);
}
}
// Glue the remaining parts together... already urlencoded
foreach ($query as $key => $value)
{
$_query[] = $key . '=' . $value;
}
$query = implode('&', $_query);
$redirect .= ($query) ? '?' . $query : '';
}
return str_replace('&', '&amp;', $redirect);
} }
/** /**
@ -2712,7 +2651,6 @@ function confirm_box($check, $title = '', $hidden = '', $html_body = 'confirm_bo
WHERE user_id = " . $user->data['user_id']; WHERE user_id = " . $user->data['user_id'];
$db->sql_query($sql); $db->sql_query($sql);
if ($request->is_ajax()) if ($request->is_ajax())
{ {
$u_action .= '&confirm_uid=' . $user->data['user_id'] . '&sess=' . $user->session_id . '&sid=' . $user->session_id; $u_action .= '&confirm_uid=' . $user->data['user_id'] . '&sess=' . $user->session_id . '&sid=' . $user->session_id;
@ -3849,6 +3787,16 @@ function msg_handler($errno, $msg_text, $errfile, $errline)
if (defined('IN_INSTALL') || defined('DEBUG') || isset($auth) && $auth->acl_get('a_')) if (defined('IN_INSTALL') || defined('DEBUG') || isset($auth) && $auth->acl_get('a_'))
{ {
$msg_text = $log_text; $msg_text = $log_text;
// If this is defined there already was some output
// So let's not break it
if (defined('IN_DB_UPDATE'))
{
echo '<div class="errorbox">' . $msg_text . '</div>';
$db->sql_return_on_error(true);
phpbb_end_update($cache, $config);
}
} }
if ((defined('IN_CRON') || defined('IMAGE_OUTPUT')) && isset($db)) if ((defined('IN_CRON') || defined('IMAGE_OUTPUT')) && isset($db))
@ -4045,7 +3993,7 @@ function obtain_guest_count($item_id = 0, $item = 'forum')
// Get number of online guests // Get number of online guests
if ($db->sql_layer === 'sqlite') if ($db->sql_layer === 'sqlite' || $db->sql_layer === 'sqlite3')
{ {
$sql = 'SELECT COUNT(session_ip) as num_guests $sql = 'SELECT COUNT(session_ip) as num_guests
FROM ( FROM (
@ -4735,7 +4683,7 @@ function page_header($page_title = '', $display_online_list = false, $item_id =
* @var int item_id Restrict online users to item id * @var int item_id Restrict online users to item id
* @var bool page_header_override Shall we return instead of running * @var bool page_header_override Shall we return instead of running
* the rest of page_header() * the rest of page_header()
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('page_title', 'display_online_list', 'item_id', 'item', 'page_header_override'); $vars = array('page_title', 'display_online_list', 'item_id', 'item', 'page_header_override');
extract($phpbb_dispatcher->trigger_event('core.page_header', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.page_header', compact($vars)));
@ -4911,12 +4859,10 @@ function page_header($page_title = '', $display_online_list = false, $item_id =
} }
} }
$hidden_fields_for_jumpbox = phpbb_build_hidden_fields_for_query_params($request, array('f'));
$notification_mark_hash = generate_link_hash('mark_all_notifications_read'); $notification_mark_hash = generate_link_hash('mark_all_notifications_read');
// The following assigns all _common_ variables that may be used at any point in a template. // The following assigns all _common_ variables that may be used at any point in a template.
$template->assign_vars(array( $template->assign_vars(array(
'CURRENT_USER_AVATAR' => phpbb_get_user_avatar($user->data),
'SITENAME' => $config['sitename'], 'SITENAME' => $config['sitename'],
'SITE_DESCRIPTION' => $config['site_desc'], 'SITE_DESCRIPTION' => $config['site_desc'],
'PAGE_TITLE' => $page_title, 'PAGE_TITLE' => $page_title,
@ -4927,9 +4873,10 @@ function page_header($page_title = '', $display_online_list = false, $item_id =
'TOTAL_USERS_ONLINE' => $l_online_users, 'TOTAL_USERS_ONLINE' => $l_online_users,
'LOGGED_IN_USER_LIST' => $online_userlist, 'LOGGED_IN_USER_LIST' => $online_userlist,
'RECORD_USERS' => $l_online_record, 'RECORD_USERS' => $l_online_record,
'PRIVATE_MESSAGE_COUNT' => (!empty($user->data['user_unread_privmsg'])) ? $user->data['user_unread_privmsg'] : 0,
'HIDDEN_FIELDS_FOR_JUMPBOX' => $hidden_fields_for_jumpbox,
'PRIVATE_MESSAGE_COUNT' => (!empty($user->data['user_unread_privmsg'])) ? $user->data['user_unread_privmsg'] : 0,
'CURRENT_USER_AVATAR' => phpbb_get_user_avatar($user->data),
'CURRENT_USERNAME_FULL' => get_username_string('full', $user->data['user_id'], $user->data['username'], $user->data['user_colour']),
'UNREAD_NOTIFICATIONS_COUNT' => ($notifications !== false) ? $notifications['unread_count'] : '', 'UNREAD_NOTIFICATIONS_COUNT' => ($notifications !== false) ? $notifications['unread_count'] : '',
'NOTIFICATIONS_COUNT' => ($notifications !== false) ? $notifications['unread_count'] : '', 'NOTIFICATIONS_COUNT' => ($notifications !== false) ? $notifications['unread_count'] : '',
'U_VIEW_ALL_NOTIFICATIONS' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=ucp_notifications'), 'U_VIEW_ALL_NOTIFICATIONS' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=ucp_notifications'),
@ -4946,7 +4893,6 @@ function page_header($page_title = '', $display_online_list = false, $item_id =
'SESSION_ID' => $user->session_id, 'SESSION_ID' => $user->session_id,
'ROOT_PATH' => $web_path, 'ROOT_PATH' => $web_path,
'BOARD_URL' => $board_url, 'BOARD_URL' => $board_url,
'USERNAME_FULL' => get_username_string('full', $user->data['user_id'], $user->data['username'], $user->data['user_colour']),
'L_LOGIN_LOGOUT' => $l_login_logout, 'L_LOGIN_LOGOUT' => $l_login_logout,
'L_INDEX' => ($config['board_index_text'] !== '') ? $config['board_index_text'] : $user->lang['FORUM_INDEX'], 'L_INDEX' => ($config['board_index_text'] !== '') ? $config['board_index_text'] : $user->lang['FORUM_INDEX'],
@ -5100,7 +5046,7 @@ function page_footer($run_cron = true, $display_template = true, $exit_handler =
* @var bool run_cron Shall we run cron tasks * @var bool run_cron Shall we run cron tasks
* @var bool page_footer_override Shall we return instead of running * @var bool page_footer_override Shall we return instead of running
* the rest of page_footer() * the rest of page_footer()
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('run_cron', 'page_footer_override'); $vars = array('run_cron', 'page_footer_override');
extract($phpbb_dispatcher->trigger_event('core.page_footer', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.page_footer', compact($vars)));
@ -5208,7 +5154,7 @@ function garbage_collection()
* 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.0-a1
*/ */
$phpbb_dispatcher->dispatch('core.garbage_collection'); $phpbb_dispatcher->dispatch('core.garbage_collection');
} }

View file

@ -41,7 +41,7 @@ function adm_page_header($page_title)
* @var string page_title Page title * @var string page_title Page title
* @var bool adm_page_header_override Shall we return instead of * @var bool adm_page_header_override Shall we return instead of
* running the rest of adm_page_header() * running the rest of adm_page_header()
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('page_title', 'adm_page_header_override'); $vars = array('page_title', 'adm_page_header_override');
extract($phpbb_dispatcher->trigger_event('core.adm_page_header', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.adm_page_header', compact($vars)));
@ -132,7 +132,7 @@ function adm_page_footer($copyright_html = true)
* @var bool copyright_html Shall we display the copyright? * @var bool copyright_html Shall we display the copyright?
* @var bool adm_page_footer_override Shall we return instead of * @var bool adm_page_footer_override Shall we return instead of
* running the rest of adm_page_footer() * running the rest of adm_page_footer()
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('copyright_html', 'adm_page_footer_override'); $vars = array('copyright_html', 'adm_page_footer_override');
extract($phpbb_dispatcher->trigger_event('core.adm_page_footer', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.adm_page_footer', compact($vars)));
@ -396,7 +396,7 @@ function build_cfg_template($tpl_type, $key, &$new, $config_key, $vars)
* @var string name Should be used for the name attribute * @var string name Should be used for the name attribute
* @var array vars Array with the options for the config * @var array vars Array with the options for the config
* @var string tpl The resulting html code we display * @var string tpl The resulting html code we display
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('tpl_type', 'key', 'new', 'name', 'vars', 'tpl'); $vars = array('tpl_type', 'key', 'new', 'name', 'vars', 'tpl');
extract($phpbb_dispatcher->trigger_event('core.build_config_template', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.build_config_template', compact($vars)));
@ -606,7 +606,7 @@ function validate_config_vars($config_vars, &$cfg_array, &$error)
* @var array error Array of errors, the errors should * @var array error Array of errors, the errors should
* be strings only, language keys are * be strings only, language keys are
* not replaced afterwards * not replaced afterwards
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('cfg_array', 'config_name', 'config_definition', 'error'); $vars = array('cfg_array', 'config_name', 'config_definition', 'error');
extract($phpbb_dispatcher->trigger_event('core.validate_config_variable', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.validate_config_variable', compact($vars)));

View file

@ -736,8 +736,6 @@ function delete_posts($where_type, $where_ids, $auto_sync = true, $posted_sync =
// Notifications types to delete // Notifications types to delete
$delete_notifications_types = array( $delete_notifications_types = array(
'quote', 'quote',
'bookmark',
'post',
'approve_post', 'approve_post',
'post_in_queue', 'post_in_queue',
); );
@ -755,7 +753,15 @@ function delete_posts($where_type, $where_ids, $auto_sync = true, $posted_sync =
* @var array delete_notifications_types Array with notifications types to delete * @var array delete_notifications_types Array with notifications types to delete
* @since 3.1.0-a4 * @since 3.1.0-a4
*/ */
$vars = array('where_type', 'where_ids', 'auto_sync', 'posted_sync', 'post_count_sync', 'call_delete_topics', 'delete_notifications_types'); $vars = array(
'where_type',
'where_ids',
'auto_sync',
'posted_sync',
'post_count_sync',
'call_delete_topics',
'delete_notifications_types',
);
extract($phpbb_dispatcher->trigger_event('core.delete_posts_before', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.delete_posts_before', compact($vars)));
if ($where_type === 'range') if ($where_type === 'range')
@ -912,7 +918,15 @@ function delete_posts($where_type, $where_ids, $auto_sync = true, $posted_sync =
* @var array delete_notifications_types Array with notifications types to delete * @var array delete_notifications_types Array with notifications types to delete
* @since 3.1.0-a4 * @since 3.1.0-a4
*/ */
$vars = array('post_ids', 'poster_ids', 'topic_ids', 'forum_ids', 'where_type', 'where_ids', 'delete_notifications_types'); $vars = array(
'post_ids',
'poster_ids',
'topic_ids',
'forum_ids',
'where_type',
'where_ids',
'delete_notifications_types',
);
extract($phpbb_dispatcher->trigger_event('core.delete_posts_in_transaction', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.delete_posts_in_transaction', compact($vars)));
$db->sql_transaction('commit'); $db->sql_transaction('commit');
@ -930,7 +944,15 @@ function delete_posts($where_type, $where_ids, $auto_sync = true, $posted_sync =
* @var array delete_notifications_types Array with notifications types to delete * @var array delete_notifications_types Array with notifications types to delete
* @since 3.1.0-a4 * @since 3.1.0-a4
*/ */
$vars = array('post_ids', 'poster_ids', 'topic_ids', 'forum_ids', 'where_type', 'where_ids', 'delete_notifications_types'); $vars = array(
'post_ids',
'poster_ids',
'topic_ids',
'forum_ids',
'where_type',
'where_ids',
'delete_notifications_types',
);
extract($phpbb_dispatcher->trigger_event('core.delete_posts_after', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.delete_posts_after', compact($vars)));
// Resync topics_posted table // Resync topics_posted table
@ -1489,7 +1511,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
ITEM_DELETED => (!empty($topics_softdeleted)) ? ' WHERE ' . $db->sql_in_set('topic_id', $topics_softdeleted) : '', ITEM_DELETED => (!empty($topics_softdeleted)) ? ' WHERE ' . $db->sql_in_set('topic_id', $topics_softdeleted) : '',
); );
foreach ($topic_visiblities as $visibility => $sql_where) foreach ($update_ary as $visibility => $sql_where)
{ {
if ($sql_where) if ($sql_where)
{ {
@ -1778,7 +1800,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
{ {
$forum_data[$forum_id]['topics_approved'] = $row['total_topics']; $forum_data[$forum_id]['topics_approved'] = $row['total_topics'];
} }
else if ($row['topic_visibility'] == ITEM_UNAPPROVED) else if ($row['topic_visibility'] == ITEM_UNAPPROVED || $row['topic_visibility'] == ITEM_REAPPROVE)
{ {
$forum_data[$forum_id]['topics_unapproved'] = $row['total_topics']; $forum_data[$forum_id]['topics_unapproved'] = $row['total_topics'];
} }
@ -2001,7 +2023,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
{ {
$topic_data[$topic_id]['posts_approved'] = $row['total_posts']; $topic_data[$topic_id]['posts_approved'] = $row['total_posts'];
} }
else if ($row['post_visibility'] == ITEM_UNAPPROVED) else if ($row['post_visibility'] == ITEM_UNAPPROVED || $row['post_visibility'] == ITEM_REAPPROVE)
{ {
$topic_data[$topic_id]['posts_unapproved'] = $row['total_posts']; $topic_data[$topic_id]['posts_unapproved'] = $row['total_posts'];
} }
@ -2023,7 +2045,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
$topic_data[$topic_id]['first_post_id'] = (!empty($topic_data[$topic_id]['first_post_id'])) ? min($topic_data[$topic_id]['first_post_id'], $row['first_post_id']) : $row['first_post_id']; $topic_data[$topic_id]['first_post_id'] = (!empty($topic_data[$topic_id]['first_post_id'])) ? min($topic_data[$topic_id]['first_post_id'], $row['first_post_id']) : $row['first_post_id'];
$topic_data[$topic_id]['last_post_id'] = max($topic_data[$topic_id]['last_post_id'], $row['last_post_id']); $topic_data[$topic_id]['last_post_id'] = max($topic_data[$topic_id]['last_post_id'], $row['last_post_id']);
if ($topic_data[$topic_id]['visibility'] == ITEM_UNAPPROVED) if ($topic_data[$topic_id]['visibility'] == ITEM_UNAPPROVED || $topic_data[$topic_id]['visibility'] == ITEM_REAPPROVE)
{ {
// Soft delete status is stronger than unapproved. // Soft delete status is stronger than unapproved.
$topic_data[$topic_id]['visibility'] = $row['post_visibility']; $topic_data[$topic_id]['visibility'] = $row['post_visibility'];
@ -2418,6 +2440,7 @@ function phpbb_cache_moderators($db, $cache, $auth)
switch ($db->sql_layer) switch ($db->sql_layer)
{ {
case 'sqlite': case 'sqlite':
case 'sqlite3':
case 'firebird': case 'firebird':
$db->sql_query('DELETE FROM ' . MODERATOR_CACHE_TABLE); $db->sql_query('DELETE FROM ' . MODERATOR_CACHE_TABLE);
break; break;
@ -2580,20 +2603,6 @@ function phpbb_cache_moderators($db, $cache, $auth)
$db->sql_multi_insert(MODERATOR_CACHE_TABLE, $sql_ary); $db->sql_multi_insert(MODERATOR_CACHE_TABLE, $sql_ary);
} }
/**
* Cache moderators. Called whenever permissions are changed
* via admin_permissions. Changes of usernames and group names
* must be carried through for the moderators table.
*
* @deprecated 3.1
* @return null
*/
function cache_moderators()
{
global $db, $cache, $auth;
return phpbb_cache_moderators($db, $cache, $auth);
}
/** /**
* View log * View log
* *
@ -2743,20 +2752,6 @@ function phpbb_update_foes($db, $auth, $group_id = false, $user_id = false)
unset($perms); unset($perms);
} }
/**
* Removes moderators and administrators from foe lists.
*
* @deprecated 3.1
* @param array|bool $group_id If an array, remove all members of this group from foe lists, or false to ignore
* @param array|bool $user_id If an array, remove this user from foe lists, or false to ignore
* @return null
*/
function update_foes($group_id = false, $user_id = false)
{
global $db, $auth;
return phpbb_update_foes($db, $auth, $group_id, $user_id);
}
/** /**
* Lists inactive users * Lists inactive users
*/ */
@ -2913,6 +2908,7 @@ function get_database_size()
break; break;
case 'sqlite': case 'sqlite':
case 'sqlite3':
global $dbhost; global $dbhost;
if (file_exists($dbhost)) if (file_exists($dbhost))

View file

@ -116,3 +116,49 @@ function phpbb_clean_path($path)
return $phpbb_path_helper->clean_path($path); return $phpbb_path_helper->clean_path($path);
} }
/**
* Pick a timezone
*
* @param string $default A timezone to select
* @param boolean $truncate Shall we truncate the options text
*
* @return string Returns the options for timezone selector only
*
* @deprecated
*/
function tz_select($default = '', $truncate = false)
{
global $user;
$timezone_select = phpbb_timezone_select($user, $default, $truncate);
return $timezone_select['tz_select'];
}
/**
* Cache moderators. Called whenever permissions are changed
* via admin_permissions. Changes of usernames and group names
* must be carried through for the moderators table.
*
* @deprecated 3.1
* @return null
*/
function cache_moderators()
{
global $db, $cache, $auth;
return phpbb_cache_moderators($db, $cache, $auth);
}
/**
* Removes moderators and administrators from foe lists.
*
* @deprecated 3.1
* @param array|bool $group_id If an array, remove all members of this group from foe lists, or false to ignore
* @param array|bool $user_id If an array, remove this user from foe lists, or false to ignore
* @return null
*/
function update_foes($group_id = false, $user_id = false)
{
global $db, $auth;
return phpbb_update_foes($db, $auth, $group_id, $user_id);
}

View file

@ -110,7 +110,7 @@ function gen_sort_selects(&$limit_days, &$sort_by_text, &$sort_days, &$sort_key,
*/ */
function make_jumpbox($action, $forum_id = false, $select_all = false, $acl_list = false, $force_display = false) function make_jumpbox($action, $forum_id = false, $select_all = false, $acl_list = false, $force_display = false)
{ {
global $config, $auth, $template, $user, $db; global $config, $auth, $template, $user, $db, $phpbb_path_helper;
// We only return if the jumpbox is not forced to be displayed (in case it is needed for functionality) // We only return if the jumpbox is not forced to be displayed (in case it is needed for functionality)
if (!$config['load_jumpbox'] && $force_display === false) if (!$config['load_jumpbox'] && $force_display === false)
@ -196,10 +196,13 @@ function make_jumpbox($action, $forum_id = false, $select_all = false, $acl_list
$db->sql_freeresult($result); $db->sql_freeresult($result);
unset($padding_store); unset($padding_store);
$url_parts = $phpbb_path_helper->get_url_parts($action);
$template->assign_vars(array( $template->assign_vars(array(
'S_DISPLAY_JUMPBOX' => $display_jumpbox, 'S_DISPLAY_JUMPBOX' => $display_jumpbox,
'S_JUMPBOX_ACTION' => $action) 'S_JUMPBOX_ACTION' => $action,
); 'HIDDEN_FIELDS_FOR_JUMPBOX' => build_hidden_fields($url_parts['params']),
));
return; return;
} }
@ -445,7 +448,7 @@ function generate_text_for_display($text, $uid, $bitfield, $flags, $censor_text
* @var string bitfield The BBCode Bitfield * @var string bitfield The BBCode Bitfield
* @var int flags The BBCode Flags * @var int flags The BBCode Flags
* @var bool censor_text Whether or not to apply word censors * @var bool censor_text Whether or not to apply word censors
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('text', 'uid', 'bitfield', 'flags', 'censor_text'); $vars = array('text', 'uid', 'bitfield', 'flags', 'censor_text');
extract($phpbb_dispatcher->trigger_event('core.modify_text_for_display_before', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.modify_text_for_display_before', compact($vars)));
@ -487,7 +490,7 @@ function generate_text_for_display($text, $uid, $bitfield, $flags, $censor_text
* @var string uid The BBCode UID * @var string uid The BBCode UID
* @var string bitfield The BBCode Bitfield * @var string bitfield The BBCode Bitfield
* @var int flags The BBCode Flags * @var int flags The BBCode Flags
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('text', 'uid', 'bitfield', 'flags'); $vars = array('text', 'uid', 'bitfield', 'flags');
extract($phpbb_dispatcher->trigger_event('core.modify_text_for_display_after', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.modify_text_for_display_after', compact($vars)));
@ -525,9 +528,17 @@ function generate_text_for_storage(&$text, &$uid, &$bitfield, &$flags, $allow_bb
* @var bool allow_bbcode Whether or not to parse BBCode * @var bool allow_bbcode Whether or not to parse BBCode
* @var bool allow_urls Whether or not to parse URLs * @var bool allow_urls Whether or not to parse URLs
* @var bool allow_smilies Whether or not to parse Smilies * @var bool allow_smilies Whether or not to parse Smilies
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('text', 'uid', 'bitfield', 'flags', 'allow_bbcode', 'allow_urls', 'allow_smilies'); $vars = array(
'text',
'uid',
'bitfield',
'flags',
'allow_bbcode',
'allow_urls',
'allow_smilies',
);
extract($phpbb_dispatcher->trigger_event('core.modify_text_for_storage_before', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.modify_text_for_storage_before', compact($vars)));
$uid = $bitfield = ''; $uid = $bitfield = '';
@ -565,7 +576,7 @@ function generate_text_for_storage(&$text, &$uid, &$bitfield, &$flags, $allow_bb
* @var string uid The BBCode UID * @var string uid The BBCode UID
* @var string bitfield The BBCode Bitfield * @var string bitfield The BBCode Bitfield
* @var int flags The BBCode Flags * @var int flags The BBCode Flags
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('text', 'uid', 'bitfield', 'flags'); $vars = array('text', 'uid', 'bitfield', 'flags');
extract($phpbb_dispatcher->trigger_event('core.modify_text_for_storage_after', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.modify_text_for_storage_after', compact($vars)));
@ -588,7 +599,7 @@ function generate_text_for_edit($text, $uid, $flags)
* @var string text The text to parse * @var string text The text to parse
* @var string uid The BBCode UID * @var string uid The BBCode UID
* @var int flags The BBCode Flags * @var int flags The BBCode Flags
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('text', 'uid', 'flags'); $vars = array('text', 'uid', 'flags');
extract($phpbb_dispatcher->trigger_event('core.modify_text_for_edit_before', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.modify_text_for_edit_before', compact($vars)));
@ -601,7 +612,7 @@ function generate_text_for_edit($text, $uid, $flags)
* @event core.modify_text_for_edit_after * @event core.modify_text_for_edit_after
* @var string text The text to parse * @var string text The text to parse
* @var int flags The BBCode Flags * @var int flags The BBCode Flags
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('text', 'flags'); $vars = array('text', 'flags');
extract($phpbb_dispatcher->trigger_event('core.modify_text_for_edit_after', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.modify_text_for_edit_after', compact($vars)));
@ -1408,9 +1419,18 @@ function get_username_string($mode, $user_id, $username, $username_colour = '',
* profile url. * profile url.
* @var string username_string The string that has been generated * @var string username_string The string that has been generated
* @var array _profile_cache Array of original return templates * @var array _profile_cache Array of original return templates
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('mode', 'user_id', 'username', 'username_colour', 'guest_username', 'custom_profile_url', 'username_string', '_profile_cache'); $vars = array(
'mode',
'user_id',
'username',
'username_colour',
'guest_username',
'custom_profile_url',
'username_string',
'_profile_cache',
);
extract($phpbb_dispatcher->trigger_event('core.modify_username_string', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.modify_username_string', compact($vars)));
return $username_string; return $username_string;

View file

@ -1650,6 +1650,7 @@ function mass_auth($ug_type, $forum_id, $ug_id, $acl_list, $setting = ACL_NO)
case 'mssql': case 'mssql':
case 'sqlite': case 'sqlite':
case 'sqlite3':
case 'mssqlnative': case 'mssqlnative':
$sql = implode(' UNION ALL ', preg_replace('#^(.*?)$#', 'SELECT \1', $sql_subary)); $sql = implode(' UNION ALL ', preg_replace('#^(.*?)$#', 'SELECT \1', $sql_subary));
break; break;
@ -2037,6 +2038,7 @@ function update_topics_posted()
switch ($db->sql_layer) switch ($db->sql_layer)
{ {
case 'sqlite': case 'sqlite':
case 'sqlite3':
case 'firebird': case 'firebird':
$db->sql_query('DELETE FROM ' . TOPICS_POSTED_TABLE); $db->sql_query('DELETE FROM ' . TOPICS_POSTED_TABLE);
break; break;

View file

@ -138,7 +138,7 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
* *
* @event core.display_forums_modify_sql * @event core.display_forums_modify_sql
* @var array sql_ary The SQL array to get the data of the forums * @var array sql_ary The SQL array to get the data of the forums
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('sql_ary'); $vars = array('sql_ary');
extract($phpbb_dispatcher->trigger_event('core.display_forums_modify_sql', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.display_forums_modify_sql', compact($vars)));
@ -161,7 +161,7 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
* @event core.display_forums_modify_row * @event core.display_forums_modify_row
* @var int branch_root_id Last top-level forum * @var int branch_root_id Last top-level forum
* @var array row The data of the forum * @var array row The data of the forum
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('branch_root_id', 'row'); $vars = array('branch_root_id', 'row');
extract($phpbb_dispatcher->trigger_event('core.display_forums_modify_row', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.display_forums_modify_row', compact($vars)));
@ -318,7 +318,7 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
* @var int branch_root_id Current top-level forum * @var int branch_root_id Current top-level forum
* @var int parent_id Current parent forum * @var int parent_id Current parent forum
* @var array row The data of the forum * @var array row The data of the forum
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('forum_rows', 'subforums', 'branch_root_id', 'parent_id', 'row'); $vars = array('forum_rows', 'subforums', 'branch_root_id', 'parent_id', 'row');
extract($phpbb_dispatcher->trigger_event('core.display_forums_modify_forum_rows', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.display_forums_modify_forum_rows', compact($vars)));
@ -568,7 +568,7 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
* @event core.display_forums_modify_template_vars * @event core.display_forums_modify_template_vars
* @var array forum_row Template data of the forum * @var array forum_row Template data of the forum
* @var array row The data of the forum * @var array row The data of the forum
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('forum_row', 'row'); $vars = array('forum_row', 'row');
extract($phpbb_dispatcher->trigger_event('core.display_forums_modify_template_vars', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.display_forums_modify_template_vars', compact($vars)));
@ -900,7 +900,6 @@ function topic_status(&$topic_row, $replies, $unread_topic, &$folder_img, &$fold
$folder_new .= '_locked'; $folder_new .= '_locked';
} }
$folder_img = ($unread_topic) ? $folder_new : $folder; $folder_img = ($unread_topic) ? $folder_new : $folder;
$folder_alt = ($unread_topic) ? 'UNREAD_POSTS' : (($topic_row['topic_status'] == ITEM_LOCKED) ? 'TOPIC_LOCKED' : 'NO_UNREAD_POSTS'); $folder_alt = ($unread_topic) ? 'UNREAD_POSTS' : (($topic_row['topic_status'] == ITEM_LOCKED) ? 'TOPIC_LOCKED' : 'NO_UNREAD_POSTS');
@ -975,7 +974,7 @@ function display_custom_bbcodes()
* @event core.display_custom_bbcodes_modify_row * @event core.display_custom_bbcodes_modify_row
* @var array custom_tags Template data of the bbcode * @var array custom_tags Template data of the bbcode
* @var array row The data of the bbcode * @var array row The data of the bbcode
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('custom_tags', 'row'); $vars = array('custom_tags', 'row');
extract($phpbb_dispatcher->trigger_event('core.display_custom_bbcodes_modify_row', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.display_custom_bbcodes_modify_row', compact($vars)));
@ -990,7 +989,7 @@ function display_custom_bbcodes()
* Display custom bbcodes * Display custom bbcodes
* *
* @event core.display_custom_bbcodes * @event core.display_custom_bbcodes
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$phpbb_dispatcher->dispatch('core.display_custom_bbcodes'); $phpbb_dispatcher->dispatch('core.display_custom_bbcodes');
} }

View file

@ -106,6 +106,15 @@ function get_available_dbms($dbms = false, $return_unavailable = false, $only_20
'AVAILABLE' => true, 'AVAILABLE' => true,
'2.0.x' => false, '2.0.x' => false,
), ),
'sqlite3' => array(
'LABEL' => 'SQLite3',
'SCHEMA' => 'sqlite',
'MODULE' => 'sqlite3',
'DELIM' => ';',
'DRIVER' => 'phpbb\db\driver\sqlite3',
'AVAILABLE' => true,
'2.0.x' => false,
),
); );
if ($dbms) if ($dbms)
@ -206,14 +215,14 @@ function connect_check_db($error_connect, &$error, $dbms_details, $table_prefix,
$db->sql_return_on_error(true); $db->sql_return_on_error(true);
// Check that we actually have a database name before going any further..... // Check that we actually have a database name before going any further.....
if ($dbms_details['DRIVER'] != 'phpbb\db\driver\sqlite' && $dbms_details['DRIVER'] != 'phpbb\db\driver\oracle' && $dbname === '') if ($dbms_details['DRIVER'] != 'phpbb\db\driver\sqlite' && $dbms_details['DRIVER'] != 'phpbb\db\driver\sqlite3' && $dbms_details['DRIVER'] != 'phpbb\db\driver\oracle' && $dbname === '')
{ {
$error[] = $lang['INST_ERR_DB_NO_NAME']; $error[] = $lang['INST_ERR_DB_NO_NAME'];
return false; return false;
} }
// Make sure we don't have a daft user who thinks having the SQLite database in the forum directory is a good idea // Make sure we don't have a daft user who thinks having the SQLite database in the forum directory is a good idea
if ($dbms_details['DRIVER'] == 'phpbb\db\driver\sqlite' && stripos(phpbb_realpath($dbhost), phpbb_realpath('../')) === 0) if (($dbms_details['DRIVER'] == 'phpbb\db\driver\sqlite' || $dbms_details['DRIVER'] == 'phpbb\db\driver\sqlite3') && stripos(phpbb_realpath($dbhost), phpbb_realpath('../')) === 0)
{ {
$error[] = $lang['INST_ERR_DB_FORUM_PATH']; $error[] = $lang['INST_ERR_DB_FORUM_PATH'];
return false; return false;
@ -243,6 +252,7 @@ function connect_check_db($error_connect, &$error, $dbms_details, $table_prefix,
break; break;
case 'phpbb\db\driver\sqlite': case 'phpbb\db\driver\sqlite':
case 'phpbb\db\driver\sqlite3':
$prefix_length = 200; $prefix_length = 200;
break; break;
@ -299,6 +309,14 @@ function connect_check_db($error_connect, &$error, $dbms_details, $table_prefix,
} }
break; break;
case 'phpbb\db\driver\sqlite3':
$version = \SQLite3::version();
if (version_compare($version['versionString'], '3.6.15', '<'))
{
$error[] = $lang['INST_ERR_DB_NO_SQLITE3'];
}
break;
case 'phpbb\db\driver\firebird': case 'phpbb\db\driver\firebird':
// check the version of FB, use some hackery if we can't get access to the server info // check the version of FB, use some hackery if we can't get access to the server info
if ($db->service_handle !== false && function_exists('ibase_server_info')) if ($db->service_handle !== false && function_exists('ibase_server_info'))

View file

@ -484,14 +484,17 @@ class messenger
$use_queue = true; $use_queue = true;
} }
$contact_name = htmlspecialchars_decode($config['board_contact_name']);
$board_contact = (($contact_name !== '') ? '"' . mail_encode($contact_name) . '" ' : '') . '<' . $config['board_contact'] . '>';
if (empty($this->replyto)) if (empty($this->replyto))
{ {
$this->replyto = '<' . $config['board_contact'] . '>'; $this->replyto = $board_contact;
} }
if (empty($this->from)) if (empty($this->from))
{ {
$this->from = '<' . $config['board_contact'] . '>'; $this->from = $board_contact;
} }
$encode_eol = ($config['smtp_delivery']) ? "\r\n" : $this->eol; $encode_eol = ($config['smtp_delivery']) ? "\r\n" : $this->eol;

View file

@ -398,6 +398,7 @@ class p_master
'cfg_([a-z0-9_]+)' => '(int) $config[\'\\1\']', 'cfg_([a-z0-9_]+)' => '(int) $config[\'\\1\']',
'request_([a-zA-Z0-9_]+)' => '$request->variable(\'\\1\', false)', 'request_([a-zA-Z0-9_]+)' => '$request->variable(\'\\1\', false)',
'ext_([a-zA-Z0-9_/]+)' => 'array_key_exists(\'\\1\', $phpbb_extension_manager->all_enabled())', 'ext_([a-zA-Z0-9_/]+)' => 'array_key_exists(\'\\1\', $phpbb_extension_manager->all_enabled())',
'authmethod_([a-z0-9_\\\\]+)' => '($config[\'auth_method\'] === \'\\1\')',
); );
/** /**
@ -409,7 +410,7 @@ class p_master
* @var string module_auth The module_auth of the current * @var string module_auth The module_auth of the current
* module * module
* @var int forum_id The current forum_id * @var int forum_id The current forum_id
* @since 3.1-A3 * @since 3.1.0-a3
*/ */
$vars = array('valid_tokens', 'module_auth', 'forum_id'); $vars = array('valid_tokens', 'module_auth', 'forum_id');
extract($phpbb_dispatcher->trigger_event('core.module_auth', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.module_auth', compact($vars)));

View file

@ -21,7 +21,7 @@ if (!defined('IN_PHPBB'))
function generate_smilies($mode, $forum_id) function generate_smilies($mode, $forum_id)
{ {
global $db, $user, $config, $template, $phpbb_dispatcher; global $db, $user, $config, $template, $phpbb_dispatcher;
global $phpEx, $phpbb_root_path, $phpbb_container; global $phpEx, $phpbb_root_path, $phpbb_container, $phpbb_path_helper;
$base_url = append_sid("{$phpbb_root_path}posting.$phpEx", 'mode=smilies&amp;f=' . $forum_id); $base_url = append_sid("{$phpbb_root_path}posting.$phpEx", 'mode=smilies&amp;f=' . $forum_id);
$pagination = $phpbb_container->get('pagination'); $pagination = $phpbb_container->get('pagination');
@ -111,7 +111,7 @@ function generate_smilies($mode, $forum_id)
if (sizeof($smilies)) if (sizeof($smilies))
{ {
$root_path = (defined('PHPBB_USE_BOARD_URL_PATH') && PHPBB_USE_BOARD_URL_PATH) ? generate_board_url() . '/' : $phpbb_root_path; $root_path = (defined('PHPBB_USE_BOARD_URL_PATH') && PHPBB_USE_BOARD_URL_PATH) ? generate_board_url() . '/' : $phpbb_path_helper->get_web_root_path();
foreach ($smilies as $row) foreach ($smilies as $row)
{ {
@ -133,7 +133,7 @@ function generate_smilies($mode, $forum_id)
* @var string mode Mode of the smilies: window|inline * @var string mode Mode of the smilies: window|inline
* @var int forum_id The forum ID we are currently in * @var int forum_id The forum ID we are currently in
* @var bool display_link Shall we display the "more smilies" link? * @var bool display_link Shall we display the "more smilies" link?
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('mode', 'forum_id', 'display_link'); $vars = array('mode', 'forum_id', 'display_link');
extract($phpbb_dispatcher->trigger_event('core.generate_smilies_after', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.generate_smilies_after', compact($vars)));
@ -173,7 +173,6 @@ function update_post_information($type, $ids, $return_update_sql = false)
$ids = array($ids); $ids = array($ids);
} }
$update_sql = $empty_forums = $not_empty_forums = array(); $update_sql = $empty_forums = $not_empty_forums = array();
if ($type != 'topic') if ($type != 'topic')
@ -1296,7 +1295,7 @@ function delete_post($forum_id, $topic_id, $post_id, &$data, $is_soft = false, $
{ {
$sql_data[FORUMS_TABLE] .= 'forum_posts_approved = forum_posts_approved - 1, forum_topics_approved = forum_topics_approved - 1'; $sql_data[FORUMS_TABLE] .= 'forum_posts_approved = forum_posts_approved - 1, forum_topics_approved = forum_topics_approved - 1';
} }
else if ($data['topic_visibility'] == ITEM_UNAPPROVED) else if ($data['topic_visibility'] == ITEM_UNAPPROVED || $data['post_visibility'] == ITEM_REAPPROVE)
{ {
$sql_data[FORUMS_TABLE] .= 'forum_posts_unapproved = forum_posts_unapproved - 1, forum_topics_unapproved = forum_topics_unapproved - 1'; $sql_data[FORUMS_TABLE] .= 'forum_posts_unapproved = forum_posts_unapproved - 1, forum_topics_unapproved = forum_topics_unapproved - 1';
} }
@ -1403,7 +1402,7 @@ function delete_post($forum_id, $topic_id, $post_id, &$data, $is_soft = false, $
{ {
$phpbb_content_visibility->remove_post_from_statistic($data, $sql_data); $phpbb_content_visibility->remove_post_from_statistic($data, $sql_data);
} }
else if ($data['post_visibility'] == ITEM_UNAPPROVED) else if ($data['post_visibility'] == ITEM_UNAPPROVED || $data['post_visibility'] == ITEM_REAPPROVE)
{ {
$sql_data[FORUMS_TABLE] = (($sql_data[FORUMS_TABLE]) ? $sql_data[FORUMS_TABLE] . ', ' : '') . 'forum_posts_unapproved = forum_posts_unapproved - 1'; $sql_data[FORUMS_TABLE] = (($sql_data[FORUMS_TABLE]) ? $sql_data[FORUMS_TABLE] . ', ' : '') . 'forum_posts_unapproved = forum_posts_unapproved - 1';
$sql_data[TOPICS_TABLE] = (($sql_data[TOPICS_TABLE]) ? $sql_data[TOPICS_TABLE] . ', ' : '') . 'topic_posts_unapproved = topic_posts_unapproved - 1'; $sql_data[TOPICS_TABLE] = (($sql_data[TOPICS_TABLE]) ? $sql_data[TOPICS_TABLE] . ', ' : '') . 'topic_posts_unapproved = topic_posts_unapproved - 1';
@ -1497,7 +1496,17 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
* @var bool update_search_index Flag indicating if the search index will be updated * @var bool update_search_index Flag indicating if the search index will be updated
* @since 3.1.0-a4 * @since 3.1.0-a4
*/ */
extract($phpbb_dispatcher->trigger_event('core.modify_submit_post_data', compact(array('mode', 'subject', 'username', 'topic_type', 'poll', 'data', 'update_message', 'update_search_index')))); $vars = array(
'mode',
'subject',
'username',
'topic_type',
'poll',
'data',
'update_message',
'update_search_index',
);
extract($phpbb_dispatcher->trigger_event('core.modify_submit_post_data', compact($vars)));
// We do not handle erasing posts here // We do not handle erasing posts here
if ($mode == 'delete') if ($mode == 'delete')
@ -1555,16 +1564,25 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
{ {
// Post not approved, but in queue // Post not approved, but in queue
$post_visibility = ITEM_UNAPPROVED; $post_visibility = ITEM_UNAPPROVED;
switch ($post_mode)
{
case 'edit_first_post':
case 'edit':
case 'edit_last_post':
case 'edit_topic':
$post_visibility = ITEM_REAPPROVE;
break;
}
} }
// MODs/Extensions are able to force any visibility on posts // MODs/Extensions are able to force any visibility on posts
if (isset($data['force_approved_state'])) if (isset($data['force_approved_state']))
{ {
$post_visibility = (in_array((int) $data['force_approved_state'], array(ITEM_APPROVED, ITEM_UNAPPROVED, ITEM_DELETED))) ? (int) $data['force_approved_state'] : $post_visibility; $post_visibility = (in_array((int) $data['force_approved_state'], array(ITEM_APPROVED, ITEM_UNAPPROVED, ITEM_DELETED, ITEM_REAPPROVE))) ? (int) $data['force_approved_state'] : $post_visibility;
} }
if (isset($data['force_visibility'])) if (isset($data['force_visibility']))
{ {
$post_visibility = (in_array((int) $data['force_visibility'], array(ITEM_APPROVED, ITEM_UNAPPROVED, ITEM_DELETED))) ? (int) $data['force_visibility'] : $post_visibility; $post_visibility = (in_array((int) $data['force_visibility'], array(ITEM_APPROVED, ITEM_UNAPPROVED, ITEM_DELETED, ITEM_REAPPROVE))) ? (int) $data['force_visibility'] : $post_visibility;
} }
// Start the transaction here // Start the transaction here
@ -2032,6 +2050,7 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
$first_post_has_topic_info = ($post_mode == 'edit_first_post' && $first_post_has_topic_info = ($post_mode == 'edit_first_post' &&
(($post_visibility == ITEM_DELETED && $data['topic_posts_softdeleted'] == 1) || (($post_visibility == ITEM_DELETED && $data['topic_posts_softdeleted'] == 1) ||
($post_visibility == ITEM_UNAPPROVED && $data['topic_posts_unapproved'] == 1) || ($post_visibility == ITEM_UNAPPROVED && $data['topic_posts_unapproved'] == 1) ||
($post_visibility == ITEM_REAPPROVE && $data['topic_posts_unapproved'] == 1) ||
($post_visibility == ITEM_APPROVED && $data['topic_posts_approved'] == 1))); ($post_visibility == ITEM_APPROVED && $data['topic_posts_approved'] == 1)));
// Fix the post's and topic's visibility and first/last post information, when the post is edited // Fix the post's and topic's visibility and first/last post information, when the post is edited
if (($post_mode != 'post' && $post_mode != 'reply') && $data['post_visibility'] != $post_visibility) if (($post_mode != 'post' && $post_mode != 'reply') && $data['post_visibility'] != $post_visibility)
@ -2039,7 +2058,7 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
// If the post was not approved, it could also be the starter, // If the post was not approved, it could also be the starter,
// so we sync the starter after approving/restoring, to ensure that the stats are correct // so we sync the starter after approving/restoring, to ensure that the stats are correct
// Same applies for the last post // Same applies for the last post
$is_starter = ($post_mode == 'edit_first_post' || $data['post_visibility'] != ITEM_APPROVED); $is_starter = ($post_mode == 'edit_first_post' || $post_mode == 'edit_topic' || $data['post_visibility'] != ITEM_APPROVED);
$is_latest = ($post_mode == 'edit_last_post' || $post_mode == 'edit_topic' || $data['post_visibility'] != ITEM_APPROVED); $is_latest = ($post_mode == 'edit_last_post' || $post_mode == 'edit_topic' || $data['post_visibility'] != ITEM_APPROVED);
$phpbb_content_visibility = $phpbb_container->get('content.visibility'); $phpbb_content_visibility = $phpbb_container->get('content.visibility');
@ -2272,16 +2291,36 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
case 'edit_first_post': case 'edit_first_post':
case 'edit': case 'edit':
case 'edit_last_post': case 'edit_last_post':
if ($data['topic_visibility'] != ITEM_APPROVED) // Nothing to do here
{ break;
$phpbb_notifications->delete_notifications('topic', $data['topic_id']);
} }
}
else if ($post_visibility == ITEM_REAPPROVE)
{
switch ($mode)
{
case 'edit_topic':
case 'edit_first_post':
$phpbb_notifications->add_notifications('topic_in_queue', $notification_data);
$phpbb_notifications->delete_notifications(array( // Delete the approve_post notification so we can notify the user again,
'quote', // when his post got reapproved
'bookmark', $phpbb_notifications->delete_notifications('approve_post', $notification_data['post_id']);
'post', break;
), $data['post_id']);
case 'edit':
case 'edit_last_post':
$phpbb_notifications->add_notifications('post_in_queue', $notification_data);
// Delete the approve_post notification so we can notify the user again,
// when his post got reapproved
$phpbb_notifications->delete_notifications('approve_post', $notification_data['post_id']);
break;
case 'post':
case 'reply':
case 'quote':
// Nothing to do here
break; break;
} }
} }
@ -2292,23 +2331,11 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
case 'post': case 'post':
case 'reply': case 'reply':
case 'quote': case 'quote':
// Nothing to do here
break;
case 'edit_topic': case 'edit_topic':
case 'edit_first_post': case 'edit_first_post':
case 'edit': case 'edit':
case 'edit_last_post': case 'edit_last_post':
if ($data['topic_visibility'] != ITEM_APPROVED) // Nothing to do here
{
$phpbb_notifications->delete_notifications('topic', $data['topic_id']);
}
$phpbb_notifications->delete_notifications(array(
'quote',
'bookmark',
'post',
), $data['post_id']);
break; break;
} }
} }
@ -2345,7 +2372,7 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
* @var string url The "Return to topic" URL * @var string url The "Return to topic" URL
* @var array data Array of post data about the * @var array data Array of post data about the
* submitted post * submitted post
* @since 3.1-A3 * @since 3.1.0-a3
*/ */
$vars = array('url', 'data'); $vars = array('url', 'data');
extract($phpbb_dispatcher->trigger_event('core.submit_post_end', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.submit_post_end', compact($vars)));

View file

@ -314,7 +314,6 @@ function check_rule(&$rules, &$rule_row, &$message_row, $user_id)
break; break;
} }
if (!$result) if (!$result)
{ {
return false; return false;

View file

@ -22,22 +22,22 @@ if (!defined('IN_PHPBB'))
/** /**
* Create a new UrlMatcher class and dump it into the cache file * Create a new UrlMatcher class and dump it into the cache file
* *
* @param \phpbb\extension\finder $finder Extension finder * @param \phpbb\extension\manager $manager Extension manager
* @param RequestContext $context Symfony RequestContext object * @param RequestContext $context Symfony RequestContext object
* @param string $root_path Root path * @param string $root_path Root path
* @param string $php_ext PHP extension * @param string $php_ext PHP extension
* @return null * @return null
*/ */
function phpbb_get_url_matcher(\phpbb\extension\finder $finder, RequestContext $context, $root_path, $php_ext) function phpbb_get_url_matcher(\phpbb\extension\manager $manager, RequestContext $context, $root_path, $php_ext)
{ {
if (defined('DEBUG')) if (defined('DEBUG'))
{ {
return phpbb_create_url_matcher($finder, $context, $root_path); return phpbb_create_url_matcher($manager, $context, $root_path);
} }
if (!phpbb_url_matcher_dumped($root_path, $php_ext)) if (!phpbb_url_matcher_dumped($root_path, $php_ext))
{ {
phpbb_create_dumped_url_matcher($finder, $root_path, $php_ext); phpbb_create_dumped_url_matcher($manager, $root_path, $php_ext);
} }
return phpbb_load_url_matcher($context, $root_path, $php_ext); return phpbb_load_url_matcher($context, $root_path, $php_ext);
@ -46,14 +46,15 @@ function phpbb_get_url_matcher(\phpbb\extension\finder $finder, RequestContext $
/** /**
* Create a new UrlMatcher class and dump it into the cache file * Create a new UrlMatcher class and dump it into the cache file
* *
* @param \phpbb\extension\finder $finder Extension finder * @param \phpbb\extension\manager $manager Extension manager
* @param string $root_path Root path * @param string $root_path Root path
* @param string $php_ext PHP extension * @param string $php_ext PHP extension
* @return null * @return null
*/ */
function phpbb_create_dumped_url_matcher(\phpbb\extension\finder $finder, $root_path, $php_ext) function phpbb_create_dumped_url_matcher(\phpbb\extension\manager $manager, $root_path, $php_ext)
{ {
$provider = new \phpbb\controller\provider($finder); $provider = new \phpbb\controller\provider();
$provider->find_routing_files($manager->get_finder());
$routes = $provider->find($root_path)->get_routes(); $routes = $provider->find($root_path)->get_routes();
$dumper = new PhpMatcherDumper($routes); $dumper = new PhpMatcherDumper($routes);
$cached_url_matcher_dump = $dumper->dump(array( $cached_url_matcher_dump = $dumper->dump(array(
@ -66,13 +67,14 @@ function phpbb_create_dumped_url_matcher(\phpbb\extension\finder $finder, $root_
/** /**
* Create a non-cached UrlMatcher * Create a non-cached UrlMatcher
* *
* @param \phpbb\extension\finder $finder Extension finder * @param \phpbb\extension\manager $manager Extension manager
* @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, $root_path) function phpbb_create_url_matcher(\phpbb\extension\manager $manager, RequestContext $context, $root_path)
{ {
$provider = new \phpbb\controller\provider($finder); $provider = new \phpbb\controller\provider();
$provider->find_routing_files($manager->get_finder());
$routes = $provider->find($root_path)->get_routes(); $routes = $provider->find($root_path)->get_routes();
return new UrlMatcher($routes, $context); return new UrlMatcher($routes, $context);
} }

View file

@ -143,7 +143,7 @@ function user_update_name($old_name, $new_name)
* @event core.update_username * @event core.update_username
* @var string old_name The old username that is replaced * @var string old_name The old username that is replaced
* @var string new_name The new username * @var string new_name The new username
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('old_name', 'new_name'); $vars = array('old_name', 'new_name');
extract($phpbb_dispatcher->trigger_event('core.update_username', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.update_username', compact($vars)));
@ -259,7 +259,7 @@ function user_add($user_row, $cp_data = false)
* *
* @event core.user_add_modify_data * @event core.user_add_modify_data
* @var array sql_ary Array of data to be inserted when a user is added * @var array sql_ary Array of data to be inserted when a user is added
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('sql_ary'); $vars = array('sql_ary');
extract($phpbb_dispatcher->trigger_event('core.user_add_modify_data', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.user_add_modify_data', compact($vars)));
@ -386,7 +386,7 @@ function user_delete($mode, $user_ids, $retain_username = true)
* @var array user_ids IDs of the deleted user * @var array user_ids IDs of the deleted user
* @var mixed retain_username True if username should be retained * @var mixed retain_username True if username should be retained
* or false if not * or false if not
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('mode', 'user_ids', 'retain_username'); $vars = array('mode', 'user_ids', 'retain_username');
extract($phpbb_dispatcher->trigger_event('core.delete_user_before', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.delete_user_before', compact($vars)));
@ -615,7 +615,7 @@ function user_delete($mode, $user_ids, $retain_username = true)
* @var array user_ids IDs of the deleted user * @var array user_ids IDs of the deleted user
* @var mixed retain_username True if username should be retained * @var mixed retain_username True if username should be retained
* or false if not * or false if not
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('mode', 'user_ids', 'retain_username'); $vars = array('mode', 'user_ids', 'retain_username');
extract($phpbb_dispatcher->trigger_event('core.delete_user_after', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.delete_user_after', compact($vars)));
@ -1326,9 +1326,18 @@ function validate_data($data, $val_ary)
{ {
$function = array_shift($validate); $function = array_shift($validate);
array_unshift($validate, $data[$var]); array_unshift($validate, $data[$var]);
$function_prefix = (function_exists('phpbb_validate_' . $function)) ? 'phpbb_validate_' : 'validate_';
if ($result = call_user_func_array($function_prefix . $function, $validate)) if (is_array($function))
{
$result = call_user_func_array(array($function[0], 'validate_' . $function[1]), $validate);
}
else
{
$function_prefix = (function_exists('phpbb_validate_' . $function)) ? 'phpbb_validate_' : 'validate_';
$result = call_user_func_array($function_prefix . $function, $validate);
}
if ($result)
{ {
// Since errors are checked later for their language file existence, we need to make sure custom errors are not adjusted. // Since errors are checked later for their language file existence, we need to make sure custom errors are not adjusted.
$error[] = (empty($user->lang[$result . '_' . strtoupper($var)])) ? $result : $result . '_' . strtoupper($var); $error[] = (empty($user->lang[$result . '_' . strtoupper($var)])) ? $result : $result . '_' . strtoupper($var);
@ -2077,7 +2086,6 @@ function get_avatar_filename($avatar_entry)
{ {
global $config; global $config;
if ($avatar_entry[0] === 'g') if ($avatar_entry[0] === 'g')
{ {
$avatar_group = true; $avatar_group = true;
@ -2504,7 +2512,7 @@ function group_delete($group_id, $group_name = false)
* @event core.delete_group_after * @event core.delete_group_after
* @var int group_id ID of the deleted group * @var int group_id ID of the deleted group
* @var string group_name Name of the deleted group * @var string group_name Name of the deleted group
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('group_id', 'group_name'); $vars = array('group_id', 'group_name');
extract($phpbb_dispatcher->trigger_event('core.delete_group_after', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.delete_group_after', compact($vars)));
@ -2752,7 +2760,7 @@ function group_user_del($group_id, $user_id_ary = false, $username_ary = false,
* @var string group_name Name of the group * @var string group_name Name of the group
* @var array user_id_ary IDs of the users which are removed * @var array user_id_ary IDs of the users which are removed
* @var array username_ary names of the users which are removed * @var array username_ary names of the users which are removed
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('group_id', 'group_name', 'user_id_ary', 'username_ary'); $vars = array('group_id', 'group_name', 'user_id_ary', 'username_ary');
extract($phpbb_dispatcher->trigger_event('core.group_delete_user_before', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.group_delete_user_before', compact($vars)));
@ -3198,7 +3206,7 @@ function group_set_user_default($group_id, $user_id_ary, $group_attributes = fal
* @var array group_attributes Group attributes which were changed * @var array group_attributes Group attributes which were changed
* @var array update_listing Update the list of moderators and foes * @var array update_listing Update the list of moderators and foes
* @var array sql_ary User attributes which were changed * @var array sql_ary User attributes which were changed
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('group_id', 'user_id_ary', 'group_attributes', 'update_listing', 'sql_ary'); $vars = array('group_id', 'user_id_ary', 'group_attributes', 'update_listing', 'sql_ary');
extract($phpbb_dispatcher->trigger_event('core.user_set_default_group', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.user_set_default_group', compact($vars)));
@ -3447,9 +3455,12 @@ function remove_newly_registered($user_id, $user_data = false)
* *
* @param array $user_ids Array of users' ids to check for banning, * @param array $user_ids Array of users' ids to check for banning,
* leave empty to get complete list of banned ids * leave empty to get complete list of banned ids
* @param bool|int $ban_end Bool True to get users currently banned
* Bool False to only get permanently banned users
* Int Unix timestamp to get users banned until that time
* @return array Array of banned users' ids if any, empty array otherwise * @return array Array of banned users' ids if any, empty array otherwise
*/ */
function phpbb_get_banned_user_ids($user_ids = array()) function phpbb_get_banned_user_ids($user_ids = array(), $ban_end = true)
{ {
global $db; global $db;
@ -3461,9 +3472,26 @@ function phpbb_get_banned_user_ids($user_ids = array())
$sql = 'SELECT ban_userid $sql = 'SELECT ban_userid
FROM ' . BANLIST_TABLE . " FROM ' . BANLIST_TABLE . "
WHERE $sql_user_ids WHERE $sql_user_ids
AND ban_exclude <> 1 AND ban_exclude <> 1";
AND (ban_end > " . time() . '
if ($ban_end === true)
{
// Banned currently
$sql .= " AND (ban_end > " . time() . '
OR ban_end = 0)'; OR ban_end = 0)';
}
else if ($ban_end === false)
{
// Permanently banned
$sql .= " AND ban_end = 0";
}
else
{
// Banned until a specified time
$sql .= " AND (ban_end > " . (int) $ban_end . '
OR ban_end = 0)';
}
$result = $db->sql_query($sql); $result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result)) while ($row = $db->sql_fetchrow($result))
{ {

View file

@ -224,7 +224,7 @@ function mcp_forum_view($id, $mode, $action, $forum_info)
$topic_title = censor_text($row['topic_title']); $topic_title = censor_text($row['topic_title']);
$topic_unapproved = ($row['topic_visibility'] == ITEM_UNAPPROVED && $auth->acl_get('m_approve', $row['forum_id'])) ? true : false; $topic_unapproved = (($row['topic_visibility'] == ITEM_UNAPPROVED || $row['topic_visibility'] == ITEM_REAPPROVE) && $auth->acl_get('m_approve', $row['forum_id'])) ? true : false;
$posts_unapproved = ($row['topic_visibility'] == ITEM_APPROVED && $row['topic_posts_unapproved'] && $auth->acl_get('m_approve', $row['forum_id'])) ? true : false; $posts_unapproved = ($row['topic_visibility'] == ITEM_APPROVED && $row['topic_posts_unapproved'] && $auth->acl_get('m_approve', $row['forum_id'])) ? true : false;
$topic_deleted = $row['topic_visibility'] == ITEM_DELETED; $topic_deleted = $row['topic_visibility'] == ITEM_DELETED;
$u_mcp_queue = ($topic_unapproved || $posts_unapproved) ? $url . '&amp;i=queue&amp;mode=' . (($topic_unapproved) ? 'approve_details' : 'unapproved_posts') . '&amp;t=' . $row['topic_id'] : ''; $u_mcp_queue = ($topic_unapproved || $posts_unapproved) ? $url . '&amp;i=queue&amp;mode=' . (($topic_unapproved) ? 'approve_details' : 'unapproved_posts') . '&amp;t=' . $row['topic_id'] : '';
@ -302,7 +302,7 @@ function mcp_forum_view($id, $mode, $action, $forum_info)
* @event core.mcp_view_forum_modify_topicrow * @event core.mcp_view_forum_modify_topicrow
* @var array row Array with topic data * @var array row Array with topic data
* @var array topic_row Template array with topic data * @var array topic_row Template array with topic data
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('row', 'topic_row'); $vars = array('row', 'topic_row');
extract($phpbb_dispatcher->trigger_event('core.mcp_view_forum_modify_topicrow', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.mcp_view_forum_modify_topicrow', compact($vars)));

View file

@ -39,7 +39,7 @@ function mcp_front_view($id, $mode, $action)
$sql = 'SELECT COUNT(post_id) AS total $sql = 'SELECT COUNT(post_id) AS total
FROM ' . POSTS_TABLE . ' FROM ' . POSTS_TABLE . '
WHERE ' . $db->sql_in_set('forum_id', $forum_list) . ' WHERE ' . $db->sql_in_set('forum_id', $forum_list) . '
AND post_visibility = ' . ITEM_UNAPPROVED; AND ' . $db->sql_in_set('post_visibility', array(ITEM_UNAPPROVED, ITEM_REAPPROVE));
$result = $db->sql_query($sql); $result = $db->sql_query($sql);
$total = (int) $db->sql_fetchfield('total'); $total = (int) $db->sql_fetchfield('total');
$db->sql_freeresult($result); $db->sql_freeresult($result);
@ -60,7 +60,7 @@ function mcp_front_view($id, $mode, $action)
$sql = 'SELECT post_id $sql = 'SELECT post_id
FROM ' . POSTS_TABLE . ' FROM ' . POSTS_TABLE . '
WHERE ' . $db->sql_in_set('forum_id', $forum_list) . ' WHERE ' . $db->sql_in_set('forum_id', $forum_list) . '
AND post_visibility = ' . ITEM_UNAPPROVED . ' AND ' . $db->sql_in_set('post_visibility', array(ITEM_UNAPPROVED, ITEM_REAPPROVE)) . '
ORDER BY post_time DESC'; ORDER BY post_time DESC';
$result = $db->sql_query_limit($sql, 5); $result = $db->sql_query_limit($sql, 5);

View file

@ -493,7 +493,7 @@ function mcp_move_topic($topic_ids)
{ {
$topics_moved++; $topics_moved++;
} }
elseif ($topic_info['topic_visibility'] == ITEM_UNAPPROVED) elseif ($topic_info['topic_visibility'] == ITEM_UNAPPROVED || $topic_info['topic_visibility'] == ITEM_REAPPROVE)
{ {
$topics_moved_unapproved++; $topics_moved_unapproved++;
} }
@ -1230,6 +1230,7 @@ function mcp_fork_topic($topic_ids)
$total_topics++; $total_topics++;
break; break;
case ITEM_UNAPPROVED: case ITEM_UNAPPROVED:
case ITEM_REAPPROVE:
$total_topics_unapproved++; $total_topics_unapproved++;
break; break;
case ITEM_DELETED: case ITEM_DELETED:
@ -1316,6 +1317,7 @@ function mcp_fork_topic($topic_ids)
$total_posts++; $total_posts++;
break; break;
case ITEM_UNAPPROVED: case ITEM_UNAPPROVED:
case ITEM_REAPPROVE:
$total_posts_unapproved++; $total_posts_unapproved++;
break; break;
case ITEM_DELETED: case ITEM_DELETED:

View file

@ -203,7 +203,7 @@ function mcp_post_details($id, $mode, $action)
'S_CAN_DELETE_POST' => $auth->acl_get('m_delete', $post_info['forum_id']), 'S_CAN_DELETE_POST' => $auth->acl_get('m_delete', $post_info['forum_id']),
'S_POST_REPORTED' => ($post_info['post_reported']) ? true : false, 'S_POST_REPORTED' => ($post_info['post_reported']) ? true : false,
'S_POST_UNAPPROVED' => ($post_info['post_visibility'] == ITEM_UNAPPROVED) ? true : false, 'S_POST_UNAPPROVED' => ($post_info['post_visibility'] == ITEM_UNAPPROVED || $post_info['post_visibility'] == ITEM_REAPPROVE) ? true : false,
'S_POST_DELETED' => ($post_info['post_visibility'] == ITEM_DELETED) ? true : false, 'S_POST_DELETED' => ($post_info['post_visibility'] == ITEM_DELETED) ? true : false,
'S_POST_LOCKED' => ($post_info['post_edit_locked']) ? true : false, 'S_POST_LOCKED' => ($post_info['post_edit_locked']) ? true : false,
'S_USER_NOTES' => true, 'S_USER_NOTES' => true,

View file

@ -115,10 +115,10 @@ class mcp_queue
if (!empty($topic_id_list)) if (!empty($topic_id_list))
{ {
$post_visibility = ($mode == 'deleted_topics') ? ITEM_DELETED : ITEM_UNAPPROVED; $post_visibility = ($mode == 'deleted_topics') ? ITEM_DELETED : array(ITEM_UNAPPROVED, ITEM_REAPPROVE);
$sql = 'SELECT post_id $sql = 'SELECT post_id
FROM ' . POSTS_TABLE . ' FROM ' . POSTS_TABLE . '
WHERE post_visibility = ' . $post_visibility . ' WHERE ' . $db->sql_in_set('post_visibility', $post_visibility) . '
AND ' . $db->sql_in_set('topic_id', $topic_id_list); AND ' . $db->sql_in_set('topic_id', $topic_id_list);
$result = $db->sql_query($sql); $result = $db->sql_query($sql);
@ -281,7 +281,7 @@ class mcp_queue
'U_APPROVE_ACTION' => append_sid("{$phpbb_root_path}mcp.$phpEx", "i=queue&amp;p=$post_id&amp;f=$forum_id"), 'U_APPROVE_ACTION' => append_sid("{$phpbb_root_path}mcp.$phpEx", "i=queue&amp;p=$post_id&amp;f=$forum_id"),
'S_CAN_VIEWIP' => $auth->acl_get('m_info', $post_info['forum_id']), 'S_CAN_VIEWIP' => $auth->acl_get('m_info', $post_info['forum_id']),
'S_POST_REPORTED' => $post_info['post_reported'], 'S_POST_REPORTED' => $post_info['post_reported'],
'S_POST_UNAPPROVED' => ($post_info['post_visibility'] == ITEM_UNAPPROVED), 'S_POST_UNAPPROVED' => $post_info['post_visibility'] == ITEM_UNAPPROVED || $post_info['post_visibility'] == ITEM_REAPPROVE,
'S_POST_LOCKED' => $post_info['post_edit_locked'], 'S_POST_LOCKED' => $post_info['post_edit_locked'],
'S_USER_NOTES' => true, 'S_USER_NOTES' => true,
'S_POST_DELETED' => ($post_info['post_visibility'] == ITEM_DELETED), 'S_POST_DELETED' => ($post_info['post_visibility'] == ITEM_DELETED),
@ -298,7 +298,6 @@ class mcp_queue
'MINI_POST_IMG' => ($post_unread) ? $user->img('icon_post_target_unread', 'UNREAD_POST') : $user->img('icon_post_target', 'POST'), 'MINI_POST_IMG' => ($post_unread) ? $user->img('icon_post_target_unread', 'UNREAD_POST') : $user->img('icon_post_target', 'POST'),
'RETURN_QUEUE' => sprintf($user->lang['RETURN_QUEUE'], '<a href="' . append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=queue' . (($topic_id) ? '&amp;mode=unapproved_topics' : '&amp;mode=unapproved_posts')) . '&amp;start=' . $start . '">', '</a>'), 'RETURN_QUEUE' => sprintf($user->lang['RETURN_QUEUE'], '<a href="' . append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=queue' . (($topic_id) ? '&amp;mode=unapproved_topics' : '&amp;mode=unapproved_posts')) . '&amp;start=' . $start . '">', '</a>'),
'RETURN_POST' => sprintf($user->lang['RETURN_POST'], '<a href="' . $post_url . '">', '</a>'), 'RETURN_POST' => sprintf($user->lang['RETURN_POST'], '<a href="' . $post_url . '">', '</a>'),
'RETURN_TOPIC_SIMPLE' => sprintf($user->lang['RETURN_TOPIC_SIMPLE'], '<a href="' . $topic_url . '">', '</a>'), 'RETURN_TOPIC_SIMPLE' => sprintf($user->lang['RETURN_TOPIC_SIMPLE'], '<a href="' . $topic_url . '">', '</a>'),
@ -331,7 +330,7 @@ class mcp_queue
$m_perm = 'm_approve'; $m_perm = 'm_approve';
$is_topics = ($mode == 'unapproved_topics' || $mode == 'deleted_topics') ? true : false; $is_topics = ($mode == 'unapproved_topics' || $mode == 'deleted_topics') ? true : false;
$is_restore = ($mode == 'deleted_posts' || $mode == 'deleted_topics') ? true : false; $is_restore = ($mode == 'deleted_posts' || $mode == 'deleted_topics') ? true : false;
$visibility_const = (!$is_restore) ? ITEM_UNAPPROVED : ITEM_DELETED; $visibility_const = (!$is_restore) ? array(ITEM_UNAPPROVED, ITEM_REAPPROVE) : ITEM_DELETED;
$user->add_lang(array('viewtopic', 'viewforum')); $user->add_lang(array('viewtopic', 'viewforum'));
@ -419,7 +418,7 @@ class mcp_queue
$sql = 'SELECT p.post_id $sql = 'SELECT p.post_id
FROM ' . POSTS_TABLE . ' p, ' . TOPICS_TABLE . ' t' . (($sort_order_sql[0] == 'u') ? ', ' . USERS_TABLE . ' u' : '') . ' FROM ' . POSTS_TABLE . ' p, ' . TOPICS_TABLE . ' t' . (($sort_order_sql[0] == 'u') ? ', ' . USERS_TABLE . ' u' : '') . '
WHERE ' . $db->sql_in_set('p.forum_id', $forum_list) . ' WHERE ' . $db->sql_in_set('p.forum_id', $forum_list) . '
AND p.post_visibility = ' . $visibility_const . ' AND ' . $db->sql_in_set('p.post_visibility', $visibility_const) . '
' . (($sort_order_sql[0] == 'u') ? 'AND u.user_id = p.poster_id' : '') . ' ' . (($sort_order_sql[0] == 'u') ? 'AND u.user_id = p.poster_id' : '') . '
' . (($topic_id) ? 'AND p.topic_id = ' . $topic_id : '') . " ' . (($topic_id) ? 'AND p.topic_id = ' . $topic_id : '') . "
AND t.topic_id = p.topic_id AND t.topic_id = p.topic_id
@ -472,7 +471,7 @@ class mcp_queue
$sql = 'SELECT t.forum_id, t.topic_id, t.topic_title, t.topic_title AS post_subject, t.topic_time AS post_time, t.topic_poster AS poster_id, t.topic_first_post_id AS post_id, t.topic_attachment AS post_attachment, t.topic_first_poster_name AS username, t.topic_first_poster_colour AS user_colour $sql = 'SELECT t.forum_id, t.topic_id, t.topic_title, t.topic_title AS post_subject, t.topic_time AS post_time, t.topic_poster AS poster_id, t.topic_first_post_id AS post_id, t.topic_attachment AS post_attachment, t.topic_first_poster_name AS username, t.topic_first_poster_colour AS user_colour
FROM ' . TOPICS_TABLE . ' t FROM ' . TOPICS_TABLE . ' t
WHERE ' . $db->sql_in_set('forum_id', $forum_list) . ' WHERE ' . $db->sql_in_set('forum_id', $forum_list) . '
AND topic_visibility = ' . $visibility_const . " AND ' . $db->sql_in_set('topic_visibility', $visibility_const) . "
AND topic_delete_user <> 0 AND topic_delete_user <> 0
$limit_time_sql $limit_time_sql
ORDER BY $sort_order_sql"; ORDER BY $sort_order_sql";
@ -660,11 +659,18 @@ class mcp_queue
} }
$phpbb_notifications->delete_notifications('post_in_queue', $post_id); $phpbb_notifications->delete_notifications('post_in_queue', $post_id);
// Only add notifications, if we are not reapproving post
// When the topic was already approved, but was edited and
// now needs re-approval, we don't want to notify the users
// again.
if ($post_data['post_visibility'] == ITEM_UNAPPROVED)
{
$phpbb_notifications->add_notifications(array( $phpbb_notifications->add_notifications(array(
'quote', 'quote',
'bookmark', 'bookmark',
'post', 'post',
), $post_data); ), $post_data);
}
$phpbb_notifications->mark_notifications_read(array( $phpbb_notifications->mark_notifications_read(array(
'quote', 'quote',
@ -832,10 +838,18 @@ class mcp_queue
)); ));
$phpbb_notifications->delete_notifications('topic_in_queue', $topic_id); $phpbb_notifications->delete_notifications('topic_in_queue', $topic_id);
// Only add notifications, if we are not reapproving post
// When the topic was already approved, but was edited and
// now needs re-approval, we don't want to notify the users
// again.
if ($topic_data['topic_visibility'] == ITEM_UNAPPROVED)
{
$phpbb_notifications->add_notifications(array( $phpbb_notifications->add_notifications(array(
'quote', 'quote',
'topic', 'topic',
), $topic_data); ), $topic_data);
}
$phpbb_notifications->mark_notifications_read('quote', $topic_data['post_id'], $user->data['user_id']); $phpbb_notifications->mark_notifications_read('quote', $topic_data['post_id'], $user->data['user_id']);
$phpbb_notifications->mark_notifications_read('topic', $topic_id, $user->data['user_id']); $phpbb_notifications->mark_notifications_read('topic', $topic_id, $user->data['user_id']);
@ -1060,7 +1074,7 @@ class mcp_queue
if ($is_disapproving) if ($is_disapproving)
{ {
$l_log_message = ($log_data['type'] == 'topic') ? 'LOG_TOPIC_DISAPPROVED' : 'LOG_POST_DISAPPROVED'; $l_log_message = ($log_data['type'] == 'topic') ? 'LOG_TOPIC_DISAPPROVED' : 'LOG_POST_DISAPPROVED';
add_log('mod', $log_data['forum_id'], $log_data['topic_id'], $l_log_message, $log_data['post_subject'], $disapprove_reason); add_log('mod', $log_data['forum_id'], $log_data['topic_id'], $l_log_message, $log_data['post_subject'], $disapprove_reason, $log_data['post_username']);
} }
else else
{ {
@ -1126,7 +1140,6 @@ class mcp_queue
$post_data['disapprove_reason'] .= ($reason) ? "\n\n" . $reason : ''; $post_data['disapprove_reason'] .= ($reason) ? "\n\n" . $reason : '';
} }
if ($disapprove_all_posts_in_topic && $topic_information[$topic_id]['topic_posts_unapproved'] == 1) if ($disapprove_all_posts_in_topic && $topic_information[$topic_id]['topic_posts_unapproved'] == 1)
{ {
// If there is only 1 post when disapproving the topic, // If there is only 1 post when disapproving the topic,
@ -1144,7 +1157,6 @@ class mcp_queue
unset($lang_reasons, $post_info, $disapprove_reason, $disapprove_reason_lang); unset($lang_reasons, $post_info, $disapprove_reason, $disapprove_reason_lang);
if ($num_disapproved_topics) if ($num_disapproved_topics)
{ {
$success_msg = ($num_disapproved_topics == 1) ? 'TOPIC' : 'TOPICS'; $success_msg = ($num_disapproved_topics == 1) ? 'TOPIC' : 'TOPICS';

View file

@ -144,7 +144,6 @@ class mcp_reports
$post_unread = (isset($topic_tracking_info[$post_info['topic_id']]) && $post_info['post_time'] > $topic_tracking_info[$post_info['topic_id']]) ? true : false; $post_unread = (isset($topic_tracking_info[$post_info['topic_id']]) && $post_info['post_time'] > $topic_tracking_info[$post_info['topic_id']]) ? true : false;
$report['report_text'] = make_clickable(bbcode_nl2br($report['report_text'])); $report['report_text'] = make_clickable(bbcode_nl2br($report['report_text']));
if ($post_info['post_attachment'] && $auth->acl_get('u_download') && $auth->acl_get('f_download', $post_info['forum_id'])) if ($post_info['post_attachment'] && $auth->acl_get('u_download') && $auth->acl_get('f_download', $post_info['forum_id']))
@ -187,7 +186,7 @@ class mcp_reports
'S_CLOSE_ACTION' => append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=reports&amp;mode=report_details&amp;f=' . $post_info['forum_id'] . '&amp;p=' . $post_id), 'S_CLOSE_ACTION' => append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=reports&amp;mode=report_details&amp;f=' . $post_info['forum_id'] . '&amp;p=' . $post_id),
'S_CAN_VIEWIP' => $auth->acl_get('m_info', $post_info['forum_id']), 'S_CAN_VIEWIP' => $auth->acl_get('m_info', $post_info['forum_id']),
'S_POST_REPORTED' => $post_info['post_reported'], 'S_POST_REPORTED' => $post_info['post_reported'],
'S_POST_UNAPPROVED' => ($post_info['post_visibility'] == ITEM_UNAPPROVED), 'S_POST_UNAPPROVED' => $post_info['post_visibility'] == ITEM_UNAPPROVED || $post_info['post_visibility'] == ITEM_REAPPROVE,
'S_POST_LOCKED' => $post_info['post_edit_locked'], 'S_POST_LOCKED' => $post_info['post_edit_locked'],
'S_REPORT_CLOSED' => $report['report_closed'], 'S_REPORT_CLOSED' => $report['report_closed'],
'S_USER_NOTES' => true, 'S_USER_NOTES' => true,
@ -578,7 +577,6 @@ function close_report($report_id_list, $mode, $action, $pm = false)
} }
$db->sql_query($sql); $db->sql_query($sql);
if (sizeof($close_report_posts)) if (sizeof($close_report_posts))
{ {
if ($pm) if ($pm)

View file

@ -212,7 +212,7 @@ function mcp_topic_view($id, $mode, $action)
parse_attachments($topic_info['forum_id'], $message, $attachments[$row['post_id']], $update_count); parse_attachments($topic_info['forum_id'], $message, $attachments[$row['post_id']], $update_count);
} }
if ($row['post_visibility'] == ITEM_UNAPPROVED) if ($row['post_visibility'] == ITEM_UNAPPROVED || $row['post_visibility'] == ITEM_REAPPROVE)
{ {
$has_unapproved_posts = true; $has_unapproved_posts = true;
} }
@ -239,7 +239,7 @@ function mcp_topic_view($id, $mode, $action)
'MINI_POST_IMG' => ($post_unread) ? $user->img('icon_post_target_unread', 'UNREAD_POST') : $user->img('icon_post_target', 'POST'), 'MINI_POST_IMG' => ($post_unread) ? $user->img('icon_post_target_unread', 'UNREAD_POST') : $user->img('icon_post_target', 'POST'),
'S_POST_REPORTED' => ($row['post_reported'] && $auth->acl_get('m_report', $topic_info['forum_id'])), 'S_POST_REPORTED' => ($row['post_reported'] && $auth->acl_get('m_report', $topic_info['forum_id'])),
'S_POST_UNAPPROVED' => ($row['post_visibility'] == ITEM_UNAPPROVED && $auth->acl_get('m_approve', $topic_info['forum_id'])), 'S_POST_UNAPPROVED' => (($row['post_visibility'] == ITEM_UNAPPROVED || $row['post_visibility'] == ITEM_REAPPROVE) && $auth->acl_get('m_approve', $topic_info['forum_id'])),
'S_POST_DELETED' => ($row['post_visibility'] == ITEM_DELETED && $auth->acl_get('m_approve', $topic_info['forum_id'])), 'S_POST_DELETED' => ($row['post_visibility'] == ITEM_DELETED && $auth->acl_get('m_approve', $topic_info['forum_id'])),
'S_CHECKED' => (($submitted_id_list && !in_array(intval($row['post_id']), $submitted_id_list)) || in_array(intval($row['post_id']), $checked_ids)) ? true : false, 'S_CHECKED' => (($submitted_id_list && !in_array(intval($row['post_id']), $submitted_id_list)) || in_array(intval($row['post_id']), $checked_ids)) ? true : false,
'S_HAS_ATTACHMENTS' => (!empty($attachments[$row['post_id']])) ? true : false, 'S_HAS_ATTACHMENTS' => (!empty($attachments[$row['post_id']])) ? true : false,
@ -462,7 +462,7 @@ function split_topic($action, $topic_id, $to_forum_id, $subject)
while ($row = $db->sql_fetchrow($result)) while ($row = $db->sql_fetchrow($result))
{ {
// If split from selected post (split_beyond), we split the unapproved items too. // If split from selected post (split_beyond), we split the unapproved items too.
if ($row['post_visibility'] == ITEM_UNAPPROVED && !$auth->acl_get('m_approve', $row['forum_id'])) if (($row['post_visibility'] == ITEM_UNAPPROVED || $row['post_visibility'] == ITEM_REAPPROVE) && !$auth->acl_get('m_approve', $row['forum_id']))
{ {
// continue; // continue;
} }

View file

@ -1128,7 +1128,7 @@ class parse_message extends bbcode_firstpass
// Maximum message length check. 0 disables this check completely. // Maximum message length check. 0 disables this check completely.
if ((int) $config['max_' . $mode . '_chars'] > 0 && $message_length > (int) $config['max_' . $mode . '_chars']) if ((int) $config['max_' . $mode . '_chars'] > 0 && $message_length > (int) $config['max_' . $mode . '_chars'])
{ {
$this->warn_msg[] = $user->lang('TOO_MANY_CHARS_' . strtoupper($mode), $message_length, (int) $config['max_' . $mode . '_chars']); $this->warn_msg[] = $user->lang('CHARS_' . strtoupper($mode) . '_CONTAINS', $message_length) . '<br />' . $user->lang('TOO_MANY_CHARS_LIMIT', (int) $config['max_' . $mode . '_chars']);
return (!$update_this_message) ? $return_message : $this->warn_msg; return (!$update_this_message) ? $return_message : $this->warn_msg;
} }
@ -1137,7 +1137,7 @@ class parse_message extends bbcode_firstpass
{ {
if (!$message_length || $message_length < (int) $config['min_post_chars']) if (!$message_length || $message_length < (int) $config['min_post_chars'])
{ {
$this->warn_msg[] = (!$message_length) ? $user->lang['TOO_FEW_CHARS'] : $user->lang('TOO_FEW_CHARS_LIMIT', $message_length, (int) $config['min_post_chars']); $this->warn_msg[] = (!$message_length) ? $user->lang['TOO_FEW_CHARS'] : ($user->lang('CHARS_POST_CONTAINS', $message_length) . '<br />' . $user->lang('TOO_FEW_CHARS_LIMIT', (int) $config['min_post_chars']));
return (!$update_this_message) ? $return_message : $this->warn_msg; return (!$update_this_message) ? $return_message : $this->warn_msg;
} }
} }

View file

@ -19,7 +19,7 @@ class ucp_auth_link_info
'title' => 'UCP_AUTH_LINK', 'title' => 'UCP_AUTH_LINK',
'version' => '1.0.0', 'version' => '1.0.0',
'modes' => array( 'modes' => array(
'auth_link' => array('title' => 'UCP_AUTH_LINK_MANAGE', 'auth' => '', 'cat' => array('UCP_PROFILE')), 'auth_link' => array('title' => 'UCP_AUTH_LINK_MANAGE', 'auth' => 'authmethod_oauth', 'cat' => array('UCP_PROFILE')),
), ),
); );
} }

View file

@ -619,7 +619,6 @@ class ucp_main
break; break;
} }
$template->assign_vars(array( $template->assign_vars(array(
'L_TITLE' => $user->lang['UCP_MAIN_' . strtoupper($mode)], 'L_TITLE' => $user->lang['UCP_MAIN_' . strtoupper($mode)],
@ -691,7 +690,6 @@ class ucp_main
AND t.topic_id = tw.topic_id AND t.topic_id = tw.topic_id
AND ' . $db->sql_in_set('t.forum_id', $forbidden_forum_ary, true, true), AND ' . $db->sql_in_set('t.forum_id', $forbidden_forum_ary, true, true),
'ORDER_BY' => 't.topic_last_post_time DESC' 'ORDER_BY' => 't.topic_last_post_time DESC'
); );

View file

@ -172,7 +172,6 @@ class ucp_pm
trigger_error('NO_AUTH_READ_HOLD_MESSAGE'); trigger_error('NO_AUTH_READ_HOLD_MESSAGE');
} }
// First Handle Mark actions and moving messages // First Handle Mark actions and moving messages
$submit_mark = (isset($_POST['submit_mark'])) ? true : false; $submit_mark = (isset($_POST['submit_mark'])) ? true : false;
$move_pm = (isset($_POST['move_pm'])) ? true : false; $move_pm = (isset($_POST['move_pm'])) ? true : false;

View file

@ -586,7 +586,6 @@ function compose_pm($id, $mode, $action, $user_folders = array())
); );
$s_hidden_fields .= build_address_field($address_list); $s_hidden_fields .= build_address_field($address_list);
confirm_box(false, 'SAVE_DRAFT', $s_hidden_fields); confirm_box(false, 'SAVE_DRAFT', $s_hidden_fields);
} }
} }
@ -748,7 +747,6 @@ function compose_pm($id, $mode, $action, $user_folders = array())
$return_box_url = ($action === 'post' || $action === 'edit') ? $outbox_folder_url : $inbox_folder_url; $return_box_url = ($action === 'post' || $action === 'edit') ? $outbox_folder_url : $inbox_folder_url;
$return_box_lang = ($action === 'post' || $action === 'edit') ? 'PM_OUTBOX' : 'PM_INBOX'; $return_box_lang = ($action === 'post' || $action === 'edit') ? 'PM_OUTBOX' : 'PM_INBOX';
$save_message = ($action === 'edit') ? $user->lang['MESSAGE_EDITED'] : $user->lang['MESSAGE_STORED']; $save_message = ($action === 'edit') ? $user->lang['MESSAGE_EDITED'] : $user->lang['MESSAGE_STORED'];
$message = $save_message . '<br /><br />' . $user->lang('VIEW_PRIVATE_MESSAGE', '<a href="' . $return_message_url . '">', '</a>'); $message = $save_message . '<br /><br />' . $user->lang('VIEW_PRIVATE_MESSAGE', '<a href="' . $return_message_url . '">', '</a>');
@ -1006,7 +1004,6 @@ function compose_pm($id, $mode, $action, $user_folders = array())
// Build hidden address list // Build hidden address list
$s_hidden_address_field = build_address_field($address_list); $s_hidden_address_field = build_address_field($address_list);
$bbcode_checked = (isset($enable_bbcode)) ? !$enable_bbcode : (($config['allow_bbcode'] && $auth->acl_get('u_pm_bbcode')) ? !$user->optionget('bbcode') : 1); $bbcode_checked = (isset($enable_bbcode)) ? !$enable_bbcode : (($config['allow_bbcode'] && $auth->acl_get('u_pm_bbcode')) ? !$user->optionget('bbcode') : 1);
$smilies_checked = (isset($enable_smilies)) ? !$enable_smilies : (($config['allow_smilies'] && $auth->acl_get('u_pm_smilies')) ? !$user->optionget('smilies') : 1); $smilies_checked = (isset($enable_smilies)) ? !$enable_smilies : (($config['allow_smilies'] && $auth->acl_get('u_pm_smilies')) ? !$user->optionget('smilies') : 1);
$urls_checked = (isset($enable_urls)) ? !$enable_urls : 0; $urls_checked = (isset($enable_urls)) ? !$enable_urls : 0;
@ -1229,29 +1226,80 @@ function handle_message_list_actions(&$address_list, &$error, $remove_u, $remove
// Check for disallowed recipients // Check for disallowed recipients
if (!empty($address_list['u'])) if (!empty($address_list['u']))
{ {
// We need to check their PM status (do they want to receive PM's?) $can_ignore_allow_pm = $auth->acl_gets('a_', 'm_') || $auth->acl_getf_global('m_');
// Only check if not a moderator or admin, since they are allowed to override this user setting
if (!$auth->acl_gets('a_', 'm_') && !$auth->acl_getf_global('m_')) // Administrator deactivated users check and we need to check their
{ // PM status (do they want to receive PM's?)
$sql = 'SELECT user_id // Only check PM status if not a moderator or admin, since they
// are allowed to override this user setting
$sql = 'SELECT user_id, user_allow_pm
FROM ' . USERS_TABLE . ' FROM ' . USERS_TABLE . '
WHERE ' . $db->sql_in_set('user_id', array_keys($address_list['u'])) . ' WHERE ' . $db->sql_in_set('user_id', array_keys($address_list['u'])) . '
AND user_allow_pm = 0'; AND (
(user_type = ' . USER_INACTIVE . '
AND user_inactive_reason = ' . INACTIVE_MANUAL . ')
' . ($can_ignore_allow_pm ? '' : ' OR user_allow_pm = 0') . '
)';
$result = $db->sql_query($sql); $result = $db->sql_query($sql);
$removed = false; $removed_no_pm = $removed_no_permission = false;
while ($row = $db->sql_fetchrow($result)) while ($row = $db->sql_fetchrow($result))
{ {
$removed = true; if (!$can_ignore_allow_pm && !$row['user_allow_pm'])
{
$removed_no_pm = true;
}
else
{
$removed_no_permission = true;
}
unset($address_list['u'][$row['user_id']]); unset($address_list['u'][$row['user_id']]);
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
// print a notice about users not being added who do not want to receive pms // print a notice about users not being added who do not want to receive pms
if ($removed) if ($removed_no_pm)
{ {
$error[] = $user->lang['PM_USERS_REMOVED_NO_PM']; $error[] = $user->lang['PM_USERS_REMOVED_NO_PM'];
} }
// print a notice about users not being added who do not have permission to receive PMs
if ($removed_no_permission)
{
$error[] = $user->lang['PM_USERS_REMOVED_NO_PERMISSION'];
}
if (!sizeof(array_keys($address_list['u'])))
{
return;
}
// Check if users have permission to read PMs
$can_read = $auth->acl_get_list(array_keys($address_list['u']), 'u_readpm');
$can_read = (empty($can_read) || !isset($can_read[0]['u_readpm'])) ? array() : $can_read[0]['u_readpm'];
$cannot_read_list = array_diff(array_keys($address_list['u']), $can_read);
if (!empty($cannot_read_list))
{
foreach ($cannot_read_list as $cannot_read)
{
unset($address_list['u'][$cannot_read]);
}
$error[] = $user->lang['PM_USERS_REMOVED_NO_PERMISSION'];
}
// Check if users are banned
$banned_user_list = phpbb_get_banned_user_ids(array_keys($address_list['u']), false);
if (!empty($banned_user_list))
{
foreach ($banned_user_list as $banned_user)
{
unset($address_list['u'][$banned_user]);
}
$error[] = $user->lang['PM_USERS_REMOVED_NO_PERMISSION'];
} }
} }
} }

View file

@ -177,6 +177,18 @@ function view_message($id, $mode, $folder_id, $msg_id, $folder, $message_row)
} }
} }
$u_pm = $u_jabber = '';
if ($config['allow_privmsg'] && $auth->acl_get('u_sendpm') && ($user_info['user_allow_pm'] || $auth->acl_gets('a_', 'm_') || $auth->acl_getf_global('m_')))
{
$u_pm = append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&amp;mode=compose&amp;u=' . $author_id);
}
if ($user_info['user_jabber'] && $auth->acl_get('u_sendim'))
{
$u_jabber = append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=contact&amp;action=jabber&amp;u=' . $author_id);
}
$msg_data = array( $msg_data = array(
'MESSAGE_AUTHOR_FULL' => get_username_string('full', $author_id, $user_info['username'], $user_info['user_colour'], $user_info['username']), 'MESSAGE_AUTHOR_FULL' => get_username_string('full', $author_id, $user_info['username'], $user_info['user_colour'], $user_info['username']),
'MESSAGE_AUTHOR_COLOUR' => get_username_string('colour', $author_id, $user_info['username'], $user_info['user_colour'], $user_info['username']), 'MESSAGE_AUTHOR_COLOUR' => get_username_string('colour', $author_id, $user_info['username'], $user_info['user_colour'], $user_info['username']),
@ -208,8 +220,8 @@ function view_message($id, $mode, $folder_id, $msg_id, $folder, $message_row)
'EDITED_MESSAGE' => $l_edited_by, 'EDITED_MESSAGE' => $l_edited_by,
'MESSAGE_ID' => $message_row['msg_id'], 'MESSAGE_ID' => $message_row['msg_id'],
'U_PM' => ($config['allow_privmsg'] && $auth->acl_get('u_sendpm') && ($user_info['user_allow_pm'] || $auth->acl_gets('a_', 'm_') || $auth->acl_getf_global('m_'))) ? append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&amp;mode=compose&amp;u=' . $author_id) : '', 'U_PM' => $u_pm,
'U_JABBER' => ($user_info['user_jabber'] && $auth->acl_get('u_sendim')) ? append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=contact&amp;action=jabber&amp;u=' . $author_id) : '', 'U_JABBER' => $u_jabber,
'U_DELETE' => ($auth->acl_get('u_pm_delete')) ? "$url&amp;mode=compose&amp;action=delete&amp;f=$folder_id&amp;p=" . $message_row['msg_id'] : '', 'U_DELETE' => ($auth->acl_get('u_pm_delete')) ? "$url&amp;mode=compose&amp;action=delete&amp;f=$folder_id&amp;p=" . $message_row['msg_id'] : '',
'U_EMAIL' => $user_info['email'], 'U_EMAIL' => $user_info['email'],
@ -248,13 +260,48 @@ function view_message($id, $mode, $folder_id, $msg_id, $folder, $message_row)
* @var array message_row Array with message data * @var array message_row Array with message data
* @var array cp_row Array with senders custom profile field data * @var array cp_row Array with senders custom profile field data
* @var array msg_data Template array with message data * @var array msg_data Template array with message data
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('id', 'mode', 'folder_id', 'msg_id', 'folder', 'message_row', 'cp_row', 'msg_data'); $vars = array(
'id',
'mode',
'folder_id',
'msg_id',
'folder',
'message_row',
'cp_row',
'msg_data',
);
extract($phpbb_dispatcher->trigger_event('core.ucp_pm_view_messsage', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.ucp_pm_view_messsage', compact($vars)));
$template->assign_vars($msg_data); $template->assign_vars($msg_data);
$contact_fields = array(
array(
'ID' => 'pm',
'NAME' => $user->lang['PRIVATE_MESSAGE'],
'U_CONTACT' => $u_pm,
),
array(
'ID' => 'email',
'NAME' => $user->lang['SEND_EMAIL'],
'U_CONTACT' => $user_info['email'],
),
array(
'ID' => 'jabber',
'NAME' => $user->lang['JABBER'],
'U_CONTACT' => $u_jabber,
),
);
foreach ($contact_fields as $field)
{
if ($field['U_CONTACT'])
{
$template->assign_block_vars('contact', $field);
}
}
// Display the custom profile fields // Display the custom profile fields
if (!empty($cp_row['row'])) if (!empty($cp_row['row']))
{ {
@ -263,6 +310,15 @@ function view_message($id, $mode, $folder_id, $msg_id, $folder, $message_row)
foreach ($cp_row['blockrow'] as $cp_block_row) foreach ($cp_row['blockrow'] as $cp_block_row)
{ {
$template->assign_block_vars('custom_fields', $cp_block_row); $template->assign_block_vars('custom_fields', $cp_block_row);
if ($cp_block_row['S_PROFILE_CONTACT'])
{
$template->assign_block_vars('contact', array(
'ID' => $cp_block_row['PROFILE_FIELD_IDENT'],
'NAME' => $cp_block_row['PROFILE_FIELD_NAME'],
'U_CONTACT' => $cp_block_row['PROFILE_FIELD_CONTACT'],
));
}
} }
} }

View file

@ -64,7 +64,7 @@ class ucp_prefs
* @var bool submit Do we display the form only * @var bool submit Do we display the form only
* or did the user press submit * or did the user press submit
* @var array data Array with current ucp options data * @var array data Array with current ucp options data
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('submit', 'data'); $vars = array('submit', 'data');
extract($phpbb_dispatcher->trigger_event('core.ucp_prefs_personal_data', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.ucp_prefs_personal_data', compact($vars)));
@ -113,7 +113,7 @@ class ucp_prefs
* @event core.ucp_prefs_personal_update_data * @event core.ucp_prefs_personal_update_data
* @var array data Submitted display options data * @var array data Submitted display options data
* @var array sql_ary Display options data we udpate * @var array sql_ary Display options data we udpate
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('data', 'sql_ary'); $vars = array('data', 'sql_ary');
extract($phpbb_dispatcher->trigger_event('core.ucp_prefs_personal_update_data', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.ucp_prefs_personal_update_data', compact($vars)));
@ -243,7 +243,7 @@ class ucp_prefs
* @var bool submit Do we display the form only * @var bool submit Do we display the form only
* or did the user press submit * or did the user press submit
* @var array data Array with current ucp options data * @var array data Array with current ucp options data
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('submit', 'data'); $vars = array('submit', 'data');
extract($phpbb_dispatcher->trigger_event('core.ucp_prefs_view_data', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.ucp_prefs_view_data', compact($vars)));
@ -292,7 +292,7 @@ class ucp_prefs
* @event core.ucp_prefs_view_update_data * @event core.ucp_prefs_view_update_data
* @var array data Submitted display options data * @var array data Submitted display options data
* @var array sql_ary Display options data we udpate * @var array sql_ary Display options data we udpate
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('data', 'sql_ary'); $vars = array('data', 'sql_ary');
extract($phpbb_dispatcher->trigger_event('core.ucp_prefs_view_update_data', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.ucp_prefs_view_update_data', compact($vars)));
@ -394,7 +394,7 @@ class ucp_prefs
* @var bool submit Do we display the form only * @var bool submit Do we display the form only
* or did the user press submit * or did the user press submit
* @var array data Array with current ucp options data * @var array data Array with current ucp options data
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('submit', 'data'); $vars = array('submit', 'data');
extract($phpbb_dispatcher->trigger_event('core.ucp_prefs_post_data', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.ucp_prefs_post_data', compact($vars)));
@ -418,7 +418,7 @@ class ucp_prefs
* @event core.ucp_prefs_post_update_data * @event core.ucp_prefs_post_update_data
* @var array data Submitted display options data * @var array data Submitted display options data
* @var array sql_ary Display options data we udpate * @var array sql_ary Display options data we udpate
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('data', 'sql_ary'); $vars = array('data', 'sql_ary');
extract($phpbb_dispatcher->trigger_event('core.ucp_prefs_post_update_data', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.ucp_prefs_post_update_data', compact($vars)));

View file

@ -64,10 +64,7 @@ class ucp_register
$agreed = false; $agreed = false;
} }
$user->lang_name = $user_lang = $use_lang; $user_lang = $use_lang;
$user->lang = array();
$user->data['user_lang'] = $user->lang_name;
$user->add_lang(array('common', 'ucp'));
} }
else else
{ {
@ -101,7 +98,6 @@ class ucp_register
if (!$agreed || ($coppa === false && $config['coppa_enable']) || ($coppa && !$config['coppa_enable'])) if (!$agreed || ($coppa === false && $config['coppa_enable']) || ($coppa && !$config['coppa_enable']))
{ {
$add_lang = ($change_lang) ? '&amp;change_lang=' . urlencode($change_lang) : '';
$add_coppa = ($coppa !== false) ? '&amp;coppa=' . $coppa : ''; $add_coppa = ($coppa !== false) ? '&amp;coppa=' . $coppa : '';
$s_hidden_fields = array_merge($s_hidden_fields, array( $s_hidden_fields = array_merge($s_hidden_fields, array(
@ -147,12 +143,15 @@ class ucp_register
'L_COPPA_NO' => sprintf($user->lang['UCP_COPPA_BEFORE'], $coppa_birthday), 'L_COPPA_NO' => sprintf($user->lang['UCP_COPPA_BEFORE'], $coppa_birthday),
'L_COPPA_YES' => sprintf($user->lang['UCP_COPPA_ON_AFTER'], $coppa_birthday), 'L_COPPA_YES' => sprintf($user->lang['UCP_COPPA_ON_AFTER'], $coppa_birthday),
'U_COPPA_NO' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=register&amp;coppa=0' . $add_lang), 'U_COPPA_NO' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=register&amp;coppa=0'),
'U_COPPA_YES' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=register&amp;coppa=1' . $add_lang), 'U_COPPA_YES' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=register&amp;coppa=1'),
'S_SHOW_COPPA' => true, 'S_SHOW_COPPA' => true,
'S_HIDDEN_FIELDS' => build_hidden_fields($s_hidden_fields), 'S_HIDDEN_FIELDS' => build_hidden_fields($s_hidden_fields),
'S_UCP_ACTION' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=register' . $add_lang), 'S_UCP_ACTION' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=register'),
'COOKIE_NAME' => $config['cookie_name'],
'COOKIE_PATH' => $config['cookie_path'],
)); ));
} }
else else
@ -164,7 +163,10 @@ class ucp_register
'S_SHOW_COPPA' => false, 'S_SHOW_COPPA' => false,
'S_REGISTRATION' => true, 'S_REGISTRATION' => true,
'S_HIDDEN_FIELDS' => build_hidden_fields($s_hidden_fields), 'S_HIDDEN_FIELDS' => build_hidden_fields($s_hidden_fields),
'S_UCP_ACTION' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=register' . $add_lang . $add_coppa), 'S_UCP_ACTION' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=register' . $add_coppa),
'COOKIE_NAME' => $config['cookie_name'],
'COOKIE_PATH' => $config['cookie_path'],
) )
); );
} }
@ -469,6 +471,9 @@ class ucp_register
'S_COPPA' => $coppa, 'S_COPPA' => $coppa,
'S_HIDDEN_FIELDS' => $s_hidden_fields, 'S_HIDDEN_FIELDS' => $s_hidden_fields,
'S_UCP_ACTION' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=register'), 'S_UCP_ACTION' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=register'),
'COOKIE_NAME' => $config['cookie_name'],
'COOKIE_PATH' => $config['cookie_path'],
)); ));
// //

View file

@ -62,7 +62,7 @@ class ucp_zebra
* @event core.ucp_remove_zebra * @event core.ucp_remove_zebra
* @var string mode Zebra type: friends|foes * @var string mode Zebra type: friends|foes
* @var array user_ids User ids we remove * @var array user_ids User ids we remove
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('mode', '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)));
@ -207,7 +207,7 @@ class ucp_zebra
* friends|foes * friends|foes
* @var array sql_ary Array of * @var array sql_ary Array of
* entries we add * entries we add
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('mode', 'sql_ary'); $vars = array('mode', 'sql_ary');
extract($phpbb_dispatcher->trigger_event('core.ucp_add_zebra', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.ucp_add_zebra', compact($vars)));

View file

@ -479,7 +479,6 @@ class utf_normalizer
continue; continue;
} }
// STEP 1: Decompose current char // STEP 1: Decompose current char
// We have found a character that is either: // We have found a character that is either:
@ -527,7 +526,6 @@ class utf_normalizer
$utf_seq = array($utf_char); $utf_seq = array($utf_char);
} }
// STEP 2: Capture the starter // STEP 2: Capture the starter
// Check out the combining class of the first character of the UTF sequence // Check out the combining class of the first character of the UTF sequence
@ -683,7 +681,6 @@ class utf_normalizer
} }
} }
// STEP 3: Capture following combining modifiers // STEP 3: Capture following combining modifiers
while ($pos < $len) while ($pos < $len)
@ -752,7 +749,6 @@ class utf_normalizer
} }
} }
// STEP 4: Sort and combine // STEP 4: Sort and combine
// Here we sort... // Here we sort...
@ -991,7 +987,6 @@ class utf_normalizer
$tmp_pos = $last_cc = $sort = $dump = 0; $tmp_pos = $last_cc = $sort = $dump = 0;
$utf_sort = array(); $utf_sort = array();
// Main loop // Main loop
do do
{ {
@ -1047,7 +1042,6 @@ class utf_normalizer
continue; continue;
} }
// STEP 1: Decide what to do with current char // STEP 1: Decide what to do with current char
// Now, in that order: // Now, in that order:

View file

@ -63,7 +63,7 @@ if (($mark_notification = $request->variable('mark_notification', 0)))
redirect(append_sid($phpbb_root_path . $redirect)); redirect(append_sid($phpbb_root_path . $redirect));
} }
redirect($notification->get_url()); redirect($notification->get_redirect_url());
} }
} }
} }
@ -188,7 +188,7 @@ $page_title = $user->lang['INDEX'];
* *
* @event core.index_modify_page_title * @event core.index_modify_page_title
* @var string page_title Title of the index page * @var string page_title Title of the index page
* @since 3.1-A1 * @since 3.1.0-a1
*/ */
$vars = array('page_title'); $vars = array('page_title');
extract($phpbb_dispatcher->trigger_event('core.index_modify_page_title', compact($vars))); extract($phpbb_dispatcher->trigger_event('core.index_modify_page_title', compact($vars)));

View file

@ -33,7 +33,7 @@ $dbms = phpbb_convert_30_dbms_to_31($dbms);
$convertor_data = array( $convertor_data = array(
'forum_name' => 'phpBB 2.0.x', 'forum_name' => 'phpBB 2.0.x',
'version' => '1.0.3', 'version' => '1.0.3',
'phpbb_version' => '3.1.0-b2', 'phpbb_version' => '3.1.0-b3',
'author' => '<a href="https://www.phpbb.com/">phpBB Group</a>', 'author' => '<a href="https://www.phpbb.com/">phpBB Group</a>',
'dbms' => $dbms, 'dbms' => $dbms,
'dbhost' => $dbhost, 'dbhost' => $dbhost,

View file

@ -71,7 +71,6 @@ function phpbb_insert_forums()
$prune_enabled = (int) $src_db->sql_fetchfield('config_value'); $prune_enabled = (int) $src_db->sql_fetchfield('config_value');
$src_db->sql_freeresult($result); $src_db->sql_freeresult($result);
// Insert categories // Insert categories
$sql = 'SELECT cat_id, cat_title $sql = 'SELECT cat_id, cat_title
FROM ' . $convert->src_table_prefix . 'categories FROM ' . $convert->src_table_prefix . 'categories
@ -571,7 +570,6 @@ function phpbb_convert_authentication($mode)
// What we will do is handling all 2.0.x admins as founder to replicate what is common in 2.0.x. // What we will do is handling all 2.0.x admins as founder to replicate what is common in 2.0.x.
// After conversion the main admin need to make sure he is removing permissions and the founder status if wanted. // After conversion the main admin need to make sure he is removing permissions and the founder status if wanted.
// Grab user ids of users with user_level of ADMIN // Grab user ids of users with user_level of ADMIN
$sql = "SELECT user_id $sql = "SELECT user_id
FROM {$convert->src_table_prefix}users FROM {$convert->src_table_prefix}users
@ -1845,6 +1843,7 @@ function phpbb_create_userconv_table()
break; break;
case 'sqlite': case 'sqlite':
case 'sqlite3':
$create_sql = 'CREATE TABLE ' . USERCONV_TABLE . ' ( $create_sql = 'CREATE TABLE ' . USERCONV_TABLE . ' (
user_id INTEGER NOT NULL DEFAULT \'0\', user_id INTEGER NOT NULL DEFAULT \'0\',
username_clean varchar(255) NOT NULL DEFAULT \'\' username_clean varchar(255) NOT NULL DEFAULT \'\'

View file

@ -115,7 +115,13 @@ request_var('', 0, false, false, $request); // "dependency injection" for a func
$config = $phpbb_container->get('config'); $config = $phpbb_container->get('config');
set_config(null, null, null, $config); set_config(null, null, null, $config);
set_config_count(null, null, null, $config); set_config_count(null, null, null, $config);
$orig_version = $config['version'];
if (!isset($config['version_update_from']))
{
$config->set('version_update_from', $config['version']);
}
$orig_version = $config['version_update_from'];
$user->add_lang(array('common', 'acp/common', 'install', 'migrator')); $user->add_lang(array('common', 'acp/common', 'install', 'migrator'));
@ -169,6 +175,8 @@ header('Content-type: text/html; charset=UTF-8');
<?php <?php
define('IN_DB_UPDATE', true);
/** /**
* @todo firebird/mysql update? * @todo firebird/mysql update?
*/ */
@ -285,4 +293,6 @@ else
echo $user->lang['COMPLETE_LOGIN_TO_BOARD']; echo $user->lang['COMPLETE_LOGIN_TO_BOARD'];
} }
$config->delete('version_update_from');
phpbb_end_update($cache, $config); phpbb_end_update($cache, $config);

View file

@ -249,6 +249,7 @@ class install_convert extends module
switch ($db->sql_layer) switch ($db->sql_layer)
{ {
case 'sqlite': case 'sqlite':
case 'sqlite3':
case 'firebird': case 'firebird':
$db->sql_query('DELETE FROM ' . SESSIONS_KEYS_TABLE); $db->sql_query('DELETE FROM ' . SESSIONS_KEYS_TABLE);
$db->sql_query('DELETE FROM ' . SESSIONS_TABLE); $db->sql_query('DELETE FROM ' . SESSIONS_TABLE);
@ -696,6 +697,7 @@ class install_convert extends module
switch ($src_db->sql_layer) switch ($src_db->sql_layer)
{ {
case 'sqlite': case 'sqlite':
case 'sqlite3':
case 'firebird': case 'firebird':
$convert->src_truncate_statement = 'DELETE FROM '; $convert->src_truncate_statement = 'DELETE FROM ';
break; break;
@ -728,6 +730,7 @@ class install_convert extends module
switch ($db->sql_layer) switch ($db->sql_layer)
{ {
case 'sqlite': case 'sqlite':
case 'sqlite3':
case 'firebird': case 'firebird':
$convert->truncate_statement = 'DELETE FROM '; $convert->truncate_statement = 'DELETE FROM ';
break; break;

View file

@ -217,7 +217,6 @@ class install_install extends module
'S_LEGEND' => false, 'S_LEGEND' => false,
)); ));
// Check for getimagesize // Check for getimagesize
if (@function_exists('getimagesize')) if (@function_exists('getimagesize'))
{ {
@ -291,8 +290,8 @@ class install_install extends module
$checks = array( $checks = array(
array('func_overload', '&', MB_OVERLOAD_MAIL|MB_OVERLOAD_STRING), array('func_overload', '&', MB_OVERLOAD_MAIL|MB_OVERLOAD_STRING),
array('encoding_translation', '!=', 0), array('encoding_translation', '!=', 0),
array('http_input', '!=', 'pass'), array('http_input', '!=', array('pass', '')),
array('http_output', '!=', 'pass') array('http_output', '!=', array('pass', ''))
); );
foreach ($checks as $mb_checks) foreach ($checks as $mb_checks)
@ -313,7 +312,8 @@ class install_install extends module
break; break;
case '!=': case '!=':
if ($ini_val != $mb_checks[2]) if (!is_array($mb_checks[2]) && $ini_val != $mb_checks[2] ||
is_array($mb_checks[2]) && !in_array($ini_val, $mb_checks[2]))
{ {
$result = '<strong style="color:red">' . $lang['NO'] . '</strong>'; $result = '<strong style="color:red">' . $lang['NO'] . '</strong>';
$passed['mbstring'] = false; $passed['mbstring'] = false;
@ -535,7 +535,6 @@ class install_install extends module
$url = (!in_array(false, $passed)) ? $this->p_master->module_url . "?mode=$mode&amp;sub=database&amp;language=$language" : $this->p_master->module_url . "?mode=$mode&amp;sub=requirements&amp;language=$language "; $url = (!in_array(false, $passed)) ? $this->p_master->module_url . "?mode=$mode&amp;sub=database&amp;language=$language" : $this->p_master->module_url . "?mode=$mode&amp;sub=requirements&amp;language=$language ";
$submit = (!in_array(false, $passed)) ? $lang['INSTALL_START'] : $lang['INSTALL_TEST']; $submit = (!in_array(false, $passed)) ? $lang['INSTALL_START'] : $lang['INSTALL_TEST'];
$template->assign_vars(array( $template->assign_vars(array(
'L_SUBMIT' => $submit, 'L_SUBMIT' => $submit,
'S_HIDDEN' => $s_hidden_fields, 'S_HIDDEN' => $s_hidden_fields,
@ -1649,6 +1648,45 @@ class install_install extends module
$_module->move_module_by($row, 'move_up', 5); $_module->move_module_by($row, 'move_up', 5);
} }
if ($module_class == 'mcp')
{
// Move pm report details module 3 down...
$sql = 'SELECT *
FROM ' . MODULES_TABLE . "
WHERE module_basename = 'mcp_pm_reports'
AND module_class = 'mcp'
AND module_mode = 'pm_report_details'";
$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
$_module->move_module_by($row, 'move_down', 3);
// Move closed pm reports module 3 down...
$sql = 'SELECT *
FROM ' . MODULES_TABLE . "
WHERE module_basename = 'mcp_pm_reports'
AND module_class = 'mcp'
AND module_mode = 'pm_reports_closed'";
$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
$_module->move_module_by($row, 'move_down', 3);
// Move open pm reports module 3 down...
$sql = 'SELECT *
FROM ' . MODULES_TABLE . "
WHERE module_basename = 'mcp_pm_reports'
AND module_class = 'mcp'
AND module_mode = 'pm_reports'";
$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
$_module->move_module_by($row, 'move_down', 3);
}
if ($module_class == 'ucp') if ($module_class == 'ucp')
{ {
// Move attachment module 4 down... // Move attachment module 4 down...
@ -1674,6 +1712,18 @@ class install_install extends module
$db->sql_freeresult($result); $db->sql_freeresult($result);
$_module->move_module_by($row, 'move_down', 4); $_module->move_module_by($row, 'move_down', 4);
// Move OAuth module 5 down...
$sql = 'SELECT *
FROM ' . MODULES_TABLE . "
WHERE module_basename = 'ucp_auth_link'
AND module_class = 'ucp'
AND module_mode = 'auth_link'";
$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
$_module->move_module_by($row, 'move_down', 5);
} }
// And now for the special ones // And now for the special ones

View file

@ -21,6 +21,7 @@ INSERT INTO phpbb_config (config_name, config_value) VALUES ('allow_cdn', '0');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('allow_emailreuse', '0'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('allow_emailreuse', '0');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('allow_password_reset', '1'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('allow_password_reset', '1');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('allow_forum_notify', '1'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('allow_forum_notify', '1');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('allow_live_searches', '1');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('allow_mass_pm', '1'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('allow_mass_pm', '1');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('allow_name_chars', 'USERNAME_CHARS_ANY'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('allow_name_chars', 'USERNAME_CHARS_ANY');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('allow_namechange', '0'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('allow_namechange', '0');
@ -56,6 +57,7 @@ INSERT INTO phpbb_config (config_name, config_value) VALUES ('avatar_min_width',
INSERT INTO phpbb_config (config_name, config_value) VALUES ('avatar_path', 'images/avatars/upload'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('avatar_path', 'images/avatars/upload');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('avatar_salt', 'phpbb_avatar'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('avatar_salt', 'phpbb_avatar');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('board_contact', 'contact@yourdomain.tld'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('board_contact', 'contact@yourdomain.tld');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('board_contact_name', '');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('board_disable', '0'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('board_disable', '0');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('board_disable_msg', ''); INSERT INTO phpbb_config (config_name, config_value) VALUES ('board_disable_msg', '');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('board_email', 'address@yourdomain.tld'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('board_email', 'address@yourdomain.tld');
@ -269,7 +271,7 @@ INSERT INTO phpbb_config (config_name, config_value) VALUES ('tpl_allow_php', '0
INSERT INTO phpbb_config (config_name, config_value) VALUES ('upload_icons_path', 'images/upload_icons'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('upload_icons_path', 'images/upload_icons');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('upload_path', 'files'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('upload_path', 'files');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('use_system_cron', '0'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('use_system_cron', '0');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('version', '3.1.0-b3-dev'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('version', '3.1.0-b4-dev');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('warnings_expire_days', '90'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('warnings_expire_days', '90');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('warnings_gc', '14400'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('warnings_gc', '14400');

View file

@ -107,6 +107,9 @@ $lang = array_merge($lang, array(
'EXT_GROUP_REAL_MEDIA' => 'Real Media', 'EXT_GROUP_REAL_MEDIA' => 'Real Media',
'EXT_GROUP_WINDOWS_MEDIA' => 'Windows Media', 'EXT_GROUP_WINDOWS_MEDIA' => 'Windows Media',
'FILES_GONE' => 'Some of the attachments you selected for deletion do not exist. They may have been already deleted. Attachments that did exist were deleted.',
'FILES_STATS_WRONG' => 'Your file statistics are likely inaccurate and need to be resynchronised. Actual values: number of attachments = %1$d, total size of attachments = %2$s.<br />Click %3$shere%4$s to resynchronise them.',
'GO_TO_EXTENSIONS' => 'Go to extension management screen', 'GO_TO_EXTENSIONS' => 'Go to extension management screen',
'GROUP_NAME' => 'Group name', 'GROUP_NAME' => 'Group name',
@ -130,6 +133,7 @@ $lang = array_merge($lang, array(
'NOT_ALLOWED_IN_PM' => 'Only allowed in posts', 'NOT_ALLOWED_IN_PM' => 'Only allowed in posts',
'NOT_ALLOWED_IN_PM_POST' => 'Not allowed', 'NOT_ALLOWED_IN_PM_POST' => 'Not allowed',
'NOT_ASSIGNED' => 'Not assigned', 'NOT_ASSIGNED' => 'Not assigned',
'NO_ATTACHMENTS' => 'No attachments found for this period.',
'NO_EXT_GROUP' => 'None', 'NO_EXT_GROUP' => 'None',
'NO_EXT_GROUP_NAME' => 'No group name entered', 'NO_EXT_GROUP_NAME' => 'No group name entered',
'NO_EXT_GROUP_SPECIFIED' => 'No extension group specified.', 'NO_EXT_GROUP_SPECIFIED' => 'No extension group specified.',
@ -145,6 +149,7 @@ $lang = array_merge($lang, array(
'REMOVE_ALLOWED_IPS' => 'Remove or un-exclude <em>allowed</em> IPs/hostnames', 'REMOVE_ALLOWED_IPS' => 'Remove or un-exclude <em>allowed</em> IPs/hostnames',
'REMOVE_DISALLOWED_IPS' => 'Remove or un-exclude <em>disallowed</em> IPs/hostnames', 'REMOVE_DISALLOWED_IPS' => 'Remove or un-exclude <em>disallowed</em> IPs/hostnames',
'RESYNC_FILES_STATS_CONFIRM' => 'Are you sure you wish to resynchronise file statistics?',
'SEARCH_IMAGICK' => 'Search for Imagemagick', 'SEARCH_IMAGICK' => 'Search for Imagemagick',
'SECURE_ALLOW_DENY' => 'Allow/Deny list', 'SECURE_ALLOW_DENY' => 'Allow/Deny list',

View file

@ -111,7 +111,7 @@ $lang = array_merge($lang, array(
'AVATAR_GALLERY_PATH' => 'Avatar gallery path', 'AVATAR_GALLERY_PATH' => 'Avatar gallery path',
'AVATAR_GALLERY_PATH_EXPLAIN' => 'Path under your phpBB root directory for pre-loaded images, e.g. <samp>images/avatars/gallery</samp>.', 'AVATAR_GALLERY_PATH_EXPLAIN' => 'Path under your phpBB root directory for pre-loaded images, e.g. <samp>images/avatars/gallery</samp>.',
'AVATAR_STORAGE_PATH' => 'Avatar storage path', 'AVATAR_STORAGE_PATH' => 'Avatar storage path',
'AVATAR_STORAGE_PATH_EXPLAIN' => 'Path under your phpBB root directory, e.g. <samp>images/avatars/upload</samp>.', 'AVATAR_STORAGE_PATH_EXPLAIN' => 'Path under your phpBB root directory, e.g. <samp>images/avatars/upload</samp>.<br />Avatar uploading <strong>will not be available</strong> if this path is not writable.',
'MAX_AVATAR_SIZE' => 'Maximum avatar dimensions', 'MAX_AVATAR_SIZE' => 'Maximum avatar dimensions',
'MAX_AVATAR_SIZE_EXPLAIN' => 'Width x Height in pixels.', 'MAX_AVATAR_SIZE_EXPLAIN' => 'Width x Height in pixels.',
'MAX_FILESIZE' => 'Maximum avatar file size', 'MAX_FILESIZE' => 'Maximum avatar file size',
@ -356,6 +356,8 @@ $lang = array_merge($lang, array(
'ALLOW_CDN' => 'Allow usage of third party content delivery networks', 'ALLOW_CDN' => 'Allow usage of third party content delivery networks',
'ALLOW_CDN_EXPLAIN' => 'If this setting is enabled, some files will be served from external third party servers instead of your server. This reduces the network bandwidth required by your server, but may present a privacy issue for some board administrators. In a default phpBB installation, this includes loading “jQuery” and the font “Open Sans” from Googles content delivery network.', 'ALLOW_CDN_EXPLAIN' => 'If this setting is enabled, some files will be served from external third party servers instead of your server. This reduces the network bandwidth required by your server, but may present a privacy issue for some board administrators. In a default phpBB installation, this includes loading “jQuery” and the font “Open Sans” from Googles content delivery network.',
'ALLOW_LIVE_SEARCHES' => 'Allow live searches',
'ALLOW_LIVE_SEARCHES_EXPLAIN' => 'If this setting is enabled, users are provided with keyword suggestions as they type in certain fields throughout the board.',
'CUSTOM_PROFILE_FIELDS' => 'Custom profile fields', 'CUSTOM_PROFILE_FIELDS' => 'Custom profile fields',
'LIMIT_LOAD' => 'Limit system load', 'LIMIT_LOAD' => 'Limit system load',
'LIMIT_LOAD_EXPLAIN' => 'If the systems 1-minute load average exceeds this value the board will automatically go offline. A value of 1.0 equals ~100% utilisation of one processor. This only functions on UNIX based servers and where this information is accessible. The value here resets itself to 0 if phpBB was unable to get the load limit.', 'LIMIT_LOAD_EXPLAIN' => 'If the systems 1-minute load average exceeds this value the board will automatically go offline. A value of 1.0 equals ~100% utilisation of one processor. This only functions on UNIX based servers and where this information is accessible. The value here resets itself to 0 if phpBB was unable to get the load limit.',
@ -524,6 +526,8 @@ $lang = array_merge($lang, array(
'BOARD_HIDE_EMAILS_EXPLAIN' => 'This function keeps email addresses completely private.', 'BOARD_HIDE_EMAILS_EXPLAIN' => 'This function keeps email addresses completely private.',
'CONTACT_EMAIL' => 'Contact email address', 'CONTACT_EMAIL' => 'Contact email address',
'CONTACT_EMAIL_EXPLAIN' => 'This address will be used whenever a specific contact point is needed, e.g. spam, error output, etc. It will always be used as the <samp>From</samp> and <samp>Reply-To</samp> address in emails.', 'CONTACT_EMAIL_EXPLAIN' => 'This address will be used whenever a specific contact point is needed, e.g. spam, error output, etc. It will always be used as the <samp>From</samp> and <samp>Reply-To</samp> address in emails.',
'CONTACT_EMAIL_NAME' => 'Contact name',
'CONTACT_EMAIL_NAME_EXPLAIN' => 'This is the contact name that e-mail recipients will see. If you dont want to have a contact name, leave this field empty.',
'EMAIL_FUNCTION_NAME' => 'Email function name', 'EMAIL_FUNCTION_NAME' => 'Email function name',
'EMAIL_FUNCTION_NAME_EXPLAIN' => 'The email function used to send mails through PHP.', 'EMAIL_FUNCTION_NAME_EXPLAIN' => 'The email function used to send mails through PHP.',
'EMAIL_PACKAGE_SIZE' => 'Email package size', 'EMAIL_PACKAGE_SIZE' => 'Email package size',

View file

@ -85,7 +85,6 @@ $lang = array_merge($lang, array(
'ACP_EXTENSION_MANAGEMENT' => 'Extension management', 'ACP_EXTENSION_MANAGEMENT' => 'Extension management',
'ACP_EXTENSIONS' => 'Manage extensions', 'ACP_EXTENSIONS' => 'Manage extensions',
'ACP_FORUM_BASED_PERMISSIONS' => 'Forum based permissions', 'ACP_FORUM_BASED_PERMISSIONS' => 'Forum based permissions',
'ACP_FORUM_LOGS' => 'Forum logs', 'ACP_FORUM_LOGS' => 'Forum logs',
'ACP_FORUM_MANAGEMENT' => 'Forum management', 'ACP_FORUM_MANAGEMENT' => 'Forum management',
@ -241,9 +240,6 @@ $lang = array_merge($lang, array(
'EXPORT_DOWNLOAD' => 'Download', 'EXPORT_DOWNLOAD' => 'Download',
'EXPORT_STORE' => 'Store', 'EXPORT_STORE' => 'Store',
'FILES_GONE' => 'Some of the attachments you selected for deletion do not exist. They may have been already deleted. Attachments that did exist were deleted.',
'FILES_STATS_WRONG' => 'Your files statistics are probably inaccurate and need to be resynchronised. Actual values: number of attachments = %1$d, total size of attachments = %2$s.',
'GENERAL_OPTIONS' => 'General options', 'GENERAL_OPTIONS' => 'General options',
'GENERAL_SETTINGS' => 'General settings', 'GENERAL_SETTINGS' => 'General settings',
'GLOBAL_MASK' => 'Global permission mask', 'GLOBAL_MASK' => 'Global permission mask',
@ -286,8 +282,6 @@ $lang = array_merge($lang, array(
'REMIND' => 'Remind', 'REMIND' => 'Remind',
'RESYNC' => 'Resynchronise', 'RESYNC' => 'Resynchronise',
'RESYNC_FILES_STATS' => 'Resynchronise files statistics',
'RESYNC_FILES_STATS_EXPLAIN' => 'Recalculates the total number and size of files attached to posts and private messages.',
'SELECT_ANONYMOUS' => 'Select anonymous user', 'SELECT_ANONYMOUS' => 'Select anonymous user',
'SELECT_OPTION' => 'Select option', 'SELECT_OPTION' => 'Select option',
@ -388,7 +382,6 @@ $lang = array_merge($lang, array(
'RESET_ONLINE' => 'Reset most users ever online', 'RESET_ONLINE' => 'Reset most users ever online',
'RESET_ONLINE_CONFIRM' => 'Are you sure you wish to reset the most users ever online counter?', 'RESET_ONLINE_CONFIRM' => 'Are you sure you wish to reset the most users ever online counter?',
'RESET_ONLINE_SUCCESS' => 'Most users ever online reset', 'RESET_ONLINE_SUCCESS' => 'Most users ever online reset',
'RESYNC_FILES_STATS_CONFIRM' => 'Are you sure you wish to resynchronise files statistics?',
'RESYNC_POSTCOUNTS' => 'Resynchronise post counts', 'RESYNC_POSTCOUNTS' => 'Resynchronise post counts',
'RESYNC_POSTCOUNTS_EXPLAIN' => 'Only existing posts will be taken into consideration. Pruned posts will not be counted.', 'RESYNC_POSTCOUNTS_EXPLAIN' => 'Only existing posts will be taken into consideration. Pruned posts will not be counted.',
'RESYNC_POSTCOUNTS_CONFIRM' => 'Are you sure you wish to resynchronise post counts?', 'RESYNC_POSTCOUNTS_CONFIRM' => 'Are you sure you wish to resynchronise post counts?',
@ -557,7 +550,7 @@ $lang = array_merge($lang, array(
'LOG_PM_REPORT_CLOSED' => '<strong>Closed PM report</strong><br />» %s', 'LOG_PM_REPORT_CLOSED' => '<strong>Closed PM report</strong><br />» %s',
'LOG_PM_REPORT_DELETED' => '<strong>Deleted PM report</strong><br />» %s', 'LOG_PM_REPORT_DELETED' => '<strong>Deleted PM report</strong><br />» %s',
'LOG_POST_APPROVED' => '<strong>Approved post</strong><br />» %s', 'LOG_POST_APPROVED' => '<strong>Approved post</strong><br />» %s',
'LOG_POST_DISAPPROVED' => '<strong>Disapproved post “%1$s” with the following reason</strong><br />» %2$s', 'LOG_POST_DISAPPROVED' => '<strong>Disapproved post “%1$s” written by “%3$s” for the following reason</strong><br />» %2$s',
'LOG_POST_EDITED' => '<strong>Edited post “%1$s” written by</strong><br />» %2$s', 'LOG_POST_EDITED' => '<strong>Edited post “%1$s” written by</strong><br />» %2$s',
'LOG_POST_RESTORED' => '<strong>Restored post</strong><br />» %s', 'LOG_POST_RESTORED' => '<strong>Restored post</strong><br />» %s',
'LOG_REPORT_CLOSED' => '<strong>Closed report</strong><br />» %s', 'LOG_REPORT_CLOSED' => '<strong>Closed report</strong><br />» %s',
@ -570,7 +563,7 @@ $lang = array_merge($lang, array(
'LOG_TOPIC_APPROVED' => '<strong>Approved topic</strong><br />» %s', 'LOG_TOPIC_APPROVED' => '<strong>Approved topic</strong><br />» %s',
'LOG_TOPIC_RESTORED' => '<strong>Restored topic</strong><br />» %s', 'LOG_TOPIC_RESTORED' => '<strong>Restored topic</strong><br />» %s',
'LOG_TOPIC_DISAPPROVED' => '<strong>Disapproved topic “%1$s” with the following reason</strong><br />%2$s', 'LOG_TOPIC_DISAPPROVED' => '<strong>Disapproved topic “%1$s” written by “%3$s” for the following reason</strong><br />» %2$s',
'LOG_TOPIC_RESYNC' => '<strong>Resynchronised topic counters</strong><br />» %s', 'LOG_TOPIC_RESYNC' => '<strong>Resynchronised topic counters</strong><br />» %s',
'LOG_TOPIC_TYPE_CHANGED' => '<strong>Changed topic type</strong><br />» %s', 'LOG_TOPIC_TYPE_CHANGED' => '<strong>Changed topic type</strong><br />» %s',
'LOG_UNLOCK' => '<strong>Unlocked topic</strong><br />» %s', 'LOG_UNLOCK' => '<strong>Unlocked topic</strong><br />» %s',
@ -684,7 +677,6 @@ $lang = array_merge($lang, array(
'LOG_PURGE_CACHE' => '<strong>Purged cache</strong>', 'LOG_PURGE_CACHE' => '<strong>Purged cache</strong>',
'LOG_PURGE_SESSIONS' => '<strong>Purged sessions</strong>', 'LOG_PURGE_SESSIONS' => '<strong>Purged sessions</strong>',
'LOG_RANK_ADDED' => '<strong>Added new rank</strong><br />» %s', 'LOG_RANK_ADDED' => '<strong>Added new rank</strong><br />» %s',
'LOG_RANK_REMOVED' => '<strong>Removed rank</strong><br />» %s', 'LOG_RANK_REMOVED' => '<strong>Removed rank</strong><br />» %s',
'LOG_RANK_UPDATED' => '<strong>Updated rank</strong><br />» %s', 'LOG_RANK_UPDATED' => '<strong>Updated rank</strong><br />» %s',
@ -696,7 +688,7 @@ $lang = array_merge($lang, array(
'LOG_REFERER_INVALID' => '<strong>Referer validation failed</strong><br />»Referer was “<em>%1$s</em>”. The request was rejected and the session killed.', 'LOG_REFERER_INVALID' => '<strong>Referer validation failed</strong><br />»Referer was “<em>%1$s</em>”. The request was rejected and the session killed.',
'LOG_RESET_DATE' => '<strong>Board start date reset</strong>', 'LOG_RESET_DATE' => '<strong>Board start date reset</strong>',
'LOG_RESET_ONLINE' => '<strong>Most users online reset</strong>', 'LOG_RESET_ONLINE' => '<strong>Most users online reset</strong>',
'LOG_RESYNC_FILES_STATS' => '<strong>Files statistics resynchronised</strong>', 'LOG_RESYNC_FILES_STATS' => '<strong>File statistics resynchronised</strong>',
'LOG_RESYNC_POSTCOUNTS' => '<strong>User post counts resynchronised</strong>', 'LOG_RESYNC_POSTCOUNTS' => '<strong>User post counts resynchronised</strong>',
'LOG_RESYNC_POST_MARKING' => '<strong>Dotted topics resynchronised</strong>', 'LOG_RESYNC_POST_MARKING' => '<strong>Dotted topics resynchronised</strong>',
'LOG_RESYNC_STATS' => '<strong>Post, topic and user statistics resynchronised</strong>', 'LOG_RESYNC_STATS' => '<strong>Post, topic and user statistics resynchronised</strong>',

View file

@ -33,7 +33,6 @@ if (empty($lang) || !is_array($lang))
// equally where a string contains only two placeholders which are used to wrap text // equally where a string contains only two placeholders which are used to wrap text
// in a url you again do not need to specify an order e.g., 'Click %sHERE%s' is fine // in a url you again do not need to specify an order e.g., 'Click %sHERE%s' is fine
$lang = array_merge($lang, array( $lang = array_merge($lang, array(
'EXTENSION' => 'Extension', 'EXTENSION' => 'Extension',
'EXTENSIONS' => 'Extensions', 'EXTENSIONS' => 'Extensions',

View file

@ -182,7 +182,6 @@ $lang = array_merge($lang, array(
'ROLE_USER_STANDARD' => 'Standard Features', 'ROLE_USER_STANDARD' => 'Standard Features',
'ROLE_USER_NEW_MEMBER' => 'Newly Registered User Features', 'ROLE_USER_NEW_MEMBER' => 'Newly Registered User Features',
'ROLE_DESCRIPTION_ADMIN_FORUM' => 'Can access the forum management and forum permission settings.', 'ROLE_DESCRIPTION_ADMIN_FORUM' => 'Can access the forum management and forum permission settings.',
'ROLE_DESCRIPTION_ADMIN_FULL' => 'Has access to all administrative functions of this board.<br />Not recommended.', 'ROLE_DESCRIPTION_ADMIN_FULL' => 'Has access to all administrative functions of this board.<br />Not recommended.',
'ROLE_DESCRIPTION_ADMIN_STANDARD' => 'Has access to most administrative features but is not allowed to use server or system related tools.', 'ROLE_DESCRIPTION_ADMIN_STANDARD' => 'Has access to most administrative features but is not allowed to use server or system related tools.',

View file

@ -85,8 +85,8 @@ $lang = array_merge($lang, array(
'URL' => 'A valid URL using any protocol (http, ftp, etc… cannot be used for javascript exploits). If none is given, “http://” is prefixed to the string.', 'URL' => 'A valid URL using any protocol (http, ftp, etc… cannot be used for javascript exploits). If none is given, “http://” is prefixed to the string.',
'LOCAL_URL' => 'A local URL. The URL must be relative to the topic page and cannot contain a server name or protocol, as links are prefixed with “%s”', 'LOCAL_URL' => 'A local URL. The URL must be relative to the topic page and cannot contain a server name or protocol, as links are prefixed with “%s”',
'RELATIVE_URL' => 'A relative URL. You can use this to match parts of a URL, but be careful: a full URL is a valid relative URL. When you want to use relative URLs of your board, use the LOCAL_URL token.', 'RELATIVE_URL' => 'A relative URL. You can use this to match parts of a URL, but be careful: a full URL is a valid relative URL. When you want to use relative URLs of your board, use the LOCAL_URL token.',
'COLOR' => 'A HTML colour, can be either in the numeric form <samp>#FF1234</samp> or a <a href="http://www.w3.org/TR/CSS21/syndata.html#value-def-color">CSS colour keyword</a> such as <samp>fuchsia</samp> or <samp>InactiveBorder</samp>' 'COLOR' => 'A HTML colour, can be either in the numeric form <samp>#FF1234</samp> or a <a href="http://www.w3.org/TR/CSS21/syndata.html#value-def-color">CSS colour keyword</a> such as <samp>fuchsia</samp> or <samp>InactiveBorder</samp>',
) ),
)); ));
// Smilies and topic icons // Smilies and topic icons
@ -109,8 +109,6 @@ $lang = array_merge($lang, array(
'DISPLAY_POSTING' => 'On posting page', 'DISPLAY_POSTING' => 'On posting page',
'DISPLAY_POSTING_NO' => 'Not on posting page', 'DISPLAY_POSTING_NO' => 'Not on posting page',
'EDIT_ICONS' => 'Edit icons', 'EDIT_ICONS' => 'Edit icons',
'EDIT_SMILIES' => 'Edit smilies', 'EDIT_SMILIES' => 'Edit smilies',
'EMOTION' => 'Emotion', 'EMOTION' => 'Emotion',

View file

@ -68,8 +68,8 @@ $lang = array_merge($lang, array(
'DISPLAY_AT_REGISTER_EXPLAIN' => 'If this option is enabled, the field will be displayed on registration.', 'DISPLAY_AT_REGISTER_EXPLAIN' => 'If this option is enabled, the field will be displayed on registration.',
'DISPLAY_ON_MEMBERLIST' => 'Display on memberlist screen', 'DISPLAY_ON_MEMBERLIST' => 'Display on memberlist screen',
'DISPLAY_ON_MEMBERLIST_EXPLAIN' => 'If this option is enabled, the field will be displayed in the user rows on the memberlist screen.', 'DISPLAY_ON_MEMBERLIST_EXPLAIN' => 'If this option is enabled, the field will be displayed in the user rows on the memberlist screen.',
'DISPLAY_ON_PM' => 'Display on view pm screen', 'DISPLAY_ON_PM' => 'Display on view private message screen',
'DISPLAY_ON_PM_EXPLAIN' => 'If this option is enabled, the field will be displayed in the mini-profile on the pm screen.', 'DISPLAY_ON_PM_EXPLAIN' => 'If this option is enabled, the field will be displayed in the mini-profile on the private message screen.',
'DISPLAY_ON_VT' => 'Display on viewtopic screen', 'DISPLAY_ON_VT' => 'Display on viewtopic screen',
'DISPLAY_ON_VT_EXPLAIN' => 'If this option is enabled, the field will be displayed in the mini-profile on the topic screen.', 'DISPLAY_ON_VT_EXPLAIN' => 'If this option is enabled, the field will be displayed in the mini-profile on the topic screen.',
'DISPLAY_PROFILE_FIELD' => 'Publicly display profile field', 'DISPLAY_PROFILE_FIELD' => 'Publicly display profile field',

View file

@ -41,9 +41,6 @@ if (empty($lang) || !is_array($lang))
$lang = array_merge($lang, array( $lang = array_merge($lang, array(
'CONTROLLER_ARGUMENT_VALUE_MISSING' => 'Missing value for argument #%1$s: <strong>%3$s</strong> in class <strong>%2$s</strong>', 'CONTROLLER_ARGUMENT_VALUE_MISSING' => 'Missing value for argument #%1$s: <strong>%3$s</strong> in class <strong>%2$s</strong>',
'CONTROLLER_NOT_SPECIFIED' => 'No controller has been specified.', 'CONTROLLER_NOT_SPECIFIED' => 'No controller has been specified.',
'CONTROLLER_NOT_FOUND' => 'The requested page could not be found.',
'CONTROLLER_METHOD_NOT_SPECIFIED' => 'No method was specified for the controller.', 'CONTROLLER_METHOD_NOT_SPECIFIED' => 'No method was specified for the controller.',
'CONTROLLER_SERVICE_NOT_GIVEN' => 'The controller "<strong>%s</strong>" must have a service specified in ./config/routing.yml.',
'CONTROLLER_SERVICE_UNDEFINED' => 'The service for controller "<strong>%s</strong>" is not defined in ./config/services.yml.', 'CONTROLLER_SERVICE_UNDEFINED' => 'The service for controller "<strong>%s</strong>" is not defined in ./config/services.yml.',
'CONTROLLER_RETURN_TYPE_INVALID' => 'The controller object <strong>%s</strong> must return a Symfony\Component\HttpFoundation\Response object.',
)); ));

View file

@ -167,6 +167,7 @@ $lang = array_merge($lang, array(
'CONGRATULATIONS' => 'Congratulations to', 'CONGRATULATIONS' => 'Congratulations to',
'CONNECTION_FAILED' => 'Connection failed.', 'CONNECTION_FAILED' => 'Connection failed.',
'CONNECTION_SUCCESS' => 'Connection was successful!', 'CONNECTION_SUCCESS' => 'Connection was successful!',
'CONTACT_USER' => 'Contact',
'COOKIES_DELETED' => 'All board cookies successfully deleted.', 'COOKIES_DELETED' => 'All board cookies successfully deleted.',
'CURRENT_TIME' => 'It is currently %s', 'CURRENT_TIME' => 'It is currently %s',
@ -217,8 +218,6 @@ $lang = array_merge($lang, array(
'ERROR' => 'Error', 'ERROR' => 'Error',
'EXPAND_VIEW' => 'Expand view', 'EXPAND_VIEW' => 'Expand view',
'EXTENSION' => 'Extension', 'EXTENSION' => 'Extension',
'EXTENSION_CONTROLLER_MISSING' => 'The extension <strong>%s</strong> is missing a controller class and cannot be accessed through the front-end.',
'EXTENSION_CLASS_WRONG_TYPE' => 'The extension controller class <strong>%s</strong> is not an instance of the phpbb_extension_controller_interface.',
'EXTENSION_DISABLED' => 'The extension <strong>%s</strong> is not enabled.', 'EXTENSION_DISABLED' => 'The extension <strong>%s</strong> is not enabled.',
'EXTENSION_DISABLED_AFTER_POSTING' => 'The extension <strong>%s</strong> has been deactivated and can no longer be displayed.', 'EXTENSION_DISABLED_AFTER_POSTING' => 'The extension <strong>%s</strong> has been deactivated and can no longer be displayed.',
'EXTENSION_DOES_NOT_EXIST' => 'The extension <strong>%s</strong> does not exist.', 'EXTENSION_DOES_NOT_EXIST' => 'The extension <strong>%s</strong> does not exist.',
@ -348,6 +347,7 @@ $lang = array_merge($lang, array(
'LDAP_NO_SERVER_CONNECTION' => 'Could not connect to LDAP server.', 'LDAP_NO_SERVER_CONNECTION' => 'Could not connect to LDAP server.',
'LDAP_SEARCH_FAILED' => 'An error occurred while searching the LDAP directory.', 'LDAP_SEARCH_FAILED' => 'An error occurred while searching the LDAP directory.',
'LEGEND' => 'Legend', 'LEGEND' => 'Legend',
'LIVE_SEARCHES_NOT_ALLOWED' => 'Live searches are not allowed.',
'LOADING' => 'Loading', 'LOADING' => 'Loading',
'LOCATION' => 'Location', 'LOCATION' => 'Location',
'LOCK_POST' => 'Lock post', 'LOCK_POST' => 'Lock post',
@ -422,14 +422,16 @@ $lang = array_merge($lang, array(
'NOT_WATCHING_FORUM' => 'You are no longer subscribed to updates on this forum.', 'NOT_WATCHING_FORUM' => 'You are no longer subscribed to updates on this forum.',
'NOT_WATCHING_TOPIC' => 'You are no longer subscribed to this topic.', 'NOT_WATCHING_TOPIC' => 'You are no longer subscribed to this topic.',
'NOTIFICATIONS' => 'Notifications', 'NOTIFICATIONS' => 'Notifications',
// This applies for NOTIFICATION_BOOKMARK, NOTIFICATION_POST, and NOTIFICATION_QUOTE. // This applies for NOTIFICATION_BOOKMARK and NOTIFICATION_POST.
// %1$s will return a list of users that's concatenated using "," and "and" - see STRING_LIST // %1$s will return a list of users that's concatenated using "," and "and" - see STRING_LIST
// Once the user count reaches 5 users or more, the list is trimmed using NOTIFICATION_X_OTHERS // Once the user count reaches 5 users or more, the list is trimmed using NOTIFICATION_X_OTHERS
// Once the user count reaches 20 users or more, the list is trimmed using NOTIFICATION_MANY_OTHERS
// Examples: // Examples:
// A replied... // A replied...
// A and B replied... // A and B replied...
// A, B and C replied... // A, B and C replied...
// A, B, C and 2 others replied... // A, B, C and 2 others replied...
// A, B, C and others replied...
'NOTIFICATION_BOOKMARK' => array( 'NOTIFICATION_BOOKMARK' => array(
1 => '%1$s replied to the topic “%2$s” you have bookmarked.', 1 => '%1$s replied to the topic “%2$s” you have bookmarked.',
), ),
@ -454,7 +456,8 @@ $lang = array_merge($lang, array(
'NOTIFICATION_TOPIC_IN_QUEUE' => 'A new topic titled "%2$s" was posted by %1$s and needs approval.', 'NOTIFICATION_TOPIC_IN_QUEUE' => 'A new topic titled "%2$s" was posted by %1$s and needs approval.',
'NOTIFICATION_TYPE_NOT_EXIST' => 'The notification type "%s" is missing from the file system.', 'NOTIFICATION_TYPE_NOT_EXIST' => 'The notification type "%s" is missing from the file system.',
'NOTIFICATION_ADMIN_ACTIVATE_USER' => 'The user “%1$s” is newly registered and requires activation.', 'NOTIFICATION_ADMIN_ACTIVATE_USER' => 'The user “%1$s” is newly registered and requires activation.',
// Used in conjuction with NOTIFICATION_BOOKMARK, NOTIFICATION_POST, and NOTIFICATION_QUOTE. // Used in conjuction with NOTIFICATION_BOOKMARK and NOTIFICATION_POST.
'NOTIFICATION_MANY_OTHERS' => 'others',
'NOTIFICATION_X_OTHERS' => array( 'NOTIFICATION_X_OTHERS' => array(
2 => '%d others', 2 => '%d others',
), ),
@ -552,7 +555,8 @@ $lang = array_merge($lang, array(
'POST_BY_FOE' => '<strong>%1$s</strong>, who is currently on your ignore list, made this post.', 'POST_BY_FOE' => '<strong>%1$s</strong>, who is currently on your ignore list, made this post.',
'POST_DISPLAY' => '%1$sDisplay this post%2$s.', 'POST_DISPLAY' => '%1$sDisplay this post%2$s.',
'POST_DAY' => '%.2f posts per day', 'POST_DAY' => '%.2f posts per day',
'POST_DELETED' => 'Deleted post:', 'POST_DELETED_ACTION' => 'Deleted post:',
'POST_DELETED' => 'This post has been deleted.',
'POST_DELETED_BY' => '<strong>%2$s</strong> deleted the post by <strong>%1$s</strong> on %3$s.', 'POST_DELETED_BY' => '<strong>%2$s</strong> deleted the post by <strong>%1$s</strong> on %3$s.',
'POST_DELETED_BY_REASON'=> '<strong>%2$s</strong> deleted the post by <strong>%1$s</strong> on %3$s for the following reason: %4$s', 'POST_DELETED_BY_REASON'=> '<strong>%2$s</strong> deleted the post by <strong>%1$s</strong> on %3$s for the following reason: %4$s',
'POST_DETAILS' => 'Post details', 'POST_DETAILS' => 'Post details',
@ -565,7 +569,8 @@ $lang = array_merge($lang, array(
'POST_SUBJECT' => 'Post subject', 'POST_SUBJECT' => 'Post subject',
'POST_TIME' => 'Post time', 'POST_TIME' => 'Post time',
'POST_TOPIC' => 'Post a new topic', 'POST_TOPIC' => 'Post a new topic',
'POST_UNAPPROVED' => 'Post awaiting approval:', 'POST_UNAPPROVED_ACTION' => 'Post awaiting approval:',
'POST_UNAPPROVED' => 'This post has not been approved.',
'POWERED_BY' => 'Powered by %s', 'POWERED_BY' => 'Powered by %s',
'PREVIEW' => 'Preview', 'PREVIEW' => 'Preview',
'PREVIOUS' => 'Previous', // Used in pagination 'PREVIOUS' => 'Previous', // Used in pagination
@ -735,7 +740,8 @@ $lang = array_merge($lang, array(
'TOPIC_MOVED' => 'Moved topic', 'TOPIC_MOVED' => 'Moved topic',
'TOPIC_REVIEW' => 'Topic review', 'TOPIC_REVIEW' => 'Topic review',
'TOPIC_TITLE' => 'Topic title', 'TOPIC_TITLE' => 'Topic title',
'TOPIC_UNAPPROVED' => 'This topic has not been approved', 'TOPIC_UNAPPROVED' => 'This topic has not been approved.',
'TOPIC_DELETED' => 'This topic has been deleted.',
'TOTAL_ATTACHMENTS' => 'Attachment(s)', 'TOTAL_ATTACHMENTS' => 'Attachment(s)',
'TOTAL_LOGS' => array( 'TOTAL_LOGS' => array(
1 => '%d log', 1 => '%d log',
@ -1370,7 +1376,7 @@ $lang = array_merge($lang, array(
'D M d, Y g:i a' => 'Mon Jan 01, 2007 1:37 pm', 'D M d, Y g:i a' => 'Mon Jan 01, 2007 1:37 pm',
'F jS, Y, g:i a' => 'January 1st, 2007, 1:37 pm', 'F jS, Y, g:i a' => 'January 1st, 2007, 1:37 pm',
'|d M Y|, H:i' => 'Today, 13:37 / 01 Jan 2007, 13:37', '|d M Y|, H:i' => 'Today, 13:37 / 01 Jan 2007, 13:37',
'|F jS, Y|, g:i a' => 'Today, 1:37 pm / January 1st, 2007, 1:37 pm' '|F jS, Y|, g:i a' => 'Today, 1:37 pm / January 1st, 2007, 1:37 pm',
), ),
// The default dateformat which will be used on new installs in this language // The default dateformat which will be used on new installs in this language

View file

@ -10,5 +10,4 @@ Use this link to view the user's profile:
Use this link to activate the account: Use this link to activate the account:
{U_ACTIVATE} {U_ACTIVATE}
{EMAIL_SIG} {EMAIL_SIG}

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