Seite 1 von 2

Zusätzliche Benutzerfelder per Erweiterung einfügen

Verfasst: 09.05.2016 11:55
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-

Re: Zusätzliche Benutzerfelder per Erweiterung einfügen

Verfasst: 09.05.2016 16:04
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

Re: Zusätzliche Benutzerfelder per Erweiterung einfügen

Verfasst: 09.05.2016 19:52
von msta
Woher bekomme ich den phpbb_container?

Re: Zusätzliche Benutzerfelder per Erweiterung einfügen

Verfasst: 09.05.2016 20:17
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

Re: Zusätzliche Benutzerfelder per Erweiterung einfügen

Verfasst: 11.05.2016 13:44
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.

Re: Zusätzliche Benutzerfelder per Erweiterung einfügen

Verfasst: 11.05.2016 18:58
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

Re: Zusätzliche Benutzerfelder per Erweiterung einfügen

Verfasst: 12.05.2016 12:52
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';
}

Re: Zusätzliche Benutzerfelder per Erweiterung einfügen

Verfasst: 12.05.2016 15:51
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

Re: Zusätzliche Benutzerfelder per Erweiterung einfügen

Verfasst: 12.05.2016 16:14
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

Re: Zusätzliche Benutzerfelder per Erweiterung einfügen

Verfasst: 13.05.2016 11:48
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.