From 90bd9088bbcb261f1803a27f650ba7533cc05ec1 Mon Sep 17 00:00:00 2001 From: Diogo Cordeiro Date: Thu, 8 Aug 2019 15:08:23 +0100 Subject: [PATCH] [GNUsocialProfileExtensions] Fixed plugin --- composer.json | 1 + lib/noticeform.php | 11 +- .../GNUsocialProfileExtensionsPlugin.php | 123 +++++----- .../{README.txt => README.md} | 7 +- .../actions/bio.php | 104 -------- .../actions/newresponse.php | 53 ----- .../actions/profilefields.php | 175 -------------- .../actions/profilefieldsadminpanel.php | 183 ++++++++++++++ .../GNUsocialProfileExtensionField.php | 104 ++++---- .../GNUsocialProfileExtensionResponse.php | 104 ++++---- .../lib/noticetree.php | 223 ------------------ .../lib/profiletools.php | 59 ++--- .../locale/GNUsocialProfileExtensions.pot | 87 ++++++- 13 files changed, 462 insertions(+), 772 deletions(-) rename plugins/GNUsocialProfileExtensions/{README.txt => README.md} (54%) delete mode 100644 plugins/GNUsocialProfileExtensions/actions/bio.php delete mode 100644 plugins/GNUsocialProfileExtensions/actions/newresponse.php delete mode 100644 plugins/GNUsocialProfileExtensions/actions/profilefields.php create mode 100644 plugins/GNUsocialProfileExtensions/actions/profilefieldsadminpanel.php delete mode 100644 plugins/GNUsocialProfileExtensions/lib/noticetree.php diff --git a/composer.json b/composer.json index d5b21692ed..c51c08985d 100644 --- a/composer.json +++ b/composer.json @@ -16,6 +16,7 @@ "ext-simplexml": "*", "ext-xml": "*", "ext-xmlwriter": "*", + "ext-ctype": "*", "apereo/phpcas": "^1.3", "diogocomposer/xmpphp": "^3.0", "embed/embed": "^3.4", diff --git a/lib/noticeform.php b/lib/noticeform.php index f9b2309119..7dcd2e7d7c 100644 --- a/lib/noticeform.php +++ b/lib/noticeform.php @@ -87,8 +87,8 @@ class NoticeForm extends Form /** * Constructor * - * @param Action $action Action we're being embedded into - * @param array $options Array of optional parameters + * @param Action $action Action we're being embedded into + * @param array $options Array of optional parameters * 'user' a user instead of current * 'content' notice content * 'inreplyto' ID of notice to reply to @@ -96,8 +96,9 @@ class NoticeForm extends Form * 'lon' Longitude * 'location_id' ID of location * 'location_ns' Namespace of location + * @throws UserNoProfileException */ - function __construct($action, $options=null) + function __construct(Action $action, array $options = []) { parent::__construct($action); @@ -105,10 +106,6 @@ class NoticeForm extends Form // possibly existing HTML elements, as naming conventions are similar. $this->id_suffix = rand(); - if (is_null($options)) { - $options = array(); - } - $this->actionName = $action->trimmed('action'); $prefill = array('content', 'inreplyto', 'lat', diff --git a/plugins/GNUsocialProfileExtensions/GNUsocialProfileExtensionsPlugin.php b/plugins/GNUsocialProfileExtensions/GNUsocialProfileExtensionsPlugin.php index 66014f0c6d..3ba86770f3 100644 --- a/plugins/GNUsocialProfileExtensions/GNUsocialProfileExtensionsPlugin.php +++ b/plugins/GNUsocialProfileExtensions/GNUsocialProfileExtensionsPlugin.php @@ -1,57 +1,51 @@ . + /** - * GNU Social - * Copyright (C) 2010, Free Software Foundation, Inc. - * - * PHP version 5 - * - * LICENCE: - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * Allows administrators to define additional profile fields for the users of a GNU social installation. * * @category Widget - * @package GNU Social + * @package GNU social * @author Max Shinn - * @copyright 2011 Free Software Foundation, Inc. - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @author Diogo Cordeiro + * @copyright 2011-2019 Free Software Foundation, Inc http://www.fsf.org + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ -if (!defined('STATUSNET')) { - exit(1); -} +defined('GNUSOCIAL') || die(); -include_once $dir . '/lib/profiletools.php'; +include_once __DIR__ . '/lib/profiletools.php'; class GNUsocialProfileExtensionsPlugin extends Plugin { - - function onCheckSchema() + public function onCheckSchema(): bool { $schema = Schema::get(); - $schema->ensureTable('GNUsocialProfileExtensionField', GNUsocialProfileExtensionField::schemaDef()); - $schema->ensureTable('GNUsocialProfileExtensionResponse', GNUsocialProfileExtensionResponse::schemaDef()); - - } - - function onRouterInitialized($m) - { - $m->connect(':nickname/bio', ['action' => 'bio']); - $m->connect('admin/profilefields', ['action' => 'profilefieldsAdminPanel']); - $m->connect('notice/respond', ['action' => 'newresponse']); + $schema->ensureTable('gnusocialprofileextensionfield', GNUsocialProfileExtensionField::schemaDef()); + $schema->ensureTable('gnusocialprofileextensionresponse', GNUsocialProfileExtensionResponse::schemaDef()); return true; } - function onEndProfileFormData($action) + public function onRouterInitialized($m): bool + { + $m->connect('admin/profilefields', ['action' => 'profilefieldsAdminPanel']); + return true; + } + + public function onEndProfileFormData($action): bool { $fields = GNUsocialProfileExtensionField::allFields(); $user = common_current_user(); @@ -61,20 +55,26 @@ class GNUsocialProfileExtensionsPlugin extends Plugin $action->elementStart('li'); $fieldname = $field->systemname; if ($field->type == 'str') { - $action->input($fieldname, $field->title, - ($action->arg($fieldname)) ? $action->arg($fieldname) : $profile->$fieldname, - $field->description); - } - else if ($field->type == 'text') { - $action->textarea($fieldname, $field->title, - ($action->arg($fieldname)) ? $action->arg($fieldname) : $profile->$fieldname, - $field->description); + $action->input( + $fieldname, + $field->title, + ($action->arg($fieldname)) ? $action->arg($fieldname) : $profile->$fieldname, + $field->description + ); + } elseif ($field->type == 'text') { + $action->textarea( + $fieldname, + $field->title, + ($action->arg($fieldname)) ? $action->arg($fieldname) : $profile->$fieldname, + $field->description + ); } $action->elementEnd('li'); } + return true; } - function onEndProfileSaveForm($action) + public function onEndProfileSaveForm($action): bool { $fields = GNUsocialProfileExtensionField::allFields(); $user = common_current_user(); @@ -85,38 +85,40 @@ class GNUsocialProfileExtensionsPlugin extends Plugin $response = new GNUsocialProfileExtensionResponse(); $response->profile_id = $profile->id; $response->extension_id = $field->id; - + if ($response->find()) { $response->fetch(); $response->value = $val; if ($response->validate()) { - if (empty($val)) + if (empty($val)) { $response->delete(); - else + } else { $response->update(); + } } - } - else { + } else { $response->value = $val; $response->insert(); } } + return true; } - - function onEndShowStyles($action) + + public function onEndShowStyles($action): bool { $action->cssLink('/plugins/GNUsocialProfileExtensions/res/style.css'); + return true; } - function onEndShowScripts($action) + public function onEndShowScripts($action): bool { $action->script('plugins/GNUsocialProfileExtensions/js/profile.js'); + return true; } - function onEndAdminPanelNav($nav) + public function onEndAdminPanelNav($nav): bool { if (AdminPanelAction::canAdmin('profilefields')) { - $action_name = $nav->action->trimmed('action'); $nav->out->menuItem( @@ -130,11 +132,4 @@ class GNUsocialProfileExtensionsPlugin extends Plugin return true; } - - function onStartPersonalGroupNav(Menu $nav, Profile $target, Profile $scoped=null) - { - $nav->out->menuItem(common_local_url('bio', - array('nickname' => $nav->action->trimmed('nickname'))), _('Bio'), - _('The user\'s extended profile'), $nav->action->trimmed('action') == 'bio', 'nav_bio'); - } } diff --git a/plugins/GNUsocialProfileExtensions/README.txt b/plugins/GNUsocialProfileExtensions/README.md similarity index 54% rename from plugins/GNUsocialProfileExtensions/README.txt rename to plugins/GNUsocialProfileExtensions/README.md index fd496cd19a..e2cc62b5ca 100644 --- a/plugins/GNUsocialProfileExtensions/README.txt +++ b/plugins/GNUsocialProfileExtensions/README.md @@ -1,15 +1,14 @@ -GNU Social Profile Extensions +GNU social Profile Extensions ============================= Allows administrators to define additional profile fields for the -users of a GNU Social installation. +users of a GNU social installation. Installation ------------ -To install, copy this directory into your plugins directory and add -the following lines to your config.php file: +To enable, add the following lines to your config.php file: addPlugin('GNUsocialProfileExtensions'); $config['admin']['panels'][] = 'profilefields'; diff --git a/plugins/GNUsocialProfileExtensions/actions/bio.php b/plugins/GNUsocialProfileExtensions/actions/bio.php deleted file mode 100644 index 948a30ea8e..0000000000 --- a/plugins/GNUsocialProfileExtensions/actions/bio.php +++ /dev/null @@ -1,104 +0,0 @@ -. - * - * @category Widget - * @package GNU Social - * @author Max Shinn - * @copyright 2011 Free Software Foundation, Inc. - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 - */ - -if (!defined('STATUSNET')) { - exit(1); -} - -require_once INSTALLDIR . '/lib/personalgroupnav.php'; -require_once INSTALLDIR . '/classes/Profile.php'; -require_once INSTALLDIR . '/lib/profilelist.php'; - -class BioAction extends Action -{ - var $user = null; - - function prepare(array $args = array()) - { - parent::prepare($args); - - $args = $this->returnToArgs(); - $this->profile = Profile::getKV('nickname', $args[1]['nickname']); - //die(print_r($this->profile)); - gnusocial_profile_merge($this->profile); - - return true; - - } - - function handle() - { - parent::handle(); - $this->showPage(); - } - - function title() - { - return sprintf(_m("%s's Bio."), $this->profile->nickname); - } - - function showLocalNav() - { - $nav = new PersonalGroupNav($this); - $nav->show(); - } - - function showContent() - { - if(empty($this->profile)) { - return; - } - - $profilelistitem = new ProfileListItem($this->profile, $this); - $profilelistitem->show(); - $this->elementStart('ul'); - $fields = GNUsocialProfileExtensionField::allFields(); - foreach ($fields as $field) { - $fieldname = $field->systemname; - if (!empty($this->profile->$fieldname)) { - $this->elementStart('li', array('class' => 'biolistitem')); - $this->elementStart('div', array('class' => 'biolistitemcontainer')); - if ($field->type == 'text') { - $this->element('h3', array(), $field->title); - $this->element('p', array('class' => 'biovalue'), $this->profile->$fieldname); - } - else { - $this->element('span', array('class' => 'biotitle'), $field->title); - $this->text(' '); - $this->element('span', array('class' => 'biovalue'), $this->profile->$fieldname); - } - $this->elementEnd('div'); - $this->elementEnd('li'); - } - } - $this->elementEnd('ul'); - } - -} - - diff --git a/plugins/GNUsocialProfileExtensions/actions/newresponse.php b/plugins/GNUsocialProfileExtensions/actions/newresponse.php deleted file mode 100644 index 0e71ee3f26..0000000000 --- a/plugins/GNUsocialProfileExtensions/actions/newresponse.php +++ /dev/null @@ -1,53 +0,0 @@ -. - * - * @category Widget - * @package GNU Social - * @author Max Shinn - * @copyright 2011 Free Software Foundation, Inc. - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 - */ - -require_once INSTALLDIR . '/actions/newnotice.php'; - -class NewresponseAction extends NewnoticeAction -{ - /** - * Same as the parent, but not including the @-whoever in replies - * - * @return void - */ - - function showNoticeForm() - { - $content = $this->trimmed('status_textarea'); - if (!$content) { - $replyto = $this->trimmed('replyto'); - $inreplyto = $this->trimmed('inreplyto'); - } else { - // @fixme most of these bits above aren't being passed on above - $inreplyto = null; - } - - $notice_form = new NoticeForm($this, '', $content, null, $inreplyto); - $notice_form->show(); - } -} \ No newline at end of file diff --git a/plugins/GNUsocialProfileExtensions/actions/profilefields.php b/plugins/GNUsocialProfileExtensions/actions/profilefields.php deleted file mode 100644 index 1feea86771..0000000000 --- a/plugins/GNUsocialProfileExtensions/actions/profilefields.php +++ /dev/null @@ -1,175 +0,0 @@ -. - * - * @category Widget - * @package GNU Social - * @author Max Shinn - * @copyright 2010 Free Software Foundation, Inc. - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 - */ - -if (!defined('STATUSNET')) { - exit(1); -} - -require_once INSTALLDIR . '/lib/adminpanelaction.php'; - -class ProfilefieldsAdminPanelAction extends AdminPanelAction -{ - - function title() - { - return _('Profile fields'); - } - - function getInstructions() - { - return _('GNU Social custom profile fields'); - } - - function showForm() - { - $form = new ProfilefieldsAdminForm($this); - $form->show(); - return; - } - - function saveSettings() - { - $field = GNUsocialProfileExtensionField::getKV('id', $this->trimmed('id')); - if (!$field) - $field = new GNUsocialProfileExtensionField(); - $field->title = $this->trimmed('title'); - $field->description = $this->trimmed('description'); - $field->type = $this->trimmed('type'); - $field->systemname = $this->trimmed('systemname'); - if (!gnusocial_field_systemname_validate($field->systemname)) { - $this->clientError(_('Internal system name must be unique and consist of only alphanumeric characters!')); - } - if ($field->id) { - if ($field->validate()) - $field->update(); - else { - $this->clientError(_('There was an error with the field data.')); - } - } - else { - $field->insert(); - } - - return; - } - -} - -class ProfilefieldsAdminForm extends AdminForm -{ - - function id() - { - return 'form_profilefields_admin_panel'; - } - - function formClass() - { - return 'form_settings'; - } - - function action() - { - return '/admin/profilefields'; - } - - function formData() - { - $title = null; - $description = null; - $type = null; - $systemname = null; - $id = null; - $fieldsettitle = _("New Profile Field"); - //Edit a field - if ($this->out->trimmed('edit')) { - $field = GNUsocialProfileExtensionField::getKV('id', $this->out->trimmed('edit')); - $title = $field->title; - $description = $field->description; - $type = $field->type; - $systemname = $field->systemname; - $this->out->hidden('id', $field->id, 'id'); - $fieldsettitle = _("Edit Profile Field"); - } - //Don't show the list of all fields when editing one - else { - $this->out->elementStart('fieldset'); - $this->out->element('legend', null, _('Existing Custom Profile Fields')); - $this->out->elementStart('ul', 'form_data'); - $fields = GNUsocialProfileExtensionField::allFields(); - foreach ($fields as $field) { - $this->li(); - $content = - $this->out->elementStart('div'); - $this->out->element('a', array('href' => '/admin/profilefields?edit=' . $field->id), - $field->title); - $this->out->text(' (' . $field->type . '): ' . $field->description); - $this->out->elementEnd('div'); - $this->unli(); - } - $this->out->elementEnd('ul'); - $this->out->elementEnd('fieldset'); - } - - //New fields - $this->out->elementStart('fieldset'); - $this->out->element('legend', null, $fieldsettitle); - $this->out->elementStart('ul', 'form_data'); - - $this->li(); - $this->out->input('title', _('Title'), $title, - _('The title of the field')); - $this->unli(); - $this->li(); - $this->out->input('systemname', _('Internal name'), $systemname, - _('The alphanumeric name used internally for this field. Also the key used in OStatus user info. (optional)')); - $this->unli(); - $this->li(); - $this->out->input('description', _('Description'), $description, - _('An optional more detailed description of the field')); - $this->unli(); - $this->li(); - $this->out->dropdown('type', _('Type'), array('text' => _("Text"), - 'str' => _("String")), - _('The type of the datafield'), false, $type); - $this->unli(); - $this->out->elementEnd('ul'); - $this->out->elementEnd('fieldset'); - } - - /** - * Action elements - * - * @return void - */ - - function formActions() - { - $this->out->submit('submit', _('Save'), 'submit', null, _('Save new field')); - } -} diff --git a/plugins/GNUsocialProfileExtensions/actions/profilefieldsadminpanel.php b/plugins/GNUsocialProfileExtensions/actions/profilefieldsadminpanel.php new file mode 100644 index 0000000000..f0342c106b --- /dev/null +++ b/plugins/GNUsocialProfileExtensions/actions/profilefieldsadminpanel.php @@ -0,0 +1,183 @@ +. + +/** + * Allows administrators to define additional profile fields for the users of a GNU social installation. + * + * @category Widget + * @package GNU social + * @author Max Shinn + * @author Diogo Cordeiro + * @copyright 2011-2019 Free Software Foundation, Inc http://www.fsf.org + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later + */ + +defined('GNUSOCIAL') || die(); + +class ProfilefieldsAdminPanelAction extends AdminPanelAction +{ + public function title(): string + { + return _m('Profile fields'); + } + + public function getInstructions(): string + { + return _m('GNU Social custom profile fields'); + } + + public function showForm(): void + { + $form = new ProfilefieldsAdminForm($this); + $form->show(); + } + + public function saveSettings(): void + { + $field = GNUsocialProfileExtensionField::getKV('id', $this->trimmed('id')); + if (!$field) { + $field = new GNUsocialProfileExtensionField(); + $field->systemname = $this->trimmed('systemname'); + if (!gnusocial_field_systemname_validate($field->systemname)) { + $this->clientError(_m('Internal system name must be unique and consist of only alphanumeric characters!')); + } + } + $field->title = $this->trimmed('title'); + $field->description = $this->trimmed('description'); + $field->type = $this->trimmed('type'); + if ($field->id) { + if ($field->validate()) { + $field->update(); + } else { + $this->clientError(_m('There was an error with the field data.')); + } + } else { + $field->insert(); + } + } +} + +class ProfilefieldsAdminForm extends AdminForm +{ + public function id(): string + { + return 'form_profilefields_admin_panel'; + } + + public function formClass(): string + { + return 'form_settings'; + } + + public function action(): string + { + return '/admin/profilefields'; + } + + public function formData(): void + { + $title = null; + $description = null; + $type = null; + $systemname = null; + $id = null; + $fieldsettitle = _m("New Profile Field"); + // Edit a field + if ($this->out->trimmed('edit')) { + $field = GNUsocialProfileExtensionField::getKV('id', $this->out->trimmed('edit')); + $title = $field->title; + $description = $field->description; + $type = $field->type; + $systemname = $field->systemname; + $this->out->hidden('id', $field->id, 'id'); + $fieldsettitle = _m("Edit Profile Field"); + } // Don't show the list of all fields when editing one + else { + $this->out->elementStart('fieldset'); + $this->out->element('legend', null, _m('Existing Custom Profile Fields')); + $this->out->elementStart('ul', 'form_data'); + $fields = GNUsocialProfileExtensionField::allFields(); + foreach ($fields as $field) { + $this->li(); + $this->out->elementStart('div'); + $this->out->element( + 'a', + array('href' => '/admin/profilefields?edit=' . $field->id), + $field->title + ); + $this->out->text(' (' . $field->type . '): ' . $field->description); + $this->out->elementEnd('div'); + $this->unli(); + } + $this->out->elementEnd('ul'); + $this->out->elementEnd('fieldset'); + } + + // New fields + $this->out->elementStart('fieldset'); + $this->out->element('legend', null, $fieldsettitle); + $this->out->elementStart('ul', 'form_data'); + + $this->li(); + $this->out->input( + 'title', + _m('Title'), + $title, + _m('The title of the field') + ); + $this->unli(); + $this->li(); + $this->out->input( + 'systemname', + _m('Internal name'), + $systemname, + _m('The alphanumeric name used internally for this field. Also the key used in OStatus user info. (optional)') + ); + $this->unli(); + $this->li(); + $this->out->input( + 'description', + _m('Description'), + $description, + _m('An optional more detailed description of the field') + ); + $this->unli(); + $this->li(); + $this->out->dropdown( + 'type', + _m('Type'), + array('text' => _m("Text"), + 'str' => _m("String")), + _m('The type of the datafield'), + false, + $type + ); + $this->unli(); + $this->out->elementEnd('ul'); + $this->out->elementEnd('fieldset'); + } + + /** + * Action elements + * + * @return void + * @throws Exception + */ + public function formActions(): void + { + $this->out->submit('submit', _m('Save'), 'submit', null, _m('Save new field')); + } +} diff --git a/plugins/GNUsocialProfileExtensions/classes/GNUsocialProfileExtensionField.php b/plugins/GNUsocialProfileExtensions/classes/GNUsocialProfileExtensionField.php index 5a9b8de0cb..518fff043b 100644 --- a/plugins/GNUsocialProfileExtensions/classes/GNUsocialProfileExtensionField.php +++ b/plugins/GNUsocialProfileExtensions/classes/GNUsocialProfileExtensionField.php @@ -1,36 +1,31 @@ . + /** - * GNU Social - * Copyright (C) 2010, Free Software Foundation, Inc. - * - * PHP version 5 - * - * LICENCE: - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * Allows administrators to define additional profile fields for the users of a GNU social installation. * * @category Widget - * @package GNU Social + * @package GNU social * @author Max Shinn - * @copyright 2010 Free Software Foundation, Inc. - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @author Diogo Cordeiro + * @copyright 2011-2019 Free Software Foundation, Inc http://www.fsf.org + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ -if (!defined('STATUSNET')) { - exit(1); -} - -require_once INSTALLDIR . '/classes/Memcached_DataObject.php'; +defined('GNUSOCIAL') || die(); class GNUsocialProfileExtensionField extends Managed_DataObject { @@ -40,53 +35,54 @@ class GNUsocialProfileExtensionField extends Managed_DataObject public $title; // varchar(191) not 255 because utf8mb4 takes more space public $description; // text public $type; // varchar(191) not 255 because utf8mb4 takes more space - public $created; // datetime() not_null - public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP + public $created; // datetime() not_null default_0000-00-00%2000%3A00%3A00 + public $modified; // datetime() not_null default_CURRENT_TIMESTAMP - public static function schemaDef() + public static function schemaDef(): array { - return array( - 'fields' => array( - 'id' => array('type' => 'serial', 'not null' => true, 'description' => 'Unique ID for extension field'), - 'systemname' => array('type' => 'varchar', 'not null' => true, 'length' => 64, 'description' => 'field systemname'), - 'title' => array('type' => 'varchar', 'not null' => true, 'length' => 191, 'description' => 'field title'), - 'description' => array('type' => 'text', 'not null' => true, 'description' => 'field description'), - 'type' => array('type' => 'varchar', 'not null' => true, 'length' => 191, 'description' => 'field type'), - 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), - 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), - ), - 'primary key' => array('id'), - 'indexes' => array( - 'gnusocialprofileextensionfield_title_idx' => array('title'), - ), - ); + return [ + 'fields' => [ + 'id' => ['type' => 'serial', 'not null' => true, 'description' => 'Unique ID for extension field'], + 'systemname' => ['type' => 'varchar', 'not null' => true, 'length' => 64, 'description' => 'field systemname'], + 'title' => ['type' => 'varchar', 'not null' => true, 'length' => 191, 'description' => 'field title'], + 'description' => ['type' => 'text', 'not null' => true, 'description' => 'field description'], + 'type' => ['type' => 'varchar', 'not null' => true, 'length' => 191, 'description' => 'field type'], + 'created' => ['type' => 'datetime', 'not null' => true, 'default' => '0000-00-00 00:00:00', 'description' => 'date this record was created'], + 'modified' => ['type' => 'datetime', 'not null' => true, 'default' => 'CURRENT_TIMESTAMP', 'description' => 'date this record was modified'], + ], + 'primary key' => ['id'], + 'indexes' => [ + 'gnusocialprofileextensionfield_title_idx' => ['title'], + ], + ]; } - static function newField($title, $description=null, $type='str', $systemname=null) + public static function newField($title, $description = null, $type = 'str', $system_name = null): GNUsocialProfileExtensionField { $field = new GNUsocialProfileExtensionField(); $field->title = $title; $field->description = $description; $field->type = $type; - if (empty($systemname)) - $field->systemname = 'field' + $field->id; - else - $field->systemname = $systemname; - + if (empty($system_name)) { + $field->systemname = 'field' . $field->id; + } else { + $field->systemname = $system_name; + } + $field->id = $field->insert(); - if (!$field->id){ + if (!$field->id) { common_log_db_error($field, 'INSERT', __FILE__); throw new ServerException(_m('Error creating new field.')); } return $field; } - static function allFields() + public static function allFields(): array { $field = new GNUsocialProfileExtensionField(); - $fields = array(); + $fields = []; if ($field->find()) { - while($field->fetch()) { + while ($field->fetch()) { $fields[] = clone($field); } } diff --git a/plugins/GNUsocialProfileExtensions/classes/GNUsocialProfileExtensionResponse.php b/plugins/GNUsocialProfileExtensions/classes/GNUsocialProfileExtensionResponse.php index 7af6bb5051..e7099ef149 100644 --- a/plugins/GNUsocialProfileExtensions/classes/GNUsocialProfileExtensionResponse.php +++ b/plugins/GNUsocialProfileExtensions/classes/GNUsocialProfileExtensionResponse.php @@ -1,36 +1,31 @@ . + /** - * GNU Social - * Copyright (C) 2010, Free Software Foundation, Inc. - * - * PHP version 5 - * - * LICENCE: - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * Allows administrators to define additional profile fields for the users of a GNU social installation. * * @category Widget - * @package GNU Social + * @package GNU social * @author Max Shinn - * @copyright 2010 Free Software Foundation, Inc. - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @author Diogo Cordeiro + * @copyright 2011-2019 Free Software Foundation, Inc http://www.fsf.org + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ -if (!defined('STATUSNET')) { - exit(1); -} - -require_once INSTALLDIR . '/classes/Memcached_DataObject.php'; +defined('GNUSOCIAL') || die(); class GNUsocialProfileExtensionResponse extends Managed_DataObject { @@ -38,56 +33,56 @@ class GNUsocialProfileExtensionResponse extends Managed_DataObject public $id; // int(11) public $extension_id; // int(11) public $profile_id; // int(11) - public $value; // text - public $created; // datetime() not_null - public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP + public $value; // text + public $created; // datetime() not_null default_0000-00-00%2000%3A00%3A00 + public $modified; // datetime() not_null default_CURRENT_TIMESTAMP - public static function schemaDef() + public static function schemaDef(): array { - return array( - 'fields' => array( - 'id' => array('type' => 'serial', 'not null' => true, 'description' => 'Unique ID for extension response'), - 'extension_id' => array('type' => 'int', 'not null' => true, 'description' => 'The extension field ID'), - 'profile_id' => array('type' => 'int', 'not null' => true, 'description' => 'Profile id that made the response'), - 'value' => array('type' => 'text', 'not null' => true, 'description' => 'response entry'), - 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), - 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), - ), - 'primary key' => array('id'), - 'foreign keys' => array( - 'gnusocialprofileextensionresponse_profile_id_fkey' => array('profile', array('profile_id' => 'id')), - 'gnusocialprofileextensionresponse_extension_id_fkey' => array('gnusocialprofileextensionfield', array('extension_id' => 'id')), - ), - 'indexes' => array( - 'gnusocialprofileextensionresponse_extension_id_idx' => array('extension_id'), - ), - ); + return [ + 'fields' => [ + 'id' => ['type' => 'serial', 'not null' => true, 'description' => 'Unique ID for extension response'], + 'extension_id' => ['type' => 'int', 'not null' => true, 'description' => 'The extension field ID'], + 'profile_id' => ['type' => 'int', 'not null' => true, 'description' => 'Profile id that made the response'], + 'value' => ['type' => 'text', 'not null' => true, 'description' => 'response entry'], + 'created' => ['type' => 'datetime', 'not null' => true, 'default' => '0000-00-00 00:00:00', 'description' => 'date this record was created'], + 'modified' => ['type' => 'datetime', 'not null' => true, 'default' => 'CURRENT_TIMESTAMP', 'description' => 'date this record was modified'], + ], + 'primary key' => ['id'], + // Syntax: foreign_key_name => [remote_table, local_key => remote_key]] + 'foreign keys' => [ + 'gnusocialprofileextensionresponse_profile_id_fkey' => ['profile', ['profile_id' => 'id']], + 'gnusocialprofileextensionresponse_extension_id_fkey' => ['gnusocialprofileextensionfield', ['extension_id' => 'id']], + ], + 'indexes' => [ + 'gnusocialprofileextensionresponse_extension_id_idx' => ['extension_id'], + ], + ]; } - static function newResponse($extension_id, $profile_id, $value) + public static function newResponse($extension_id, $profile_id, $value): GNUsocialProfileExtensionResponse { - $response = new GNUsocialProfileExtensionResponse(); $response->extension_id = $extension_id; $response->profile_id = $profile_id; $response->value = $value; - + $response->id = $response->insert(); - if (!$response->id){ + if (!$response->id) { common_log_db_error($response, 'INSERT', __FILE__); throw new ServerException(_m('Error creating new response.')); } return $response; } - static function findResponsesByProfile($id) + public static function findResponsesByProfile($id): array { $extf = 'gnusocialprofileextensionfield'; $extr = 'gnusocialprofileextensionresponse'; $sql = "SELECT $extr.*, $extf.title, $extf.description, $extf.type, $extf.systemname FROM $extr JOIN $extf ON $extr.extension_id=$extf.id WHERE $extr.profile_id = $id"; $response = new GNUsocialProfileExtensionResponse(); $response->query($sql); - $responses = array(); + $responses = []; while ($response->fetch()) { $responses[] = clone($response); @@ -95,5 +90,4 @@ class GNUsocialProfileExtensionResponse extends Managed_DataObject return $responses; } - } diff --git a/plugins/GNUsocialProfileExtensions/lib/noticetree.php b/plugins/GNUsocialProfileExtensions/lib/noticetree.php deleted file mode 100644 index 95df528388..0000000000 --- a/plugins/GNUsocialProfileExtensions/lib/noticetree.php +++ /dev/null @@ -1,223 +0,0 @@ -. - * - * @category Widget - * @package GNU Social - * @author Max Shinn - * @copyright 2011 Free Software Foundation, Inc. - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 - */ - //functions to sort replies -class NoticeTree extends NoticeList -{ - function show() - { - $this->out->elementStart('div', array('id' =>'notices_primary')); - // TRANS: Header on conversation page. Hidden by default (h2). - $this->out->element('h2', null, _('Notices')); - $this->out->elementStart('ol', array('class' => 'notices xoxo')); - - $cnt = 0; - - while ($this->notice->fetch() && $cnt <= NOTICES_PER_PAGE) { - if (!empty($this->notice->reply_to)) - continue; - - $cnt++; - - if ($cnt > NOTICES_PER_PAGE) { - break; - } - - try { - $this->showNoticePlus($this->newListItem($this->notice)); - } catch (Exception $e) { - // we log exceptions and continue - print "ERROR!" . $e->getMessage(); - common_log(LOG_ERR, $e->getMessage()); - continue; - } - } - - $this->out->elementEnd('ol'); - $this->out->elementEnd('div'); - - return $cnt; - } - - function _cmpDate($a, $b) { return strcmp($a->notice->modified, $b->notice->modified); } - function _cmpFav($a, $b) { return (int)$a->faves < (int)$b->faves; } - - function showNoticePlus($item) - { - $replies = new Notice(); - $replies->reply_to = $item->notice->id; - - // We take responsibility for doing the li - - $this->out->elementStart('li', array('class' => 'h-entry notice', - 'id' => 'notice-' . $item->notice->id)); - - $item->show(); - - if ($replies->find()) { - $this->out->elementStart('ol', array('class' => 'notices')); - - $replieslist = array(); - while ($replies->fetch()) { - $replieslist[] = $this->newListItem(clone($replies)); - } - - //Sorting based on url argument - if($_GET['sort'] == 'faves') - usort($replieslist, array($this, '_cmpFav')); - else - usort($replieslist, array($this, '_cmpDate')); - - - foreach($replieslist as $reply) { - $this->showNoticePlus($reply); - } - - $this->out->elementEnd('ol'); - } - - $this->out->elementEnd('li'); - } - - function newListItem($notice) - { - return new NoticeTreeItem($notice, $this->out); - } -} - -class NoticeTreeItem extends NoticeListItem -{ - function __construct($notice, $out=null) - { - parent::__construct($notice, $out); - //TODO: Rewrite this - //Showing number of favorites - $fave = new Fave(); - $fave->notice_id = $this->notice->id; - $cnt = 0; - if ($fave->find()) { - while ($fave->fetch()) - $cnt++; - } - $this->faves = $cnt; - } - - function showStart() - { - return; - } - - function showEnd() - { - if ($this->faves > 0) { - $this->out->text(_m("Favorited by $this->faves user")); - if ($this->faves > 1) $this->out->text("s"); //there has to be a better way to do this... - } - - //Show response form - $this->out->elementStart('div', array('id' => 'form' . $this->notice->id, 'class' => 'replyform')); - $noticeform = new ReplyForm($this->out, null, null, null, $this->notice->id); - $noticeform->show(); - $this->out->elementEnd('div'); - return; - } - - //Just changing the link... - function showReplyLink() - { - if (common_logged_in()) { - $this->out->text(' '); - //Why doesn't common_local_url work here? - $reply_url = '/notice/respond?replyto=' . $this->profile->nickname . '&inreplyto=' . $this->notice->id; - $this->out->elementStart('a', array('href' => $reply_url, - 'class' => 'notice_reply', - 'title' => _('Reply to this notice'))); - $this->out->text(_('Reply')); - $this->out->text(' '); - $this->out->element('span', 'notice_id', $this->notice->id); - $this->out->elementEnd('a'); - } - } - -} - -class ReplyForm extends NoticeForm -{ - //Changing the text. We have to either repeat ids or get hacky. I vote repeat ids. - function formData() - { - if (Event::handle('StartShowNoticeFormData', array($this))) { - // XXX: vary by defined max size - $this->out->element('textarea', array('id' => 'notice_data-text', - 'cols' => 35, - 'rows' => 4, - 'name' => 'status_textarea'), - ($this->content) ? $this->content : ''); - - $contentLimit = Notice::maxContent(); - - if ($contentLimit > 0) { - $this->out->elementStart('dl', 'form_note'); - $this->out->element('dt', null, _('Available characters')); - $this->out->element('dd', array('id' => 'notice_text-count'), - $contentLimit); - $this->out->elementEnd('dl'); - } - - if (common_config('attachments', 'uploads')) { - $this->out->element('label', array('for' => 'notice_data-attach'),_('Attach')); - $this->out->element('input', array('id' => 'notice_data-attach', - 'type' => 'file', - 'name' => 'attach', - 'title' => _('Attach a file'))); - $this->out->hidden('MAX_FILE_SIZE', common_config('attachments', 'file_quota')); - } - if ($this->action) { - $this->out->hidden('notice_return-to', $this->action, 'returnto'); - } - $this->out->hidden('notice_in-reply-to', $this->inreplyto, 'inreplyto'); - - if ($this->profile->shareLocation()) { - $this->out->hidden('notice_data-lat', empty($this->lat) ? (empty($this->profile->lat) ? null : $this->profile->lat) : $this->lat, 'lat'); - $this->out->hidden('notice_data-lon', empty($this->lon) ? (empty($this->profile->lon) ? null : $this->profile->lon) : $this->lon, 'lon'); - $this->out->hidden('notice_data-location_id', empty($this->location_id) ? (empty($this->profile->location_id) ? null : $this->profile->location_id) : $this->location_id, 'location_id'); - $this->out->hidden('notice_data-location_ns', empty($this->location_ns) ? (empty($this->profile->location_ns) ? null : $this->profile->location_ns) : $this->location_ns, 'location_ns'); - - $this->out->elementStart('div', array('id' => 'notice_data-geo_wrap', - 'title' => common_local_url('geocode'))); - $this->out->checkbox('notice_data-geo', _('Share my location'), true); - $this->out->elementEnd('div'); - $this->out->inlineScript(' var NoticeDataGeo_text = {'. - 'ShareDisable: ' .json_encode(_('Do not share my location')).','. - 'ErrorTimeout: ' .json_encode(_('Sorry, retrieving your geo location is taking longer than expected, please try again later')). - '}'); - } - - Event::handle('EndShowNoticeFormData', array($this)); - } - } -} diff --git a/plugins/GNUsocialProfileExtensions/lib/profiletools.php b/plugins/GNUsocialProfileExtensions/lib/profiletools.php index fa3cfa9656..a1b48daf3e 100644 --- a/plugins/GNUsocialProfileExtensions/lib/profiletools.php +++ b/plugins/GNUsocialProfileExtensions/lib/profiletools.php @@ -1,47 +1,52 @@ . + /** - * GNU Social - * Copyright (C) 2010, Free Software Foundation, Inc. - * - * PHP version 5 - * - * LICENCE: - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * Allows administrators to define additional profile fields for the users of a GNU social installation. * * @category Widget - * @package GNU Social + * @package GNU social * @author Max Shinn - * @copyright 2010 Free Software Foundation, Inc. - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @author Diogo Cordeiro + * @copyright 2011-2019 Free Software Foundation, Inc http://www.fsf.org + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ +defined('GNUSOCIAL') || die(); + function gnusocial_profile_merge(&$profile) { $responses = GNUsocialProfileExtensionResponse::findResponsesByProfile($profile->id); - $profile->customfields = array(); + $profile->customfields = []; foreach ($responses as $response) { $title = $response->systemname; $profile->$title = $response->value; $profile->customfields[] = $title; } } - + function gnusocial_field_systemname_validate($systemname) { + // Ensure it doesn't exist already $fields = GNUsocialProfileExtensionField::allFields(); - foreach ($fields as $field) - if ($field->systemname == $systemname) + foreach ($fields as $field) { + if ($field->systemname == $systemname) { return false; - return ctype_alphanum($systemname); -} \ No newline at end of file + } + } + // Ensure that it consist of only alphanumeric characters + return ctype_alnum($systemname); +} diff --git a/plugins/GNUsocialProfileExtensions/locale/GNUsocialProfileExtensions.pot b/plugins/GNUsocialProfileExtensions/locale/GNUsocialProfileExtensions.pot index 30e252dcea..b745e94c14 100644 --- a/plugins/GNUsocialProfileExtensions/locale/GNUsocialProfileExtensions.pot +++ b/plugins/GNUsocialProfileExtensions/locale/GNUsocialProfileExtensions.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-14 14:51+0100\n" +"POT-Creation-Date: 2019-08-14 14:54+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -25,15 +25,90 @@ msgstr "" msgid "Custom profile fields" msgstr "" -#: actions/bio.php:62 -#, php-format -msgid "%s's Bio." +#: actions/profilefieldsadminpanel.php:34 +msgid "Profile fields" msgstr "" -#: classes/GNUsocialProfileExtensionField.php:79 +#: actions/profilefieldsadminpanel.php:39 +msgid "GNU Social custom profile fields" +msgstr "" + +#: actions/profilefieldsadminpanel.php:55 +msgid "" +"Internal system name must be unique and consist of only alphanumeric " +"characters!" +msgstr "" + +#: actions/profilefieldsadminpanel.php:65 +msgid "There was an error with the field data." +msgstr "" + +#: actions/profilefieldsadminpanel.php:97 +msgid "New Profile Field" +msgstr "" + +#: actions/profilefieldsadminpanel.php:106 +msgid "Edit Profile Field" +msgstr "" + +#: actions/profilefieldsadminpanel.php:110 +msgid "Existing Custom Profile Fields" +msgstr "" + +#: actions/profilefieldsadminpanel.php:137 +msgid "Title" +msgstr "" + +#: actions/profilefieldsadminpanel.php:139 +msgid "The title of the field" +msgstr "" + +#: actions/profilefieldsadminpanel.php:145 +msgid "Internal name" +msgstr "" + +#: actions/profilefieldsadminpanel.php:147 +msgid "" +"The alphanumeric name used internally for this field. Also the key used in " +"OStatus user info. (optional)" +msgstr "" + +#: actions/profilefieldsadminpanel.php:153 +msgid "Description" +msgstr "" + +#: actions/profilefieldsadminpanel.php:155 +msgid "An optional more detailed description of the field" +msgstr "" + +#: actions/profilefieldsadminpanel.php:161 +msgid "Type" +msgstr "" + +#: actions/profilefieldsadminpanel.php:162 +msgid "Text" +msgstr "" + +#: actions/profilefieldsadminpanel.php:163 +msgid "String" +msgstr "" + +#: actions/profilefieldsadminpanel.php:164 +msgid "The type of the datafield" +msgstr "" + +#: actions/profilefieldsadminpanel.php:181 +msgid "Save" +msgstr "" + +#: actions/profilefieldsadminpanel.php:181 +msgid "Save new field" +msgstr "" + +#: classes/GNUsocialProfileExtensionField.php:75 msgid "Error creating new field." msgstr "" -#: classes/GNUsocialProfileExtensionResponse.php:78 +#: classes/GNUsocialProfileExtensionResponse.php:73 msgid "Error creating new response." msgstr ""