[FINAL] Customize first post edit permissions

In diesem Forum können Extension-Autoren ihre Extensions vorstellen, die sich noch im Entwicklungsstatus befinden. Der Einbau in Foren im produktiven Betrieb wird nicht empfohlen.
Benutzeravatar
gn#36
Administrator
Administrator
Beiträge: 9257
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

[FINAL] Customize first post edit permissions

Beitragvon gn#36 » 11.05.2015 01:07

Name der Extension: gn36 - customize first post edit permissions
Autor:gn#36

Beschreibung der Extension: Erlaubt dem Themenersteller die Änderung des ersten Beitrags, obwohl die eingestellte erlaubte Bearbeitungszeit aus der Foren-Konfiguration bereits abgelaufen ist.

Aktuelle Version der Extension: 1.2.1

Voraussetzungen:
  • phpBB 3.1.3-RC1 oder neuer

Features:
  • Trennt die Berechtigung zur Bearbeitung des Ersten Beitrags vom Recht, andere Beiträge zu bearbeiten
    • Das bisherige Recht "Kann eigene Beiträge ändern" wird zu "Kann eigene Antwortbeiträge ändern"
    • Es gibt ein neues Recht "Kann eigene Startbeiträge ändern", welches die Erlaubnis zur Bearbeitung des ersten Beitrags steuert.
    • Für das bisherige Verhalten müssen lediglich beide Berechtigungen gesetzt werden.
  • Erlaubt das Umgehen von maximalen Bearbeitungszeiten separat für den ersten Beitrag eines Themas und Antwortbeiträge
    • Es gibt ein neues Recht "Kann max. Bearbeitungszeit beim Startbeitrag umgehen"
    • Es gibt ein neues Recht "Kann max. Bearbeitungszeit bei Antwortbeiträgen umgehen"
    • Beide berechtigen für Start-, bzw. Antwortbeiträge die in den Board Einstellungen unter Beiträge eingestellte Maximale Bearbeitungszeit zu ignorieren. Das gilt nur für eigene Beiträge und berechtigt den Nutzer nicht, fremde Beiträge zu bearbeiten. Wenn das Recht zum Bearbeiten der jeweiligen Beiträge fehlt, sind diese Rechte ohne Bedeutung.
  • Konfiguration über neue Foren-Berechtigungen
  • Bei der Installation der Extension sind die Rechte so konfiguriert, dass sich das übliche Verhalten nicht ändert: Niemand umgeht die Bearbeitungszeit und die Bearbeitung von Start- und Antwortbeiträgen ist an den gleichen Orten erlaubt, wie zuvor die Bearbeitung aller Beiträge.

Geplant:
  • Derzeit nichts

Screenshots: [ externes Bild ] (vielen Dank an LukeWCS)

Download der Extension:
Github:https://github.com/gn36/phpbb-ext-firstpostedit
Zip des RC: http://phpbb.gn36.de/extensions/downloa ... .1-RC1.zip
phpBB.com: https://www.phpbb.com/customise/db/exte ... tpostedit/

Fehler bitte auf Github melden: https://github.com/gn36/phpbb-ext-firstpostedit/issues

Vorgeschichte des Beitrags und Themas: viewtopic.php?f=146&t=234393&p=1338324#p1338324

gn#36 hat geschrieben:Das ist eigentlich recht einfach: Genau hierfür gibt's zwei quasi perfekt passende Events.

Ich habe da mal eine Extension draus gemacht. Auf Komfort musst du leider verzichten, extrem ausführlich getestet habe ich auch nicht. Allerdings ist das auch nicht sonderlich kompliziert. Trotzdem bitte erst mal lokal z.B. an einem jungfräulichen phpBB 3.1.x oder besser Backup mit den richtigen Foren IDs testen ob das auch so funktioniert wie du dir das vorstellst.

Bevor du aber die Extension aktivierst musst du die gn36/firstpostedit/config/service.yml bearbeiten. Da ist ganz oben in der zweiten Zeile eine Liste von Zahlen drin [1,2,3] Die musst du ersetzen durch deine Liste von foren IDs in denen das Bearbeiten des ersten Posts dauerhaft erlaubt sein soll. Cache leeren hilft glaube ich im Zweifel auch um die IDs zu aktualisieren. Auch wenn nur ein Forum in der Liste ist müssen Klammern drum.

Link: https://github.com/gn36/phpbb-ext-firstpostedit
Installation wie üblich: Installationsanleitung für eine Erweiterung (Extension) in phpBB 3.1 / 3.2 Die extension muss nach ext/gn36/firstpostedit/ und besteht aus insgesamt 3 Dateien.
Zuletzt geändert von gn#36 am 10.08.2015 23:19, insgesamt 17-mal geändert.
Grund: Screenshot eingefügt
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.

Benutzeravatar
LukeWCS
Mitglied
Beiträge: 283
Registriert: 15.12.2014 10:19
Kontaktdaten:

Re: Automatische Updates - Fragen zum technischen Hintergrun

Beitragvon LukeWCS » 11.05.2015 13:10

gn#36 hat geschrieben:Das ist eigentlich recht einfach: Genau hierfür gibt's zwei quasi perfekt passende Events.


Werde mich mit dem Ext System ebenfalls auseinandersetzen, wenn wir mit unserem Projekt fertig sind. Gibt da durchaus ein paar Dinge, die ich gerne zusätzlich hätte.

Ich habe da mal eine Extension draus gemacht. Auf Komfort musst du leider verzichten, extrem ausführlich getestet habe ich auch nicht. Allerdings ist das auch nicht sonderlich kompliziert.


Zuerstmal, vielen Dank für deine Zeit und Mühe mir daraus eine Erweiterung zu machen. Klasse!

Komfort ist in diesem Fall irrelevant. Viel wichtiger ist mir, diese Funktionalität als Erweiterung zu haben so das ich auf jegliche Mods verzichten kann. Später wäre ein Eingabefeld im ACP noch das i-Tüpfelchen, da man dann nicht mehr zwingend per FTP ran muss, wenn man Foren hinzufügen oder löschen will. Aber das fällt wirklich unter nice-to-have.

Trotzdem bitte erst mal lokal z.B. an einem jungfräulichen phpBB 3.1.x oder besser Backup mit den richtigen Foren IDs testen ob das auch so funktioniert wie du dir das vorstellst.


Ich muss mir auf meinem Entwickler PC erstmal wieder ein lokale Testumgebung schaffen. Ist locker 7-8 Jahre her, als ich das letzte Mal einen lokalen Apache installiert hatte.

Ich habe deshalb ein aktuelles Datenbank Backup mit der internen Funktion von phpBB durchgeführt und ein Backup der Dateiebene hab ich eh noch vom 3.1.4 Update. Darum war ich eben in der Mittagspause "mutig" und habe es direkt im Live Board getestet: funktionierte auf Anhieb und das einwandfrei! :D Werde das heute Abend genauer testen und dann natürlich wieder Rückmeldung geben.

Du kannst unsere Diskussion über deine Ext auch gerne splitten in ein neues Thema. Ich denke, dass das bestimmt auch noch andere Betreiber brauchen können. ^^
Möge das Backup mit dir sein. Immer.

Erweiterungen/Forks: LF who was here, ModBreak eXtended, Monospace font for Posting Editor

Benutzeravatar
LukeWCS
Mitglied
Beiträge: 283
Registriert: 15.12.2014 10:19
Kontaktdaten:

Re: Automatische Updates - Fragen zum technischen Hintergrun

Beitragvon LukeWCS » 11.05.2015 22:30

Rückmeldung:

Habe die Ext jetzt mit meinem Test-Benutzer nochmal genauer getestet und die gleichen Foren eingetragen wie vorher beim Mod: es scheint alles zu passen. Inklusive dem Versuch nach dem Entziehen des Rechts in einem Forum die Edit-Funktion direkt über die URL zu forcieren, was aber korrekt abgelehnt wurde.

Was die Aktualisierung der IDs nach Änderung in der Textdatei angeht: jupp, Cache löschen funktioniert definitiv, habs getestet. Ebenfalls funktioniert Ext deaktivieren und reaktivieren, wie ich feststellte.
Möge das Backup mit dir sein. Immer.

Erweiterungen/Forks: LF who was here, ModBreak eXtended, Monospace font for Posting Editor

Benutzeravatar
gn#36
Administrator
Administrator
Beiträge: 9257
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Re: Automatische Updates - Fragen zum technischen Hintergrun

Beitragvon gn#36 » 12.05.2015 10:20

Wunderbar.

Da ich im Moment keine Zeit habe groß irgendwelche ACP Panels zu bauen wollte ich da um ehrlich zu sein erst mal keine Zeit rein stecken. Dafür müssen dann noch Migrations erstellt werden und Konfigurationsvariablen zum Speichern der Forenliste etc. Wenn ich wieder mehr Zeit habe vielleicht. Ich finde das so besser als einen Mod einzubauen, mit vielen alten Mods kann man sowas machen, wenn ein Event in der Nähe des Einbaupunkts ist.
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.

Benutzeravatar
LukeWCS
Mitglied
Beiträge: 283
Registriert: 15.12.2014 10:19
Kontaktdaten:

Re: Automatische Updates - Fragen zum technischen Hintergrun

Beitragvon LukeWCS » 12.05.2015 11:09

gn#36 hat geschrieben:Da ich im Moment keine Zeit habe groß irgendwelche ACP Panels zu bauen wollte ich da um ehrlich zu sein erst mal keine Zeit rein stecken.


Kein Ding, ich hab mir im Ordner mit der Konfig Datei einfach eine Liste der Foren mit deren IDs reingepackt. Und es ist jetzt ja auch nur noch eine Datei zu ändern gegenüber 2 bei der Mod Variante.

Ich finde das so besser als einen Mod einzubauen, mit vielen alten Mods kann man sowas machen, wenn ein Event in der Nähe des Einbaupunkts ist.


Definitiv. Jetzt habe ich das Forum Mod-frei und so soll es bleiben. :)
Möge das Backup mit dir sein. Immer.

Erweiterungen/Forks: LF who was here, ModBreak eXtended, Monospace font for Posting Editor

Benutzeravatar
gn#36
Administrator
Administrator
Beiträge: 9257
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Re: Automatische Updates - Fragen zum technischen Hintergrun

Beitragvon gn#36 » 12.05.2015 15:22

Also wenn jemand anderes da ACP Einstellungen einbauen will kann er das gerne machen ;)
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.

Benutzeravatar
LukeWCS
Mitglied
Beiträge: 283
Registriert: 15.12.2014 10:19
Kontaktdaten:

Re: Automatische Updates - Fragen zum technischen Hintergrun

Beitragvon LukeWCS » 13.05.2015 09:42

@gn#36

Da mir das mit der Extension von dir so gut gefiel, habe ich mich mal dran gesetzt, diese noch um die Möglichkeit zu erweitern, das Recht auch an Gruppen vergeben zu können. Ich wollte dich damit nicht auch noch behelligen. Ich habe primär bei anderen Extensions "abgeschaut", wie dort bestimmte Dinge realisiert wurden. Der Rest war dann klar, ich programmiere ja selbst auch in einigen Sprachen.

Es "scheint" korrekt zu funktionieren, verschiedene Tests durchgeführt. Aber: könnte ich das mal hier posten damit du einen prüfenden Blick darauf werfen kannst? Ich hab momentan wieder deine Original Version aktiviert, ich will mir erst ganz sicher sein, das meine Anpassungen keine üblen Fehler enthalten. :wink:
Möge das Backup mit dir sein. Immer.

Erweiterungen/Forks: LF who was here, ModBreak eXtended, Monospace font for Posting Editor

Benutzeravatar
gn#36
Administrator
Administrator
Beiträge: 9257
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Re: Allow edit of first post

Beitragvon gn#36 » 13.05.2015 09:57

Mach das. Ich habe das jetzt mal vom ursprünglichen Thema abgetrennt, weil es davon zu weit weg geht. Imho können wir das wenn es gut funktioniert auch einfach gemeinsam als Extension in der Datenbank einreichen.
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.

Benutzeravatar
LukeWCS
Mitglied
Beiträge: 283
Registriert: 15.12.2014 10:19
Kontaktdaten:

Re: Allow edit of first post

Beitragvon LukeWCS » 13.05.2015 10:14

gn#36 hat geschrieben:Ich habe das jetzt mal vom ursprünglichen Thema abgetrennt, weil es davon zu weit weg geht.


Passt. Das hatte ja mit meinem ursprünglichen Anliegen nichts mehr zu tun.

Imho können wir das wenn es gut funktioniert auch einfach gemeinsam als Extension in der Datenbank einreichen.


Wäre dabei. :wink:

Hier meine geänderten Dateien:

services.yml

Code: Alles auswählen

parameters:
    gn36.firstpostedit.forums: [4, 5, 16, 19, 32]
    gn36.firstpostedit.groups: [12]

services:
    gn36.firstpostedit.listener:
        class: gn36\firstpostedit\event\listener
        arguments
:
            - %gn36.firstpostedit.forums%
            - %gn36.firstpostedit.groups%
        tags:
            - { name: event.listener }


listener.php

Code: Alles auswählen

<?php
/**
*
* @package firstpostedit
* @copyright (c) 2015 gn#36
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/

namespace gn36\firstpostedit\event;

/**
* @ignore
*/
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
* Event listener
*/
class listener implements EventSubscriberInterface
{
    protected $forum_list;
    protected $group_list;
    
    static public function getSubscribedEvents
()
    {
        return array(
            'core.posting_modify_cannot_edit_conditions'    => 'post_edit',
            'core.viewtopic_modify_post_action_conditions'    => 'viewtopic_edit',
        );
    }

    public function __construct($forum_list, $group_list)
    {
        $this->forum_list = $forum_list;
        $this->group_list = $group_list;
    }

    public function post_edit($event)
    {
        global $phpbb_root_path, $phpEx;
        if (!function_exists('group_memberships'))
        {
            include($phpbb_root_path . 'includes/functions_user.'.$phpEx);
        }    
        if 
($event['s_cannot_edit_time'])
        {
            $is_first_post = $event['post_data']['topic_first_post_id'] == $event['post_data']['post_id'];
            $allowed_forum = in_array($event['post_data']['forum_id'], $this->forum_list);
            $allowed_group = group_memberships($this->group_list, $event['post_data']['user_id'], true);

            $event['s_cannot_edit_time'] = !($is_first_post && ($allowed_forum || $allowed_group));
        }
    }

    public function viewtopic_edit($event)
    {
        global $phpbb_root_path, $phpEx;
        if (!function_exists('group_memberships'))
        {
            include($phpbb_root_path . 'includes/functions_user.'.$phpEx);
        }    
        if 
($event['s_cannot_edit_time'])
        {
            $is_first_post = $event['topic_data']['topic_first_post_id'] == $event['row']['post_id'];
            $allowed_forum = in_array($event['row']['forum_id'], $this->forum_list);
            $allowed_group = group_memberships($this->group_list, $event['row']['user_id'], true);

            $event['s_cannot_edit_time'] = !($is_first_post && ($allowed_forum || $allowed_group));
        }
    }
}
Möge das Backup mit dir sein. Immer.

Erweiterungen/Forks: LF who was here, ModBreak eXtended, Monospace font for Posting Editor

Benutzeravatar
gn#36
Administrator
Administrator
Beiträge: 9257
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Re: Allow edit of first post

Beitragvon gn#36 » 13.05.2015 15:13

Das sieht zwar so wie du es gemacht hast gut aus, aber du hast mich auf einen Gedanken gebracht, wie das noch viel besser gehen würde und ohne groß Aufwand im ACP. Ursprünglich habe ich nur an eine eigene Konfigurationsseite gedacht, in der man Gruppen oder Foren auswählen muss in denen das gilt, aber es geht eigentlich viel einfacher.

Statt das mit jeweils einem Array zu konfigurieren, in welchen Foren das erlaubt ist und in welchen nicht machen wir da einfach eine stinknormale Berechtigung draus: f_edit_first_post. Dann kann man das genau wie alle anderen Rechte Foren und Gruppenbezogen oder auch Userbezogen vergeben wie man lustig ist und im listener müssen wir nur überprüfen ob der User das Recht hat und gerade versucht den ersten Post zu bearbeiten oder nicht.

Dafür brauchen wir nur eine Migration migrations/v_1_0_0.php, die das neue Recht anlegt:

Code: Alles auswählen

<?php
/**
 *
 * @package firstpostedit
 * @copyright (c) 2015 gn#36
 * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
 *
 */
namespace gn36\firstpostedit\migrations;

class v_1_0_0 extends \phpbb\db\migration\migration
{
    static public function depends_on()
    {
        return array();
    }

    public function update_data()
    {
        return array(
                array('permission.add', array('f_edit_first_post')),
        );
    }
}


Einen geringfügig anderen Listener:

Code: Alles auswählen

<?php
/**
*
* @package firstpostedit
* @copyright (c) 2015 gn#36
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/

namespace gn36\firstpostedit\event;

/**
* @ignore
*/
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
* Event listener
*/
class listener implements EventSubscriberInterface
{
    /** @var \phpbb\auth\auth */
    protected $auth;
    
    static public function getSubscribedEvents
()
    {
        return array(
            'core.posting_modify_cannot_edit_conditions'    => 'post_edit',
            'core.viewtopic_modify_post_action_conditions'    => 'viewtopic_edit',
            'core.permissions'            => 'add_permissions',
        );
    }

    public function __construct(\phpbb\auth\auth $auth)
    {
        $this->auth = $auth;
    }

    public function post_edit($event)
    {
        if ($event['s_cannot_edit_time'])
        {
            $is_first_post = $event['post_data']['topic_first_post_id'] == $event['post_data']['post_id'];
            $allowed_forum = $this->auth->acl_get('f_edit_first_post', $event['post_data']['forum_id']);
            
            $event
['s_cannot_edit_time'] = !($is_first_post && $allowed_forum);
        }
    }

    public function viewtopic_edit($event)
    {
        if ($event['s_cannot_edit_time'])
        {
            $is_first_post = $event['topic_data']['topic_first_post_id'] == $event['row']['post_id'];
            $allowed_forum = $this->auth->acl_get('f_edit_first_post', $event['row']['forum_id']);

            $event['s_cannot_edit_time'] = !($is_first_post && $allowed_forum);
        }
    }
    public function add_permissions($event)
    {
        $event['permissions'] = array_merge($event['permissions'], array(
            // Forum perms
            'f_edit_first_post'            => array('lang' => 'ACL_F_FIRST_POST_EDIT', 'cat' => 'actions'),
        ));
    }
}


Und eine geänderte services.yml:

Code: Alles auswählen

services:
        gn36.firstpostedit.listener:
            class: gn36\firstpostedit\event\listener
            arguments:
                - @auth
            tags:
                - { name: event.listener }


Jetzt fehlen nur noch Sprachvariablen für die neue Berechtigung im ACP in der languages/de/permissions_firstpostedit.php analog zu https://github.com/phpbb-de/phpbb-ext-p ... stebin.php:

Code: Alles auswählen

<?php
/**
* permissions_firstpostedit [German]
*
* @package language
* @copyright (c) 2015 gn#36
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*/

/**
* DO NOT CHANGE
*/
if (!defined('IN_PHPBB'))
{
    exit;
}
if (empty($lang) || !is_array($lang))
{
    $lang = array();
}

// Adding the permissions
$lang = array_merge($lang, array(
    // Forum perms,
    'ACL_F_FIRST_POST_EDIT'            => 'Kann ersten Beitrag eigener Themen bearbeiten',
));

Sowie analog auf Englisch.

Anschließend findet man nach der Installation eine neue Berechtigung "Kann ersten Beitrag eigener Themen bearbeiten" unter dem Reiter "Aktivitäten" bei den Foren-Berechtigungen. Die steht erst mal überall auf "nein", kann dann für gewünschte Gruppen und Foren aber gesetzt werden. Vermutlich sind da jetzt noch kleinere Tippfehler drin, aber eigentlich sollte das so schön konfigurierbar sein. Ich mache da bei Gelegenheit mal ein Github Repository zu auf.
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.

Verschoben von [3.1.x] Extension Bastelstube nach [3.1.x] Extensions in Entwicklung am 14.05.2015 13:21 durch gn#36


Zurück zu „Extensions in Entwicklung“