Blue Flower

Dies ist ein Core-Hack von Joomla und deshalb sind ein paar Dinge zu beachten.

0.) Joomla update Vorwort.
Es besteht immer die Möglichkeit das nach einem Update von Joomla diese Dateien überschrieben werden. Abhilfe siehe unten!
1.) Die Benutzer-Tabellen anpassen.
Hierfür z.B. über PHPMyAdmin folgende SQL-Befehle ausführen. (Hierbei beachten dass der Suffix der Tabelle korrekt ist)

ALTER TABLE `jos_users` ADD `sex` TINYINT( 2 ) NOT NULL DEFAULT '0' AFTER `email` ;
ALTER TABLE `jos_users` ADD `homepage` TINYINT( 2 ) NOT NULL DEFAULT '0' AFTER `sex`;
ALTER TABLE `jos_users` ADD `os` TINYINT( 2 ) NOT NULL DEFAULT '0' AFTER `homepage`;
 
2.) Die var Deklaration erweitern um die neuen Felder erweitern.
joomla/ libraries/joomla/database/table/ user.php
Folgendes Suchen  (etwa ab Zeile 118)

und die neuen Felder unterhalb einfügen

/**

* Description

*

* @var String

*/

var $params      = Null;


/** Erweiterung für die neuen Benutzer-Felder *********************************************

*

* Erweiterte Felder

* @var String Zusatzfelder

*/

var $sex = Null;

var $homepage = Null;

var $os = Null;

//** ENDE Erweiterung für die neuen Benutzer-Felder ****************************************

3) Das Backend anpassen damit die neuen Felder anzeigt werden

In 2 php-Dateien müssen Anpassungen gemacht werden.

1.) joomla/ administrator/components/com_users/views/user/tmpl/ form.php

<tr>

<td class="key">

<label for="email">

<?php echo JText::_( 'Email' ); ?>

</label>

</td>

<td>

<input class="InputBox" type="text" name="email" id="email" size="40" value="<?php echo $this->user->get('email'); ?>" />

</td>

</tr>


<!-- ***  Erweiterung für die neuen Benutzer-Felder  ********************************************* -->


<tr>

<td class="key">

<label for="sex">

<?php echo JText::_( 'Geschlecht' );?>

</label>

</td>

<td>

<?php echo $this->lists['sex'];?>

</td>

</tr>

<tr>

<td class="key">

<label for="os">

<?php echo JText::_( 'Betriebssystem' );?>

</label>

</td>

<td>

<?php echo $this->lists['os'];?>

</td>

</tr>

<tr>

<td class="key">

<label for="homepage">

<?php echo JText::_( 'Homepage' );?>

</label>

</td>

<td>

<input class="InputBox" type="text" name="homepage" id="homepage" size="40" value="<?php echo $this->user->get('homepage'); ?>" />

</td>

</tr>


<!-- *** ENDE  Erweiterung für die neuen Benutzer-Felder  **************************************** -->

Ergebnis:
3b.) Im Backend die neuen Felder anzeigen
(wird nur benötigt wenn Ja - Nein Option oder eine Liste angezeigt werden soll und die Objekte über $this->lists aufgebaut wird. Siehe 3a. os)

2.) joomla/ administrator/components/com_users/views/user / view.html.php

Anmerkung: Die Funktion JHTML::_('select.option'... oder auch JHTML::_('select.genericlist',... wird in joomla/libraries/joomla/html/html/select.php erzeugt.

$lists['sendEmail'] = JHTML::_('select.booleanlist',  'sendEmail', 'class="InputBox" size="1"', $user->get('sendEmail') );


//***  Erweiterung für die neuen Benutzer-Felder  *********************************************


$lists['sex'] = JHTML::_('select.booleanlist',  'sex', 'class="InputBox" size="1"', $user->get('sex'), 'Frau', 'Mann' );

$select[] = JHTML::_('select.option', '-', JText::_('---'));

$select[] = JHTML::_('select.option', 'WIN', JText::_('Windows'));

$select[] = JHTML::_('select.option', 'MAC', JText::_('MAC'));

$select[] = JHTML::_('select.option', 'LNX', JText::_('Linux'));

$select[] = JHTML::_('select.option', 'UNX', JText::_('Unix'));

$select[] = JHTML::_('select.option', 'SON', JText::_('Sonstige'));

// die Zahl von size gibt an wie viele Zeilen der Liste angezeigt werden.

$lists['os'] = JHTML::_('select.genericlist',  $select, 'os', 'class="InputBox" size="1"', 'value', 'text', $user->get('os') );


//*** ENDE  Erweiterung für die neuen Benutzer-Felder  ****************************************}

4.) Im Frontend die neuen Felder anzeigen (Ja - Nein Option etc)
joomla/ components/com_user/views/user/tmpl/ form.php
<tr>

<td>

<label for="email">

<?php echo JText::_( 'email' ); ?>:

</label>

</td>

<td>

<input class="InputBox required validate-email" type="text" id="email" name="email" value="<?php echo $this->escape($this->user->get('email'));?>" size="40" />

</td>

</tr>

<!-- ***  Erweiterung für die neuen Benutzer-Felder  ********************************************* -->

<tr>

<td>

<label for="sex">

<?php echo JText::_( 'Geschlecht' ); ?>:

</label>

</td>

<td>

<input name="sex" id="sex1" value="0" class="InputBox" type="radio" <?php echo ($this->escape($this->user->get('sex')) == '0' ? 'checked="checked"' : '');?> />Mann

<input name="sex" id="sex2" value="1" class="InputBox" type="radio" <?php echo ($this->escape($this->user->get('sex')) == '1' ? 'checked="checked"' : '');?> />Frau

</td>

</tr>
<tr>

<td>

<label for="os">

<?php echo JText::_( 'Betriebssystem' ); ?>:

</label>

</td>

<td>

<select name="os" id="os" class="InputBox" size="1">

<option value="-" <?php echo ($this->escape($this->user->get('os')) == '-' ? 'selected="selected"' : '' );?>>---</option>

<option value="WIN" <?php echo ($this->escape($this->user->get('os')) == 'WIN' ? 'selected="selected"' : '' ); ?>>Windows</option>

<option value="MAC" <?php echo ($this->escape($this->user->get('os')) == 'MAC' ? 'selected="selected"' : '' ); ?>>MAC</option>

<option value="LNX" <?php echo ($this->escape($this->user->get('os')) == 'LNX' ? 'selected="selected"' : '' ); ?>>Linux</option>

<option value="UNX" <?php echo ($this->escape($this->user->get('os')) == 'UNX' ? 'selected="selected"' : '' ); ?>>Unix</option>

<option value="SON" <?php echo ($this->escape($this->user->get('os')) == 'SON' ? 'selected="selected"' : '' );?>>Sonsitiges</option>

</select>

</td>

</tr>
<tr>

<td>

<label for="homepage">

<?php echo JText::_( 'Homepage' ); ?>:

</label>

</td>

<td>

<input class="InputBox" type="text" name="homepage" id="homepage" size="40" value="<?php echo $this->user->get('homepage'); ?>" />

</td>

</tr>

<!--  *** ENDE  Erweiterung für die neuen Benutzer-Felder  **************************************** -->

Ergebnis:

 


4Anker) Hilfs-Script um nach einem joomla Update die eventuell veränderten Dateien zu modifizieren.

 

Vorausetzungen:
Im Kopf der meisten Joomla Dateien steht die Version.
In den veränderten Dateien MUSS ein Schlüsseltext stehen

 

Ablauf:

1.) in der "alten" Kopie nach einem Versionsdatum suchen

2.) in der neuen (überspielten) Datei nach Versionstatum und Schlüsseltext suchen
3.) Falls ein update durchgeführt wurde eine Kopie der original Joomla-PHP-Datei erstellen form.php -> form.php_org

4.) Erweiterungscode in die upgedateten Dateien kopieren

5.) TESTEN !!!
Script-Link:

<?php
/**
* @version    1.0
* @author hoelldobler[at]alant.de
* @package Joomla  1.5
*
* Nach einem Update von Joomla könnten die für die Benutzererweiterung betroffenen Dateien überschrieben worden sein.
* Dieses Script schafft abhilfe und kopiert die erweiterten Felder wieder in die Dateien
* Nach dem update diese Datei von Server löschen oder zumindest umbenenen.
*
* In diesem Bsp. wurden die Benutzer-Infos um 3 Felder erweitert
* os       -> Betriegssystem (Auswahlliste)
* homepage -> (normales Textfeld)
* sex      -> (Optionsfeld mit eigenen Namen) default ja, nein
*/

/****************************************************************************************************

* Deklaration

****************************************************************************************************/


// Die Original-Datei soll kopiert und um diesen Suffix ergänzt werden
define('APPORG', '_org');
// Zusatztext als Hinweis für die Erweiterung. Wird am Anfang und Ende der Erweiterung eingefügt
// !!! Diese Text MUSS als Kommentar in der Datei stehen sonst wird angenommen die Erweiterung ist nicht enthalten
define('ERWEITERUNGSHINWEIS', ' Erweiterung für die neuen Benutzer-Felder ');
// Falls erforderlich der absolute Pfad eintragen
define('BASEPATH' , '');
// Diese Dateien Testen welche durch das update möglicherweise überschrieben wurden
// Pfad ist relativ zu Joomla-Basisverzeichnis.
$sf[0] = BASEPATH . 'libraries/joomla/database/table/user.php'; // neue Variablen definition
$sf[1] = BASEPATH . 'administrator/components/com_users/views/user/tmpl/Form.php'; //Backend com_user anpassen !!! Hat kein Datum In der Datei !!!
$sf[2] = BASEPATH . 'administrator/components/com_users/views/user/view.html.php'; //
$sf[3] = BASEPATH . 'components/com_user/views/user/tmpl/Form.php';  //!!! Hat kein Datum In der Datei !!!


// Suchtext nachdem die Erweiterung eingefügt werden soll
// Wenn $si[x] gefunden ist dann weitersuchen da der eingentliche Suchinhalt zu allgemein ist

$si[0]= 'var $params';
$si2[0] = '';
$si[1] = "<?php echo JText::_( 'Email' ); ?>";
$si2[1] = '</tr>';
$si[2] = "lists['sendEmail']";
$si2[2] = '';
$si[3] = "this->user->get('email')";
$si2[3] = '</tr>';


// Hinweis nach update
$h[0] = 'wurde angepasst !!';
$h[1] = 'Datum konnte nicht ausgelesen werden. Bitte selbst auf update prüfen';    
$h[2] = 'Das Suchmuster wurde nicht gefunden und somit die Erweiterung nicht angehängt';
$h[3] = 'blieb beim update unverändert.';


/****************************************************************************************************

* Funtionen

****************************************************************************************************/


// hier steht der Text welcher eingefügt werden soll
Function get_fileaddedtext($filename, $fVersionDate = False) {

Global $sf;

switch ($filename) {

Case $sf[0]:

$s = "\n\t".'/**' . ERWEITERUNGSHINWEIS . '*********************************************' . "\n" .

"\t*\n" .

"\t* Erweiterte Felder\n" .

"\t". '* @var String Zusatzfelder' . "\n" .

"\t". '*/' . "\n" .

"\t". 'var $sex' . "\t\t\t\t= Null;\n" .

"\t". 'var $homepage' . "\t\t= Null;\n" .

"\t". 'var $os' . "\t\t\t\t\t= Null;\n" .

"\t". '//** ENDE' . ERWEITERUNGSHINWEIS . '****************************************' . "\n\n";

break;


Case $sf[1]:

$s = "\n" . str_repeat("\t", 4) . '<!-- *** ' . ERWEITERUNGSHINWEIS . ' ********************************************* -->' . "\n\n" .

($fVersionDate === True ? '<?php //* @Version $Id: Form.php ' . date('Y-m-d') . ';?>' . "\n" : '') .

str_repeat("\t", 4) . '<tr>' . "\n" .

str_repeat("\t", 5) . '<td class="key">' . "\n" .

str_repeat("\t", 6) . '<label for="sex">' . "\n" .

str_repeat("\t", 7) . '<?php echo JText::_( \'Geschlecht\' );?>' . "\n" .

str_repeat("\t", 6) . '</label>' . "\n" .

str_repeat("\t", 5) . '</td>' . "\n" .

str_repeat("\t", 5) . '<td>' . "\n" .

str_repeat("\t", 6) . '<?php echo $this->lists[\'sex\'];?>' . "\n" .

str_repeat("\t", 5) . '</td>' . "\n" .

str_repeat("\t", 4) . '</tr>' . "\n" .

str_repeat("\t", 4) . '<tr>' . "\n" .

str_repeat("\t", 5) . '<td class="key">' . "\n" .

str_repeat("\t", 6) . '<label for="os">' . "\n" .

str_repeat("\t", 7) . '<?php echo JText::_( \'Betriebssystem\' );?>' . "\n" .

str_repeat("\t", 6) . '</label>' . "\n" .

str_repeat("\t", 5) . '</td>' . "\n" .

str_repeat("\t", 5) . '<td>' . "\n" .

str_repeat("\t", 6) . '<?php echo $this->lists[\'os\'];?>' . "\n" .

str_repeat("\t", 5) . '</td>' . "\n" .

str_repeat("\t", 4) . '</tr>' . "\n" .

str_repeat("\t", 4) . '<tr>' . "\n" .

str_repeat("\t", 5) . '<td class="key">' . "\n" .

str_repeat("\t", 6) . '<label for="homepage">' . "\n" .

str_repeat("\t", 7) . '<?php echo JText::_( \'Homepage\' );?>' . "\n" .

str_repeat("\t", 6) . '</label>' . "\n" .

str_repeat("\t", 5) . '</td>' . "\n" .

str_repeat("\t", 5) . '<td>' . "\n" .

str_repeat("\t", 6) . '<input class="InputBox" type="text" name="homepage" id="homepage" size="40" value="<?php echo $this->user->get(\'homepage\'); ?>" /> ' . "\n" .

str_repeat("\t", 5) . '</td>' . "\n" .

str_repeat("\t", 4) . '</tr>' . "\n\n" .

str_repeat("\t", 4) . '<!-- *** ENDE ' . ERWEITERUNGSHINWEIS . ' **************************************** -->' . "\n\n";

break;


Case $sf[2]:

$s = "\n\t\t" . '//*** ' . ERWEITERUNGSHINWEIS . ' *********************************************' . "\n\n" .

"\t\t" . '$lists[\'sex\'] = JHTML::_(\'select.booleanlist\',  \'sex\', \'class="InputBox" size="1"\', $user->get(\'sex\'), \'Frau\', \'Mann\' );' . "\n" .

"\t\t" . '$select[] = JHTML::_(\'select.option\', \'-\', JText::_(\'---\'));' . "\n" .

"\t\t" . '$select[] = JHTML::_(\'select.option\', \'WIN\', JText::_(\'Windows\'));' . "\n" .

"\t\t" . '$select[] = JHTML::_(\'select.option\', \'MAC\', JText::_(\'MAC\'));' . "\n" .

"\t\t" . '$select[] = JHTML::_(\'select.option\', \'LNX\', JText::_(\'Linux\'));' . "\n" .

"\t\t" . '$select[] = JHTML::_(\'select.option\', \'UNX\', JText::_(\'Unix\'));' . "\n" .

"\t\t" . '$select[] = JHTML::_(\'select.option\', \'SON\', JText::_(\'Sonstige\'));' . "\n" .

"\t\t" . '// die Zahl von size gibt an wie viele Zeilen der Liste angezeigt werden.' . "\n" .

"\t\t" . '$lists[\'os\'] = JHTML::_(\'select.genericlist\',  $select, \'os\', \'class="InputBox" size="1"\', \'value\', \'text\', $user->get(\'os\') );' . "\n\n" .

"\t\t" . '//*** ENDE ' . ERWEITERUNGSHINWEIS . ' ****************************************}' .  "\n\n";

break;


Case $sf[3]:

$s = "\n" . '<!-- *** ' . ERWEITERUNGSHINWEIS . ' ********************************************* -->' . "\n\n" .

'<tr>' . "\n" .

"\t" . '<td>' . "\n" .

"\t\t" . '<label for="sex">' . "\n" .

str_repeat("\t", 3) . '<?php echo JText::_( \'Geschlecht\' ); ?>:' . "\n" .

"\t\t" . '</label>' . "\n" .

"\t" . '</td>' . "\n" .

"\t" . '<td>' . "\n" .

"\t\t" . '<input name="sex" id="sex1" value="0" class="InputBox" type="radio" <?php echo ($this->escape($this->user->get(\'sex\')) == \'0\' ? \'checked="checked"\' : \'\');?> />Mann' . "\n" .

"\t\t" . '<input name="sex" id="sex2" value="1" class="InputBox" type="radio" <?php echo ($this->escape($this->user->get(\'sex\')) == \'1\' ? \'checked="checked"\' : \'\');?> />Frau' . "\n" .

"\t" . '</td>' . "\n" .

'</tr>' . "\n" .
'<tr>' . "\n" .

"\t" . '<td>' . "\n" .

"\t\t" . '<label for="os">' . "\n" .

str_repeat("\t", 3) . '<?php echo JText::_( \'Betriebssystem\' ); ?>:' . "\n" .

"\t\t" . '</label>' . "\n" .

"\t". '</td>' . "\n" .

"\t". '<td>' . "\n" .

"\t\t" . '<select name="os" id="os" class="InputBox" size="1">' . "\n" .

str_repeat("\t", 3) . '<option value="-" <?php echo ($this->escape($this->user->get(\'os\')) == \'-\' ? \'selected="selected"\' : \'\' );?>>---</option>' . "\n" .

str_repeat("\t", 3) . '<option value="WIN" <?php echo ($this->escape($this->user->get(\'os\')) == \'WIN\' ? \'selected="selected"\' : \'\' ); ?>>Windows</option>' . "\n" .

str_repeat("\t", 3) . '<option value="MAC" <?php echo ($this->escape($this->user->get(\'os\')) == \'MAC\' ? \'selected="selected"\' : \'\' ); ?>>MAC</option>' . "\n" .

str_repeat("\t", 3) . '<option value="LNX" <?php echo ($this->escape($this->user->get(\'os\')) == \'LNX\' ? \'selected="selected"\' : \'\' ); ?>>Linux</option>' . "\n" .

str_repeat("\t", 3) . '<option value="UNX" <?php echo ($this->escape($this->user->get(\'os\')) == \'UNX\' ? \'selected="selected"\' : \'\' ); ?>>Unix</option>' . "\n" .

str_repeat("\t", 3) . '<option value="SON" <?php echo ($this->escape($this->user->get(\'os\')) == \'SON\' ? \'selected="selected"\' : \'\' );?>>Sonsitiges</option>' . "\n" .

"\t\t" . '</select>' . "\n" .

"\t" . '</td>' . "\n" .

'</tr>' . "\n" .
'<tr>' . "\n" .

"\t" . '<td>' . "\n" .

"\t\t" . '<label for="homepage">' . "\n" .

str_repeat("\t", 3) . '<?php echo JText::_( \'Homepage\' ); ?>:' . "\n" .

"\t\t" . '</label>' . "\n" .

"\t" . '</td>' . "\n" .

"\t" . '<td>' . "\n" .

"\t\t" . '<input class="InputBox" type="text" name="homepage" id="homepage" size="40" value="<?php echo $this->user->get(\'homepage\'); ?>" />' . "\n" .

"\t" . '</td>' . "\n" .

'</tr>' . "\n\n" .
'<!--  *** ENDE ' . ERWEITERUNGSHINWEIS . ' **************************************** -->' . "\n\n";

break;

}

return $s;

}

/****************************************************************************************************

* Programmteil

****************************************************************************************************/


For ($i=0; $i< sizeof($sf); $i++){    

$found = False;

$datalt ='';

// "alte" org. Datei-Version öffnen und nach Versions-Datum durchsuchen

If ($fh = @fopen($sf[$i].APPORG,"r")) {

While(!feof($fh) && $found === False) {

$s = fgets($fh,1024);

If (strpos($s, '* @version') !== False) {

$found = True;

$arr = explode  ( " " , $s);

For ($j=0; $j < count($arr); $j++) {

If(preg_match('/^\d{4}\-\d{2}\-\d{2}$/', $arr[$j])> 0) {

$datalt = $arr[$j] ;

break;

}

}

}

}

fclose($fh);

}


If ($si2[$i] == '') {

$found = 1;

} Else {

$found = 0;

}

$datneu ='';

$fa ='';

$fe ='';

$erw = False;

$fh = fopen($sf[$i],"r"); // potentiell neue Datei öffnen und nach Versions-Datum durchsuchen

While(!feof($fh)) { // Wir gehen mal davon aus das die Datei nicht leer ist ;-)

$s = fgets($fh,1024);

If (strpos($s, '* @version') === 0) {//* @version        $Id: aro.php 14401 2010-01-26 14:10:00Z louis $

$arr = explode  ( " " , $s);

For ($j=0; $j < count($arr); $j++) {

If(preg_match('/^\d{4}\-\d{2}\-\d{2}$/', $arr[$j])> 0) {

$datneu = $arr[$j] ;

break;

}

}

}

// Sollte womöglich schon die Erweiterung In der Datei stehen dann nichts machen

If (strpos($s, ERWEITERUNGSHINWEIS) !== False) {

$erw = True;

break;

}


If ($found >= 2) {

$fe .= $s;

} Else {

$fa .= $s;

}

// Jetzt die Zeile suchen um im Anschluß die Programmerweiterung anzuhängen

//echo strpos($s, $si[$i]) .  htmlspecialchars($s) . "<br>";

$k = strpos($s, $si[$i]);

If ($k === False){

} Else {

$found++;

If ($si2[$i] <> '') {

$si[$i] = $si2[$i]; // Zeile gefunden In der es In der Tabelle einen Zeilenwechsel gibt

$si2[$i] = '';

}

}

}

fclose($fh);


$s = get_fileaddedtext($sf[$i]);

If ($erw === True) {

// In der Original-Datei wurde schon eine Erweiterung gefunden, also nicht überschrieben, da sie nicht aktualisert wurde

$j = 3;

} ElseIf (($datneu > $datalt &&  $found >= 2) || $datalt == '') {

copy($sf[$i], $sf[$i] . APPORG); // neue Original-Datei sichern

$fh = fopen($sf[$i],"w");

fputs($fh, $fa.$s.$fe);

fclose($fh);

$j= 0;

$s = '';

} ElseIf ($datneu == '' || $datalt == '') {

$j= 1;

} ElseIf ($found === False) {

$j= 2;

} Else {

$j= 3;

}

echo $sf[$i] . '</b><b> ' .$h[$j] . ' </b><br />' . nl2br(str_Replace("\t",' ', htmlspecialchars( $s))). '<br /><hr>';

}
?>