Merge pull request #13183 from MrPetovan/task/13114-rename-forum-to-group

Replace "forum" by "group"
This commit is contained in:
Michael Vogel 2023-06-04 00:19:59 +02:00 committed by GitHub
commit 483cc45712
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
86 changed files with 569 additions and 639 deletions

View file

@ -1,5 +1,5 @@
# How to Contribute
If you want to contribute to the project, you dont need to have coding experience. There are a number of tasks listed in the issue tracker with the label “[Junior Jobs](https://github.com/friendica/friendica/issues?q=is%3Aopen+is%3Aissue+label%3A%22Junior+Jobs%22)” we think are good for new contributors. But you are by no means limited to these if you find a solution to a problem (even a new one) please make a pull request at [github](https://github.com/friendica/friendica) or let us know in the [development forum](https://forum.friendi.ca/profile/developers).
If you want to contribute to the project, you dont need to have coding experience. There are a number of tasks listed in the issue tracker with the label “[Junior Jobs](https://github.com/friendica/friendica/issues?q=is%3Aopen+is%3Aissue+label%3A%22Junior+Jobs%22)” we think are good for new contributors. But you are by no means limited to these if you find a solution to a problem (even a new one) please make a pull request at [github](https://github.com/friendica/friendica) or let us know in the [development group](https://forum.friendi.ca/profile/developers).
Contribution to Friendica is also not limited to coding. Any contribution to the [documentation](https://github.com/friendica/friendica/tree/develop/doc), the [translation](https://app.transifex.com/Friendica/friendica/dashboard/) or advertisement materials is welcome or reporting a problem. You dont need to deal with Git(Hub) or Transifex if you dont like to. Just [get in touch](https://forum.friendi.ca/profile/helpers) with us and we will get the materials to the appropriate places.

View file

@ -190,7 +190,7 @@ CREATE TABLE IF NOT EXISTS `contact` (
`confirm` varbinary(383) COMMENT '',
`poco` varbinary(383) COMMENT '',
`writable` boolean NOT NULL DEFAULT '0' COMMENT '',
`forum` boolean NOT NULL DEFAULT '0' COMMENT 'contact is a forum. Deprecated, use \'contact-type\' = \'community\' and \'manually-approve\' = false instead',
`forum` boolean NOT NULL DEFAULT '0' COMMENT 'contact is a group. Deprecated, use \'contact-type\' = \'community\' and \'manually-approve\' = false instead',
`prv` boolean NOT NULL DEFAULT '0' COMMENT 'contact is a private group. Deprecated, use \'contact-type\' = \'community\' and \'manually-approve\' = true instead',
`bdyear` varchar(4) NOT NULL DEFAULT '' COMMENT '',
`site-pubkey` text COMMENT 'Deprecated',
@ -717,7 +717,7 @@ CREATE TABLE IF NOT EXISTS `group` (
`uid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'Owner User id',
`visible` boolean NOT NULL DEFAULT '0' COMMENT '1 indicates the member list is not private',
`deleted` boolean NOT NULL DEFAULT '0' COMMENT '1 indicates the circle has been deleted',
`cid` int unsigned COMMENT 'Contact id of forum. When this field is filled then the members are synced automatically.',
`cid` int unsigned COMMENT 'Contact id of group. When this field is filled then the members are synced automatically.',
`name` varchar(255) NOT NULL DEFAULT '' COMMENT 'human readable name of circle',
PRIMARY KEY(`id`),
INDEX `uid` (`uid`),

View file

@ -6,7 +6,7 @@ Bugs and Issues
If your server has a support page, you should report any bugs/issues you encounter there first.
Reporting to your support page before reporting to the developers makes their job easier, as they don't have to deal with bug reports that might not have anything to do with them.
Reducing the workload in this way helps us get new features faster.
You can also contact the [friendica support forum](https://forum.friendi.ca/profile/helpers) and report your problem there.
You can also contact the [friendica support group](https://forum.friendi.ca/profile/helpers) and report your problem there.
Bugs are rarely limited to one person, and the chances are somebody from another node has encountered the problem too, and will be able to help you.
If you're a technical user, or your site doesn't have a support page, you'll need to use the [Bug Tracker](https://github.com/friendica/friendica/issues).

View file

@ -13,14 +13,14 @@ Whether you feel like an expert or like a newbie - join us with your ideas!
## Contact us
The discussion of Friendica development takes place in the following Friendica forums:
The discussion of Friendica development takes place in the following Friendica groups:
* The main [forum for Friendica development](https://forum.friendi.ca/profile/developers)
* The main [group for Friendica development](https://forum.friendi.ca/profile/developers)
## Help other users
Remember the questions you had when you first tried Friendica?
A good place to start can be to help new people find their way around Friendica in the [general support forum](https://forum.friendi.ca/profile/helpers).
A good place to start can be to help new people find their way around Friendica in the [general support group](https://forum.friendi.ca/profile/helpers).
Welcome them, answer their questions, point them to documentation or ping other helpers directly if you can't help but think you know who can.
## Translation
@ -33,10 +33,10 @@ If you don't want to translate the UI, or it is already done to your satisfactio
Are you good at designing things?
If you have seen Friendica you probably have ideas to improve it, haven't you?
* If you would like to work with us on enhancing the user interface, please join the [forum for Friendica development](https://forum.friendi.ca/profile/developers).
* If you would like to work with us on enhancing the user interface, please join the [group for Friendica development](https://forum.friendi.ca/profile/developers).
* Make plans for a better Friendica interface design and share them with us.
* Tell us if you are able to realize your ideas or what kind of help you need.
We can't promise we have the right skills in the group but we'll try.
We can't promise we have the right skills in the group, but we'll try.
* Choose a thing to start with, e.g. work on the icon set of your favorite theme
## Programming
@ -72,7 +72,7 @@ just place it into `.git/hooks/post-merge` and make it executable.
### Coding standards
For the sake of consistency between contribution and general code readability, Friendica follows the widespread [PSR-2 coding standards](http://www.php-fig.org/psr/psr-2/) to the exception of a few rules.
For the sake of consistency between contribution and general code readability, Friendica follows the widespread [PSR-2 coding standards](http://www.php-fig.org/psr/psr-2/) excepted a few rules.
Here's a few primers if you are new to Friendica or to the PSR-2 coding standards:
* Indentation is tabs, period (not PSR-2).
@ -88,7 +88,7 @@ Here's a few primers if you are new to Friendica or to the PSR-2 coding standard
Don't worry, you don't have to know by heart the PSR-2 coding standards to start contributing to Friendica.
There are a few tools you can use to check or fix your files before you commit.
For documentation we use the standard of *one sentence per line* for the `md` files in the `/doc` and `/doc/$lng` subdirectories.
For documentation, we use the standard of *one sentence per line* for the `md` files in the `/doc` and `/doc/$lng` subdirectories.
#### Check with [PHP Code Sniffer](https://github.com/squizlabs/PHP_CodeSniffer)
@ -113,7 +113,7 @@ If the command-line tools `diff` and `patch` are unavailable for you, `phpcbf` c
### Code documentation
If you are interested in having the documentation of the Friendica code outside of the code files, you can use [Doxygen](http://doxygen.org) to generate it.
If you are interested in having the documentation of the Friendica code outside the code files, you can use [Doxygen](http://doxygen.org) to generate it.
The configuration file for Doxygen is located in the base directory of the project sources.
Run
@ -126,7 +126,7 @@ If you find missing documentation, don't hesitate to contact us and write it dow
### Issues
Have a look at our [issue tracker](https://github.com/friendica/friendica) on github!
Have a look at our [issue tracker](https://github.com/friendica/friendica) on GitHub!
* Try to reproduce a bug that needs more inquiries and write down what you find out.
* If a bug looks fixed, ask the bug reporters for feedback to find out if the bug can be closed.
@ -143,13 +143,13 @@ If you want to get involved here:
* Look at the first steps that were made (e.g. the clean theme).
Ask us to find out whom to talk to about their experiences.
* Talk to design people if you know any.
* Let us know about your plans [in the dev forum](https://forum.friendi.ca/profile/developers)
* Let us know about your plans [in the dev group](https://forum.friendi.ca/profile/developers)
Do not worry about cross-posting.
### Client software
As Friendica is using a [Twitter/GNU Social compatible API](help/api) any of the clients for those platforms should work with Friendica as well.
Furthermore there are several client projects, especially for use with Friendica.
Furthermore, there are several client projects, especially for use with Friendica.
If you are interested in improving those clients, please contact the developers of the clients directly.
* Android / LinageOS: **Friendiqa** [src](https://git.friendi.ca/lubuwest/Friendiqa)/[Google Play](https://play.google.com/store/apps/details?id=org.qtproject.friendiqa) developed by [Marco R](https://freunde.ma-nic.de/profile/marco)

View file

@ -52,4 +52,4 @@ You can manually execute the structure update from the CLI in the base directory
bin/console dbstructure update
if there occur any errors, please contact the [support forum](https://forum.friendi.ca/profile/helpers).
if there occur any errors, please contact the [support group](https://forum.friendi.ca/profile/helpers).

View file

@ -4,14 +4,14 @@ Frequently Asked Questions - FAQ
* [Home](help)
* **[Where I can find help?](help/FAQ#help)**
* **[Why do I getting warnings about certificates?](help/FAQ#ssl)**
* **[Why do I get warnings about certificates?](help/FAQ#ssl)**
* **[How can I upload images, files, links, videos and sound files to posts?](help/FAQ#upload)**
* **[Is it possible to have different avatars per profile?](help/FAQ#avatars)**
* **[How can I view Friendica in a certain language?](help/FAQ#language)**
* **[How do blocked, ignored, archived and hidden contacts behave?](help/FAQ#contacts)**
* **[What happens when an account is removed? Is it truly deleted?](help/FAQ#removed)**
* **[Can I subscribe to a hashtag?](help/FAQ#hashtag)**
* **[How to create a RSS feed of the stream?](help/FAQ#rss)**
* **[How to create an RSS feed of the stream?](help/FAQ#rss)**
* **[What friendica clients can I use?](help/FAQ#clients)**
@ -21,7 +21,7 @@ Frequently Asked Questions - FAQ
If this FAQ does not answer your question you can always reach out to the community via the following options:
* Friendica Support Forum: [@helpers@forum.friendi.ca](https://forum.friendi.ca/~helpers)
* Friendica Support Group: [@helpers@forum.friendi.ca](https://forum.friendi.ca/~helpers)
* Community chat rooms (the IRC, Matrix and XMPP rooms are bridged) these public chats are logged [from IRC](https://gnusociarg.nsupdate.info/2021/%23friendica/) and [Matrix](https://view.matrix.org/alias/%23friendi.ca:matrix.org/)
* XMPP: support(at)forum.friendi.ca
* IRC: #friendica at [libera.chat](https://web.libera.chat/?channels=#friendica)
@ -66,7 +66,7 @@ If this doesn't work, try to add the link by typing: [url=http://example.com]*se
You can also add video and audio files to posts.
However, instead of a direct upload you have to use one of the following methods:
1. Add the video or audio link of a hoster (Youtube, Vimeo, Soundcloud and anyone else with oembed/opengraph-support). Videos will be shown with a preview image you can click on to start. SoundCloud directly inserts a player to your post.
1. Add the video or audio link of a hoster (YouTube, Vimeo, Soundcloud and anyone else with oembed/opengraph-support). Videos will be shown with a preview image you can click on to start. SoundCloud directly inserts a player to your post.
2. If you have your own server, you can upload multimedia files via FTP and insert the URL.
@ -92,7 +92,7 @@ A question mark is required for the separation between url and parameters.
Example:
https://social.example.com/profile/example
https://social.example.com/profile/example
in German:
@ -107,48 +107,48 @@ When a certain language is forced, the language remains until session is closed.
Direct communication will be blocked.
Blocked contacts are not included in delivery, and their own posts to you are not imported.
However their conversations with your friends will still be visible in your stream.
However, their conversations with your friends will still be visible in your stream.
If you remove a contact completely, they can send you another friend request.
Blocked contacts cannot do this. They cannot communicate with you directly, only through friends.
##### Ignored
Ignored contacts are included in delivery and will receive your posts and private messages.
However we do not import their posts or private messages to you.
Like blocking you will still see this person's comments to posts made by your friends.
However, we do not import their posts or private messages to you.
Like blocking, you will still see this person's comments to posts made by your friends.
An addon called "blockem" can be installed to collapse/hide all posts from a particular person in your stream if you desire complete blocking of an individual, including their conversations with your other friends.
##### Archived
Communication is not possible and will not be attempted.
However unlike blocking, existing posts this person made before being archived will be visible in your stream.
However, unlike blocking, existing posts this person made before being archived will be visible in your stream.
##### Hidden
Contact not be displayed in your public friend list.
However a hidden contact will appear normally in conversations and this may expose their hidden status to anybody who can see the conversation.
However, a hidden contact will appear normally in conversations and this may expose their hidden status to anybody who can see the conversation.
<a name="removed"></a>
### What happens when an account is removed?
If you remove your account, it will be scheduled for permanent deletion in *seven days*.
As soon as you activate the deletion process you won't be able to login any more.
If you remove your account, it will be scheduled for permanent deletion in *seven days*.
As soon as you activate the deletion process you won't be able to log in anymore.
Only the administrator of your node can halt this process prior to permanent deletion.
After the elapsed time of seven days, all your posts, messages, photos, and personal information stored on your node will be deleted.
Your node will also issue removal requests to all your contacts; this will also remove your profile from the global directory if you are listed.
After the elapsed time of seven days, all your posts, messages, photos, and personal information stored on your node will be deleted.
Your node will also issue removal requests to all your contacts; this will also remove your profile from the global directory if you are listed.
Your username cannot be reissued for future sign-ups for security reasons.
<a name="hashtag"></a>
### Can I follow a hashtag?
Yes. Simply add the hash tag to your saved searches.
Yes. Simply add the hashtag to your saved searches.
The posts will appear on your network page.
For technical reasons, your answers to such posts won't appear on the "personal" tab in the network page and the whole thread isn't accessible via the API.
<a name="rss"></a>
### How to create a RSS feed of the stream?
### How to create an RSS feed of the stream?
If you want to share your public page via rss you can use one of the following links:
@ -191,10 +191,10 @@ The available features are client specific and may differ.
#### iOS
* [Mastodon](https://joinmastodon.org/apps) ([AppStore](https://apps.apple.com/us/app/mastodon-for-iphone/id1571998974))
* [Stella*](https://www.stella-app.net/) ([AppStore](https://apps.apple.com/us/app/stella-for-mastodon-twitter/id921372048))
* [Tooot](https://github.com/tooot-app) ([AppStore](https://apps.apple.com/app/id1549772269)
* [TwidereX](https://github.com/TwidereProject/TwidereX-iOS) ([AppStore](https://apps.apple.com/app/twidere-x/id1530314034))
* [Mastodon](https://joinmastodon.org/apps) ([App Store](https://apps.apple.com/us/app/mastodon-for-iphone/id1571998974))
* [Stella*](https://www.stella-app.net/) ([App Store](https://apps.apple.com/us/app/stella-for-mastodon-twitter/id921372048))
* [Tooot](https://github.com/tooot-app) ([App Store](https://apps.apple.com/app/id1549772269)
* [TwidereX](https://github.com/TwidereProject/TwidereX-iOS) ([App Store](https://apps.apple.com/app/twidere-x/id1530314034))
#### Linux
@ -206,7 +206,7 @@ The available features are client specific and may differ.
#### macOS
* [TheDesk](https://thedesk.top/en/) ([GitHub](https://github.com/cutls/TheDesk))
* [Whalebird](https://whalebird.social/en/desktop/contents) ([AppStore](https://apps.apple.com/de/app/whalebird/id1378283354), [GitHub](https://github.com/h3poteto/whalebird-desktop))
* [Whalebird](https://whalebird.social/en/desktop/contents) ([App Store](https://apps.apple.com/de/app/whalebird/id1378283354), [GitHub](https://github.com/h3poteto/whalebird-desktop))
#### Windows

View file

@ -1,66 +0,0 @@
Forums
=====
* [Home](help)
Friendica also lets you create community forums and other types of accounts that can function as discussion forums, celebrity accounts, announcement channels, news reflectors, or organization pages, depending on how you want to interact with others. Management of these pages can be delegated to other accounts, or a parent account can be designated to easily toggle multiple identities.
Every page in Friendica has a nickname and these must all be unique. This applies to all forums, whether they are normal profiles or forum profiles.
Managing Accounts
---
To create a new linked account that can be used as a forum, log in to your normal account and go to Settings > Manage Accounts.
Here you can register additional accounts with new nicknames that will be linked to your primary account.
You may appoint a delegate to manage your new account (e.g. forum page).
The Delegates section of Manage Accounts page will provide you with a list of contacts on this instance under "Potential Delegates".
Selecting one or more persons will give them access to manage your forum.
They will be able to edit contacts, profiles, and all content for this account/page.
Please use this facility wisely.
Delegated managers will not be able to alter basic account settings, such as passwords or page types, or remove the account.
Additionally, this page is also where you can choose to designate an account as a parent user.
If your primary account is designated as the parent user, you will be able to easily toggle identities and manage your forums or other types of accounts.
Types of Accounts
---
On the new account, visit the Settings > Account page.
Towards the end of the page is a section for "Advanced account types".
Typically you would use "Personal Page - Standard" for a normal personal account with manual approval of “friends” and “followers.”
This is the default selection.
On this page you can change the type of account if desired.
The other subtypes of a Personal Page are “Soapbox” and “Love-all.”
A Soapbox account is an announcement channel that automatically approvals follower requests.
Everything posted by the account will go out to the followers, but there will be no opportunity for interaction.
This setting would typically be used for announcements or corporate communications.
“Love-all” automatically approves contacts as friends.
In addition to Personal Page, there are options for Organization Page, News Page, and Community Forum.
Organization and New Pages automatically approve contact requests as followers.
Community Forum provide the ability for people to become friends/fans of the forum without requiring approval.
This creates a forum page where all members can freely interact.
Posting to Community forums
---
If you are a member of a community forum, you may post to the forum by including an @-mention in the post mentioning the forum.
For example @bicycle would send my post to all members of the group "bicycle" in addition to the normal recipients.
If you mention a forum (you are a member of) in a new posting, the posting will be distributed to all members of the forum, regardless of your privacy settings for the posting.
Also, if the forum is a public forum, your posting will be public for the all internet users.
If your post is private you must also explicitly include the group in the post permissions (to allow the forum "contact" to see the post) **and** mention it in a tag (which redistributes the post to the forum members).
Posting privately to a public forum, will result in your posting being displayed on the forum wall, but not on yours.
Additionally it is possible to address a forum with the exclamation mark.
In the example above this means that you can address the bicycle forum via !bicycle.
The difference to the @ is that the post will only be sent to the addressed forum.
This also means that you shouldn't address multiple forums in a single post in that way since it will only be distributed by one the forums.
You may also post to a community forum by posting a "wall-to-wall" post using secure cross-site authentication.
Comments which are relayed to community forums will be relayed back to the original post creator.
Mentioning the forum with an @-mention in a comment does not relay the message, as distribution is controlled entirely by the original post creator.

View file

@ -3,7 +3,7 @@ Friendica on GitHub
* [Home](help)
Here is how you can work on the code with us. If you have any questions please write to the Friendica developers' forum.
Here is how you can work on the code with us. If you have any questions please write to the Friendica developers' group.
Introduction to the workflow with our GitHub repository
-------------------------------------------------------

68
doc/Groups.md Normal file
View file

@ -0,0 +1,68 @@
Groups
=====
* [Home](help)
Friendica also lets you create accounts that can function as discussion groups, celebrity accounts, announcement channels, news reflectors, or organization pages, depending on how you want to interact with others.
Management of these accounts can be delegated to other accounts, or a parent account can be designated to easily toggle multiple identities.
Every account in Friendica has a nickname and these must all be unique.
This applies to all accounts, whether they are individual profiles or group profiles.
Managing Accounts
---
To create a new linked account that can be used as a group, log in to your normal account and go to Settings > Manage Accounts.
Here you can register additional accounts with new nicknames that will be linked to your primary account.
You may appoint a delegate to manage your new account.
The Delegates section of Manage Accounts page will provide you with a list of contacts on this instance under "Potential Delegates".
Selecting one or more persons will give them access to manage your newly created account.
They will be able to edit contacts, profiles, and all content for this account.
Please use this facility wisely.
Delegated managers will not be able to alter basic account settings, such as passwords or account types, or remove the account.
Additionally, this page is also where you can choose to designate an account as a parent user.
If your primary account is designated as the parent user, you will be able to easily toggle identities and manage your groups or other types of accounts.
Types of Accounts
---
On the new account, visit the Settings > Account page.
Towards the end of the page is a section for "Advanced account types".
Typically, you would use "Personal Page - Standard" for a normal personal account with manual approval of “friends” and “followers.”
This is the default selection.
On this page you can change the type of account if desired.
The other subtypes of a Personal Page are “Soapbox” and “Love-all.”
A Soapbox account is an announcement channel that automatically approvals follower requests.
Everything posted by the account will go out to the followers, but there will be no opportunity for interaction.
This setting would typically be used for announcements or corporate communications.
“Love-all” automatically approves contacts as friends.
In addition to Personal Page, there are options for Organization Page, News Page, and Community Group.
Organization and New Pages automatically approve contact requests as followers.
Community Group provide the ability for people to join the group without requiring approval.
This creates a group where all members can freely interact.
Posting to Community groups
---
If you are a member of a community group, you may post to the group by including an @-mention in the post mentioning the group.
For example @bicycle would send my post to all members of the group "bicycle" in addition to the normal recipients.
If you mention a group (you are a member of) in a new posting, the posting will be distributed to all members of the group, regardless of your privacy settings for the posting.
Also, if the group is public, your posting will be public for the all internet users.
If your post is private you must also explicitly include the group in the post permissions (to allow the group "contact" to see the post) **and** mention it in a tag (which redistributes the post to the group members).
Posting privately to a public group, will result in your posting being displayed on the group wall, but not on yours.
Additionally, it is possible to address a group with the exclamation mark.
In the example above this means that you can address the bicycle group via !bicycle.
The difference with the @-mention is that the post will only be sent to the addressed group.
This also means that you shouldn't address multiple groups in a single post in that way since it will only be distributed by one the groups.
You may also post to a community group by posting a "wall-to-wall" post using secure cross-site authentication.
Comments which are relayed to community groups will be relayed back to the original post creator.
Mentioning the group with an @-mention in a comment does not relay the message, as distribution is controlled entirely by the original post creator.

View file

@ -16,7 +16,7 @@ Friendica Documentation and Resources
* [Making Friends](help/Making-Friends)
* [Circles and Privacy](help/Circles-and-Privacy)
* [Tags and Mentions](help/Tags-and-Mentions)
* [Community Forums](help/Forums)
* [Community Groups](help/Groups)
* [Chats](help/Chats)
* Further information
* [Move your account](help/Move-Account)
@ -67,7 +67,7 @@ Friendica Documentation and Resources
* [Main Website](https://friendi.ca)
* Ways to get Support
* Friendica Support Forum: [@helpers@forum.friendi.ca](https://forum.friendi.ca/~helpers)
* Friendica Support Group: [@helpers@forum.friendi.ca](https://forum.friendi.ca/~helpers)
* [Mailing List Archive](http://mailman.friendi.ca/mailman/listinfo/support-friendi.ca) you can subscribe to the list by sending an email to ``support-request(at)friendi.ca?subject=subscribe``
* Community chat rooms (the IRC, Matrix and XMPP rooms are bridged) these public chats are logged [from IRC](https://gnusociarg.nsupdate.info/2021/%23friendica/) and [Matrix](https://view.matrix.org/alias/%23friendi.ca:matrix.org/)
* XMPP/Jabber MUC: support(at)forum.friendi.ca

View file

@ -3,7 +3,7 @@ How to improve the performance of a Friendica site
* [Home](help)
Feel free to ask in the [Friendica support forum](https://forum.friendi.ca/profile/helpers) if you need some clarification about the following instructions or if you need help in any other way.
Feel free to ask in the [Friendica support group](https://forum.friendi.ca/profile/helpers) if you need some clarification about the following instructions or if you need help in any other way.
System configuration
--------
@ -31,7 +31,7 @@ Active the following addons:
### rendertime
This addon doesn't speed up your system.
This addon doesn't speed up your system.
It helps to analyze your bottlenecks.
When enabled you see some values at the bottom of every page.

View file

@ -15,7 +15,7 @@ Many will.
But **please** review the [requirements](#Requirements) and confirm these with your hosting provider prior to installation.
## Support
If you encounter installation issues, please let us know via the [helper](http://forum.friendi.ca/profile/helpers) or the [developer](https://forum.friendi.ca/profile/developers) forum or [file an issue](https://github.com/friendica/friendica/issues).
If you encounter installation issues, please let us know via the [helper](http://forum.friendi.ca/profile/helpers) or the [developer](https://forum.friendi.ca/profile/developers) group or [file an issue](https://github.com/friendica/friendica/issues).
Please be as clear as you can about your operating environment and provide as much detail as possible about any error messages you may see, so that we can prevent it from happening in the future.
Due to the large variety of operating systems and PHP platforms in existence we may have only limited ability to debug your PHP installation or acquire any missing modules - but we will do our best to solve any general code issues.
@ -23,7 +23,7 @@ Due to the large variety of operating systems and PHP platforms in existence we
## Prerequisites
* Choose a domain name or subdomain name for your server. Put some thought into this. While changing it after installation is supported, things still might break.
* Setup HTTPS on your domain.
* Setup HTTPS on your domain.
### Requirements
@ -42,7 +42,7 @@ Due to the large variety of operating systems and PHP platforms in existence we
For alternative server configurations (such as Nginx server and MariaDB database engine), refer to the [Friendica wiki](https://github.com/friendica/friendica/wiki).
### Optional
### Optional
* PHP ImageMagick extension (php-imagick) for animated GIF support.
@ -105,11 +105,11 @@ If you encounter a bug, please let us know.
### Create a database
Create an empty database and note the access details (hostname, username, password, database name).
Create an empty database and note the access details (hostname, username, password, database name).
Generate a strong password, then enter mysql with:
mysql
Then use the following script using the password you just generated:
CREATE DATABASE friendicadb;
@ -148,7 +148,7 @@ You have the following options to automatically install Friendica:
- using environment variables (f.e. `MYSQL_HOST`)
- using options (f.e. `--dbhost <host>`)
You can combine environment variables and options, but be aware that options are prioritized over environment variables.
You can combine environment variables and options, but be aware that options are prioritized over environment variables.
For more information during the installation, you can use this command line option
@ -157,7 +157,7 @@ For more information during the installation, you can use this command line opti
If you wish to include all optional checks, use `-a` like this statement:
bin/console autoinstall -a
*If* the automatic installation fails for any reason, check the following:
* Does `config/local.config.php` already exist? If yes, the automatic installation won't start
@ -171,7 +171,7 @@ You can use a prepared config file like [local-sample.config.php](/config/local-
Navigate to the main Friendica directory and execute the following command:
bin/console autoinstall -f <prepared.config.php>
#### B.2: Environment variables
There are two types of environment variables.
@ -194,7 +194,7 @@ if you don't use the option `--savedb` during installation, the DB credentials w
**Friendica settings**
This variables wont be used at normal Friendica runtime.
Instead, they get saved into `config/local.config.php`.
Instead, they get saved into `config/local.config.php`.
- `FRIENDICA_URL_PATH` The URL path of Friendica (f.e. '/friendica')
- `FRIENDICA_PHP_PATH` The path of the PHP binary
@ -238,7 +238,7 @@ Example:
### Verify the "host-meta" page is working
Friendica should respond automatically to important addresses under the */.well-known/* rewrite path.
One critical URL would look like, for example: https://example.com/.well-known/host-meta
One critical URL would look like, for example: https://example.com/.well-known/host-meta
It must be visible to the public and must respond with an XML file that is automatically customized to your site.
If that URL is not working, it is possible that some other software is using the /.well-known/ path.
@ -257,7 +257,7 @@ It may be necessary to chmod the /.well-known/.htaccess file if you were not giv
At this point visit your website again, and register your personal account with the same email as in the `config.admin_email` config value.
Registration errors should all be recoverable automatically.
If you get any *critical* failure at this point, it generally indicates the database was not installed correctly.
If you get any *critical* failure at this point, it generally indicates the database was not installed correctly.
You might wish to delete/rename `config/local.config.php` to another name and drop all the database tables so that you can start fresh.
## Post Install Configuration
@ -295,7 +295,7 @@ Once started, you can check the daemon status using the following command:
cd /path/to/friendica; php bin/daemon.php status
After a server restart or any other failure, the daemon needs to be restarted.
After a server restart or any other failure, the daemon needs to be restarted.
This could be achieved by a cronjob.
### (RECOMMENDED) Logging & Log Rotation
@ -408,7 +408,7 @@ provided by one of our members.
> On my server I use the php protection system Suhosin [http://www.hardened-php.net/suhosin/].
> One of the things it does is to block certain functions like proc_open, as
> configured in `/etc/php5/conf.d/suhosin.ini`:
>
>
> suhosin.executor.func.blacklist = proc_open, ...
>
> For those sites like Friendica that really need these functions they can be
@ -418,34 +418,34 @@ provided by one of our members.
> php_admin_value suhosin.executor.func.blacklist none
> php_admin_value suhosin.executor.eval.blacklist none
> </Directory>
>
>
> This enables every function for Friendica if accessed via browser, but not for
> the cronjob that is called via php command line. I attempted to enable it for
> cron by using something like:
>
>
> */10 * * * * cd /var/www/friendica/friendica/ && sudo -u www-data /usr/bin/php \
> -d suhosin.executor.func.blacklist=none \
> -d suhosin.executor.eval.blacklist=none -f bin/worker.php
>
>
> This worked well for simple test cases, but the friendica-cron still failed
> with a fatal error:
>
>
> suhosin[22962]: ALERT - function within blacklist called: proc_open()
> (attacker 'REMOTE_ADDR not set', file '/var/www/friendica/friendica/boot.php',
> line 1341)
>
>
> After a while I noticed, that `bin/worker.php` calls further PHP script via `proc_open`.
> These scripts themselves also use `proc_open` and fail, because they are NOT
> called with `-d suhosin.executor.func.blacklist=none`.
>
>
> So the simple solution is to put the correct parameters into `config/local.config.php`:
>
>
> 'config' => [
> //Location of PHP command line processor
> 'php_path' => '/usr/bin/php -d suhosin.executor.func.blacklist=none \
> -d suhosin.executor.eval.blacklist=none',
> ],
>
>
> This is obvious as soon as you notice that the friendica-cron uses `proc_open`
> to execute PHP scripts that also use `proc_open`, but it took me quite some time to find that out.
> I hope this saves some time for other people using suhosin with function blocklists.

View file

@ -20,15 +20,15 @@ You'll also see a link to a **Global Directory**.
There are several global directories across the globe that regularly exchange information with each other.
The specific global directory that you see usually depends on where your server is located.
If you click through to the global directory, you will be presented with a list of everybody who choses to be listed across all instances of Friendica.
You will also see a "Show Community Forums" link, which will direct you to Circles, Forums and Fanpages.
You connect to people, groups and forums in the same way, except groups and forums will automatically accept your introduction request, whereas a human will approve you manually.
You will also see a "Show Community Groups" link, which will direct you to Groups.
You connect to people and groups the same way, public groups will automatically accept your introduction, whereas private groups and some individual users will need to manually approve it.
Connect to other Friendica users
---
Visit their profile.
Just beneath their profile picture will be the word 'Connect' (we're assuming this is an English language profile).
Click that 'Connect' button and it will take you to a 'Connect' form.
Click that 'Connect' button, and it will take you to a 'Connect' form.
The form is going to ask you for your Identity Address.
This is necessary so that this person's website can find yours.
@ -41,7 +41,7 @@ It's easy for people to remember.
You *could* also put in the URL of your "home" page, such as "http://demo.friendica.com/profile/bob" instead of the email-style address.
When you've submitted the connection page, it will take you back to your own site where you must then login (if necessary) and verify the connection request on *your* site.
When you've submitted the connection page, it will take you back to your own site where you must then log in (if necessary) and verify the connection request on *your* site.
Once you've done this, the two websites can communicate with each other to complete the process (after your new friend has approved the request).
If you already know somebody's Identity Address, you can enter it in the "connect" box on your "Contacts" page.
@ -55,14 +55,14 @@ You can also use your Identity Address or other people's Identity Addresses to b
Currently, Friendica supports connections with people on diaspora*, Red, Hubzilla, GNU Social, StatusNet, Mastodon, Pleroma, socialhome, and ganggo platforms.
If you know (for instance) "alice" on gnusocial.net (a GNU Social site) you could put alice@gnusocial.net into your Contact page and become friends across networks.
Likewise you can put in the URL to Alice's gnusocial.net page, if you wish.
Likewise, you can put in the URL to Alice's gnusocial.net page, if you wish.
Note: Some versions of GNU Social software may require the full URL to your profile and may not work with the identity address.
People on these networks can also initiate contact with you, if they know your contact details.
### Other social media
If you server provides this functionality, you can also connect with people one
Twitter or important feeds from Tumblr, Wordpress, and many more.
Twitter or important feeds from Tumblr, WordPress, and many more.
To connect, enter their contact details in the "connect" box on your "Contacts" page.

View file

@ -4,7 +4,7 @@ Here are some more things to help get you started:
**Groups**
- <a href="http://forum.friendi.ca/profile/helpers">Friendica Support</a> - problems? This is the place to ask.
- <a href="https://forum.friendi.ca/profile/helpers">Friendica Support</a> - problems? This is the place to ask.
**Documentation**

View file

@ -1,9 +1,9 @@
This is the global directory.
If you get lost, you can <a href = "help/Quick-Start-groupsandpages">click this link</a> to bring yourself back here.
On this page, you'll find a collection of groups, forums and celebrity pages.
On this page, you'll find a collection of groups.
Groups are not real people.
Connecting to them is similar to "liking" something on Facebook, or signing up for a new forum.
Connecting to them is similar to "liking" something on Facebook, or signing up for a new group.
You don't have to feel awkward about introducing yourself to a new person, because they're not people!
When you connect to a group, all messages to that group will start appearing in your network tab.
@ -15,6 +15,6 @@ Remember the link at the top of this page will bring you back here.
Once you've added some groups, <a href="help/Quick-Start-andfinally">move on to the next section</a>.
<iframe src="https://dir.friendica.social/forum" width="950" height="600"></iframe>
<iframe src="https://dir.friendica.social/group" width="950" height="600"></iframe>

View file

@ -23,19 +23,19 @@ You can tag a person on a different network or one that is **not in your social
Unless their system blocks unsolicited "mentions", the person tagged will likely receive a "Mention" post/activity or become a direct participant in the conversation in the case of public posts.
Friendica blocks incoming “mentions” from people with no relationship to you.
The exception is an ongoing conversation started from a contact of both you and the 3rd person or a conversation in a forum where you are a member of.
The exception is an ongoing conversation started from a contact of both you and the 3rd person or a conversation in a group where you are a member of.
This is a spam prevention measure.
Remote mentions are delivered using the OStatus protocol.
This protocol is used by Friendica and GNU Social and several other systems like Mastodon, but is not currently implemented in Diaspora.
As the OStatus protocol allows this Friendica user can be @-mentioned by users from platforms using this protocol in conversations if the "Enable OStatus support" is activated on the Friendica node.
These @-mentions wont be blocked, even if there is no relationship between the sender and the receiver of the message.
These @-mentions won't be blocked, even if there is no relationship between the sender and the receiver of the message.
Friendica makes no distinction between people and forums for the purpose of tagging.
You can use @-mentions for forums like for other accounts to tag the forum.
If you want to post something exclusively to a forum (e.g. the support forum) please use the bang-notation instead of the @tag.
So !helpers will be an exclusive posting to the support forum if you are connected with the forum.
If you select a forum from the ACL a !-mention will be added automatically to your posting.
Friendica makes no distinction between people and groups for the purpose of tagging.
You can use @-mentions for groups like for other accounts to tag the group.
If you want to post something exclusively to a group (e.g. the support group) please use the !-mention instead of the @-mention.
So !helpers will be an exclusive posting to the support group if you are connected with the group.
If you select a group from the ACL a !-mention will be added automatically to your posting.
If you sort your contacts into circles, you cannot @-mention these circles.
But you can select the circle in the access control when creating a new posting, to allow (or disallow) a certain circle of people to see the posting.
@ -43,7 +43,7 @@ See [Circles and Privacy](help/Circles-and-Privacy) for more details about group
**Topical Tags**
Topical tags are indicated by preceding the tag name with the # character.
Topical tags are indicated by preceding the tag name with the # character.
This will create a link in the post to a generalised site search for the term provided.
For example, #cars will provide a search link for all posts mentioning 'cars' on your site.
Topical tags are generally a minimum of three characters in length.

View file

@ -81,7 +81,7 @@ Fields
| confirm | | varbinary(383) | YES | | NULL | |
| poco | | varbinary(383) | YES | | NULL | |
| writable | | boolean | NO | | 0 | |
| forum | contact is a forum. Deprecated, use 'contact-type' = 'community' and 'manually-approve' = false instead | boolean | NO | | 0 | |
| forum | contact is a group. Deprecated, use 'contact-type' = 'community' and 'manually-approve' = false instead | boolean | NO | | 0 | |
| prv | contact is a private group. Deprecated, use 'contact-type' = 'community' and 'manually-approve' = true instead | boolean | NO | | 0 | |
| bdyear | | varchar(4) | NO | | | |
| site-pubkey | Deprecated | text | YES | | NULL | |

View file

@ -12,7 +12,7 @@ Fields
| uid | Owner User id | mediumint unsigned | NO | | 0 | |
| visible | 1 indicates the member list is not private | boolean | NO | | 0 | |
| deleted | 1 indicates the circle has been deleted | boolean | NO | | 0 | |
| cid | Contact id of forum. When this field is filled then the members are synced automatically. | int unsigned | YES | | NULL | |
| cid | Contact id of group. When this field is filled then the members are synced automatically. | int unsigned | YES | | NULL | |
| name | human readable name of circle | varchar(255) | NO | | | |
Indexes

View file

@ -108,7 +108,7 @@ Zwischen der URL und dem Parameter muss ein Fragezeichen als Trennzeichen verwen
Ein Beispiel:
https://social.example.com/profile/example
https://social.example.com/profile/example
auf Deutsch:

View file

@ -60,4 +60,4 @@ Dies bedeutet auch, dass es nicht sinnvoll ist, mehrere Gruppen per ! in einem B
Du kannst außerdem via "Wall zu Wall" einen Beitrag auf der Community-Seite bzw. in der Community-Gruppe erstellen.
Kommentare, die Du an eine Community-Gruppe schickst, werden dem Originalbeitrag hinzugefügt.
Eine weitere Gruppe mit dem @-Erwähnung anzusprechen, leitet den Beitrag nicht an dieses weiter, da die Verteilung der Kommentare komplett vom Originalbeitrag bestimmt wird.
Eine weitere Gruppe mit dem @-Erwähnung anzusprechen, leitet den Beitrag nicht an dieses weiter, da die Verteilung der Kommentare komplett vom Originalbeitrag bestimmt wird.

View file

@ -16,7 +16,7 @@ Friendica - Dokumentation und Ressourcen
* [Freunde finden](help/Making-Friends)
* [Circles und Privatsphäre](help/Circles-and-Privacy)
* [Tags und Erwähnungen](help/Tags-and-Mentions)
* [Community-Gruppen](help/Forums)
* [Community-Gruppen](help/Groups)
* [Chats](help/Chats)
* Weiterführende Informationen
* [Account umziehen](help/Move-Account)

View file

@ -182,7 +182,7 @@ Sie werden stattdessen direkt in `config/local.config.php` gespeichert.
Gehe im Anschluss in den Friendica-Hauptordner und führe den Kommandozeilen Befehl aus:
bin/console autoinstall [--savedb]
#### B.3: Optionen
Alle Optionen werden in `config/local.config.php` gespeichert und überschreiben etwaige, zugehörige Umgebungsvariablen.

View file

@ -3,21 +3,21 @@ Freunde finden
* [Zur Startseite der Hilfe](help)
Freundschaft kann in Friendica viele verschiedene Bedeutungen annehmen.
Aber lasst es uns einfach halten, du willst einfach mit jemandem befreundet sein.
Freundschaft kann in Friendica viele verschiedene Bedeutungen annehmen.
Aber lasst es uns einfach halten, du willst einfach mit jemandem befreundet sein.
Wie machst du das?
Schau dir das Verzeichnis an.
Das Verzeichnis ist in zwei Teile aufgeteilt.
Wenn du auf den "Verzeichnis"-Button klickst, wirst du zunächst alle Mitglieder deines Servers sehen, die sich dazu entschlossen haben, angezeigt zu werden.
Außerdem siehst du dort einen Link zum globalen Verzeichnis.
Wenn du dich durch das globale Verzeichnis klickst, siehst du alle Nutzer weltweit auf allen Servern, die sich entschlossen haben, im Verzeichnis zu erscheinen.
Du wirst außerdem den Link "Show Community Groups" sehen, welcher dich zu Gruppen und Fan-Seiten führt.
Schau dir das Verzeichnis an.
Das Verzeichnis ist in zwei Teile aufgeteilt.
Wenn du auf den "Verzeichnis"-Button klickst, wirst du zunächst alle Mitglieder deines Servers sehen, die sich dazu entschlossen haben, angezeigt zu werden.
Außerdem siehst du dort einen Link zum globalen Verzeichnis.
Wenn du dich durch das globale Verzeichnis klickst, siehst du alle Nutzer weltweit auf allen Servern, die sich entschlossen haben, im Verzeichnis zu erscheinen.
Du wirst außerdem den Link "Show Community Groups" sehen, welcher dich zu Gruppen und Fan-Seiten führt.
Du verbindest dich mit Personen und Gruppen auf die gleiche Art, wobei Gruppen deine Anfrage automatisch annehmen, wohingegen ein Mensch dich erst manuell bestätigen muss.
*Mit anderen Friendica-Nutzern verbinden*
Besuche ihr Profil.
Besuche ihr Profil.
Direkt unter dem Profilfoto ist das Wort "Verbinden" (bzw. "Connect" in einem englischsprachigem Profil).
Klicke drauf und du gelangst zur "Verbinden"-Seite.
Dort wirst du nach deiner Identitätsadresse gefragt.

View file

@ -1,4 +1,4 @@
Gruppen und Seiten
Gruppen und Seiten
==========
* [Zur Startseite der Hilfe](help)
@ -21,6 +21,6 @@ Solltest Du beim Stöbern durch die vielen Gruppen nicht wieder hierher zurück
Wenn Du einige Gruppen hinzugefügt hast, gehe <a href="help/Quick-Start-andfinally">weiter zum nächsten Schritt</a>.
<iframe src="https://dir.friendica.social/forum" width="950" height="600"></iframe>
<iframe src="https://dir.friendica.social/group" width="950" height="600"></iframe>

View file

@ -1,26 +0,0 @@
Gruppen und Seiten
==========
* [Zur Startseite der Hilfe](help)
Hier siehst du das globale Verzeichnis.
Wenn du dich mal verirrt hast, kannst du <a href = "help/groupsandpages">diesen Link klicken</a> und wieder hierher kommen.
Auf dieser Seite findest du eine Zusammenstellung von Gruppen, Foren und bekannten Seiten.
Gruppen sind keine realen Personen.
Sich mit diesen zu verbinden ist, als wenn man jemanden auf Facebook "liked" ("gefällt mir") oder wenn man sich in einem Forum anmeldet.
Habe keine Sorge, falls du dich unbehaglich fühlst, wenn du dich einer neuen Person vorstellen sollst, da es sich nicht um Personen handelt.
Wenn du dich mit einer Gruppe verbindest, erscheinen alle Nachrichten der Gruppe in deinem "Netzwerk"-Tab.
Du kannst diese Beiträge kommentieren oder selbst in der Gruppe schreiben, ohne eine der Gruppenmitglieder persönlich hinzuzufügen.
Das ist ein großartiger Weg, dynamisch neue Freunde zu gewinnen.
Du findest Personen, die du magst, anstatt Fremde hinzuzufügen.
Suche dir einfach eine Gruppe und füge sie so hinzu, wie du auch normale Freunde hinzufügst.
Es gibt eine Menge Gruppen und möglicherweise findest du nicht wieder zu dieser Seite zurück.
In diesem Fall nutze einfach den Link oben auf dieser Seite.
Wenn du einige Gruppen hinzugefügt hast, gehe <a href="help/andfinally">weiter zum nächsten Schritt</a>.
<iframe src="https://dir.friendica.social/home" width="950" height="600"></iframe>

View file

@ -102,7 +102,7 @@ class Feature
// Post composition
'composition' => [
DI::l10n()->t('Post Composition Features'),
['aclautomention', DI::l10n()->t('Auto-mention Forums'), DI::l10n()->t('Add/remove mention when a forum page is selected/deselected in ACL window.'), false, DI::config()->get('feature_lock', 'aclautomention', false)],
['aclautomention', DI::l10n()->t('Auto-mention Groups'), DI::l10n()->t('Add/remove mention when a group page is selected/deselected in ACL window.'), false, DI::config()->get('feature_lock', 'aclautomention', false)],
['explicit_mentions', DI::l10n()->t('Explicit Mentions'), DI::l10n()->t('Add explicit mentions to comment box for manual control over who gets mentioned in replies.'), false, DI::config()->get('feature_lock', 'explicit_mentions', false)],
['add_abstract', DI::l10n()->t('Add an abstract from ActivityPub content warnings'), DI::l10n()->t('Add an abstract when commenting on ActivityPub posts with a content warning. Abstracts are displayed as content warning on systems like Mastodon or Pleroma.'), false, DI::config()->get('feature_lock', 'add_abstract', false)],
],
@ -116,7 +116,7 @@ class Feature
// Advanced Profile Settings
'advanced_profile' => [
DI::l10n()->t('Advanced Profile Settings'),
['forumlist_profile', DI::l10n()->t('List Forums'), DI::l10n()->t('Show visitors public community forums at the Advanced Profile Page'), false, DI::config()->get('feature_lock', 'forumlist_profile', false)],
['forumlist_profile', DI::l10n()->t('List Groups'), DI::l10n()->t('Show visitors public groups at the Advanced Profile Page'), false, DI::config()->get('feature_lock', 'forumlist_profile', false)],
['tagadelic', DI::l10n()->t('Tag Cloud'), DI::l10n()->t('Provide a personal tag cloud on your profile page'), false, DI::config()->get('feature_lock', 'tagadelic', false)],
['profile_membersince', DI::l10n()->t('Display Membership Date'), DI::l10n()->t('Display membership date in profile'), false, DI::config()->get('feature_lock', 'profile_membersince', false)],
],

View file

@ -29,21 +29,21 @@ use Friendica\DI;
use Friendica\Model\Contact;
/**
* This class handles methods related to the forum functionality
* This class handles methods related to the group functionality
*/
class ForumManager
class GroupManager
{
/**
* Function to list all forums a user is connected with
* Function to list all groups a user is connected with
*
* @param int $uid of the profile owner
* @param boolean $lastitem Sort by lastitem
* @param boolean $showhidden Show forums which are not hidden
* @param boolean $showhidden Show groups which are not hidden
* @param boolean $showprivate Show private groups
*
* @return array
* 'url' => forum url
* 'name' => forum name
* 'url' => group url
* 'name' => group name
* 'id' => number of the key from the array
* 'micro' => contact photo in format micro
* 'thumb' => contact photo in format thumb
@ -76,16 +76,16 @@ class ForumManager
$condition = DBA::mergeConditions($condition, ['hidden' => false]);
}
$forumlist = [];
$groupList = [];
$fields = ['id', 'url', 'name', 'micro', 'thumb', 'avatar', 'network', 'uid'];
$contacts = DBA::select('account-user-view', $fields, $condition, $params);
if (!$contacts) {
return($forumlist);
return $groupList;
}
while ($contact = DBA::fetch($contacts)) {
$forumlist[] = [
$groupList[] = [
'url' => $contact['url'],
'name' => $contact['name'],
'id' => $contact['id'],
@ -95,19 +95,19 @@ class ForumManager
}
DBA::close($contacts);
return($forumlist);
return($groupList);
}
/**
* Forumlist widget
* Group list widget
*
* Sidebar widget to show subscribed friendica forums. If activated
* in the settings, it appears at the notwork page sidebar
* Sidebar widget to show subscribed Friendica groups. If activated
* in the settings, it appears in the network page sidebar
*
* @param string $baseurl Base module path
* @param int $uid The ID of the User
* @param int $cid The contact id which is used to mark a forum as "selected"
* @param int $cid The contact id which is used to mark a group as "selected"
* @return string
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
@ -121,7 +121,7 @@ class ForumManager
$contacts = self::getList($uid, $lastitem, true, true);
$total = count($contacts);
$visible_forums = 10;
$visibleGroups = 10;
if (DBA::isResult($contacts)) {
$id = 0;
@ -129,7 +129,7 @@ class ForumManager
$entries = [];
foreach ($contacts as $contact) {
$selected = (($cid == $contact['id']) ? ' forum-selected' : '');
$selected = (($cid == $contact['id']) ? ' group-selected' : '');
$entry = [
'url' => $baseurl . '/' . $contact['id'],
@ -143,16 +143,16 @@ class ForumManager
$entries[] = $entry;
}
$tpl = Renderer::getMarkupTemplate('widget_forumlist.tpl');
$tpl = Renderer::getMarkupTemplate('widget/group_list.tpl');
$o .= Renderer::replaceMacros(
$tpl,
[
'$title' => DI::l10n()->t('Forums'),
'$forums' => $entries,
'$link_desc' => DI::l10n()->t('External link to forum'),
'$title' => DI::l10n()->t('Groups'),
'$groups' => $entries,
'$link_desc' => DI::l10n()->t('External link to group'),
'$total' => $total,
'$visible_forums' => $visible_forums,
'$visible_groups' => $visibleGroups,
'$showless' => DI::l10n()->t('show less'),
'$showmore' => DI::l10n()->t('show more')]
);
@ -162,9 +162,9 @@ class ForumManager
}
/**
* Format forumlist as contact block
* Format group list as contact block
*
* This function is used to show the forumlist in
* This function is used to show the group list in
* the advanced profile.
*
* @param int $uid The ID of the User
@ -181,7 +181,7 @@ class ForumManager
$o = '';
// place holder in case somebody wants configurability
// placeholder in case somebody wants configurability
$show_total = 9999;
//don't sort by last updated item
@ -191,7 +191,7 @@ class ForumManager
$total_shown = 0;
foreach ($contacts as $contact) {
$o .= HTML::micropro($contact, true, 'forumlist-profile-advanced');
$o .= HTML::micropro($contact, true, 'grouplist-profile-advanced');
$total_shown++;
if ($total_shown == $show_total) {
break;
@ -202,14 +202,14 @@ class ForumManager
}
/**
* count unread forum items
* count unread group items
*
* Count unread items of connected forums and private groups
* Count unread items of connected groups and private groups
*
* @return array
* 'id' => contact id
* 'name' => contact/forum name
* 'count' => counted unseen forum items
* 'name' => contact/group name
* 'count' => counted unseen group items
* @throws \Exception
*/
public static function countUnseenItems()

View file

@ -484,16 +484,16 @@ class Item
{
// Look for any tags and linkify them
$item['inform'] = '';
$private_forum = false;
$private_group = false;
$private_id = null;
$only_to_forum = false;
$forum_contact = [];
$only_to_group = false;
$group_contact = [];
$receivers = [];
// Convert mentions in the body to a unified format
$item['body'] = BBCode::setMentions($item['body'], $item['uid'], $item['network']);
// Search for forum mentions
// Search for group mentions
foreach (Tag::getFromBody($item['body'], Tag::TAG_CHARACTER[Tag::MENTION] . Tag::TAG_CHARACTER[Tag::EXCLUSIVE_MENTION]) as $tag) {
$contact = Contact::getByURLForUser($tag[2], $item['uid']);
if (empty($contact)) {
@ -512,37 +512,37 @@ class Item
}
if (!empty($contact['prv']) || ($tag[1] == Tag::TAG_CHARACTER[Tag::EXCLUSIVE_MENTION])) {
$private_forum = $contact['prv'];
$only_to_forum = ($tag[1] == Tag::TAG_CHARACTER[Tag::EXCLUSIVE_MENTION]);
$private_group = $contact['prv'];
$only_to_group = ($tag[1] == Tag::TAG_CHARACTER[Tag::EXCLUSIVE_MENTION]);
$private_id = $contact['id'];
$forum_contact = $contact;
Logger::info('Private forum or exclusive mention', ['url' => $tag[2], 'mention' => $tag[1]]);
$group_contact = $contact;
Logger::info('Private group or exclusive mention', ['url' => $tag[2], 'mention' => $tag[1]]);
} elseif ($item['allow_cid'] == '<' . $contact['id'] . '>') {
$private_forum = false;
$only_to_forum = true;
$private_group = false;
$only_to_group = true;
$private_id = $contact['id'];
$forum_contact = $contact;
Logger::info('Public forum', ['url' => $tag[2], 'mention' => $tag[1]]);
$group_contact = $contact;
Logger::info('Public group', ['url' => $tag[2], 'mention' => $tag[1]]);
} else {
Logger::info('Post with forum mention will not be converted to a forum post', ['url' => $tag[2], 'mention' => $tag[1]]);
Logger::info('Post with group mention will not be converted to a group post', ['url' => $tag[2], 'mention' => $tag[1]]);
}
}
Logger::info('Got inform', ['inform' => $item['inform']]);
if (($item['gravity'] == ItemModel::GRAVITY_PARENT) && !empty($forum_contact) && ($private_forum || $only_to_forum)) {
// we tagged a forum in a top level post. Now we change the post
$item['private'] = $private_forum ? ItemModel::PRIVATE : ItemModel::UNLISTED;
if (($item['gravity'] == ItemModel::GRAVITY_PARENT) && !empty($group_contact) && ($private_group || $only_to_group)) {
// we tagged a group in a top level post. Now we change the post
$item['private'] = $private_group ? ItemModel::PRIVATE : ItemModel::UNLISTED;
if ($only_to_forum) {
if ($only_to_group) {
$item['postopts'] = '';
}
$item['deny_cid'] = '';
$item['deny_gid'] = '';
if ($private_forum) {
if ($private_group) {
$item['allow_cid'] = '<' . $private_id . '>';
$item['allow_gid'] = '<' . Circle::getIdForForum($forum_contact['id']) . '>';
$item['allow_gid'] = '<' . Circle::getIdForGroup($group_contact['id']) . '>';
} else {
$item['allow_cid'] = '';
$item['allow_gid'] = '';
@ -1011,7 +1011,7 @@ class Item
$post['body'] = $this->bbCodeVideo->transform($post['body']);
$post = $this->setObjectType($post);
// Personal notes must never be altered to a forum post.
// Personal notes must never be altered to a group post.
if ($post['post-type'] != ItemModel::PT_PERSONAL_NOTE) {
// Look for any tags and linkify them
$post = $this->expandTags($post);

View file

@ -123,7 +123,7 @@ class Nav
'$apps' => $this->getAppMenu(),
'$home' => $this->l10n->t('Go back'),
'$clear_notifs' => $this->l10n->t('Clear notifications'),
'$search_hint' => $this->l10n->t('@name, !forum, #tags, content')
'$search_hint' => $this->l10n->t('@name, !group, #tags, content')
]);
Hook::callAll('page_header', $nav);
@ -273,7 +273,7 @@ class Nav
];
if ($this->config->get('system', 'poco_local_search')) {
$nav['searchoption'][] = $this->l10n->t('Forums');
$nav['searchoption'][] = $this->l10n->t('Groups');
}
}

View file

@ -861,7 +861,7 @@ class HTML
'$id' => $id,
'$search_label' => DI::l10n()->t('Search'),
'$save_label' => $save_label,
'$search_hint' => DI::l10n()->t('@name, !forum, #tags, content'),
'$search_hint' => DI::l10n()->t('@name, !group, #tags, content'),
'$mode' => $mode,
'$return_url' => urlencode(Search::getSearchPath($s)),
];
@ -874,7 +874,7 @@ class HTML
];
if (DI::config()->get('system', 'poco_local_search')) {
$values['$searchoption']['forums'] = DI::l10n()->t('Forums');
$values['$searchoption']['groups'] = DI::l10n()->t('Groups');
}
}

View file

@ -530,7 +530,7 @@ class Widget
['ref' => 'person', 'name' => DI::l10n()->t('Persons')],
['ref' => 'organisation', 'name' => DI::l10n()->t('Organisations')],
['ref' => 'news', 'name' => DI::l10n()->t('News')],
['ref' => 'community', 'name' => DI::l10n()->t('Forums')],
['ref' => 'community', 'name' => DI::l10n()->t('Groups')],
];
return self::filter('accounttype', DI::l10n()->t('Account Types'), '',

View file

@ -167,12 +167,12 @@ class ACL
$acl_contacts[] = $acl_yourself;
$acl_forums = Contact::selectToArray($fields,
$acl_groups = Contact::selectToArray($fields,
['uid' => $user_id, 'self' => false, 'blocked' => false, 'archive' => false, 'deleted' => false,
'network' => Protocol::FEDERATED, 'pending' => false, 'contact-type' => Contact::TYPE_COMMUNITY], $params
);
$acl_contacts = array_merge($acl_forums, $acl_contacts);
$acl_contacts = array_merge($acl_groups, $acl_contacts);
array_walk($acl_contacts, function (&$value) {
$value['type'] = 'contact';

View file

@ -42,7 +42,7 @@ class Search
const DEFAULT_DIRECTORY = 'https://dir.friendica.social';
const TYPE_PEOPLE = 0;
const TYPE_FORUM = 1;
const TYPE_GROUP = 1;
const TYPE_ALL = 2;
/**
@ -55,7 +55,7 @@ class Search
* @throws HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function getContactsFromProbe(string $user, $only_forum = false): ResultList
public static function getContactsFromProbe(string $user, $only_group = false): ResultList
{
$emptyResultList = new ResultList();
@ -68,7 +68,7 @@ class Search
return $emptyResultList;
}
if ($only_forum && ($user_data['contact-type'] != Contact::TYPE_COMMUNITY)) {
if ($only_group && ($user_data['contact-type'] != Contact::TYPE_COMMUNITY)) {
return $emptyResultList;
}
@ -112,8 +112,8 @@ class Search
$searchUrl = $server . '/search';
switch ($type) {
case self::TYPE_FORUM:
$searchUrl .= '/forum';
case self::TYPE_GROUP:
$searchUrl .= '/group';
break;
case self::TYPE_PEOPLE:
$searchUrl .= '/people';
@ -174,7 +174,7 @@ class Search
{
Logger::info('Searching', ['search' => $search, 'type' => $type, 'start' => $start, 'itempage' => $itemPage]);
$contacts = Contact::searchByName($search, $type == self::TYPE_FORUM ? 'community' : '', true);
$contacts = Contact::searchByName($search, $type == self::TYPE_GROUP ? 'community' : '', true);
$resultList = new ResultList($start, count($contacts), $itemPage);
@ -240,7 +240,9 @@ class Search
$return = array_map(function ($result) {
static $contactType = [
'People' => Contact::TYPE_PERSON,
// Kept for backward compatibility
'Forum' => Contact::TYPE_COMMUNITY,
'Group' => Contact::TYPE_COMMUNITY,
'Organization' => Contact::TYPE_ORGANISATION,
'News' => Contact::TYPE_NEWS,
];

View file

@ -615,9 +615,9 @@ class Circle
* @param integer $id Contact ID
* @return integer Circle ID
*/
public static function getIdForForum(int $id): int
public static function getIdForGroup(int $id): int
{
Logger::info('Get id for forum id', ['id' => $id]);
Logger::info('Get id for group id', ['id' => $id]);
$contact = Contact::getById($id, ['uid', 'name', 'contact-type', 'manually-approve']);
if (empty($contact) || ($contact['contact-type'] != Contact::TYPE_COMMUNITY) || !$contact['manually-approve']) {
return 0;
@ -645,9 +645,9 @@ class Circle
* @param integer $id Contact ID
* @return void
*/
public static function updateMembersForForum(int $id)
public static function updateMembersForGroup(int $id)
{
Logger::info('Update forum members', ['id' => $id]);
Logger::info('Update group members', ['id' => $id]);
$contact = Contact::getById($id, ['uid', 'url']);
if (empty($contact)) {
@ -659,7 +659,7 @@ class Circle
return;
}
$gid = self::getIdForForum($id);
$gid = self::getIdForGroup($id);
if (empty($gid)) {
return;
}
@ -682,6 +682,6 @@ class Circle
}
DBA::delete('group_member', ['gid' => $gid, 'contact-id' => $current]);
Logger::info('Updated forum members', ['id' => $id, 'count' => DBA::count('group_member', ['gid' => $gid])]);
Logger::info('Updated group members', ['id' => $id, 'count' => DBA::count('group_member', ['gid' => $gid])]);
}
}

View file

@ -79,7 +79,7 @@ class Contact
* TYPE_NEWS - the account is a news reflector
* Associated page type: PAGE_SOAPBOX
*
* TYPE_COMMUNITY - the account is community forum
* TYPE_COMMUNITY - the account is community group
* Associated page types: PAGE_COMMUNITY, PAGE_PRVGROUP
*
* TYPE_RELAY - the account is a relay
@ -1652,7 +1652,7 @@ class Contact
break;
case self::TYPE_COMMUNITY:
$account_type = DI::l10n()->t("Forum");
$account_type = DI::l10n()->t("Group");
break;
default:
@ -3472,13 +3472,13 @@ class Contact
}
/**
* Is the contact a forum?
* Is the contact a group?
*
* @param integer $contactid ID of the contact
*
* @return boolean "true" if it is a forum
* @return boolean "true" if it is a group
*/
public static function isForum(int $contactid): bool
public static function isGroup(int $contactid): bool
{
$fields = ['contact-type'];
$condition = ['id' => $contactid];
@ -3487,7 +3487,7 @@ class Contact
return false;
}
// Is it a forum?
// Is it a group?
return ($contact['contact-type'] == self::TYPE_COMMUNITY);
}

View file

@ -1004,7 +1004,7 @@ class Item
$item['deleted'] = $toplevel_parent['deleted'];
$item['wall'] = $toplevel_parent['wall'];
// Reshares have to keep their permissions to allow forums to work
// Reshares have to keep their permissions to allow groups to work
if (!$defined_permissions && (!$item['origin'] || ($item['verb'] != Activity::ANNOUNCE))) {
$item['allow_cid'] = $toplevel_parent['allow_cid'];
$item['allow_gid'] = $toplevel_parent['allow_gid'];
@ -1307,7 +1307,7 @@ class Item
Post::update($fields, ['uri-id' => $posted_item['parent-uri-id'], 'uid' => $posted_item['uid']]);
// In that function we check if this is a forum post. Additionally we delete the item under certain circumstances
// In that function we check if this is a group post. Additionally we delete the item under certain circumstances
if (self::tagDeliver($posted_item['uid'], $post_user_id)) {
// Get the user information for the logging
$user = User::getById($uid);
@ -1418,11 +1418,11 @@ class Item
}
/**
* Change the owner of a parent item if it had been shared by a forum
* Change the owner of a parent item if it had been shared by a group
*
* (public) forum posts in the new format consist of the regular post by the author
* followed by an announce message sent from the forum account.
* Changing the owner helps in grouping forum posts.
* (public) group posts in the new format consist of the regular post by the author
* followed by an announce message sent from the group account.
* Changing the owner helps in grouping group posts.
*
* @param array $item
* @return void
@ -1458,7 +1458,7 @@ class Item
}
if (Contact::isSharing($parent['owner-id'], $item['uid'])) {
Logger::info('The resharer is no forum: quit', ['resharer' => $item['author-id'], 'owner' => $parent['owner-id'], 'author' => $parent['author-id'], 'uid' => $item['uid']]);
Logger::info('The resharer is no group: quit', ['resharer' => $item['author-id'], 'owner' => $parent['owner-id'], 'author' => $parent['author-id'], 'uid' => $item['uid']]);
return;
}
}
@ -1603,7 +1603,7 @@ class Item
if (($uid != 0) && ($item['gravity'] == self::GRAVITY_PARENT)) {
$owner = User::getOwnerDataById($uid);
if (($owner['contact-type'] == User::ACCOUNT_TYPE_COMMUNITY) && !Tag::isMentioned($uri_id, $owner['url'])) {
Logger::info('Target user is a forum but is not mentioned here, thread will not be stored', ['uid' => $uid, 'uri-id' => $uri_id]);
Logger::info('Target user is a group but is not mentioned here, thread will not be stored', ['uid' => $uid, 'uri-id' => $uri_id]);
return 0;
}
}
@ -1709,7 +1709,7 @@ class Item
return 0;
}
// When the post belongs to a a forum then all forum users are allowed to access it
// When the post belongs to a a group then all group users are allowed to access it
foreach (Tag::getByURIId($uriid, [Tag::MENTION, Tag::EXCLUSIVE_MENTION]) as $tag) {
if (DBA::exists('contact', ['uid' => $uid, 'nurl' => Strings::normaliseLink($tag['url']), 'contact-type' => Contact::TYPE_COMMUNITY])) {
$target_uid = User::getIdForURL($tag['url']);
@ -2104,7 +2104,7 @@ class Item
/// @todo On private posts we could obfuscate the date
$update = ($arr['private'] != self::PRIVATE) || in_array($arr['network'], Protocol::FEDERATED);
// Is it a forum? Then we don't care about the rules from above
// Is it a group? Then we don't care about the rules from above
if (!$update && in_array($arr["network"], [Protocol::ACTIVITYPUB, Protocol::DFRN]) && ($arr["parent-uri-id"] === $arr["uri-id"])) {
if (DBA::exists('contact', ['id' => $arr['contact-id'], 'forum' => true])) {
$update = true;
@ -2200,7 +2200,7 @@ class Item
}
/**
* look for mention tags and setup a second delivery chain for forum/community posts if appropriate
* look for mention tags and setup a second delivery chain for group/community posts if appropriate
*
* @param int $uid
* @param int $item_id
@ -3663,13 +3663,13 @@ class Item
}
/**
* Does the given uri-id belongs to a post that is sent as starting post to a forum?
* Does the given uri-id belongs to a post that is sent as starting post to a group?
*
* @param int $uri_id
*
* @return boolean "true" when it is a forum post
* @return boolean "true" when it is a group post
*/
public static function isForumPost(int $uri_id): bool
public static function isGroupPost(int $uri_id): bool
{
foreach (Tag::getByURIId($uri_id, [Tag::EXCLUSIVE_MENTION]) as $tag) {
if (DBA::exists('contact', ['uid' => 0, 'nurl' => Strings::normaliseLink($tag['url']), 'contact-type' => Contact::TYPE_COMMUNITY])) {

View file

@ -42,7 +42,7 @@ class Type
const TAG_SELF = 128;
/** @var int Notification about getting poked/prodded/etc. (Obsolete) */
const POKE = 512;
/** @var int Notification about either a contact had posted something directly or the contact is a mentioned forum */
/** @var int Notification about either a contact had posted something directly or the contact is a mentioned group */
const SHARE = 1024;
/** @var int Global System notifications */

View file

@ -830,7 +830,7 @@ class Photo
* Changes photo permissions that had been embedded in a post
*
* @todo This function currently does have some flaws:
* - Sharing a post with a forum will create a photo that only the forum can see.
* - Sharing a post with a group will create a photo that only the group can see.
* - Sharing a photo again that been shared non public before doesn't alter the permissions.
*
* @return string
@ -877,7 +877,7 @@ class Photo
/**
* @todo Existing permissions need to be mixed with the new ones.
* Otherwise this creates problems with sharing the same picture multiple times
* Also check if $str_contact_allow does contain a public forum.
* Also check if $str_contact_allow does contain a public group.
* Then set the permissions to public.
*/

View file

@ -50,7 +50,7 @@ class Tag
*/
const IMPLICIT_MENTION = 8;
/**
* An exclusive mention transmits the post only to the target account without transmitting it to the followers, usually a forum.
* An exclusive mention transmits the post only to the target account without transmitting it to the followers, usually a group.
*/
const EXCLUSIVE_MENTION = 9;

View file

@ -88,7 +88,7 @@ class User
* ACCOUNT_TYPE_NEWS - the account is a news reflector
* Associated page type: PAGE_FLAGS_SOAPBOX
*
* ACCOUNT_TYPE_COMMUNITY - the account is community forum
* ACCOUNT_TYPE_COMMUNITY - the account is community group
* Associated page types: PAGE_COMMUNITY, PAGE_FLAGS_PRVGROUP
*
* ACCOUNT_TYPE_RELAY - the account is a relay

View file

@ -71,8 +71,8 @@ class BaseSearch extends BaseModule
$header = DI::l10n()->t('People Search - %s', $search);
} elseif (strpos($search, '!') === 0) {
$search = trim(substr($search, 1));
$type = Search::TYPE_FORUM;
$header = DI::l10n()->t('Forum Search - %s', $search);
$type = Search::TYPE_GROUP;
$header = DI::l10n()->t('Group Search - %s', $search);
}
$search = Network::convertToIdn($search);
@ -98,7 +98,7 @@ class BaseSearch extends BaseModule
}
if (!$results->getTotal()) {
$results = Search::getContactsFromProbe(Network::convertToIdn($search), $type == Search::TYPE_FORUM);
$results = Search::getContactsFromProbe(Network::convertToIdn($search), $type == Search::TYPE_GROUP);
}
return self::printResult($results, $pager, $header);
@ -151,4 +151,4 @@ class BaseSearch extends BaseModule
'$paginate' => $pager->renderFull($results->getTotal()),
]);
}
}
}

View file

@ -24,7 +24,7 @@ namespace Friendica\Module\Conversation;
use Friendica\BaseModule;
use Friendica\Content\BoundariesPager;
use Friendica\Content\Conversation;
use Friendica\Content\ForumManager;
use Friendica\Content\GroupManager;
use Friendica\Content\Nav;
use Friendica\Content\Widget;
use Friendica\Content\Text\HTML;
@ -52,7 +52,7 @@ class Network extends BaseModule
/** @var int */
private static $circleId;
/** @var int */
private static $forumContactId;
private static $groupContactId;
/** @var string */
private static $selectedTab;
/** @var mixed */
@ -90,9 +90,9 @@ class Network extends BaseModule
DI::page()['aside'] .= Widget::accountTypes($module, self::$accountTypeString);
DI::page()['aside'] .= Circle::sidebarWidget($module, $module . '/circle', 'standard', self::$circleId);
DI::page()['aside'] .= ForumManager::widget($module . '/forum', DI::userSession()->getLocalUserId(), self::$forumContactId);
DI::page()['aside'] .= GroupManager::widget($module . '/group', DI::userSession()->getLocalUserId(), self::$groupContactId);
DI::page()['aside'] .= Widget::postedByYear($module . '/archive', DI::userSession()->getLocalUserId(), false);
DI::page()['aside'] .= Widget::networks($module, !self::$forumContactId ? self::$network : '');
DI::page()['aside'] .= Widget::networks($module, !self::$groupContactId ? self::$network : '');
DI::page()['aside'] .= Widget\SavedSearches::getHTML(DI::args()->getQueryString());
DI::page()['aside'] .= Widget::fileAs('filed', '');
@ -119,9 +119,9 @@ class Network extends BaseModule
$content = '';
if (self::$forumContactId) {
// If self::$forumContactId belongs to a community forum or a private group, add a mention to the status editor
$condition = ["`id` = ? AND `contact-type` = ?", self::$forumContactId, Contact::TYPE_COMMUNITY];
if (self::$groupContactId) {
// If self::$groupContactId belongs to a community group or a private group, add a mention to the status editor
$condition = ["`id` = ? AND `contact-type` = ?", self::$groupContactId, Contact::TYPE_COMMUNITY];
$contact = DBA::selectFirst('contact', ['addr'], $condition);
if (!empty($contact['addr'])) {
$content = '!' . $contact['addr'];
@ -136,8 +136,8 @@ class Network extends BaseModule
}
$allowedCids = [];
if (self::$forumContactId) {
$allowedCids[] = (int) self::$forumContactId;
if (self::$groupContactId) {
$allowedCids[] = (int) self::$groupContactId;
} elseif (self::$network) {
$condition = [
'uid' => DI::userSession()->getLocalUserId(),
@ -160,9 +160,9 @@ class Network extends BaseModule
}
$x = [
'lockstate' => self::$circleId || self::$forumContactId || self::$network || ACL::getLockstateForUserId($a->getLoggedInUserId()) ? 'lock' : 'unlock',
'lockstate' => self::$circleId || self::$groupContactId || self::$network || ACL::getLockstateForUserId($a->getLoggedInUserId()) ? 'lock' : 'unlock',
'acl' => ACL::getFullSelectorHTML(DI::page(), $a->getLoggedInUserId(), true, $default_permissions),
'bang' => ((self::$circleId || self::$forumContactId || self::$network) ? '!' : ''),
'bang' => ((self::$circleId || self::$groupContactId || self::$network) ? '!' : ''),
'content' => $content,
];
@ -178,8 +178,8 @@ class Network extends BaseModule
$o = Renderer::replaceMacros(Renderer::getMarkupTemplate('section_title.tpl'), [
'$title' => DI::l10n()->t('Circle: %s', $circle['name'])
]) . $o;
} elseif (self::$forumContactId) {
$contact = Contact::getById(self::$forumContactId);
} elseif (self::$groupContactId) {
$contact = Contact::getById(self::$groupContactId);
if (DBA::isResult($contact)) {
$o = Renderer::replaceMacros(Renderer::getMarkupTemplate('contact/list.tpl'), [
'contacts' => [ModuleContact::getContactTemplateVars($contact)],
@ -307,7 +307,7 @@ class Network extends BaseModule
{
self::$circleId = $this->parameters['circle_id'] ?? 0;
self::$forumContactId = $this->parameters['contact_id'] ?? 0;
self::$groupContactId = $this->parameters['contact_id'] ?? 0;
self::$selectedTab = self::getTimelineOrderBySession(DI::userSession(), DI::pConfig());
@ -413,10 +413,10 @@ class Network extends BaseModule
if (self::$circleId) {
$conditionStrings = DBA::mergeConditions($conditionStrings, ["`contact-id` IN (SELECT `contact-id` FROM `group_member` WHERE `gid` = ?)", self::$circleId]);
} elseif (self::$forumContactId) {
} elseif (self::$groupContactId) {
$conditionStrings = DBA::mergeConditions($conditionStrings,
["((`contact-id` = ?) OR `uri-id` IN (SELECT `parent-uri-id` FROM `post-user-view` WHERE (`contact-id` = ? AND `gravity` = ? AND `vid` = ? AND `uid` = ?)))",
self::$forumContactId, self::$forumContactId, Item::GRAVITY_ACTIVITY, Verb::getID(Activity::ANNOUNCE), DI::userSession()->getLocalUserId()]);
self::$groupContactId, self::$groupContactId, Item::GRAVITY_ACTIVITY, Verb::getID(Activity::ANNOUNCE), DI::userSession()->getLocalUserId()]);
}
// Currently only the order modes "received" and "commented" are in use
@ -479,7 +479,7 @@ class Network extends BaseModule
// We aren't going to try and figure out at the item, circle, and page
// level which items you've seen and which you haven't. If you're looking
// at the top level network page just mark everything seen.
if (!self::$circleId && !self::$forumContactId && !self::$star && !self::$mention) {
if (!self::$circleId && !self::$groupContactId && !self::$star && !self::$mention) {
$condition = ['unseen' => true, 'uid' => DI::userSession()->getLocalUserId()];
self::setItemsSeenByCondition($condition);
} elseif (!empty($parents)) {

View file

@ -118,15 +118,15 @@ abstract class BaseUsers extends BaseModeration
$page_types = [
User::PAGE_FLAGS_NORMAL => $this->t('Normal Account Page'),
User::PAGE_FLAGS_SOAPBOX => $this->t('Soapbox Page'),
User::PAGE_FLAGS_COMMUNITY => $this->t('Public Forum'),
User::PAGE_FLAGS_COMMUNITY => $this->t('Public Group'),
User::PAGE_FLAGS_FREELOVE => $this->t('Automatic Friend Page'),
User::PAGE_FLAGS_PRVGROUP => $this->t('Private Forum')
User::PAGE_FLAGS_PRVGROUP => $this->t('Private Group')
];
$account_types = [
User::ACCOUNT_TYPE_PERSON => $this->t('Personal Page'),
User::ACCOUNT_TYPE_ORGANISATION => $this->t('Organisation Page'),
User::ACCOUNT_TYPE_NEWS => $this->t('News Page'),
User::ACCOUNT_TYPE_COMMUNITY => $this->t('Community Forum'),
User::ACCOUNT_TYPE_COMMUNITY => $this->t('Community Group'),
User::ACCOUNT_TYPE_RELAY => $this->t('Relay'),
];

View file

@ -52,10 +52,10 @@ class Summary extends BaseModeration
$accounts = [
[$this->t('Normal Account'), 0],
[$this->t('Automatic Follower Account'), 0],
[$this->t('Public Forum Account'), 0],
[$this->t('Public Group Account'), 0],
[$this->t('Automatic Friend Account'), 0],
[$this->t('Blog Account'), 0],
[$this->t('Private Forum Account'), 0]
[$this->t('Private Group Account'), 0]
];
$users = 0;

View file

@ -24,7 +24,7 @@ namespace Friendica\Module\Notifications;
use Friendica\App;
use Friendica\BaseModule;
use Friendica\Contact\Introduction\Repository\Introduction;
use Friendica\Content\ForumManager;
use Friendica\Content\GroupManager;
use Friendica\Core\Cache\Capability\ICanCache;
use Friendica\Core\Cache\Enum\Duration;
use Friendica\Core\Config\Capability\IManageConfigValues;
@ -109,14 +109,14 @@ class Ping extends BaseModule
$register_count = 0;
$sysnotify_count = 0;
$circles_unseen = [];
$forums_unseen = [];
$groups_unseen = [];
$event_count = 0;
$today_event_count = 0;
$birthday_count = 0;
$today_birthday_count = 0;
// Suppress notification display for forum accounts
// Suppress notification display for group accounts
if ($this->session->getLocalUserId() && $this->session->get('page_flags', '') != User::PAGE_FLAGS_COMMUNITY) {
if ($this->pconfig->get($this->session->getLocalUserId(), 'system', 'detailed_notif')) {
$notifications = $this->notificationRepo->selectDetailedForUser($this->session->getLocalUserId());
@ -160,9 +160,9 @@ class Ping extends BaseModule
}
}
foreach (ForumManager::countUnseenItems() as $forum_count) {
if ($forum_count['count'] > 0) {
$forums_unseen[] = $forum_count;
foreach (GroupManager::countUnseenItems() as $group_count) {
if ($group_count['count'] > 0) {
$groups_unseen[] = $group_count;
}
}
}
@ -290,7 +290,7 @@ class Ping extends BaseModule
$data['birthdays'] = $birthday_count;
$data['birthdays-today'] = $today_birthday_count;
$data['circles'] = $circles_unseen;
$data['forums'] = $forums_unseen;
$data['groups'] = $groups_unseen;
$data['notification'] = ($notification_count < 50) ? $notification_count : '49+';
$data['notifications'] = $navNotifications;

View file

@ -188,7 +188,7 @@ class Conversations extends BaseProfile
$condition = DBA::mergeConditions($condition, ["`received` >= ?", DateTimeFormat::convert($datequery2, 'UTC', $this->app->getTimeZone())]);
}
// Does the profile page belong to a forum?
// Does the profile page belong to a group?
// If not then we can improve the performance with an additional condition
if ($profile['account-type'] != User::ACCOUNT_TYPE_COMMUNITY) {
$condition = DBA::mergeConditions($condition, ['contact-id' => $profile['id']]);

View file

@ -23,7 +23,7 @@ namespace Friendica\Module\Profile;
use Friendica\App;
use Friendica\Content\Feature;
use Friendica\Content\ForumManager;
use Friendica\Content\GroupManager;
use Friendica\Content\Nav;
use Friendica\Content\Text\BBCode;
use Friendica\Core\Config\Capability\IManageConfigValues;
@ -254,12 +254,12 @@ class Profile extends BaseProfile
);
}
//show subscribed forum if it is enabled in the usersettings
//show subscribed group if it is enabled in the usersettings
if (Feature::isEnabled($profile['uid'], 'forumlist_profile')) {
$custom_fields += self::buildField(
'forumlist',
$this->t('Forums:'),
ForumManager::profileAdvanced($profile['uid'])
'group_list',
$this->t('Groups:'),
GroupManager::profileAdvanced($profile['uid'])
);
}

View file

@ -50,7 +50,7 @@ class Acl extends BaseModule
const TYPE_MENTION_CONTACT = 'c';
const TYPE_MENTION_CIRCLE = 'g';
const TYPE_MENTION_CONTACT_CIRCLE = '';
const TYPE_MENTION_FORUM = 'f';
const TYPE_MENTION_GROUP = 'f';
const TYPE_PRIVATE_MESSAGE = 'm';
const TYPE_ANY_CONTACT = 'a';
@ -100,7 +100,7 @@ class Acl extends BaseModule
'nick' => $contact['addr'] ?: $contact['url'],
'network' => $contact['network'],
'link' => $contact['url'],
'forum' => $contact['contact-type'] == Contact::TYPE_COMMUNITY,
'group' => $contact['contact-type'] == Contact::TYPE_COMMUNITY,
];
}
@ -161,7 +161,7 @@ class Acl extends BaseModule
]);
break;
case self::TYPE_MENTION_FORUM:
case self::TYPE_MENTION_GROUP:
$condition = DBA::mergeConditions($condition,
["NOT `self` AND NOT `blocked` AND `notify` != ? AND `contact-type` = ?", '', Contact::TYPE_COMMUNITY
]);
@ -205,7 +205,7 @@ class Acl extends BaseModule
'id' => intval($circle['id']),
'uids' => array_map('intval', explode(',', $circle['uids'])),
'link' => '',
'forum' => '0'
'group' => '0'
];
}
if ((count($resultCircles) > 0) && ($search == '')) {
@ -218,7 +218,7 @@ class Acl extends BaseModule
$contacts = Contact::selectToArray([], $condition, ['order' => ['name']]);
}
$forums = [];
$groups = [];
foreach ($contacts as $contact) {
$entry = [
'type' => self::TYPE_MENTION_CONTACT,
@ -229,21 +229,21 @@ class Acl extends BaseModule
'link' => $contact['url'],
'nick' => htmlentities(($contact['attag'] ?? '') ?: $contact['nick']),
'addr' => htmlentities(($contact['addr'] ?? '') ?: $contact['url']),
'forum' => $contact['contact-type'] == Contact::TYPE_COMMUNITY,
'group' => $contact['contact-type'] == Contact::TYPE_COMMUNITY,
];
if ($entry['forum']) {
$forums[] = $entry;
if ($entry['group']) {
$groups[] = $entry;
} else {
$resultContacts[] = $entry;
}
}
if ($forums) {
if ($groups) {
if ($search == '') {
$forums[] = ['separator' => true];
$groups[] = ['separator' => true];
}
$resultContacts = array_merge($forums, $resultContacts);
$resultContacts = array_merge($groups, $resultContacts);
}
$resultItems = array_merge($resultCircles, $resultContacts);
@ -285,7 +285,7 @@ class Acl extends BaseModule
'link' => $contact['url'],
'nick' => htmlentities(($contact['nick'] ?? '') ?: $contact['addr']),
'addr' => htmlentities(($contact['addr'] ?? '') ?: $contact['url']),
'forum' => $contact['forum']
'group' => $contact['forum']
];
}
}

View file

@ -139,7 +139,7 @@ class Index extends BaseSearch
break;
case 'contacts':
return self::performContactSearch($search, '@');
case 'forums':
case 'groups':
return self::performContactSearch($search, '!');
}
}

View file

@ -452,7 +452,7 @@ class Account extends BaseSettings
$pagetype = Renderer::replaceMacros($pageset_tpl, [
'$account_types' => DI::l10n()->t("Account Types"),
'$user' => DI::l10n()->t("Personal Page Subtypes"),
'$community' => DI::l10n()->t("Community Forum Subtypes"),
'$community' => DI::l10n()->t("Community Group Subtypes"),
'$account_type' => $user['account-type'],
'$type_person' => User::ACCOUNT_TYPE_PERSON,
'$type_organisation' => User::ACCOUNT_TYPE_ORGANISATION,
@ -481,7 +481,7 @@ class Account extends BaseSettings
],
'$account_community' => [
'account-type',
DI::l10n()->t('Community Forum'),
DI::l10n()->t('Community Group'),
User::ACCOUNT_TYPE_COMMUNITY,
DI::l10n()->t('Account for community discussions.'),
$user['account-type'] == User::ACCOUNT_TYPE_COMMUNITY
@ -502,7 +502,7 @@ class Account extends BaseSettings
],
'$page_community' => [
'page-flags',
DI::l10n()->t('Public Forum'),
DI::l10n()->t('Public Group'),
User::PAGE_FLAGS_COMMUNITY,
DI::l10n()->t('Automatically approves all contact requests.'),
$user['page-flags'] == User::PAGE_FLAGS_COMMUNITY
@ -516,7 +516,7 @@ class Account extends BaseSettings
],
'$page_prvgroup' => [
'page-flags',
DI::l10n()->t('Private Forum [Experimental]'),
DI::l10n()->t('Private Group [Experimental]'),
User::PAGE_FLAGS_PRVGROUP,
DI::l10n()->t('Requires manual approval of contact requests.'),
$user['page-flags'] == User::PAGE_FLAGS_PRVGROUP

View file

@ -242,7 +242,7 @@ class Notify extends BaseRepository
return false;
}
// There is no need to create notifications for forum accounts
// There is no need to create notifications for group accounts
if ($user['account-type'] == Model\User::ACCOUNT_TYPE_COMMUNITY) {
return false;
}

View file

@ -925,7 +925,7 @@ class Post
if ($conv) {
// This will allow us to comment on wall-to-wall items owned by our friends
// and community forums even if somebody else wrote the post.
// and community groups even if somebody else wrote the post.
// bug #517 - this fixes for conversation owner
if ($conv->getMode() == 'profile' && $conv->getProfileOwner() == DI::userSession()->getLocalUserId()) {
return true;

View file

@ -52,8 +52,8 @@ use Friendica\Util\JsonLD;
* - Polling the outboxes for missing content?
*
* Missing parts from DFRN:
* - Public Forum
* - Private Forum
* - Public Group
* - Private Group
* - Relocation
*/
class ActivityPub

View file

@ -415,7 +415,7 @@ class Processor
$item['post-type'] = Item::PT_NOTE;
}
$item['isForum'] = false;
$item['isGroup'] = false;
if (!empty($activity['thread-completion'])) {
if ($activity['thread-completion'] != $item['owner-id']) {
@ -434,7 +434,7 @@ class Processor
$item['owner-id'] = $item['author-id'];
} else {
$actor = APContact::getByURL($item['owner-link'], false);
$item['isForum'] = ($actor['type'] ?? 'Person') == 'Group';
$item['isGroup'] = ($actor['type'] ?? 'Person') == 'Group';
}
$item['uri'] = $activity['id'];
@ -1059,7 +1059,7 @@ class Processor
$item['causer-id'] = ($item['gravity'] == Item::GRAVITY_PARENT) ? $item['owner-id'] : $item['author-id'];
}
if ($item['isForum'] ?? false) {
if ($item['isGroup'] ?? false) {
$item['contact-id'] = Contact::getIdForURL($activity['actor'], $receiver);
} else {
$item['contact-id'] = Contact::getIdForURL($activity['author'], $receiver);
@ -1075,7 +1075,7 @@ class Processor
}
if (($receiver != 0) && ($item['gravity'] == Item::GRAVITY_PARENT) && !in_array($item['post-reason'], [Item::PR_FOLLOWER, Item::PR_TAG, item::PR_TO, Item::PR_CC, Item::PR_AUDIENCE])) {
if (!($item['isForum'] ?? false)) {
if (!($item['isGroup'] ?? false)) {
if ($item['post-reason'] == Item::PR_BCC) {
Logger::info('Top level post via BCC from a non sharer, ignoring', ['uid' => $receiver, 'contact' => $item['contact-id'], 'url' => $item['uri']]);
continue;
@ -1089,16 +1089,16 @@ class Processor
}
}
$is_forum = false;
$isGroup = false;
$user = User::getById($receiver, ['account-type']);
if (!empty($user['account-type'])) {
$is_forum = ($user['account-type'] == User::ACCOUNT_TYPE_COMMUNITY);
$isGroup = ($user['account-type'] == User::ACCOUNT_TYPE_COMMUNITY);
}
if ((DI::pConfig()->get($receiver, 'system', 'accept_only_sharer') == Item::COMPLETION_NONE)
&& ((!$is_forum && !($item['isForum'] ?? false) && ($activity['type'] != 'as:Announce'))
&& ((!$isGroup && !($item['isGroup'] ?? false) && ($activity['type'] != 'as:Announce'))
|| !Contact::isSharingByURL($activity['actor'], $receiver))) {
Logger::info('Actor is a non sharer, is no forum or it is no announce', ['uid' => $receiver, 'actor' => $activity['actor'], 'url' => $item['uri'], 'type' => $activity['type']]);
Logger::info('Actor is a non sharer, is no group or it is no announce', ['uid' => $receiver, 'actor' => $activity['actor'], 'url' => $item['uri'], 'type' => $activity['type']]);
continue;
}
@ -1141,7 +1141,7 @@ class Processor
// Store send a follow request for every reshare - but only when the item had been stored
if ($stored && ($item['private'] != Item::PRIVATE) && ($item['gravity'] == Item::GRAVITY_PARENT) && !empty($item['author-link']) && ($item['author-link'] != $item['owner-link'])) {
$author = APContact::getByURL($item['owner-link'], false);
// We send automatic follow requests for reshared messages. (We don't need though for forum posts)
// We send automatic follow requests for reshared messages. (We don't need though for group posts)
if ($author['type'] != 'Group') {
Logger::info('Send follow request', ['uri' => $item['uri'], 'stored' => $stored, 'to' => $item['author-link']]);
ActivityPub\Transmitter::sendFollowObject($item['uri'], $item['author-link']);

View file

@ -1098,7 +1098,7 @@ class Receiver
if (!empty($actor)) {
$profile = APContact::getByURL($actor);
$followers = $profile['followers'] ?? '';
$is_forum = ($profile['type'] ?? '') == 'Group';
$isGroup = ($profile['type'] ?? '') == 'Group';
if ($push) {
Contact::updateByUrlIfNeeded($actor);
}
@ -1106,7 +1106,7 @@ class Receiver
} else {
Logger::info('Empty actor', ['activity' => $activity]);
$followers = '';
$is_forum = false;
$isGroup = false;
}
// We have to prevent false follower assumptions upon thread completions
@ -1129,7 +1129,7 @@ class Receiver
}
// Fetch the receivers for the public and the followers collection
if ((($receiver == $followers) || (($receiver == self::PUBLIC_COLLECTION) && !$is_forum)) && !empty($actor)) {
if ((($receiver == $followers) || (($receiver == self::PUBLIC_COLLECTION) && !$isGroup)) && !empty($actor)) {
$receivers = self::getReceiverForActor($actor, $tags, $receivers, $follower_target, $profile);
continue;
}
@ -1148,7 +1148,7 @@ class Receiver
$condition = ['nurl' => Strings::normaliseLink($actor), 'rel' => [Contact::SHARING, Contact::FRIEND],
'network' => $networks, 'archive' => false, 'pending' => false, 'uid' => $contact['uid']];
// Forum posts are only accepted from forum contacts
// Group posts are only accepted from group contacts
if ($contact['contact-type'] == Contact::TYPE_COMMUNITY) {
$condition['rel'] = [Contact::SHARING, Contact::FRIEND, Contact::FOLLOWER];
}

View file

@ -492,13 +492,13 @@ class Transmitter
* Returns an array with permissions of the thread parent of the given item array
*
* @param array $item
* @param bool $is_forum_thread
* @param bool $is_group_thread
*
* @return array with permissions
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
private static function fetchPermissionBlockFromThreadParent(array $item, bool $is_forum_thread): array
private static function fetchPermissionBlockFromThreadParent(array $item, bool $is_group_thread): array
{
if (empty($item['thr-parent-id'])) {
return [];
@ -528,7 +528,7 @@ class Transmitter
$type = [Tag::TO => 'to', Tag::CC => 'cc', Tag::BTO => 'bto', Tag::BCC => 'bcc'];
foreach (Tag::getByURIId($item['thr-parent-id'], [Tag::TO, Tag::CC, Tag::BTO, Tag::BCC]) as $receiver) {
if (!empty($parent_profile['followers']) && $receiver['url'] == $parent_profile['followers'] && !empty($item_profile['followers'])) {
if (!$is_forum_thread) {
if (!$is_group_thread) {
$permissions[$type[$receiver['type']]][] = $item_profile['followers'];
}
} elseif (!in_array($receiver['url'], $exclude)) {
@ -573,7 +573,7 @@ class Transmitter
}
$always_bcc = false;
$is_forum = false;
$is_group = false;
$follower = '';
// Check if we should always deliver our stuff via BCC
@ -581,7 +581,7 @@ class Transmitter
$owner = User::getOwnerDataById($item['uid']);
if (!empty($owner)) {
$always_bcc = $owner['hide-friends'];
$is_forum = ($owner['account-type'] == User::ACCOUNT_TYPE_COMMUNITY) && $owner['manually-approve'];
$is_group = ($owner['account-type'] == User::ACCOUNT_TYPE_COMMUNITY) && $owner['manually-approve'];
$profile = APContact::getByURL($owner['url'], false);
$follower = $profile['followers'] ?? '';
@ -595,9 +595,9 @@ class Transmitter
$parent = Post::selectFirst(['causer-link', 'post-reason'], ['id' => $item['parent']]);
if (!empty($parent) && ($parent['post-reason'] == Item::PR_ANNOUNCEMENT) && !empty($parent['causer-link'])) {
$profile = APContact::getByURL($parent['causer-link'], false);
$is_forum_thread = isset($profile['type']) && $profile['type'] == 'Group';
$is_group_thread = isset($profile['type']) && $profile['type'] == 'Group';
} else {
$is_forum_thread = false;
$is_group_thread = false;
}
if (self::isAnnounce($item) || self::isAPPost($last_id)) {
@ -619,7 +619,7 @@ class Transmitter
$exclusive = false;
$mention = false;
if ($is_forum_thread) {
if ($is_group_thread) {
foreach (Tag::getByURIId($item['parent-uri-id'], [Tag::MENTION, Tag::EXCLUSIVE_MENTION]) as $term) {
$profile = APContact::getByURL($term['url'], false);
if (!empty($profile) && ($profile['type'] == 'Group')) {
@ -644,7 +644,7 @@ class Transmitter
$data['cc'][] = $announce['actor']['url'];
}
$data = array_merge($data, self::fetchPermissionBlockFromThreadParent($item, $is_forum_thread));
$data = array_merge($data, self::fetchPermissionBlockFromThreadParent($item, $is_group_thread));
// Check if the item is completely public or unlisted
if ($item['private'] == Item::PUBLIC) {
@ -702,7 +702,7 @@ class Transmitter
$exclusive = false;
}
if ($is_forum && !$exclusive && !empty($follower)) {
if ($is_group && !$exclusive && !empty($follower)) {
$data['cc'][] = $follower;
} elseif (!$exclusive) {
foreach ($receiver_list as $receiver) {
@ -739,19 +739,19 @@ class Transmitter
$profile = APContact::getByURL($parent['owner-link'], false);
if (!empty($profile)) {
if ($item['gravity'] != Item::GRAVITY_PARENT) {
// Comments to forums are directed to the forum
// But comments to forums aren't directed to the followers collection
// This rule is only valid when the actor isn't the forum.
// The forum needs to transmit their content to their followers.
// Comments to groups are directed to the group
// But comments to groups aren't directed to the followers collection
// This rule is only valid when the actor isn't the group.
// The group needs to transmit their content to their followers.
if (($profile['type'] == 'Group') && ($profile['url'] != ($actor_profile['url'] ?? ''))) {
$data['to'][] = $profile['url'];
} else {
$data['cc'][] = $profile['url'];
if (($item['private'] != Item::PRIVATE) && !empty($actor_profile['followers']) && (!$exclusive || !$is_forum_thread)) {
if (($item['private'] != Item::PRIVATE) && !empty($actor_profile['followers']) && (!$exclusive || !$is_group_thread)) {
$data['cc'][] = $actor_profile['followers'];
}
}
} elseif (!$exclusive && !$is_forum_thread) {
} elseif (!$exclusive && !$is_group_thread) {
// Public thread parent post always are directed to the followers.
if ($item['private'] != Item::PRIVATE) {
$data['cc'][] = $actor_profile['followers'];
@ -885,12 +885,11 @@ class Transmitter
{
$inboxes = [];
$isforum = false;
$isGroup = false;
if (!empty($item['uid'])) {
$profile = User::getOwnerDataById($item['uid']);
if (!empty($profile)) {
$isforum = $profile['account-type'] == User::ACCOUNT_TYPE_COMMUNITY;
$isGroup = $profile['account-type'] == User::ACCOUNT_TYPE_COMMUNITY;
}
}
@ -920,7 +919,7 @@ class Transmitter
continue;
}
if ($isforum && ($contact['network'] == Protocol::DFRN)) {
if ($isGroup && ($contact['network'] == Protocol::DFRN)) {
continue;
}

View file

@ -2220,8 +2220,8 @@ class DFRN
GServer::setProtocol($importer['gsid'], Post\DeliveryData::DFRN);
}
// is it a public forum? Private forums aren't exposed with this method
$forum = intval(XML::getFirstNodeValue($xpath, '/atom:feed/dfrn:community/text()'));
// is it a public group? Private groups aren't exposed with this method
$group = intval(XML::getFirstNodeValue($xpath, '/atom:feed/dfrn:community/text()'));
// The account type is new since 3.5.1
if ($xpath->query('/atom:feed/dfrn:account_type')->length > 0) {
@ -2235,17 +2235,17 @@ class DFRN
// Updating the public contact as well
Contact::update(['contact-type' => $accounttype], ['uid' => 0, 'nurl' => $importer['nurl']]);
}
// A forum contact can either have set "forum" or "prv" - but not both
// A group contact can either have set "forum" or "prv" - but not both
if ($accounttype == User::ACCOUNT_TYPE_COMMUNITY) {
// It's a forum, so either set the public or private forum flag
$condition = ['(`forum` != ? OR `prv` != ?) AND `id` = ?', $forum, !$forum, $importer['id']];
Contact::update(['forum' => $forum, 'prv' => !$forum], $condition);
// It's a group, so either set the public or private forum flag
$condition = ['(`forum` != ? OR `prv` != ?) AND `id` = ?', $group, !$group, $importer['id']];
Contact::update(['forum' => $group, 'prv' => !$group], $condition);
// Updating the public contact as well
$condition = ['(`forum` != ? OR `prv` != ?) AND `uid` = 0 AND `nurl` = ?', $forum, !$forum, $importer['nurl']];
Contact::update(['forum' => $forum, 'prv' => !$forum], $condition);
$condition = ['(`forum` != ? OR `prv` != ?) AND `uid` = 0 AND `nurl` = ?', $group, !$group, $importer['nurl']];
Contact::update(['forum' => $group, 'prv' => !$group], $condition);
} else {
// It's not a forum, so remove the flags
// It's not a group, so remove the flags
$condition = ['(`forum` OR `prv`) AND `id` = ?', $importer['id']];
Contact::update(['forum' => false, 'prv' => false], $condition);
@ -2253,13 +2253,13 @@ class DFRN
$condition = ['(`forum` OR `prv`) AND `uid` = 0 AND `nurl` = ?', $importer['nurl']];
Contact::update(['forum' => false, 'prv' => false], $condition);
}
} elseif ($forum != $importer['forum']) { // Deprecated since 3.5.1
$condition = ['`forum` != ? AND `id` = ?', $forum, $importer['id']];
Contact::update(['forum' => $forum], $condition);
} elseif ($group != $importer['forum']) { // Deprecated since 3.5.1
$condition = ['`forum` != ? AND `id` = ?', $group, $importer['id']];
Contact::update(['forum' => $group], $condition);
// Updating the public contact as well
$condition = ['`forum` != ? AND `uid` = 0 AND `nurl` = ?', $forum, $importer['nurl']];
Contact::update(['forum' => $forum], $condition);
$condition = ['`forum` != ? AND `uid` = 0 AND `nurl` = ?', $group, $importer['nurl']];
Contact::update(['forum' => $group], $condition);
}

View file

@ -404,7 +404,7 @@ class Delivery
*/
private static function deliverDiaspora(string $cmd, array $contact, array $owner, array $items, array $target_item, bool $public_message, bool $top_level, bool $followup): bool
{
// We don't treat Forum posts as "wall-to-wall" to be able to post them via Diaspora
// We don't treat group posts as "wall-to-wall" to be able to post them via Diaspora
$walltowall = $top_level && ($owner['id'] != $items[0]['contact-id']) & ($owner['account-type'] != User::ACCOUNT_TYPE_COMMUNITY);
if ($public_message) {

View file

@ -36,7 +36,7 @@ class ExpireAndRemoveUsers
{
public static function execute()
{
// expire any expired regular accounts. Don't expire forums.
// expire any expired regular accounts. Don't expire groups.
$condition = ["NOT `account_expired` AND `account_expires_on` > ? AND `account_expires_on` < ? AND `page-flags` = ? AND `uid` != ?",
DBA::NULL_DATETIME, DateTimeFormat::utcNow(), User::PAGE_FLAGS_NORMAL, 0];
DBA::update('user', ['account_expired' => true], $condition);

View file

@ -167,8 +167,8 @@ class Notifier
// Do a PuSH
$push_notify = false;
// Deliver directly to a forum, don't PuSH
$direct_forum_delivery = false;
// Deliver directly to a group, don't PuSH
$direct_group_delivery = false;
$only_ap_delivery = false;
@ -249,15 +249,15 @@ class Notifier
$relay_to_owner = false;
}
// Special treatment for forum posts
if (Item::isForumPost($target_item['uri-id'])) {
// Special treatment for group posts
if (Item::isGroupPost($target_item['uri-id'])) {
$relay_to_owner = true;
$direct_forum_delivery = true;
$direct_group_delivery = true;
}
// Avoid that comments in a forum thread are sent to OStatus
if (Item::isForumPost($parent['uri-id'])) {
$direct_forum_delivery = true;
// Avoid that comments in a group thread are sent to OStatus
if (Item::isGroupPost($parent['uri-id'])) {
$direct_group_delivery = true;
}
$exclusive_delivery = false;
@ -303,7 +303,7 @@ class Notifier
}
}
if ($direct_forum_delivery) {
if ($direct_group_delivery) {
$push_notify = false;
}
@ -793,11 +793,11 @@ class Notifier
$uid = $target_item['contact-uid'] ?: $target_item['uid'];
// Update the locally stored follower list when we deliver to a forum
// Update the locally stored follower list when we deliver to a group
foreach (Tag::getByURIId($target_item['uri-id'], [Tag::MENTION, Tag::EXCLUSIVE_MENTION]) as $tag) {
$target_contact = Contact::getByURL(Strings::normaliseLink($tag['url']), null, [], $uid);
if ($target_contact && $target_contact['contact-type'] == Contact::TYPE_COMMUNITY && $target_contact['manually-approve']) {
Circle::updateMembersForForum($target_contact['id']);
Circle::updateMembersForGroup($target_contact['id']);
}
}

View file

@ -250,7 +250,7 @@ return [
"confirm" => ["type" => "varbinary(383)", "comment" => ""],
"poco" => ["type" => "varbinary(383)", "comment" => ""],
"writable" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
"forum" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "contact is a forum. Deprecated, use 'contact-type' = 'community' and 'manually-approve' = false instead"],
"forum" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "contact is a group. Deprecated, use 'contact-type' = 'community' and 'manually-approve' = false instead"],
"prv" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "contact is a private group. Deprecated, use 'contact-type' = 'community' and 'manually-approve' = true instead"],
"bdyear" => ["type" => "varchar(4)", "not null" => "1", "default" => "", "comment" => ""],
// Deprecated fields that aren't in use anymore
@ -767,7 +767,7 @@ return [
"uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "foreign" => ["user" => "uid"], "comment" => "Owner User id"],
"visible" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "1 indicates the member list is not private"],
"deleted" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "1 indicates the circle has been deleted"],
"cid" => ["type" => "int unsigned", "foreign" => ["contact" => "id"], "comment" => "Contact id of forum. When this field is filled then the members are synced automatically."],
"cid" => ["type" => "int unsigned", "foreign" => ["contact" => "id"], "comment" => "Contact id of group. When this field is filled then the members are synced automatically."],
"name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "human readable name of circle"],
],
"indexes" => [

View file

@ -633,7 +633,7 @@ return [
'throttle_limit_month' => 0,
// transmit_pending_events (Boolean)
// Transmit pending events upon accepted contact request for forums
// Transmit pending events upon accepted contact request for groups
'transmit_pending_events' => false,
// update_active_contacts (Boolean)

View file

@ -667,7 +667,7 @@ return [
'/network' => [
'[/]' => [Module\Conversation\Network::class, [R::GET]],
'/archive/{from:\d\d\d\d-\d\d-\d\d}[/{to:\d\d\d\d-\d\d-\d\d}]' => [Module\Conversation\Network::class, [R::GET]],
'/forum/{contact_id:\d+}' => [Module\Conversation\Network::class, [R::GET]],
'/group/{contact_id:\d+}' => [Module\Conversation\Network::class, [R::GET]],
'/circle/{circle_id:\d+}' => [Module\Conversation\Network::class, [R::GET]],
],
@ -687,7 +687,7 @@ return [
'/update_network' => [
'[/]' => [Module\Update\Network::class, [R::GET]],
'/archive/{from:\d\d\d\d-\d\d-\d\d}[/{to:\d\d\d\d-\d\d-\d\d}]' => [Module\Update\Network::class, [R::GET]],
'/forum/{contact_id:\d+}' => [Module\Update\Network::class, [R::GET]],
'/group/{contact_id:\d+}' => [Module\Update\Network::class, [R::GET]],
'/circle/{circle_id:\d+}' => [Module\Update\Network::class, [R::GET]],
],

View file

@ -452,14 +452,14 @@ td.federation-data {
max-height: 80px;
}
/* forumlist widget */
.forumlist-img {
/* group list widget */
.grouplist-img {
height: 20px;
width: 20px;
vertical-align: middle;
}
#forum-widget-collapse {
#group-widget-collapse {
opacity: 0.3;
}
@ -479,7 +479,7 @@ aside .help-aside-wrapper h1 {
color: #ffffff;
}
#forum-widget-collapse:hover {
#group-widget-collapse:hover {
opacity: 1.0;
}

View file

@ -25,7 +25,7 @@ function contact_search(term, callback, backend_url, type, mode) {
if(lterm.indexOf(t) >= 0) { // A more broad search has been performed already, so use those results
// Filter old results locally
var matching = contact_search.cache[bt][t].filter(function (x) { return (x.name.toLowerCase().indexOf(lterm) >= 0 || (typeof x.nick !== 'undefined' && x.nick.toLowerCase().indexOf(lterm) >= 0)); }); // Need to check that nick exists because circles don't have one
matching.unshift({forum:false, text: term, replace: term});
matching.unshift({group: false, text: term, replace: term});
setTimeout(function() { callback(matching); } , 1); // Use "pseudo-thread" to avoid some problems
return;
}
@ -69,10 +69,10 @@ function contact_format(item) {
// Show contact information if not explicitly told to show something else
if(typeof item.text === 'undefined') {
var desc = ((item.label) ? item.nick + ' ' + item.label : item.nick);
var forum = ((item.forum) ? 'forum' : '');
var group = ((item.group) ? 'group' : '');
if(typeof desc === 'undefined') desc = '';
if(desc) desc = ' ('+desc+')';
return "<div class='{0}' title='{4}'><img class='acpopup-img' src='{1}'><span class='acpopup-contactname'>{2}</span><span class='acpopup-sub-text'>{3}</span><div class='clear'></div></div>".format(forum, item.photo, item.name, desc, item.link);
return "<div class='{0}' title='{4}'><img class='acpopup-img' src='{1}'><span class='acpopup-contactname'>{2}</span><span class='acpopup-sub-text'>{3}</span><div class='clear'></div></div>".format(group, item.photo, item.name, desc, item.link);
}
else
return "<div>" + item.text + "</div>";
@ -258,8 +258,8 @@ function string2bb(element) {
template: contact_format,
};
// Autocomplete forums
forums = {
// Autocomplete groups
groups = {
match: /(^|\s)(!\!*)([^ \n]+)$/,
index: 3,
search: function(term, callback) { contact_search(term, callback, backend_url, 'f'); },
@ -294,7 +294,7 @@ function string2bb(element) {
};
this.attr('autocomplete','off');
this.textcomplete([contacts, forums, smilies, tags], {dropdown: {className:'acpopup'}});
this.textcomplete([contacts, groups, smilies, tags], {dropdown: {className:'acpopup'}});
this.fixTextcompleteEscape();
return this;
@ -310,7 +310,7 @@ function string2bb(element) {
template: contact_format,
};
// Autocomplete forum accounts
// Autocomplete group accounts
community = {
match: /(^!)([^\n]{2,})$/,
index: 2,

View file

@ -296,11 +296,11 @@ $(function() {
$(".circle-"+gid+" .notify").addClass("show").text(gcount);
});
$(".forum-widget-entry .notify").removeClass("show");
$(data.forums).each(function(key, forum) {
var fid = forum.id;
var fcount = forum.count;
$(".forum-"+fid+" .notify").addClass("show").text(fcount);
$(".group-widget-entry .notify").removeClass("show");
$(data.groups).each(function(key, group) {
var fid = group.id;
var fcount = group.count;
$(".group-"+fid+" .notify").addClass("show").text(fcount);
});
if (data.notifications.length == 0) {

View file

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 2023.09-dev\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-05-30 08:56+0000\n"
"POT-Creation-Date: 2023-06-01 19:00-0400\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -1513,12 +1513,12 @@ msgid "Post Composition Features"
msgstr ""
#: src/Content/Feature.php:105
msgid "Auto-mention Forums"
msgid "Auto-mention Groups"
msgstr ""
#: src/Content/Feature.php:105
msgid ""
"Add/remove mention when a forum page is selected/deselected in ACL window."
"Add/remove mention when a group page is selected/deselected in ACL window."
msgstr ""
#: src/Content/Feature.php:106
@ -1559,11 +1559,11 @@ msgid "Advanced Profile Settings"
msgstr ""
#: src/Content/Feature.php:119
msgid "List Forums"
msgid "List Groups"
msgstr ""
#: src/Content/Feature.php:119
msgid "Show visitors public community forums at the Advanced Profile Page"
msgid "Show visitors public groups at the Advanced Profile Page"
msgstr ""
#: src/Content/Feature.php:120
@ -1596,20 +1596,20 @@ msgid ""
"Contact birthday events are private to you."
msgstr ""
#: src/Content/ForumManager.php:151 src/Content/Nav.php:276
#: src/Content/GroupManager.php:151 src/Content/Nav.php:276
#: src/Content/Text/HTML.php:877 src/Content/Widget.php:533
msgid "Forums"
msgid "Groups"
msgstr ""
#: src/Content/ForumManager.php:153
msgid "External link to forum"
#: src/Content/GroupManager.php:153
msgid "External link to group"
msgstr ""
#: src/Content/ForumManager.php:156 src/Content/Widget.php:512
#: src/Content/GroupManager.php:156 src/Content/Widget.php:512
msgid "show less"
msgstr ""
#: src/Content/ForumManager.php:157 src/Content/Widget.php:414
#: src/Content/GroupManager.php:157 src/Content/Widget.php:414
#: src/Content/Widget.php:513
msgid "show more"
msgstr ""
@ -1712,7 +1712,7 @@ msgid "Clear notifications"
msgstr ""
#: src/Content/Nav.php:126 src/Content/Text/HTML.php:864
msgid "@name, !forum, #tags, content"
msgid "@name, !group, #tags, content"
msgstr ""
#: src/Content/Nav.php:220 src/Module/Security/Login.php:157
@ -3033,7 +3033,7 @@ msgid "Organisation"
msgstr ""
#: src/Model/Contact.php:1655
msgid "Forum"
msgid "Group"
msgstr ""
#: src/Model/Contact.php:2951
@ -5555,7 +5555,7 @@ msgstr ""
#: src/Module/BaseSearch.php:75
#, php-format
msgid "Forum Search - %s"
msgid "Group Search - %s"
msgstr ""
#: src/Module/BaseSearch.php:121 src/Module/Contact/MatchInterests.php:139
@ -7366,7 +7366,7 @@ msgid "Soapbox Page"
msgstr ""
#: src/Module/Moderation/BaseUsers.php:121 src/Module/Settings/Account.php:505
msgid "Public Forum"
msgid "Public Group"
msgstr ""
#: src/Module/Moderation/BaseUsers.php:122 src/Module/Settings/Account.php:512
@ -7374,7 +7374,7 @@ msgid "Automatic Friend Page"
msgstr ""
#: src/Module/Moderation/BaseUsers.php:123
msgid "Private Forum"
msgid "Private Group"
msgstr ""
#: src/Module/Moderation/BaseUsers.php:126 src/Module/Settings/Account.php:463
@ -7390,7 +7390,7 @@ msgid "News Page"
msgstr ""
#: src/Module/Moderation/BaseUsers.php:129 src/Module/Settings/Account.php:484
msgid "Community Forum"
msgid "Community Group"
msgstr ""
#: src/Module/Moderation/BaseUsers.php:130
@ -7812,7 +7812,7 @@ msgid "Automatic Follower Account"
msgstr ""
#: src/Module/Moderation/Summary.php:55
msgid "Public Forum Account"
msgid "Public Group Account"
msgstr ""
#: src/Module/Moderation/Summary.php:56
@ -7824,7 +7824,7 @@ msgid "Blog Account"
msgstr ""
#: src/Module/Moderation/Summary.php:58
msgid "Private Forum Account"
msgid "Private Group Account"
msgstr ""
#: src/Module/Moderation/Summary.php:78
@ -8450,7 +8450,7 @@ msgid "Description:"
msgstr ""
#: src/Module/Profile/Profile.php:261
msgid "Forums:"
msgid "Groups:"
msgstr ""
#: src/Module/Profile/Profile.php:273
@ -9017,7 +9017,7 @@ msgid "Personal Page Subtypes"
msgstr ""
#: src/Module/Settings/Account.php:455
msgid "Community Forum Subtypes"
msgid "Community Group Subtypes"
msgstr ""
#: src/Module/Settings/Account.php:465
@ -9063,7 +9063,7 @@ msgid ""
msgstr ""
#: src/Module/Settings/Account.php:519
msgid "Private Forum [Experimental]"
msgid "Private Group [Experimental]"
msgstr ""
#: src/Module/Settings/Account.php:521
@ -11874,7 +11874,7 @@ msgid "Textareas font size"
msgstr ""
#: view/theme/vier/config.php:91
msgid "Comma separated list of helper forums"
msgid "Comma separated list of helper groups"
msgstr ""
#: view/theme/vier/config.php:131

View file

@ -0,0 +1,53 @@
<script>
function showHideGroupList() {
if( $("li[id^='group-widget-entry-extended-']").is(':visible')) {
$("li[id^='group-widget-entry-extended-']").hide();
$("li#group-widget-collapse").html('{{$showmore}}');
}
else {
$("li[id^='group-widget-entry-extended-']").show();
$("li#group-widget-collapse").html('{{$showless}}');
}
}
</script>
<span id="group-list-sidebar-frame">
<span id="group-list-sidebar-inflated" class="widget fakelink" onclick="openCloseWidget('group-list-sidebar', 'group-list-sidebar-inflated');">
<h3>{{$title}}</h3>
</span>
<div id="group-list-sidebar" class="widget">
<span class="fakelink" onclick="openCloseWidget('group-list-sidebar', 'group-list-sidebar-inflated');">
<h3 id="group-list">{{$title}}</h3>
</span>
<ul id="group-list-sidebar-ul" role="menu">
{{foreach $groups as $group}}
{{if $group.id <= $visible_groups}}
<li class="group-widget-entry group-{{$group.cid}}" id="group-widget-entry-{{$group.id}}" role="menuitem">
<span class="notify badge pull-right"></span>
<a href="{{$group.external_url}}" title="{{$group.link_desc}}" class="label sparkle" target="_blank" rel="noopener noreferrer">
<img class="group-list-img" src="{{$group.micro}}" alt="{{$group.link_desc}}" />
</a>
<a class="group-widget-link {{if $group.selected}}group-selected{{/if}}" id="group-widget-link-{{$group.id}}" href="{{$group.url}}">{{$group.name}}</a>
</li>
{{/if}}
{{if $group.id > $visible_groups}}
<li class="group-widget-entry group-{{$group.cid}}" id="group-widget-entry-extended-{{$group.id}}" role="menuitem" style="display: none;">
<span class="notify badge pull-right"></span>
<a href="{{$group.external_url}}" title="{{$group.link_desc}}" class="label sparkle" target="_blank" rel="noopener noreferrer">
<img class="group-list-img" src="{{$group.micro}}" alt="{{$group.link_desc}}" />
</a>
<a class="group-widget-link {{if $group.selected}}group-selected{{/if}}" id="group-widget-link-{{$group.id}}" href="{{$group.url}}">{{$group.name}}</a>
</li>
{{/if}}
{{/foreach}}
{{if $total > $visible_groups }}
<li onclick="showHideGroupList(); return false;" id="group-widget-collapse" class="group-widget-link fakelink tool">{{$showmore}}</li>
{{/if}}
</ul>
</div>
</span>
<script>
initWidget('group-list-sidebar', 'group-list-sidebar-inflated');
</script>

View file

@ -1,53 +0,0 @@
<script>
function showHideForumlist() {
if( $("li[id^='forum-widget-entry-extended-']").is(':visible')) {
$("li[id^='forum-widget-entry-extended-']").hide();
$("li#forum-widget-collapse").html('{{$showmore}}');
}
else {
$("li[id^='forum-widget-entry-extended-']").show();
$("li#forum-widget-collapse").html('{{$showless}}');
}
}
</script>
<span id="forumlist-sidebar-frame">
<span id="forumlist-sidebar-inflated" class="widget fakelink" onclick="openCloseWidget('forumlist-sidebar', 'forumlist-sidebar-inflated');">
<h3>{{$title}}</h3>
</span>
<div id="forumlist-sidebar" class="widget">
<span class="fakelink" onclick="openCloseWidget('forumlist-sidebar', 'forumlist-sidebar-inflated');">
<h3 id="forumlist">{{$title}}</h3>
</span>
<ul id="forumlist-sidebar-ul" role="menu">
{{foreach $forums as $forum}}
{{if $forum.id <= $visible_forums}}
<li class="forum-widget-entry forum-{{$forum.cid}}" id="forum-widget-entry-{{$forum.id}}" role="menuitem">
<span class="notify badge pull-right"></span>
<a href="{{$forum.external_url}}" title="{{$forum.link_desc}}" class="label sparkle" target="_blank" rel="noopener noreferrer">
<img class="forumlist-img" src="{{$forum.micro}}" alt="{{$forum.link_desc}}" />
</a>
<a class="forum-widget-link {{if $forum.selected}}forum-selected{{/if}}" id="forum-widget-link-{{$forum.id}}" href="{{$forum.url}}">{{$forum.name}}</a>
</li>
{{/if}}
{{if $forum.id > $visible_forums}}
<li class="forum-widget-entry forum-{{$forum.cid}}" id="forum-widget-entry-extended-{{$forum.id}}" role="menuitem" style="display: none;">
<span class="notify badge pull-right"></span>
<a href="{{$forum.external_url}}" title="{{$forum.link_desc}}" class="label sparkle" target="_blank" rel="noopener noreferrer">
<img class="forumlist-img" src="{{$forum.micro}}" alt="{{$forum.link_desc}}" />
</a>
<a class="forum-widget-link {{if $forum.selected}}forum-selected{{/if}}" id="forum-widget-link-{{$forum.id}}" href="{{$forum.url}}">{{$forum.name}}</a>
</li>
{{/if}}
{{/foreach}}
{{if $total > $visible_forums }}
<li onclick="showHideForumlist(); return false;" id="forum-widget-collapse" class="forum-widget-link fakelink tool">{{$showmore}}</li>
{{/if}}
</ul>
</div>
</span>
<script>
initWidget('forumlist-sidebar', 'forumlist-sidebar-inflated');
</script>

View file

@ -90,7 +90,7 @@ nav #site-location {
box-shadow: 4px 4px 3px 0 #444444;
}
.forumlist-img {
.group-list-img {
border-radius: 3px;
-moz-border-radius: 3px;
box-shadow: 4px 4px 3px 0 #444444;

View file

@ -386,7 +386,7 @@ div.wall-item-content-wrapper.shiny {
margin-bottom: 10px;
}
.widget .selected, .circle-selected, .forum-selected {
.widget .selected, .circle-selected, .group-selected {
padding: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
@ -1859,7 +1859,7 @@ a.mail-list-link {
#sidebar-circle-list ul {
list-style-type: none;
}
.sidebar-circle-li .notify, .forum-widget-entry .notify {
.sidebar-circle-li .notify, .group-widget-entry .notify {
display: none;
font-size: 9px;
border: 1px solid rgb(221, 221, 221);
@ -1867,7 +1867,7 @@ a.mail-list-link {
float: right;
background-color: #BABDB6;
}
.sidebar-circle-li .notify.show, .forum-widget-entry .notify.show {
.sidebar-circle-li .notify.show, .group-widget-entry .notify.show {
display: block;
}
@ -1881,7 +1881,7 @@ a.mail-list-link {
margin-top: 10px;
}
#forumlist-sidebar ul {
#group-list-sidebar ul {
list-style: none;
}

View file

@ -20,7 +20,7 @@ This theme should be the start of a discussion in the friendica community (users
What frameworks do we want to use? How should default friendica look like? And how do we want to use friendica? What do we need in the core code (At the present time some stuff this is done with ugly javascript hacks and own php code)?
Coding a theme is much work but you will get a really good insight of the limitations of friendica and can start a discussion about doing things differently.
So join the discussion at the friendica forums ;-)
So join the discussion at the friendica groups ;-)
If anyone wants to contribute to this theme he/she is welcome to do this.

View file

@ -367,7 +367,7 @@ btn-eventnav:hover {
aside .badge {
opacity: 0.7;
}
.forum-widget-entry .badge,
.group-widget-entry .badge,
.sidebar-circle-li .badge {
margin-top: 6px;
}
@ -1102,7 +1102,7 @@ aside .widget li a:hover {
color: $font_color_darker;
}
/* forumlist widget */
/* group-list widget */
aside > #datebrowse-sidebar li.posted-date-selector-months {
margin-bottom: 10px;
padding: 0;
@ -1122,7 +1122,7 @@ aside > #datebrowse-sidebar .posted-date-selector-months > ul > li:hover {
padding-left: 27px;
}
.forumlist-img {
.group-list-img {
-webkit-filter: grayscale(100%);
filter: grayscale(100%);
opacity: 0.5;
@ -1133,7 +1133,7 @@ aside > #datebrowse-sidebar .posted-date-selector-months > ul > li:hover {
-ms-transition: all 0.2s ease-in-out;
transition: all 0.2s ease-in-out;
}
#forumlist-sidebar-ul li:hover a > .forumlist-img {
#group-list-sidebar-ul li:hover a > .group-list-img {
-webkit-filter: unset;
filter: unset;
opacity: unset;
@ -2192,7 +2192,7 @@ nav .acpopup {
border-left: 3px solid $link_color;
padding-left: 17px !important;
}
.textcomplete-item a .forum {
.textcomplete-item a .group {
color: $link_color;
}
img.acpopup-img {
@ -2494,7 +2494,7 @@ body.mod-login .navbar #nav-login {
margin-top: 20px;
margin-bottom: 20px;
}
.contact-block-div.forumlist-profile-advanced {
.contact-block-div.group-list-profile-advanced {
float: left;
}

View file

@ -41,9 +41,9 @@ $(document).ready(function () {
$("#sidebar-circle-ul li a.circle-selected").parent("li").addClass("selected");
}
// add the class "selected" to forums widgets li if li > a does have the class forum-selected
if ($("#forumlist-sidebar-ul li a").hasClass("forum-selected")) {
$("#forumlist-sidebar-ul li a.forum-selected").parent("li").addClass("selected");
// add the class "selected" to groups widgets li if li > a does have the class group-selected
if ($("#group-list-sidebar-ul li a").hasClass("group-selected")) {
$("#group-list-sidebar-ul li a.group-selected").parent("li").addClass("selected");
}
// add the class "active" to tabmenuli if li > a does have the class active
@ -206,7 +206,7 @@ $(document).ready(function () {
});
}
// move the forum contact information of the network page into the second navbar
// move the group contact information of the network page into the second navbar
if ($(".network-content-wrapper > #viewcontact_wrapper-network").length) {
// get the contact-wrapper element and append it to the second nav bar
// Note: We need the first() element with this class since at the present time we

View file

@ -91,7 +91,7 @@
<div class="contact-entry-name" id="contact-entry-name-{{$contact.id}}">
<h4 class="media-heading"><a href="{{if !empty($contact.photo_menu.edit)}}{{$contact.photo_menu.edit.1}}{{else}}{{$contact.url}}{{/if}}">{{$contact.name}}</a>
{{if $contact.account_type}} <small class="contact-entry-details" id="contact-entry-accounttype-{{$contact.id}}">({{$contact.account_type}})</small>{{/if}}
{{if $contact.account_type == 'Forum'}}<i class="fa fa-comments-o" aria-hidden="true"></i>{{/if}}
{{if $contact.account_type == 'Group'}}<i class="fa fa-comments-o" aria-hidden="true"></i>{{/if}}
{{* @todo this needs some changing in core because $contact.account_type contains a translated string which may not be the same in every language *}}
</h4>
</div>

View file

@ -50,9 +50,9 @@
$("#profile-jot-text").focus(enableOnUser);
$("#profile-jot-text").click(enableOnUser);
// When clicking on a forum in acl we should remove the profile jot textarea
// default value before inserting the forum mention
$("body").on('click', '#jot-modal .acl-list-item.forum', function(){
// When clicking on a group in acl we should remove the profile jot textarea
// default value before inserting the group mention
$("body").on('click', '#jot-modal .acl-list-item.group', function(){
jotTextOpenUI(document.getElementById("profile-jot-text"));
});

View file

@ -80,7 +80,7 @@ as the value of $top_child_total (this is done at the end of this file)
</a>
</div>
{{* The little overlay avatar picture if someone is posting directly to a wall or a forum *}}
{{* The little overlay avatar picture if someone is posting directly to a wall or a group *}}
{{if $item.owner_url}}
<div aria-hidden="true" class="contact-photo-wrapper mframe wwto" id="wall-item-ownerphoto-wrapper-{{$item.id}}">
<a href="{{$item.owner_url}}" target="redir" title="{{$item.olinktitle}}" class="contact-photo-link" id="wall-item-ownerphoto-link-{{$item.id}}">

View file

@ -12,11 +12,11 @@ $(document).ready(function(){
$(".circle-"+gid+" .notify").addClass("on").text(gcount);
});
$(".forum-widget-entry .notify").removeClass("on");
$(data).find("forum").each(function() {
$(".group-widget-entry .notify").removeClass("on");
$(data).find("group").each(function() {
var fid = this.id;
var fcount = this.innerHTML;
$(".forum-"+fid+" .notify").addClass("on").text(fcount);
$(".group-"+fid+" .notify").addClass("on").text(fcount);
});
console.log(intro,mail);

View file

@ -0,0 +1,46 @@
<script>
function showHideGroupList() {
if( $("li[id^='group-widget-entry-extended-']").is(':visible')) {
$("li[id^='group-widget-entry-extended-']").hide();
$("li#group-widget-collapse").html('{{$showmore}}');
}
else {
$("li[id^='group-widget-entry-extended-']").show();
$("li#group-widget-collapse").html('{{$showless}}');
}
}
</script>
<div id="group-list-sidebar" class="widget">
<h3 id="group-list">{{$title}}</h3>
<ul id="group-list-sidebar-ul" role="menu">
{{foreach $groups as $group}}
{{if $group.id <= $visible_groups}}
<li class="group-widget-entry group-{{$group.cid}} tool {{if $group.selected}}selected{{/if}}" id="group-widget-entry-{{$group.id}}" role="menuitem">
<span class="notify badge pull-right"></span>
<a href="{{$group.external_url}}" title="{{$group.link_desc}}" class="label sparkle" target="_blank" rel="noopener noreferrer">
<img class="group-list-img" src="{{$group.micro}}" alt="{{$group.link_desc}}" />
</a>
<a class="group-widget-link" id="group-widget-link-{{$group.id}}" href="{{$group.url}}">{{$group.name}}</a>
</li>
{{/if}}
{{if $group.id > $visible_groups}}
<li class="group-widget-entry group-{{$group.cid}} tool {{if $group.selected}}selected{{/if}}" id="group-widget-entry-extended-{{$group.id}}" role="menuitem" style="display: none;">
<span class="notify badge pull-right"></span>
<a href="{{$group.external_url}}" title="{{$group.link_desc}}" class="label sparkle" target="_blank" rel="noopener noreferrer">
<img class="group-list-img" src="{{$group.micro}}" alt="{{$group.link_desc}}" />
</a>
<a class="group-widget-link" id="group-widget-link-{{$group.id}}" href="{{$group.url}}">{{$group.name}}</a>
</li>
{{/if}}
{{/foreach}}
{{if $total > $visible_groups }}
<li onclick="showHideGroupList(); return false;" id="group-widget-collapse" class="group-widget-link fakelink tool">{{$showmore}}</li>
{{/if}}
</ul>
</div>

View file

@ -1,46 +0,0 @@
<script>
function showHideForumlist() {
if( $("li[id^='forum-widget-entry-extended-']").is(':visible')) {
$("li[id^='forum-widget-entry-extended-']").hide();
$("li#forum-widget-collapse").html('{{$showmore}}');
}
else {
$("li[id^='forum-widget-entry-extended-']").show();
$("li#forum-widget-collapse").html('{{$showless}}');
}
}
</script>
<div id="forumlist-sidebar" class="widget">
<h3 id="forumlist">{{$title}}</h3>
<ul id="forumlist-sidebar-ul" role="menu">
{{foreach $forums as $forum}}
{{if $forum.id <= $visible_forums}}
<li class="forum-widget-entry forum-{{$forum.cid}} tool {{if $forum.selected}}selected{{/if}}" id="forum-widget-entry-{{$forum.id}}" role="menuitem">
<span class="notify badge pull-right"></span>
<a href="{{$forum.external_url}}" title="{{$forum.link_desc}}" class="label sparkle" target="_blank" rel="noopener noreferrer">
<img class="forumlist-img" src="{{$forum.micro}}" alt="{{$forum.link_desc}}" />
</a>
<a class="forum-widget-link" id="forum-widget-link-{{$forum.id}}" href="{{$forum.url}}">{{$forum.name}}</a>
</li>
{{/if}}
{{if $forum.id > $visible_forums}}
<li class="forum-widget-entry forum-{{$forum.cid}} tool {{if $forum.selected}}selected{{/if}}" id="forum-widget-entry-extended-{{$forum.id}}" role="menuitem" style="display: none;">
<span class="notify badge pull-right"></span>
<a href="{{$forum.external_url}}" title="{{$forum.link_desc}}" class="label sparkle" target="_blank" rel="noopener noreferrer">
<img class="forumlist-img" src="{{$forum.micro}}" alt="{{$forum.link_desc}}" />
</a>
<a class="forum-widget-link" id="forum-widget-link-{{$forum.id}}" href="{{$forum.url}}">{{$forum.name}}</a>
</li>
{{/if}}
{{/foreach}}
{{if $total > $visible_forums }}
<li onclick="showHideForumlist(); return false;" id="forum-widget-collapse" class="forum-widget-link fakelink tool">{{$showmore}}</li>
{{/if}}
</ul>
</div>

View file

@ -88,7 +88,7 @@ function theme_admin(App $a) {
$t = Renderer::getMarkupTemplate("theme_admin_settings.tpl");
$o = Renderer::replaceMacros($t, [
'$helperlist' => ['vier_helperlist', DI::l10n()->t('Comma separated list of helper forums'), $helperlist, '', ''],
'$helperlist' => ['vier_helperlist', DI::l10n()->t('Comma separated list of helper groups'), $helperlist, '', ''],
]);
$show_pages = get_vier_config('show_pages', true, true);

View file

@ -421,7 +421,7 @@ pre code {
.tool a {
/* color: #000; */
}
.tool a:hover, .widget a:hover, #nets-sidebar a:hover, #forum-widget-collapse:hover, .admin.link a:hover, aside h4 a:hover, right_aside h4 a:hover {
.tool a:hover, .widget a:hover, #nets-sidebar a:hover, #group-widget-collapse:hover, .admin.link a:hover, aside h4 a:hover, right_aside h4 a:hover {
/* text-decoration: underline; */
text-decoration: none;
color: black;
@ -435,8 +435,8 @@ pre code {
opacity: 1;
}
.sidebar-circle-li:hover, #sidebar-new-circle:hover, #sidebar-edit-circles:hover,#forum-widget-collapse:hover,
#sidebar-uncircled:hover, .side-link:hover, .nets-ul li:hover, #forumlist-sidebar li:hover, #forumlist-sidebar-right li:hover,
.sidebar-circle-li:hover, #sidebar-new-circle:hover, #sidebar-edit-circles:hover,#group-widget-collapse:hover,
#sidebar-uncircled:hover, .side-link:hover, .nets-ul li:hover, #group-list-sidebar li:hover, #group-list-sidebar-right li:hover,
.nets-all:hover, .saved-search-li:hover, li.tool:hover, .admin.link:hover, aside h4 a:hover, right_aside h4 a:hover, #message-new:hover,
#sidebar-photos-albums li:hover, .photos-upload-link:hover, .textcomplete-item.active {
/* background-color: #ddd; */
@ -452,11 +452,11 @@ pre code {
/* color: #000; */
}
.widget .selected, .forum-selected {
.widget .selected, .group-selected {
font-weight: bold;
}
#forum-widget-showmore, #sidebar-new-circle, #sidebar-edit-circles, #forum-widget-collapse, #forumlist-rsidebar-right, #sidebar-uncircled,
#group-widget-showmore, #sidebar-new-circle, #sidebar-edit-circles, #group-widget-collapse, #group-list-rsidebar-right, #sidebar-uncircled,
.side-link, #peoplefind-desc, #connect-desc, .nets-all, .admin.link, #message-new {
padding-left: 10px;
padding-top: 3px;
@ -471,22 +471,22 @@ pre code {
display: block;
}
#forumlist-sidebar {
#group-list-sidebar {
padding-top: 3px;
padding-bottom: 3px;
display: block;
}
.forum-widget-entry {
.group-widget-entry {
padding-left: 10px;
padding-right: 5px;
}
#forumlist-sidebar .notify, #forumlist-sidebar-right .notify {
#group-list-sidebar .notify, #group-list-sidebar-right .notify {
display: none;
}
#forumlist-sidebar .notify.show, #forumlist-sidebar-right .notify.show {
#group-list-sidebar .notify.show, #group-list-sidebar-right .notify.show {
display: inline-block;
}
@ -517,11 +517,11 @@ a.sidebar-circle-element {
color: black;
}
#forumlist-sidebar a, #forumlist-sidebar-right a, .tool a, .admin.link a, #sidebar-photos-albums a {
#group-list-sidebar a, #group-list-sidebar-right a, .tool a, .admin.link a, #sidebar-photos-albums a {
color: #737373;
}
#forumlist-sidebar, #forumlist-sidebar-right {
#group-list-sidebar, #group-list-sidebar-right {
margin-top: 2px;
}
@ -941,11 +941,11 @@ nav .acpopup {
color: #000;
padding: 3px 20px;
}
.textcomplete-item a .forum, .forum .acpopup-sub-text {
.textcomplete-item a .group, .group .acpopup-sub-text {
color: #36C;
opacity: 0.8;
}
.textcomplete-item a .forum:hover {
.textcomplete-item a .group:hover {
opacity: 1.0;
}
img.acpopup-img {

View file

@ -121,7 +121,7 @@
<option value="fulltext">{{$nav.searchoption.0}}</option>
<option value="tags">{{$nav.searchoption.1}}</option>
<option value="contacts">{{$nav.searchoption.2}}</option>
{{if $nav.searchoption.3}}<option value="forums">{{$nav.searchoption.3}}</option>{{/if}}
{{if $nav.searchoption.3}}<option value="groups">{{$nav.searchoption.3}}</option>{{/if}}
</select>
</form>
</li>

View file

@ -1,47 +0,0 @@
<script>
function showHideForumlist() {
if( $("li[id^='forum-widget-entry-extended-']").is(':visible')) {
$("li[id^='forum-widget-entry-extended-']").hide();
$("li#forum-widget-collapse").html('{{$showmore}}');
}
else {
$("li[id^='forum-widget-entry-extended-']").show();
$("li#forum-widget-collapse").html('{{$showless}}');
}
}
</script>
<div id="forumlist-sidebar-right" class="widget">
<h3 id="forumlist">{{$title}}</h3>
<ul id="forumlist-sidebar-ul" role="menu">
{{foreach $forums as $forum}}
{{if $forum.id <= $visible_forums}}
<li class="forum-widget-entry forum-{{$forum.cid}}" id="forum-widget-entry-{{$forum.id}}" role="menuitem">
<span class="notify badge pull-right"></span>
<a href="{{$forum.external_url}}" title="{{$forum.link_desc}}" class="label sparkle" target="_blank" rel="noopener noreferrer">
<img class="forumlist-img" src="{{$forum.micro}}" alt="{{$forum.link_desc}}" />
</a>
<a class="forum-widget-link {{if $forum.selected}}forum-selected{{/if}}" id="forum-widget-link-{{$forum.id}}" href="{{$forum.url}}">{{$forum.name}}</a>
</li>
{{/if}}
{{if $forum.id > $visible_forums}}
<li class="forum-widget-entry forum-{{$forum.cid}}" id="forum-widget-entry-extended-{{$forum.id}}" role="menuitem" style="display: none;">
<span class="notify badge pull-right"></span>
<a href="{{$forum.external_url}}" title="{{$forum.link_desc}}" class="label sparkle" target="_blank" rel="noopener noreferrer">
<img class="forumlist-img" src="{{$forum.micro}}" alt="{{$forum.link_desc}}" />
</a>
<a class="forum-widget-link {{if $forum.selected}}forum-selected{{/if}}" id="forum-widget-link-{{$forum.id}}" href="{{$forum.url}}">{{$forum.name}}</a>
</li>
{{/if}}
{{/foreach}}
{{if $total > $visible_forums }}
<li onclick="showHideForumlist(); return false;" id="forum-widget-collapse" class="forum-widget-link fakelink tool">{{$showmore}}</li>
{{/if}}
</ul>
</div>

View file

@ -27,7 +27,7 @@
*/
use Friendica\App;
use Friendica\Content\ForumManager;
use Friendica\Content\GroupManager;
use Friendica\Core\Addon;
use Friendica\Core\Renderer;
use Friendica\Core\Search;
@ -208,7 +208,7 @@ function vier_community_info()
//Community_Pages at right_aside
if ($show_pages && DI::userSession()->getLocalUserId()) {
$aside['$page'] = ForumManager::widget('network/forum', DI::userSession()->getLocalUserId());;
$aside['$page'] = GroupManager::widget('network/group', DI::userSession()->getLocalUserId());;
}
// END Community Page

View file

@ -2,9 +2,9 @@ right_aside {
display: block;
}
aside #forumlist-sidebar-frame,
aside #forumlist-sidebar,
#forumlist-sidebar-inflated {
aside #group-list-sidebar-frame,
aside #group-list-sidebar,
#group-list-sidebar-inflated {
display: none;
}