mehr profilfelder mehr profilfelder
 

News:

cpg1.5.48 Security release - upgrade mandatory!
The Coppermine development team is releasing a security update for Coppermine in order to counter a recently discovered vulnerability. It is important that all users who run version cpg1.5.46 or older update to this latest version as soon as possible.
[more]

Main Menu

mehr profilfelder

Started by ralf45_nrw, August 28, 2013, 01:04:36 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

ralf45_nrw

hallo,


ich bräuchte noch ein paar profil felder mehr. gibt es da ein plugin für.
oder eine anleitung wie man zusätliche profilfelder einbaut.
brauche felder mit eingabe, textblock, checkbox.

gruss ralf
coppermine 1.5.x

Αndré

Ein Plugin für genau diesen Zweck gibt es nicht. Soweit ich weiß, fügt das Plugin "cpgShop" neue Profilfelder hinzu, jedoch lässt der Name schon vermuten, dass der eigentliche Zweck des Plugins ein ganz anderer ist. Evtl. kann man das Plugin entsprechend kastrieren. Ich bin mir gerade auch nicht sicher, ob es hier im Forum schon entsprechende Mods gibt. Im Zweifelsfall musst du bei 0 starten, sollte jedoch nicht all zu schwer sein (Datenbank, Backend und Frontends erweitern).

ralf45_nrw

hi,

schade das es kein plugin dafür gibt.

gibt es den irgend wo eine anleitung, den meine php kentnisse werden dafür nicht ausreichen.
benötiege noch 34 zusäzliche felder.

18 felder, immer 1 feld mit 3 checkboxen zur auswahl (nur 1 makierbar) aber die anzeige im profil soll eine grafik oder nur eine farbe sein grün, rot, gelb (z.b) die als hintergund in einer tabelle oder div container darstellt. oder vor einer zeile eine grafik mit einem grünen haken, gelber punkt und rotes kreuz.

13 felder nur mit einzeiliger text eingabe

1 feld für textblock

2 felder wo man je ein bilder hochladen kann das eine bestimmte größe hat.

den das profi ist sehr wichtig für meine umsetzung.

gruss ralf



coppermine 1.5.x

Αndré

Quote from: ralf45_nrw on August 28, 2013, 02:32:17 PM
3 checkboxen zur auswahl (nur 1 makierbar)
Das ist dann ein Radio-Button, keine Checkbox.

Die Anzeige im Profil ist meiner Meinung nach erstmal egal, da wir die Werte überhaupt erstmal eingeben und speichern müssen, bevor wir sie irgendwo anzeigen.

In Coppermine gibt es 2 Arten Benutzer anzulegen. Entweder der Admin erledigt das, oder die Benutzer registrieren sich selbst. Welche Variante(n) ist/sind bei dir vorgesehen? Sollen diese Angaben überhaupt schon beim anlegen/registrieren eingefügt werden, oder reicht es auch, wenn die Nutzer ihr Profil später vervollständigen? Dann können wir uns ggf. sparen alles davon anpassen zu müssen.

Quote from: ralf45_nrw on August 28, 2013, 02:32:17 PM
2 felder wo man je ein bilder hochladen kann das eine bestimmte größe hat.
Sollte möglich sein, ein paar genauere Angaben wären aber hilfreich. Bilder in der falschen Größe (damit meinst du die Abmessungen, nicht die Dateigröße, oder?) werden generell abgelehnt?

ralf45_nrw

hi,

1. richtig radi-button

2.der user soll später nach der anmeldung sein profil ausfüllen können.

3. ich meine die abmessung des bildes soll eine bestimmte grösse haben z.b. 1, bild 800x300, 2. bild 300x400

gruss ralf
coppermine 1.5.x

ralf45_nrw

Quote from: ralf45_nrw on August 28, 2013, 02:55:46 PM
hi,

1. richtig radio-button

2.der user soll später nach der anmeldung sein profil ausfüllen können.

3. ich meine die abmessung des bildes soll eine bestimmte grösse haben z.b. 1, bild 800x300, 2. bild 300x400

gruss ralf
coppermine 1.5.x

Αndré

Schritt 1: Frontend

Öffne die Datei profile.php und suche nach
$edit_profile_form_param[]

Ich denke hier erkennst du schon selbst, wie das Formular zustande kommt. Je nachdem wo du nun deine weiteren Felder haben möchtest, musst du deinen neuen Code entsprechend einfügen. Ich füge die neuen Felder hier exemplarisch einfach mal hinter die benutzerdefinierten Felder ein. D.h. suche nach
$edit_profile_form_param[] = array('text', 'disk_usage', cpg_fetch_icon('disk_usage', 2) . $lang_register_php['disk_usage']);
und davor kommt dann der neue Code.

Ein Feld für einzeilige Texteingabe sieht z.B. so aus:
$edit_profile_form_param[] = array('input', 'custom_input_1', 'Textfeld 1', 255);

für eine mehrzeilige Texteingabe so:
$edit_profile_form_param[] = array('textarea', 'custom_area_1', 'Textblock 1', 255);

Für die Radio-Buttons und die Dateiupload-Felder müssen wir erst noch neue Typen in der Funktion make_form definieren. Machen wir später, wenn der Rest soweit funktioniert.


Schritt 2: Backend

Damit Coppermine etwas mit den Erweiterungen anzufangen weiß, suchen wir
    $profile6 = $superCage->post->getEscaped('user_profile6');
und fügen danach für alle oben hinzugefügten Formularfelder eine ähnliche Zeile ein, z.B.
    $custom_input_1 = $superCage->post->getEscaped('custom_input_1');
    $custom_input_2 = $superCage->post->getEscaped('custom_input_2');
    $custom_input_3 = $superCage->post->getEscaped('custom_input_3');
    // usw. bis 13
    $custom_area_1 = $superCage->post->getEscaped('custom_area_1');


Dann suchen wir die Zeile
$sql = "UPDATE {$CONFIG['TABLE_USERS']} SET user_profile1 = '$profile1', user_profile2 = '$profile2', user_profile3 = '$profile3', user_profile4 = '$profile4', user_profile5 = '$profile5', user_profile6 = '$profile6'" . (($CONFIG['allow_email_change'] || GALLERY_ADMIN_MODE) && !$error ? ", user_email = '$email'" : "") . " WHERE user_id = '" . USER_ID . "'";
und fügen unsere Werte hinzu. Sieht dann in etwa so aus:
$sql = "UPDATE {$CONFIG['TABLE_USERS']} SET user_profile1 = '$profile1', user_profile2 = '$profile2', user_profile3 = '$profile3', user_profile4 = '$profile4', user_profile5 = '$profile5', user_profile6 = '$profile6', custom_input_1 = '$custom_input_1', custom_input_2 = '$custom_input_2', custom_input_3 = '$custom_input_3', custom_area_1 = '$custom_area_1'" . (($CONFIG['allow_email_change'] || GALLERY_ADMIN_MODE) && !$error ? ", user_email = '$email'" : "") . " WHERE user_id = '" . USER_ID . "'";
(ich habe jetzt nicht alle 13 Felder eingefügt, sondern nur die ersten 3).


Schritt 3: Datenbankfelder hinzufügen

Der bisherige Code würde nur eine Fehlermeldung produzieren, da es die benötigten Felder in der Datenbank noch nicht gibt. Öffne dafür ein Tool wie z.B. phpMyAdmin und füge die Felder mit folgender Abfrage hinzu:
ALTER TABLE `cpg15x_users` ADD COLUMN `custom_input_1` VARCHAR(255) NOT NULL default '';
ALTER TABLE `cpg15x_users` ADD COLUMN `custom_input_2` VARCHAR(255) NOT NULL default '';
ALTER TABLE `cpg15x_users` ADD COLUMN `custom_input_3` VARCHAR(255) NOT NULL default '';
-- usw. bis 13
ALTER TABLE `cpg15x_users` ADD COLUMN `custom_area_1` VARCHAR(255) NOT NULL default '';



Schritt 4: Daten im Profilbearbeitungsmodus anzeigen

Suche
$sql = "SELECT user_name, user_email, user_group, user_active, UNIX_TIMESTAMP(user_regdate) AS user_regdate, group_name, " . "user_profile1, user_profile2, user_profile3, user_profile4, user_profile5, user_profile6, user_group_list, " . "COUNT(pid) AS pic_count, SUM(total_filesize) AS disk_usage, group_quota " . "FROM {$CONFIG['TABLE_USERS']} AS u " . "INNER JOIN {$CONFIG['TABLE_USERGROUPS']} AS g ON user_group = group_id " . "LEFT JOIN {$CONFIG['TABLE_PICTURES']} AS p ON p.owner_id = u.user_id " . "WHERE user_id ='" . USER_ID . "' " . "GROUP BY user_id ";
und ersetze es durch
$sql = "SELECT u.*, user_name, user_email, user_group, user_active, UNIX_TIMESTAMP(user_regdate) AS user_regdate, group_name, " . "user_profile1, user_profile2, user_profile3, user_profile4, user_profile5, user_profile6, user_group_list, " . "COUNT(pid) AS pic_count, SUM(total_filesize) AS disk_usage, group_quota " . "FROM {$CONFIG['TABLE_USERS']} AS u " . "INNER JOIN {$CONFIG['TABLE_USERGROUPS']} AS g ON user_group = group_id " . "LEFT JOIN {$CONFIG['TABLE_PICTURES']} AS p ON p.owner_id = u.user_id " . "WHERE user_id ='" . USER_ID . "' " . "GROUP BY user_id ";
(durch den Stern (*) wählen wir alle Felder aus, das müssen wir also nicht weiter beachten).

Suche
        'user_profile6' => $user_data['user_profile6'],
und füge darunter folgendes ein:
        'custom_input_1' => $user_data['custom_input_1'],
        'custom_input_2' => $user_data['custom_input_2'],
        'custom_input_3' => $user_data['custom_input_3'],
        // usw. bis 13
        'custom_area_1' => $user_data['custom_area_1'],



Schritt 5: Daten im öffentlichen Profil anzeigen

Suche
if ($CONFIG['user_profile6_name'] != '') {
    $display_profile_form_param[] = array('text', 'user_profile6', $CONFIG['user_profile6_name']);
}

unter füge darunter folgendes ein:
$display_profile_form_param[] = array('text', 'custom_input_1', 'Textfeld 1');
$display_profile_form_param[] = array('text', 'custom_input_2', 'Textfeld 2');
$display_profile_form_param[] = array('text', 'custom_input_3', 'Textfeld 3');
// usw.
$display_profile_form_param[] = array('text', 'custom_area_1', 'Textblock 1');


Suche
'user_profile6' => bb_decode($user_data['user_profile6']),
und füge darunter folgendes ein:
        'custom_input_1' => $user_data['custom_input_1'],
        'custom_input_2' => $user_data['custom_input_2'],
        'custom_input_3' => $user_data['custom_input_3'],
        // usw. bis 13
        'custom_area_1' => bb_decode($user_data['custom_area_1']),



Das kannst du erstmal abarbeiten und bescheid geben, falls irgendwas nicht wie erwartet funktioniert.

ralf45_nrw

hallo,

werde es heute mal probieren und die sachen einfügen.

danke erst mal ist super.

gruss ralf
coppermine 1.5.x

ralf45_nrw

hallo,

hat mir keine ruhe gelassen, habe die eintragungen gemacht.
und siehe da 13 felder und ein text feld sind da.

super.

gruss ralf
coppermine 1.5.x

Αndré

Und es funktioniert auch alles soweit (Daten eintragen, ändern, anzeigen, etc.)?

ralf45_nrw

hi andre,

ja er zeigt die felder an beim profil ändern, wen die felder leer sind werden die nicht angezeigt und wen ich die ausfülle alle 13 oder nur ein paar dann werden die ausgefüllten felder angezeigt. also werden die auch in der db gespeichert.
so weit alles ok.

gruss ralf
coppermine 1.5.x

Αndré

Ich habe jetzt leider keine Zeit mehr für die Radio-Buttons und die Upload-Felder. Nach dem Wochenende können wir fortfahren.

Αndré

Die Radiobuttons.

Schritt 0: make_form erweitern

Suche
        default:
            cpg_die(CRITICAL_ERROR, 'Invalid action for form creation ' . $element[0], __FILE__, __LINE__);
        }

und füge darüber folgendes ein
        case 'radio':

            $value = $form_data[$element[1]];

            if ($element[2]) {

                echo <<< EOT
    <tr>
        <td width="40%" class="{$cellStyle}" height="25" valign="top">
            {$element[2]}
        </td>
        <td width="60%" class="{$cellStyle}" valign="top">
EOT;
                for ($i=1; $i <= $element[3]; $i++) {
                    $checked = $value == $i ? 'checked="checked" ' : '';
                    echo <<< EOT
            <input type="radio" name="{$element[1]}" value="$i" class="radio" $checked/>
EOT;
                }
                echo <<< EOT
        </td>
    </tr>


EOT;
            }

            break;



Schritt 1: Frontend

Füge wie bereits beschrieben in der Nähe der anderen Zeilen mit
$edit_profile_form_param[]
etwas in folgender Art hinzu
$edit_profile_form_param[] = array('radio', 'custom_radio_1', 'Radiobutton 1', 3);
$edit_profile_form_param[] = array('radio', 'custom_radio_2', 'Radiobutton 2', 3);
$edit_profile_form_param[] = array('radio', 'custom_radio_3', 'Radiobutton 3', 3);
// usw. bis 18



Schritt 2: Backend

Damit Coppermine etwas mit den Erweiterungen anzufangen weiß, suchen wir
    $profile6 = $superCage->post->getEscaped('user_profile6');
und fügen danach für alle oben hinzugefügten Formularfelder eine ähnliche Zeile ein, z.B.
    $custom_radio_1 = $superCage->post->getEscaped('custom_radio_1');
    $custom_radio_2 = $superCage->post->getEscaped('custom_radio_2');
    $custom_radio_3 = $superCage->post->getEscaped('custom_radio_3');
    // usw. bis 18


Dann erweiterst du die SQL-Abfrage
$sql = "UPDATE {$CONFIG['TABLE_USERS']} SET user_profile1 = '$profile1', .......
wie oben beschrieben um die weiteren Werte.

Kombiniert mit meinem obigen Beispiel sieht die Zeile bei mir jetzt so aus:
$sql = "UPDATE {$CONFIG['TABLE_USERS']} SET user_profile1 = '$profile1', user_profile2 = '$profile2', user_profile3 = '$profile3', user_profile4 = '$profile4', user_profile5 = '$profile5', user_profile6 = '$profile6', custom_input_1 = '$custom_input_1', custom_input_2 = '$custom_input_2', custom_input_3 = '$custom_input_3', custom_area_1 = '$custom_area_1', custom_radio_1 = '$custom_radio_1', custom_radio_2 = '$custom_radio_2', custom_radio_3 = '$custom_radio_3' " . (($CONFIG['allow_email_change'] || GALLERY_ADMIN_MODE) && !$error ? ", user_email = '$email'" : "") . " WHERE user_id = '" . USER_ID . "'";


Schritt 3: Datenbankfelder hinzufügen

Der bisherige Code würde nur eine Fehlermeldung produzieren, da es die benötigten Felder in der Datenbank noch nicht gibt. Öffne dafür ein Tool wie z.B. phpMyAdmin und füge die Felder mit folgender Abfrage hinzu:
ALTER TABLE `cpg15x_users` ADD COLUMN `custom_radio_1` VARCHAR(1) NOT NULL default '';
ALTER TABLE `cpg15x_users` ADD COLUMN `custom_radio_2` VARCHAR(1) NOT NULL default '';
ALTER TABLE `cpg15x_users` ADD COLUMN `custom_radio_3` VARCHAR(1) NOT NULL default '';
-- usw. bis 18



Schritt 4: Daten im Profilbearbeitungsmodus anzeigen

Suche
        'user_profile6' => $user_data['user_profile6'],
und füge darunter folgendes ein:
        'custom_radio_1' => $user_data['custom_radio_1'],
        'custom_radio_2' => $user_data['custom_radio_2'],
        'custom_radio_3' => $user_data['custom_radio_3'],
        // usw. bis 18


Die Datenbankabfrage müssen wir dank des verwendeten Stern (*) nicht weiter anpassen.


Schritt 5: Daten im öffentlichen Profil anzeigen

Suche
if ($CONFIG['user_profile6_name'] != '') {
    $display_profile_form_param[] = array('text', 'user_profile6', $CONFIG['user_profile6_name']);
}

unter füge darunter folgendes ein:
$display_profile_form_param[] = array('text', 'custom_radio_1', 'Radiobutton 1');
$display_profile_form_param[] = array('text', 'custom_radio_2', 'Radiobutton 2');
$display_profile_form_param[] = array('text', 'custom_radio_3', 'Radiobutton 3');
// usw. bis 18


Suche
        'user_profile6' => bb_decode($user_data['user_profile6']),
und füge darunter folgendes ein:
        'custom_radio_1' => radio_button_color($user_data['custom_radio_1']),
        'custom_radio_2' => radio_button_color($user_data['custom_radio_2']),
        'custom_radio_3' => radio_button_color($user_data['custom_radio_3']),
        // usw. bis 18


Jetzt fügst du vor dem darüberstehenden
$form_data = array(
noch folgende Funktion hinzu:
    function radio_button_color($value) {
        switch($value) {
            case '1': $color = 'red'; break;
            case '2': $color = 'yellow'; break;
            case '3': $color = 'green'; break;
            default: $color = false; break;
        }
        if ($color) {
            return '<div style="width: 16px; height: 16px; background: '.$color.'"></div>';
        } else {
            return $value;
        }
    }


Die Funktion sorgt dafür, anstatt dem Wert eine farbige Box darzustellen.

ralf45_nrw

hallo Andre,,

Super habe es eben eingebunden und es funktioniert.

habe dazu noch eine frage die anzeige für die fab felder ist:
function radio_button_color($value) {
        switch($value) {
            case '1': $color = 'red'; break;
            case '2': $color = 'yellow'; break;
            case '3': $color = 'green'; break;
            default: $color = false; break;
        }
        if ($color) {
            return '<div style="width: 16px; height: 16px; background: '.$color.'"></div>';
        } else {
            return $value;
        }
    }


Die Funktion sorgt dafür, a


wen ich keine farbe möchte sonder kleine icons wie mache ich das ?

habe es versucht mit

  case '1': $color = 'img src="themes/neu/images/neina.png"; break;
  case '1': $color = 'img src="themes/neu/images/vie.png"; break;
  case '1': $color = 'img src="themes/neu/images/ja.png"; break;


meine denkweise ist bestimmt falsch.

gruss ralf
coppermine 1.5.x

Αndré

Der Ansatz ist prinzipiell richtig. Probier es mal mit
        switch($value) {
            case '1': $img = 'neina.png'; break;
            case '2': $img = 'vie.png'; break;
            case '3': $img = 'ja.png'; break;
            default: $img = false; break;
        }
        if ($img) {
            return '<img src="themes/neu/images/'.$img.'" />';
        } else {
            return $value;
        }

ralf45_nrw

hallo andre,

super so geht es so nimmt er die icons.

mir ist aufgefallen das im profil wen ich es ausfülle er mir die 3 radiobubuttons anzeigt (neben einander) nur weiß man nicht für was die stehen.
es müsste vor dem 1. Nein stehen vor dem 2. vieleicht und vor dem 3. Ja.

da ich ja den Text für die zusätzlichen felder manuell eingeben muss für "Textfeld 1" "Radiobutton 1" bekomme ich für umlaute nur diese schwarze raute angezeigt.
könnte man den text so ersetzen das er die texte aus der german.php nimmt dann könnte man das auch nehmen wen ich deutsch und englisch nutzen möchte. könnte dann die lang bearbeiten.

habe mir die vorhandenen felder angesehen und wen ich bei den neuen den text durch z.b.   $CONFIG['custom_input_1'] ersetze wäre ja zu einfach da muss doch bestimmt noch mehr gemacht werden.

gruss ralf
coppermine 1.5.x

Αndré

Quote from: ralf45_nrw on September 06, 2013, 09:08:04 PM
mir ist aufgefallen das im profil wen ich es ausfülle er mir die 3 radiobubuttons anzeigt (neben einander) nur weiß man nicht für was die stehen.
es müsste vor dem 1. Nein stehen vor dem 2. vieleicht und vor dem 3. Ja.

Suche
                for ($i=1; $i <= $element[3]; $i++) {
                    $checked = $value == $i ? 'checked="checked" ' : '';
                    echo <<< EOT
            <input type="radio" name="{$element[1]}" value="$i" class="radio" $checked/>
EOT;
                }

und ersetze es durch
                for ($i=1; $i <= $element[3]; $i++) {
                    $checked = $value == $i ? 'checked="checked" ' : '';
                    switch($i) {
                        case 1: $label = "Nein"; break;
                        case 2: $label = "Vielleicht"; break;
                        case 3: $label = "Ja"; break;
                        default: $label = ""; break;
                    }
                    echo <<< EOT
            <label for="{$element[1]}{$i}">{$label}:</label>
            <input type="radio" name="{$element[1]}" value="{$i}" id="{$element[1]}{$i}" class="radio" {$checked}/>
            &nbsp;
EOT;
                }




Quote from: ralf45_nrw on September 06, 2013, 09:08:04 PM
da ich ja den Text für die zusätzlichen felder manuell eingeben muss für "Textfeld 1" "Radiobutton 1" bekomme ich für umlaute nur diese schwarze raute angezeigt.
Das liegt an der fehlenden UTF-8-Codierung. Entweder codierst du die Datei profile.php in UTF-8 um oder du benutzt die entsprechenden Entitäten (ä = &auml; / ö = &ouml; / usw.).



Quote from: ralf45_nrw on September 06, 2013, 09:08:04 PM
könnte man den text so ersetzen das er die texte aus der german.php nimmt dann könnte man das auch nehmen wen ich deutsch und englisch nutzen möchte. könnte dann die lang bearbeiten.
Sicher. Füge einfach in die entsprechenden Sprachdateien neue Werte hinzu, die du dann entsprechend an beiden Stellen in profile.php ersetzt. Z.B. fügst du in den Sprachdateien direkt vor
?>
folgendes ein
$lang_profile_custom['radio1'] = 'Radiobutton 1';

Wichtig ist, dass du einen Eintrag in die Englische Sprachdatei hinzufügst, da diese immer als Fallback für alle Sprachdateien fungiert, in denen der String nicht vorhanden ist.

Dann suchst du in profile.php nach
'Radiobutton 1'
(kommt 2 mal vor) und ersetzt beides durch
$lang_profile_custom['radio1']

Entsprechend verfährst du mit den anderen Strings.

ralf45_nrw

hi andre,

super, werde es direkt ausprobieren.

DANKE.

gruss ralf
coppermine 1.5.x

ralf45_nrw

hi andre,

habe es so gemacht aber irgend wo ist ein fehler wen ich das profil aufrufe läd er es nicht nur weiße seite.

habe in der lang de und en habe ich das gemacht (vor ?>)

$lang_profile_custom['radio1'] = 'Portrait';


in der profil an beiden stellen

$edit_profile_form_param[] = array('radio', 'custom_radio_1', '$lang_profile_custom['radio1']', 3);

$display_profile_form_param[] = array('text', 'custom_radio_1', '$lang_profile_custom['radio1']');


gruss ralf
coppermine 1.5.x

Αndré

Ersetze
$edit_profile_form_param[] = array('radio', 'custom_radio_1', '$lang_profile_custom['radio1']', 3);
durch
$edit_profile_form_param[] = array('radio', 'custom_radio_1', $lang_profile_custom['radio1'], 3);
und bei allen anderen geänderten Zeilen entsprechend auch. Hätte ich vielleicht deutlicher kennzeichnen sollen in meiner Beschreibung, aber wenn du genau hinsiehst, wird der String samt Hochkommata durch die Variable ersetzt.