Seite 1 von 1

Jeden eigenen Beitrag löschen +Editierhinweis immer anzeigen

Verfasst: 10.07.2007 21:29
von dieweltist
Mit diesen beiden Modifizierungen wird erreicht, dass zum einen ein User, falls aktiviert, jeden eigenen Beitrag löschen kann. Er kann es auch dann, wenn er nicht das Recht hat Beiträge zu editieren. Er kann auch den Basisbeitrag löschen. Sonst kann ein User, falls aktiviert, nur dann seinen Beitrag löschen, wenn dieser der letzte im Thread ist.

Mit diesen Modifizierungen wird zum anderen auch erreicht, dass der Editierhinweis, falls aktiviert, immer angezeigt wird. Bisher war es so, dass dieser nicht angezeigt wurde, wenn der Beitrag der letzte im Thread ist. Auf diese Weise erfolgt auch stets ein Eintrag des Editierdatums in die Datenbank.

Falls zudem Interesse besteht einzustellen, dass im Thread ein editierter Beitrag jeweils im Thread an die letzte Stelle rutscht, indem sein Editierdatum sein neues Erstellungsdatum ist, wäre eine Kombination aus dieser Modifikation und der in diesem Beitrag beschriebenen Modifikation zu empfehlen.

Denn bei der anderen Modifikation war das Problem, dass bei einem editierten Beitrag der Editierhinweis nicht angezeigt wurde, und dadurch auch kein Eintrag in der Datenbank erfolgte, falls ein Beitrag editiert wurde, der an letzter Stelle war.

Das an sich wäre zwar noch kein Problem, nur wenn bereits Beiträge durch Editieren ans Ende des Threads befördert wurden, waren sie für das System nicht am Ende des Threads, weil intern das System den tatsächlich letzten Beitrag (bezogen auf das wirkliche Erstellungsdatum) als den letzten Beitrag im Thread ansieht; und nicht denjenigen Beitrag, der durch Editieren ans Ende verschoben wurde.

Das ist deswegen so, weil (anscheinend) das System intern die Reihenfolge anhand der Beitrag-IDs ansieht. Dadurch kann es passieren, dass man einen Beitrag inmitten des Threads editiert, das System aber nicht das Editierdatum anzeigt und dieser dadurch auch nicht ans Ende des Threads verschoben wird, weil ggf. dieser Beitrag vom System als der letzte Beitrag im Thread angesehen wird.

Mit dieser Modifizierung ist aber diese Funktionalität ausgeschaltet; also ausnahmslos jeder Beitrag erhält bei Editierung seinen Editierhinweis. Dadurch werden auch die Probleme, die bei der im anderen verlinkten Beitrag beschriebenen Modifikation beseitigt.

Ich habe auch noch eine Modifikation veröffentlicht, wie man das Editierdatum völlig abschalten kann, aber dass trotzdem weiterhin entsprechende Editiervermerke in die Datenbank eingetragen werden. Siehe hier: Klick!

Würde man nämlich ggf. den Editierhinweis im Adminbereich abschalten, würden keine Einträge mehr in der Datenbank erfolgen. Für den Fall, dass man die im anderen Beitrag beschriebene Modifizierung anwendet, damit editierte Beiträge jeweils ans Ende des Threads rutschen sollen, würde das nicht funktionieren, falls man den Editierhinweis im ACP abschaltet.

Mir haben diese beiden Modifizierungen übrigens 270 € gekostet, weil ich sie mir von einem PHP-Kundigen habe machen lassen. Die Dokumentation dazu veröffentliche ich hier aber mit seiner Erlaubnis unentgeltlich. Hier seine Dokumentation, die er mir übergab:

posting.php

Finde:

Code: Alles auswählen

trigger_error('CANNOT_EDIT_TIME');
Ersetze mit:

Code: Alles auswählen

//trigger_error('CANNOT_EDIT_TIME');
Finde:

Code: Alles auswählen

if ($auth->acl_get('m_delete', $forum_id) || ($post_data['poster_id'] == $user->data['user_id'] && $user->data['is_registered'] && $auth->acl_get('f_delete', $forum_id) && $post_id == $post_data['topic_last_post_id']))
Ersetze mit:

Code: Alles auswählen

if ($auth->acl_get('m_delete', $forum_id) || ($post_data['poster_id'] == $user->data['user_id'] && $user->data['is_registered'] && $auth->acl_get('f_delete', $forum_id)))
Finde:

Code: Alles auswählen

trigger_error('CANNOT_DELETE_REPLIED');
Ersetze mit:

Code: Alles auswählen

//trigger_error('CANNOT_DELETE_REPLIED');


viewtopic.php

Finde:

Code: Alles auswählen

if (($row['post_edit_count'] && $config['display_last_edited']) || $row['post_edit_reason'])
Ersetze mit:

Code: Alles auswählen

if (($row['post_edit_count']) || $row['post_edit_reason'])
Finde:

Code: Alles auswählen

'U_DELETE'			=> (!$user->data['is_registered']) ? '' : ((($user->data['user_id'] == $poster_id && $auth->acl_get('f_delete', $forum_id) && $topic_data['topic_last_post_id'] == $row['post_id'] && ($row['post_time'] > time() - ($config['edit_time'] * 60) || !$config['edit_time'])) || $auth->acl_get('m_delete', $forum_id)) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=delete&f=$forum_id&p={$row['post_id']}") : ''),
Ersetze mit:

Code: Alles auswählen

'U_DELETE'			=> (!$user->data['is_registered']) ? '' : ((($user->data['user_id'] == $poster_id && $auth->acl_get('f_delete', $forum_id) ) || $auth->acl_get('m_delete', $forum_id)) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=delete&f=$forum_id&p={$row['post_id']}") : ''),


includes/functions_posting.php

Finde:

Code: Alles auswählen

$post_mode = ($data['topic_replies_real'] == 0) ? 'edit_topic' : (($data['topic_first_post_id'] == $data['post_id']) ? 'edit_first_post' : (($data['topic_last_post_id'] == $data['post_id']) ? 'edit_last_post' : 'edit'));
Ersetze mit:

Code: Alles auswählen

$post_mode = ($data['topic_replies_real'] == 0) ? 'edit_topic' : (($data['topic_first_post_id'] == $data['post_id']) ? 'edit' : (($data['topic_last_post_id'] == $data['post_id']) ? 'edit' : 'edit'));


Ich hatte selbst zuvor alle Veränderungen am System aufgespürt und dokumentiert. Meine so entstandene Dokumentation ist aber vollständiger, weil sie absolut alle Veränderungen umfassen; also auch eingefügte Kommentare, auskommentierten nicht mehr gültigen Code, Leerstellen und Tabulatoreinrückungen:

posting.php

Finde:

Code: Alles auswählen

		trigger_error('CANNOT_EDIT_TIME');
Ersetze mit:

Code: Alles auswählen

//ORIGINAL LINE: trigger_error('CANNOT_EDIT_TIME');
		//trigger_error('CANNOT_EDIT_TIME');
Finde:

Code: Alles auswählen

	if ($auth->acl_get('m_delete', $forum_id) || ($post_data['poster_id'] == $user->data['user_id'] && $user->data['is_registered'] && $auth->acl_get('f_delete', $forum_id) && $post_id == $post_data['topic_last_post_id']))
Ersetze mit:

Code: Alles auswählen

//ORIGINAL LINE: 	if ($auth->acl_get('m_delete', $forum_id) || ($post_data['poster_id'] == $user->data['user_id'] && $user->data['is_registered'] && $auth->acl_get('f_delete', $forum_id) && $post_id == $post_data['topic_last_post_id']))
	if ($auth->acl_get('m_delete', $forum_id) || ($post_data['poster_id'] == $user->data['user_id'] && $user->data['is_registered'] && $auth->acl_get('f_delete', $forum_id)))
Finde:

Code: Alles auswählen

		trigger_error('CANNOT_DELETE_REPLIED');
Ersetze mit:

Code: Alles auswählen

//ORIGINAL LINE:	trigger_error('CANNOT_DELETE_REPLIED');
//		trigger_error('CANNOT_DELETE_REPLIED');

viewtopic.php

Finde:

Code: Alles auswählen

	if (($row['post_edit_count'] && $config['display_last_edited']) || $row['post_edit_reason'])
Ersetze mit:

Code: Alles auswählen

	// ORIGINAL LINE: if (($row['post_edit_count'] && $config['display_last_edited']) || $row['post_edit_reason'])
	if (($row['post_edit_count']) || $row['post_edit_reason'])
Finde:

Code: Alles auswählen

		'U_DELETE'			=> (!$user->data['is_registered']) ? '' : ((($user->data['user_id'] == $poster_id && $auth->acl_get('f_delete', $forum_id) && $topic_data['topic_last_post_id'] == $row['post_id'] && ($row['post_time'] > time() - ($config['edit_time'] * 60) || !$config['edit_time'])) || $auth->acl_get('m_delete', $forum_id)) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=delete&f=$forum_id&p={$row['post_id']}") : ''),
Ersetze mit:

Code: Alles auswählen

// ORIGINAL LINE: 'U_DELETE'			=> (!$user->data['is_registered']) ? '' : ((($user->data['user_id'] == $poster_id && $auth->acl_get('f_delete', $forum_id) && $topic_data['topic_last_post_id'] == $row['post_id'] && ($row['post_time'] > time() - ($config['edit_time'] * 60) || !$config['edit_time'])) || $auth->acl_get('m_delete', $forum_id)) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=delete&f=$forum_id&p={$row['post_id']}") : ''),
		'U_DELETE'			=> (!$user->data['is_registered']) ? '' : ((($user->data['user_id'] == $poster_id && $auth->acl_get('f_delete', $forum_id) ) || $auth->acl_get('m_delete', $forum_id)) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=delete&f=$forum_id&p={$row['post_id']}") : ''),


includes/functions_posting.php

Finde:

Code: Alles auswählen

		$post_mode = ($data['topic_replies_real'] == 0) ? 'edit_topic' : (($data['topic_first_post_id'] == $data['post_id']) ? 'edit_first_post' : (($data['topic_last_post_id'] == $data['post_id']) ? 'edit_last_post' : 'edit'));
Ersetze mit:

Code: Alles auswählen

	//ORIGINAL LINE: 	$post_mode = ($data['topic_replies_real'] == 0) ? 'edit_topic' : (($data['topic_first_post_id'] == $data['post_id']) ? 'edit_first_post' : (($data['topic_last_post_id'] == $data['post_id']) ? 'edit_last_post' : 'edit'));
		$post_mode = ($data['topic_replies_real'] == 0) ? 'edit_topic' : (($data['topic_first_post_id'] == $data['post_id']) ? 'edit' : (($data['topic_last_post_id'] == $data['post_id']) ? 'edit' : 'edit'));

Verfasst: 10.07.2007 21:46
von nickvergessen
Pack das ganze doch in eine MOD-Anleitung, der Thread bzw. dein Post ist sonst ziemlich laaaaange ;)

http://www.phpbb.com/mods/modx/

Verfasst: 10.07.2007 22:10
von dieweltist
Wenn ich englisch könnte . . . würde ich es tun. Ich bin aber einverstanden, wenn jemand diesen Text übersetzt, und ggf. auch ändert, und das Ganze dort postet; ggf. natürlich auch alle anderen von mir in diesem Forums-Board geposteten Beiträge bzw. Modifizierungsanleitungen.

Verfasst: 03.09.2007 15:49
von Kleopatras_Sister
wow

durch einen link im andern Topic hab ich das hier gefunden :)


Fast für mich geschnitten. Nur brauche ich die Funktion User kann löschen absolut aus Sicherheitsgründen nicht.

Sondern nur die "immer Edit anzeigen" Änderung.

Ich weiß leider nicht welches wofür ist. Kannst du oder jemand mit da die Schnipsel dazu bereit stellen `? *liebkuck* :D

Wäre Ultra Klasse 8)

MFG :cookie:

Verfasst: 03.09.2007 16:13
von dieweltist
@Kleopatras_Sister; das weiß ich leider nicht, weil ich damals nicht danach gefragt hatte. Aber warum schaltest Du das Löschen der eigenen Beiträge nicht einfach ab? Die Modifizierung, dass jeder Beitrag gelöscht werden kann, wirkt nur, wenn das Löschen der eigenen Beiträge aktiviert ist.

Ich hatte lange nach einem Forensystem gesucht, wo User alle ihre eigenen Beiträge löschen können ohne wenn und aber, aber leider gibt es dieses glaube ich nicht, wo das ohne eine Modifizierung möglich ist. Aber dieses Problem müsste mit dieser Modifizierung gelöst sein.

Verfasst: 03.09.2007 17:17
von Kleopatras_Sister
aso ok, dann ist ja alles beim alten. Das löschen hab ich in Foren Rollen etc eingetragen, sollte also kein Problem sein. Werde das dann die Wochen, wenn ich mal xampp zum laufen bekomme, testen :)

danke für deine schnelle Antwort :)

Verfasst: 04.09.2007 18:45
von dieweltist
Edit: Die beiden Vim-Ersetzungsbefehle für das Löschen aller Beiträge habe ich an die phpBB-Version 3.0.4 angepasst.

Diese Modifizierungen habe ich jetzt an der Version RC5 getestet und festgestellt, dass diese uneingeschränkt auch für diese Version funktionieren. Ob diese aber bei späteren Versionen des phpBB3 auch noch funktionieren werden, kann ich natürlich nicht garantieren.

Bei diesen Veränderungen wurde jeweils nur Code entfernt. Man könnte diese deswegen auch so darstellen bzw. durchführen. Rot dargestelltes muss jeweils gelöscht werden. Dabei exakt auf jedes Zeichen achten, wie bspw. Klammern und Semikolons!

posting.php (Drei Veränderungen)

trigger_error('CANNOT_EDIT_TIME'); – Editierhinweis immer anzeigen

if ($auth->acl_get('m_delete', $forum_id) || ($post_data['poster_id'] == $user->data['user_id'] && $user->data['is_registered'] && $auth->acl_get('f_delete', $forum_id) && $post_id == $post_data['topic_last_post_id'])) – Jeden Beitrag löschen können

trigger_error('CANNOT_DELETE_REPLIED'); – Editierhinweis immer anzeigen

Oder mit dem Editor Vim nacheinander diese drei Ersetzungsbefehle ausführen:

Code: Alles auswählen

:g#trigger_error('CANNOT_EDIT_TIME');#d

Code: Alles auswählen

:%s#\(if ($auth->acl_get('m_delete', $forum_id) || ($post_data\['poster_id'] == $user->data\['user_id'] && $user->data\['is_registered'] && $auth->acl_get('f_delete', $forum_id)\) && $post_id == $post_data\['topic_last_post_id']\( && !$post_data\['post_edit_locked'] && ($post_data\['post_time'] > time() - ($config\['edit_time'] \* 60) || !$config\['edit_time'])))\)#\1\2

Code: Alles auswählen

:g#trigger_error('CANNOT_DELETE_REPLIED');#d
viewtopic.php (Zwei Veränderungen)

if (($row['post_edit_count'] && $config['display_last_edited']) || $row['post_edit_reason']) – Editierhinweis immer anzeigen

'U_DELETE' => (!$user->data['is_registered']) ? '' : ((($user->data['user_id'] == $poster_id && $auth->acl_get('f_delete', $forum_id) && $topic_data['topic_last_post_id'] == $row['post_id'] && ($row['post_time'] > time() - ($config['edit_time'] * 60) || !$config['edit_time'])) || $auth->acl_get('m_delete', $forum_id)) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=delete&f=$forum_id&p={$row['post_id']}") : ''), – Jeden Beitrag löschen können

Oder mit dem Editor Vim nacheinander diese zwei Ersetzungsbefehle ausführen:

Code: Alles auswählen

:%s#\(if (($row\['post_edit_count'\]\) && $config\['display_last_edited'\]\() || $row\['post_edit_reason'\])\)#\1\2

Code: Alles auswählen

:%s# && $topic_data\['topic_last_post_id'] == $row\['post_id'] && !$row\['post_edit_locked'] && ($row\['post_time'] > time() - ($config\['edit_time'] \* 60) || !$config\['edit_time'])
includes/functions_posting.php (Zwei Veränderungen in derselben Zeile)

$post_mode = ($data['topic_replies_real'] == 0) ? 'edit_topic' : (($data['topic_first_post_id'] == $data['post_id']) ? 'edit_first_post' : (($data['topic_last_post_id'] == $data['post_id']) ? 'edit_last_post' : 'edit')); – Editierhinweis immer anzeigen

Oder mit dem Editor Vim diesen Ersetzungsbefehl ausführen:

Code: Alles auswählen

:%s#\($post_mode = ($data\['topic_replies_real'\] == 0) ? 'edit_topic' : (($data\['topic_first_post_id'\] == $data\['post_id'\]) ? 'edit\)_first_post\(' : (($data\['topic_last_post_id'\] == $data\['post_id'\]) ? 'edit\)_last_post\(' : 'edit'));\)#\1\2\3

ACHTUNG! Wichtiger Nachtrag zu "Editierhinweis immer anzeige

Verfasst: 07.01.2009 18:27
von dieweltist
Bei aktuelleren Versionen wird leider der Editierhinweis nicht bei einem Basisbeitrag angezeigt, wenn diesem kein Beitrag folgt. Damit dieser auch dann angezeigt wird, anstatt der obigen 4 Code-Änderungen, bspw. nachfolgende Code-Änderung durchführen! Leider erhält man aber eine Fehlermeldung (klick), wenn man eine Editierbegründung angibt.

Zuletzt bearbeitet von ... immer anzeigen • phpBB.de

Um die im vorigen Thread beschriebene Änderung durchzuführen, einfach mit dem Freeware-Editor Vim in der Datei includes/functions_posting.php nachfolgenden Ersetzungsbefehl ausführen! Die Aktualisierung auf phpBB-Version 3.0.2 ist bereits enthalten.

Code: Alles auswählen

:%s#\/\/ If edit reason is given always display edit info\(.*\n\)*\s*\$sql_data\[POSTS_TABLE\]\['sql'\] = array(\n\s*'post_edit_reason'\s*=> '',\n\s*);\n\s*}#// Always display edit reason\r         $data['post_edit_reason']      = truncate_string($data['post_edit_reason'], 255, 255, false);\r         $sql_data[POSTS_TABLE]['sql']   = array(\r            'post_edit_time'   => $current_time,\r            'post_edit_reason'   => $data['post_edit_reason'],\r            'post_edit_user'   => (int) $data['post_edit_user'],\r         );\r         $sql_data[POSTS_TABLE]['stat'][] = 'post_edit_count = post_edit_count + 1';
Die bessere Möglichkeit, Editierhinweise immer anzeigen zu lassen, ist die Installation nachfolgenden Mods für die phpBB-Version 3.0.2. Bei der neusten Version (Installationsanweisung im Hauptordner) kann jeder User mit der Moderatorenberechtigung Beitragsdetails einzusehen, alle Beitragsversionen ansehen. Löscht er alle außer einer, so wird diese Beitragsversion angezeigt und der Editierhinweis verschwindet, falls es der letzte Beitrag im Thread ist.

Übrigens kann bei diesem Mod die Datenbankänderung auch durch die unten erwähnte mitgelieferte PHP-Datei ausgeführt werden. Diesen Mod habe ich getestet bei der phpBB-Version 3.0.2. Es funktioniert alles einwandfrei. Von den obigen Veränderungen müssen natürlich nur noch die zwei für das Ermöglichen des Löschens eines jeden Beitrags angewendet werden.

phpBB.com • View topic - [RC] Prime Post Revisions - View all edits to posts

Um die Änderungen in den Dateien vorzunehmen, habe ich in nachfolgendem Beitrag die entsprechenden Ersetzungsbefehle für den Editor Vim veröffentlicht.

Mods können Beiträge ohne Editierhinweis editieren • phpBB.de