Hallo, Gast! (Registrieren)

Letzte Ankündigung: MyBB 1.8.27 veröffentlicht (22.06.21)


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste
Foreneinstellung erweitern - wie?
#1
Hi!

Ich habe die Forentabelle um ein Feld erweitert, was ich nun auch in den Foreneinstellungen editieren möchte. Dies habe ich vorhin schon mit der User-Tabelle geschafft - nur für die Foreneinstellungen finde ich kein Template.

Wie schaffe ich es, ein Feld dort einzufügen?

Michael
Zitieren
#2
Was willst du überhaupt machen? Welchen Zweck hat es?
Zitieren
#3
(17.04.2010, 00:40)Falkenauge Mihawk schrieb: Was willst du überhaupt machen? Welchen Zweck hat es?
Ich bin dabei, eine Synchronisation zwischen Forum und Newsserver zu erstellen. Deswegen benötige ich pro Forum ein zusätzliches Feld, in dem der Name der Newsgroup hinterlegt ist.

Ich hab eben ein wenig rumgegrübelt, dabei fielen mir zwei mögliche Lösungen ein, eine unsaubere und eine unschöne.

Die Unsaubere: Ich nutze die Hooks "admin_forum_management_edit" und "admin_forum_management_edit_commit". Der erste wird aufgerufen, wenn die Einstellungen geladen werden, der zweite, wenn sie gespeichert wurden. Ich könnte nun also im ersten Hook den Inhalt meines neu erstellten Feldes in ein anderes Feld kopieren (am Besten das Beschreibungsfeld) und beim Speichern dann wieder dort rausholen. Wenn ich mit einem Prefix arbeiten würde (z.B. "newsgroup=...") könnte ich den Text relativ sauber zu bestehenden Texten in der Beschreibung hinzufügen und auch wieder sauber trennen, so dass es in der Tabelle wieder gut aussehen würde.

Die unschöne Lösung: Anstelle der Ablage des Newsgroup-Namens in der Forentabelle könnte ich eine Config-Datei verwenden, in der ich die Foren-ID und den dazugehörigen Newsgroup-Namen eintrage. Das System wird sowieso aus der direkten Forenanbindung und einem per Cronjob aufgerufenem Prozess bestehen. Dann könnte die Übersetzung zwischen Foren-ID und Newsgroup durch den Cronjob geschehen. Fände ich aber unschön, da ich dann immer an zwei Stellen Eintragungen machen müsste, um eine neue Gruppe anzulegen.

Michael
Zitieren
#4
Also streng genommen ist es bereits unsauber, die Original-Tabellen zu modifizieren.

Eigene Formular-Felder anlegen müsste eigentlich gehen, das Formular wird über eine eigene Klasse erstellt und die hat mehrere Hooks dazu, wenn es dir nichts ausmacht wenn das Feld das letzte in einer Gruppe ist sollte sich der admin_formcontainer_end dazu eignen.
Zitieren
#5
(17.04.2010, 01:52)frostschutz schrieb: Also streng genommen ist es bereits unsauber, die Original-Tabellen zu modifizieren.
Naja, wenn das Plugin die nicht nur anlegen, sondern auch zerstören kann - und sie gleichzeitig von der Benennung her so gestaltet sind, dass auch bei zukünftigen Updates keine Namensdopplung passieren kann, empfinde ich persönlich das als sauber.
Zitat:Eigene Formular-Felder anlegen müsste eigentlich gehen, das Formular wird über eine eigene Klasse erstellt und die hat mehrere Hooks dazu, wenn es dir nichts ausmacht wenn das Feld das letzte in einer Gruppe ist sollte sich der admin_formcontainer_end dazu eignen.
Der Hook hat leider keine passenden Variablen. Ich habe jetzt den "admin_formcontainer_output_row" gefunden, der ja für jede einzelne Zeile ausgegeben wird. Mein Code derzeit sieht so aus:
PHP-Code:
function bbsync_admin_formcontainer_output_row($pluginargs)
{
global 
$mybb;

if ((
$mybb->input['module'] == 'forum/management') and ($mybb->input['action'] == 'edit')
    and (
$pluginargs['label_for'] == 'description'))
  
$pluginargs['content'] .=
'</tr><td class="first"><label for="bbsync_newsgroup">Newsgroup</label>
 <div class="form_row"><input type="text" name="bbsync_newsgroup" value="" class="text_input" id="bbsync_newsgroup" /></div>
 </td></tr>'
;

Das erzeugt zumindest ein Feld, in dem ich den Wert eintragen kann - jetzt muss ich nur noch herausfinden, wie ich das auch abgespeichert und geladen bekomme Wink

Sauberer wäre es natürlich schon, wenn ich statt des HTML-Codes die entsprechenden Routinen aufrufen würde, die dies zusammenbauen, aber ich habe bislang nichts passendes gefunden.

Gibt es denn Plugins, die an einer ähnlichen Stelle eingreifen, so dass ich schauen kann, wie die das gelöst haben?

Michael
Zitieren
#6
Ich kenne jetzt kein Plugin das sich so einklinkt. Was du da machst, sieht schon etwas abenteuerlich aus. Wink Aus eigener Erfahrung weiß ich aber, dass es manchmal nicht elegant geht...
[Bild: banner.png]

Bitte die Foren-Regeln beachten und im Profil die verwendete MyBB-Version angeben.
Zitieren
#7
(17.04.2010, 10:40)icarus schrieb: Naja, wenn das Plugin die nicht nur anlegen, sondern auch zerstören kann - und sie gleichzeitig von der Benennung her so gestaltet sind, dass auch bei zukünftigen Updates keine Namensdopplung passieren kann, empfinde ich persönlich das als sauber.

Es gibt halt Leute, die denken sich das gleiche, und machen das dann selbst bei der posts Tabelle so... was dann in großen Foren schonmal dazu führt, daß sich MySQL aufhängt wenns intern eine riesige Tabelle umkopieren muss...

(17.04.2010, 10:40)icarus schrieb: Der Hook hat leider keine passenden Variablen.

Mit variablen meinst du, du hast schon ins global geschaut? Eigentlich sollte das Formular da greifbar sein. Daß keine Parameter übergeben werden ist leider normal.
Zitieren
#8
(17.04.2010, 12:41)frostschutz schrieb: Es gibt halt Leute, die denken sich das gleiche, und machen das dann selbst bei der posts Tabelle so... was dann in großen Foren schonmal dazu führt, daß sich MySQL aufhängt wenns intern eine riesige Tabelle umkopieren muss...
Nun, ich muss es auch bei der posts-Tabelle machen - da kommt die Message-ID rein - aber ich mache das sehr behutsam. D.h. ich füge nur dort Felder ein, wo sie wirklich benötigt werden - und auch nur an der wirklich richtigen Stelle.

Ich bin mittlerweile soweit, dass ich nicht nur ein Eingabefeld darstellen kann, sondern über die mybb-Variable auch den Inhalt meines Feldes dort lesen kann. (Ich hoffe, dass ich mich auf den Inhalt des Cache-Arrays verlassen kann) Nur der Weg von der Eingabe zur Datenbank klappt noch nicht.

Ich habe noch nicht herausgefunden, wo die Werte zurückgeschrieben werden. Sad

Irgendwo müssen ja die POST-Variablen gelesen werden - nur wo?

Michael
Zitieren
#9
$mybb->input für GET/POST, admin_forum_management_*_commit als Hooks zum Query nachschieben.

Ziemlich eklig Smile
Zitieren
#10
Moin!
(17.04.2010, 13:26)frostschutz schrieb: Ziemlich eklig Smile
... aber erfolgreich. Hat geklappt. Und damit das andere schneller hinbekommen, hier der Source:
PHP-Code:
$plugins->add_hook('admin_formcontainer_output_row''bbsync_admin_formcontainer_output_row');
$plugins->add_hook('admin_forum_management_edit_commit''bbsync_admin_forum_management_edit_commit');

function 
bbsync_admin_forum_management_edit_commit()
{
global 
$mybb$db;

if (
array_key_exists('bbsync_newsgroup'$mybb->input) and ($mybb->input['fid'] != '')) {
        
$sql_array = array("bbsync_newsgroup" => $mybb->input['bbsync_newsgroup']);
        
$db->update_query("forums"$sql_array"fid=".$mybb->input['fid'], 1);
}
}

function 
bbsync_admin_formcontainer_output_row($pluginargs)
{
global 
$mybb$db;

if ((
$mybb->input['module'] == 'forum/management') and ($mybb->input['action'] == 'edit')
        and (
$pluginargs['label_for'] == 'description') and ($mybb->input['fid'] != '')) {

        
$query $db->simple_select("forums""bbsync_newsgroup""fid=".$mybb->input['fid'], array('limit' => 1));
        
$forum $db->fetch_array($query);
        
$newsgroup $forum['bbsync_newsgroup'];

        
$pluginargs['content'] .=
'</tr><td class="first"><label for="bbsync_newsgroup">Newsgroup</label>
<div class="form_row">
<input type="text" name="bbsync_newsgroup" value="'
.$forum['bbsync_newsgroup'].'" class="text_input" id="bbsync_newsgroup" />
</div></td></tr>'
;
}

Zitieren