Zusätzliche Benutzerfelder per Erweiterung einfügen

In diesem Forum gibt es Starthilfe zum neuen Extension-System von phpBB 3.1/3.2. Fragen zur Entwicklung von Extensions und zur Konvertierung von phpBB 3.0.x MODs sind ebenfalls willkommen.
msta
Mitglied
Beiträge: 34
Registriert: 09.05.2016 11:24

Zusätzliche Benutzerfelder per Erweiterung einfügen

Beitrag von msta »

Hallo,
ich arbeite gerade an eine Erweiterung, die alle Benutzer auflistet, aber jeweils in Form einer Visitenkarte, die ausgewählte Informationen anzeigt. An ein paar Stellen komme ich aber nicht weiter.

Code: Alles auswählen

 public function __construct(\phpbb\config\config $config, \phpbb\controller\helper $helper, \phpbb\template\template $template, \phpbb\db\driver\driver_interface $db) {
  $this->config = $config;
  $this->helper = $helper;
  $this->template = $template;
  $this->db = $db;
}

public function handle($name) {
 $users = $this->db->sql_query('SELECT * FROM '.USERS_TABLE);
 while ($user = $this->db->sql_fetchrow($users)) {
  $params = array();
  if ($user['user_custom_title']) $params['name'] = $user['user_custom_title']; else $params['name'] = $user['username'];
  if ($user['user_avatar']) { if (substr($user['user_avatar'], 0, 4) == 'http') $params['image'] = $user['user_avatar']; else $params['image'] = '/download/file.php?avatar='.$user['user_avatar']; }
  if ($user['website']) $params['website'] = $user['website'];
  $this->template->assign_block_vars('userlist', $params);
 }
 $this->db->sql_freeresult($users);
 return $this->helper->render('userlist_body.html', $name);
}
Dieser Code erzeugt die Template-Variablen für die besagte Liste.
  1. Die Datenbankeinträge 'username' und 'user_avatar' gehen, aber z.B. 'website' nicht. Wie komme ich an Website, Facebook, E-Mail-Adresse, usw.?
  2. Es müssen einige zusätzliche Informationen zu jedem Benutzer gespeichert werden (Telefonnummer, ein längerer Text, ...), im Code oben wird versucht den Eintrag 'user_custom_title' basierend auf der Erweiterung Custom User Title von David King zu importieren. Die Editbox in den Profileinstellungen wird auch schon angezeigt. Aber die Datenbankaktualisierung dud nit. Ich habe folgendes Migrationsskript versucht:

    Code: Alles auswählen

    <?php
    
    namespace msta\publicuserlist\migrations\V1-0;
    
    if (!defined('IN_PHPBB')) exit;
    
    class db_additional_user_info extends \phpbb\db\migration\migration {
    
     static public function depends_on() {
      return array('\phpbb\db\migration\data\v31x\v314');
     }
    
     public function update_schema() {
      return [ 'add_columns' => [ $this->table_prefix.'profile_fields' => [
       'user_custom_title' => ['VCHAR:255', ''],
       'user_custom_phone' => ['VCHAR:255', ''],
       'user_custom_phone_crypt' => ['VCHAR:255', ''],
       'user_custom_email_crypt' => ['VCHAR:255', ''],
       'user_custom_info' => ['VCHAR:255', ''],
       'user_custom_desc' => ['VCHAR:2000', ''],
      ]]];
     }
    
     public function revert_schema() {
      return ['drop_columns' => [$this->table_prefix.'profile_fields' => [
       'user_custom_title',
       'user_custom_phone',
       'user_custom_phone_crypt',
       'user_custom_email_crypt',
       'user_custom_info',
       'user_custom_desc',
      ]]];
     }
    }
    
    Aber es sieht nicht so aus, als häte sich an der Datenbank was geändert. Wann wird dieses Script eigentlich ausgeführt? Bei Aktivierung der Erweiterung?
  3. Das Script listet auch die ganzen automatisch erstellten Benutzer für die Suchmaschienenbots auf. Wie kann ich zwischen denen und echten Benutzern unterschieden? Sinnvoller weise sollten alle Benutzer einer Gruppe gelistet werden...
Danke und Gruß, Mitja Stachowiak-
Benutzeravatar
tas2580
Ehemaliges Teammitglied
Beiträge: 3029
Registriert: 01.07.2004 05:42
Wohnort: /home/tas2580
Kontaktdaten:

Re: Zusätzliche Benutzerfelder per Erweiterung einfügen

Beitrag von tas2580 »

Hallo,
msta hat geschrieben:Wie komme ich an Website, Facebook, E-Mail-Adresse, usw.?
mit

Code: Alles auswählen

$cp = $this->phpbb_container->get('profilefields.manager');
$profile_fields = $cp->grab_profile_fields_data($user_id]);
msta hat geschrieben:Wann wird dieses Script eigentlich ausgeführt? Bei Aktivierung der Erweiterung?
Bei installation der Erweiterung, wenn du da nachträglich Änderungen machst musst du die Erweiterung komplett deinstallieren (Arbeitsdaten löschen) und neu installieren damit das Script erneut ausgeführt wird. Alternativ kannst du eine 2. Datei anlegen und dort deine Änderungen machen. Jede Migrations Datei wird nur ein mal ausgeführt bis du eben die Erweiterung komplett löscht und neu installierst.

msta hat geschrieben:Wie kann ich zwischen denen und echten Benutzern unterschieden?
mit

Code: Alles auswählen

'WHERE user_type == ' . USER_NORMAL . ' OR user_type == ' . USER_FOUNDER . '
Gruß Tobi
Heute ist ein guter Tag um dein Forum zu testen.
Ehemaliger Benutzername: [BTK] Tobi
msta
Mitglied
Beiträge: 34
Registriert: 09.05.2016 11:24

Re: Zusätzliche Benutzerfelder per Erweiterung einfügen

Beitrag von msta »

Woher bekomme ich den phpbb_container?
Benutzeravatar
tas2580
Ehemaliges Teammitglied
Beiträge: 3029
Registriert: 01.07.2004 05:42
Wohnort: /home/tas2580
Kontaktdaten:

Re: Zusätzliche Benutzerfelder per Erweiterung einfügen

Beitrag von tas2580 »

In der services.yml bei den arguments:

Code: Alles auswählen

- @service_container
Im Listener oder Controller deiner Extension dann oben einfügen:

Code: Alles auswählen

use Symfony\Component\DependencyInjection\Container;
und als Argument im Konstruktor

Code: Alles auswählen

Container $phpbb_container
Danach eben noch $this->phpbb_container = $phpbb_container;

Gruß Tobi
Heute ist ein guter Tag um dein Forum zu testen.
Ehemaliger Benutzername: [BTK] Tobi
msta
Mitglied
Beiträge: 34
Registriert: 09.05.2016 11:24

Re: Zusätzliche Benutzerfelder per Erweiterung einfügen

Beitrag von msta »

Ok, vielen Dank schon mal, meine Funktion sieht jetzt so aus:

Code: Alles auswählen

public function handle($name) {
     $users = $this->db->sql_query('SELECT * FROM '.USERS_TABLE.' WHERE user_type = '.USER_NORMAL.' OR user_type = '.USER_FOUNDER);
     $fields = $this->phpbb_container->get('profilefields.manager');
     while ($user = $this->db->sql_fetchrow($users)) {
      $params = array();
      $user_fields = $fields->grab_profile_fields_data($user['user_id']);
      if ($user['user_custom_title']) $params['name'] = $user['user_custom_title']; else $params['name'] = $user['username'];
      if ($user['user_avatar']) { if (substr($user['user_avatar'], 0, 4) == 'http') $params['image'] = $user['user_avatar']; else $params['image'] = '/download/file.php?avatar='.$user['user_avatar']; }
      if ($user['user_email']) $params['email'] = $user['user_email'];
      foreach ($user_fields as $val) foreach ($val as $val2) {
       if ($val2['data']['lang_name'] == 'WEBSITE') $params['website'] = $val2['value'];
       if ($val2['data']['lang_name'] == 'FACEBOOK') $params['facebook'] = $val2['value'];
      }
      $this->template->assign_block_vars('userlist', $params);
     }
     $this->db->sql_freeresult($users);
     return $this->helper->render('userlist_body.html', $name);
    } 
Exportiert werden nur noch "echte" user und Website+Facebook werden auch angezeigt.

Wie kann ich nun Werte aus profile_fields_data ändern oder per Migration hinzufügen?
Mein oben gepostetes Migrationsscript hat ja schon mal nicht funktioniert.
Benutzeravatar
tas2580
Ehemaliges Teammitglied
Beiträge: 3029
Registriert: 01.07.2004 05:42
Wohnort: /home/tas2580
Kontaktdaten:

Re: Zusätzliche Benutzerfelder per Erweiterung einfügen

Beitrag von tas2580 »

Dein Migrationsscript hat ein paar Fehler:

Code: Alles auswählen

if (!defined('IN_PHPBB')) exit; 
brauchst du nicht.

Code: Alles auswählen

 static public function depends_on() {
  return array('\phpbb\db\migration\data\v31x\v314');
 } 
Warum v314 ? Hier solltest du nur deine eigenen Scripte eintragen, wenn du also später mal ein Update machst und ein weiteres Script hinzufügst wird dort das erste eingetragen. Bei dem ersten Script kannst du den Teil komplett weg lassen. Das könnte auch ein Grund sein warum dein Script gar nicht ausgeführt wird.

Code: Alles auswählen

return [ 'add_columns' => [ $this->table_prefix.'profile_fields' => [ 
Willst du wirklich neue Spalten zur Tabelle hinzufügen? Ich denke eher du willst neue Daten einfügen. Schau dir am besten mal an die phpBB das macht, dazu das.

Gruß Tobi
Heute ist ein guter Tag um dein Forum zu testen.
Ehemaliger Benutzername: [BTK] Tobi
msta
Mitglied
Beiträge: 34
Registriert: 09.05.2016 11:24

Re: Zusätzliche Benutzerfelder per Erweiterung einfügen

Beitrag von msta »

Das heißt, ich lasse meine Klasse von profilefield_base_migration erben und setze nur $profilefield_name, $profilefield_database_type, $profilefield_data und $user_column_name entsprechend und erstelle für jedes zusätzliche Feld ein eigenes Migrationsskript?

[Edit:] Das hier hat schon mal nicht funktioniert (ja, ich habe den Cache geleert und die Arbeitsdaten der Erweiterung gelöscht):

Code: Alles auswählen

<?php

namespace msta\publicuserlist\migrations\V1-0;

class db_additional_user_info extends \phpbb\db\migration\profilefield_base_migration {
 protected $profilefield_name = 'email_crypt';
 protected $profilefield_database_type = array('VCHAR', '');
 protected $profilefield_data = array(
  'field_name'            => 'email_crypt',
  'field_type'            => 'profilefields.type.string',
  'field_ident'            => 'email_crypt',
  'field_length'            => '40',
  'field_minlen'            => '0',
  'field_maxlen'            => '255',
  'field_novalue'            => '',
  'field_default_value'    => '',
  'field_validation'        => '.*',
  'field_required'        => 0,
  'field_show_novalue'    => 0,
  'field_show_on_reg'        => 0,
  'field_show_on_pm'        => 0,
  'field_show_on_vt'        => 0,
  'field_show_on_ml'        => 0,
  'field_show_profile'    => 1,
  'field_hide'            => 0,
  'field_no_view'            => 0,
  'field_active'            => 1,
  'field_is_contact'        => 0,
  'field_contact_desc'    => '',
  'field_contact_url'        => '',
 );
 protected $user_column_name = 'user_email_crypt';
}
Benutzeravatar
tas2580
Ehemaliges Teammitglied
Beiträge: 3029
Registriert: 01.07.2004 05:42
Wohnort: /home/tas2580
Kontaktdaten:

Re: Zusätzliche Benutzerfelder per Erweiterung einfügen

Beitrag von tas2580 »

msta hat geschrieben:Das heißt, ich lasse meine Klasse von profilefield_base_migration erben
Nein, du musst das Ding schon komplett nachbauen, aber das Prinzip dürfte jetzt klar sein.

Gruß Tobi
Heute ist ein guter Tag um dein Forum zu testen.
Ehemaliger Benutzername: [BTK] Tobi
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Re: Zusätzliche Benutzerfelder per Erweiterung einfügen

Beitrag von gn#36 »

Doch, erben geht, aber du kannst nicht alles erben sondern musst neben Variablen auch zum Teil Funktionen überschreiben damit es geht. Schau mal hier: https://www.phpbb.com/community/viewtop ... #p14340646
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.
msta
Mitglied
Beiträge: 34
Registriert: 09.05.2016 11:24

Re: Zusätzliche Benutzerfelder per Erweiterung einfügen

Beitrag von msta »

Also ich habe jetzt mal diese Funktion versucht:

Code: Alles auswählen

 public function update_schema() {
  return array(
   'add_columns'    => array(
    $this->table_prefix . 'profile_fields_data'            => array(
     'pf_mail_crypt'        => array('VCHAR', ''),
    ),
   ),
   'add_tables'        => array(
    $this->table_prefix . 'msta_userlist'    => array(
     'COLUMNS'        => array(
      'msta_id'            => array('UINT', null, 'auto_increment'),
      'msta_name'            => array('VCHAR:255', ''),
     ),
     'PRIMARY_KEY'    => 'msta_id',
    ),
   ),
  );
 } 
Die Tabelle wurde angelegt, die neue Spalte nicht. Seit dem geht nichts mehr, auch wenn ich nur noch die Tabelle anlegen lasse, was bislang immer ging, passiert einfach nichts. Anscheinend hat sich die Migrationsverwaltung komplett aufgehängt. Gibt es noch einen anderen Cache hierzu, den man leeren könnte?

Ich denke, ich werde die Profilfelder einfach im Adminbereich manuell anlegen und fertig. Dann kann ich meine Erweiterung zwar nicht veröffentlichen, aber den Zweck erfüllt's trotzdem.
Antworten

Zurück zu „Extension Bastelstube“