Antworten auf deine Fragen:
Neues Thema erstellen

Antworten zum Thema „Eine Art Settingsdatei erstellen?“

GeKiller

Liqu1d

Hi,

ich würde gerne eine Art von Einstellungsdatei erstellen, wo ein paar Einstellungen für das Backend bspw. gespeichert werden sollen. Daher das ja eigentlich eh nur der Administrator machen kann oder der, der Zugriff zum Backend hat, speichert man das ja bestimmt nicht in der Datenbank?
Das würde man ja warscheinlich eher machen, wenn man mehrere Benutzer im Backend hat oder?

Die Frage ist jetzt, liege ich da richtig? Sollte man dafür so eine Einstellungsdatei machen? Daher die Sachen ja beim Laden gesetzt werden sollen, macht man das ja warscheinlich mit so einer .ini Datei?

Ich wollte dabei die Daten in so einer Form oder ähnlich speichern: (Hier mal nur ein paar Beispiele für das Format, nicht für meine Einstellungen):
RecordsBackend = 10
RecordsFrontend = 10

SiteAfterLogout = Pfad

LogoutNecessary = Yes

Sowas in der Richtung halt aber man müsste diese Einstellungen dann ja auch beim Start validieren und falls die Datei bspw. nicht gelesen werden kann oder ähnliches die Standardeinstellungen laden?

Die Einstellungen sollen dann auch nur übernommen werden, wenn der Benutzer auf Übernehmen klickt und zudem wollte ich dann auch beim Verlassen der Einstellungsseite prüfen, ob der Benutzer vielleicht etwas geändert hat und dann nachfragen, ob der die Ändeurngen nun machen will oder nicht, also wie könnte man das realisieren?
 
Zuletzt bearbeitet:

Mereel

Aktives Mitglied

Hm, für ein paar Schlüssel-Wert Paare bist du mit einem Config-File (ini, json, xml, ...) vermutlich besser beraten, als alles in eine Datenbank zu schreiben.
Ein ganz simpler Ansatz: Zu Beginn deines Skriptes lädst du dein Config-File in ein Array (parse_ini_file(), json_decode(), ... je nachdem) und kombinierst dieses mit array_merge() mit deinen Standardwerten (für den Fall, dass das Config-Array leer ist, einzelne Werte nicht gesetzt sind, etc.). Für dein Backend erstellst du ein Formular, dass du mit den Werten deines Config-Arrays fütterst. Wird das Formular abgeschickt, validierst du alle übergebenen Werte und schreibst das Config-File neu.
 

lachender_engel

Aktives Mitglied

Daher das ja eigentlich eh nur der Administrator machen kann oder der, der Zugriff zum Backend hat, speichert man das ja bestimmt nicht in der Datenbank?
Das würde man ja warscheinlich eher machen, wenn man mehrere Benutzer im Backend hat oder?
Wie Du Daten speicherst hat nicht wirklich was mit der Anzahl von Benutzern zu tun.
Eine Datenbank bietet sich an, wenn Du eh eine Datenbank führst und der "Settingsdatei" keine Zugangsdaten der Datenbank stehen.
Ansonsten ist es wirklich DIr überlassen, ob Datenbank oder Datei. @Mereel hat gut erklärt, dass es in PHP schon Funktionen gibt um solche Dateien zu schreiben und zu lesen.

Bedenke nur die Sicherheit. Dateien mit .ini, .xml und .json lassen sich auch direkt über den Brwoser aufrufen und anzeigen. Daher bevorzuge ich persönlich php-Dateien, da diese geparst werden und Du abfangen, ob sie direkt aufgerufen oder über ein anderes Skript inkludiert werden.
 

GeKiller

Liqu1d

Mh .. dann habe ich das mit dem config file jetzt mal so gelöst:

Die Dateiheißt jetzt settings.ini.php
PHP:
<?php
;/*
[settings]
  RecordsBackend= 20
  SiteAfterLogout = "index.php?site=backend-login"

;*/
;?>

Dadurch sollte das ganze dann ja auch sicher sein oder? Das mit dem Einlesen und auch mit der Datenbankabfrage usw. habe ich jetzt auch hingekriegt aber ich habe für diese Anzahl der Datensätze, die bspw. im Backend angezeigt werden sollen eine select Box genommen, wie übernehme ich dann den Wert aus dem Array? Das funktioniert nämlich leider gar nicht.

Javascript:
$(document).ready(function()
{
    $('#backend-entrys').val("{$settings['RecordsBackend']}");
});

funktioniert nämlich leider nicht. Ich arbeite nämlich auch mit Smarty udn wenn ich verusche {$settings['RecordsBackend']} auszugeben, dann kriege ich das als String ausgegeben aber es sollte ja eigentlich ein Int Wert sein ...
http://stackoverflow.com/questions/16946829/how-to-pass-php-variables-value-to-jquery

So funktioniert es allerdings auch nicht:

In der html Datei:
Code:
<form .....
    <select id="backend-entrys">
        <option>5</option>
        <option>10</option>
        <option>20</option>
     </select>

var test = <?php echo $settings['backendEntrys']); ?>

Code:
$(document).ready(function()
{
    $('#backend-entrys').val($test);
});

So übergibt man dann doch dann eigentlich den Wert oder wie kriege ich das Array auch sauber zu JS rüber? Ansonsten kann man ja den Wert dieser <select><option> nicht setzen oder?

Aber wie validiere ich dann auch nachher beim Form Submit die Daten und wie kann ich das ganze in der Datei dann nur überschreiben? Die Datei, bis auf die Werte sollen ja so bleiben, wie Sie sind.

@lachender_engel
Wieso hängt das nicht von der Anzahl der Benutzer ab? Das sind ja jetzt nur so Einstellungen für einen Benutzer aber wenn ich für jeden Benutzer wie z.B hier solche Einstellungen hätte, dann würde ich das doch sicherlich irgendwie mit dem jeweiligen Benutzer in der DB verknüpfen?
 
Zuletzt bearbeitet:

lachender_engel

Aktives Mitglied

Mh .. dann habe ich das mit dem config file jetzt mal so gelöst:

Die Dateiheißt jetzt settings.ini.php
PHP:
<?php
;/*
[settings]
  RecordsBackend= 20
  SiteAfterLogout = "index.php?site=backend-login"

;*/
;?>

Warum einfach, wenn es auch kompliziert geht?! :)
Da Du schon eine PHP-Datei hast, schreibe die Werte direkt in die Variablen.
PHP:
<?php
$RecordsBackend= 20;
$SiteAfterLogout = 'index.php?site=backend-login';
...
?>
Die Datei includest Du ein Mal und hast die Variablen direkt im Zugriff.
Natürlich kannst Du die Werte auch in ein ein Array setzen, etc.
@lachender_engel
Wieso hängt das nicht von der Anzahl der Benutzer ab? Das sind ja jetzt nur so Einstellungen für einen Benutzer aber wenn ich für jeden Benutzer wie z.B hier solche Einstellungen hätte, dann würde ich das doch sicherlich irgendwie mit dem jeweiligen Benutzer in der DB verknüpfen?
Also, rein sachlich ist auch eine Textdatei eine Datenbank.
Um in meinem Beispiel zu bleiben - und Deine Anforderung umzusetzen, die Einstellungen für mehrere User zu haben - kannst Du das hier machen:
PHP:
<?php
$RecordsBackend['1']= 20;
$SiteAfterLogout['1'] = 'index.php?site=backend-login';
$RecordsBackend['2']= 15;
$SiteAfterLogout['2'] = 'index.php?site=backend-logout';
...
?>
Dabei ist der Parameter des Arrays die ID des Users.
Das nur als Veranschaulichung, dass nicht immer alles in einer SQL-DB liegen muss - aber im Zusammenhang mit einer Benutzerverwaltung sicher einfacher zu handhaben ist.
Das über Dateien zu machen hat den Vorteil, dass Anwender diese direkt editieren können, ohne MySQL-Admin oder eine andere Benutzeroberfläche.
 

GeKiller

Liqu1d

Naja, jetzt habe ich das ganze ja auch schon einem Array und du sagtest ja auch, das ich das lieber in einer php Datei machen soll, also halt so.
;)

Das eine DB mehr oder weniger eine Textdatei ist, ist schon klar aber wenn man eh schon eine Benutzertabelle hat, dann kann man das ja auch besser in der DB machen, vor allem Benutzer. Eine DB hat ja auch sehr viele Vorteile im Vergleich zu einfachen Textdateien aber das ist ja auch nicht das Thema und darüber lässt sich ja beliebig lang streiten. ;)

Mein Problem ist ja jetzt immer noch das mit dem validieren nachher und wie oben beschrieben mit dem übernehmen des Wertes in die <select<
<option>, also das dann da der richtige Wert übernommen wird.
 

Mereel

Aktives Mitglied

So übergibt man dann doch dann eigentlich den Wert oder wie kriege ich das Array auch sauber zu JS rüber? Ansonsten kann man ja den Wert dieser <select><option> nicht setzen oder?
Hat es irgend einen Grund, dass du dafür Javascript verwendest? Was machst du, wenn JS mal nicht verfügbar ist? Die Werte zu setzen sollte meiner Meinung nach Serverseitig mit PHP passieren.
PHP:
$options = array( 5, 10, 20 ); // mögliche Werte für backend-options

echo '<select name="backend-options">';

foreach($options as $option)
{
   echo '<option';
   if ($option === $settings['backend-entrys'])
   {
      echo ' selected="selected"';
   }
  echo ' value="' . $option . '">' . $option . '</option>';
}
echo '</select>';

Aber wie validiere ich dann auch nachher beim Form Submit die Daten
Bei der Validierung überprüfst du einfach, ob der übergebene Wert einer der zulässigen Werte ist.
PHP:
if (in_array((integer) $_POST['backend-options'], $options))
{
   $settings['backend-options'] = (integer) $_POST['backend-options'];
}
und wie kann ich das ganze in der Datei dann nur überschreiben? Die Datei, bis auf die Werte sollen ja so bleiben, wie Sie sind.
Den Inhalt der Datei musst du bei jedem Speichern neu generieren. Z.B.:

PHP:
$content ='<?php $settings = array(';

foreach($settings as $key => $value)
{
   $content .= '\'' . $key . '\' => \'' . $value . '\', ';
}
$content .= '); ?>';

EDIT:
Bedenke nur die Sicherheit. Dateien mit .ini, .xml und .json lassen sich auch direkt über den Brwoser aufrufen und anzeigen. Daher bevorzuge ich persönlich php-Dateien, da diese geparst werden und Du abfangen, ob sie direkt aufgerufen oder über ein anderes Skript inkludiert werden.
Guter Einwand. Sicherheit wäre natürlich nur gewährleistet, wenn die Datei außerhalb des Document Root abgelegt oder zumindest per .htaccess vor Zugriff geschützt wird. Den Code der "config.php" dynamisch zu generieren, kommt mir immer etwas "falsch" vor und ich halte ini, json & Co. für die "sauberere" Lösung, aber ein + für php in Sachen Sicherheit.
 
Zuletzt bearbeitet:

GeKiller

Liqu1d

Mh, was dann nur blöd ist, ist ja, das man dann jedes Setting einzeln mit einer if bzw. nachher else if Bedingung prüfen muss?

Ich habe jetzt auch soweit eigentlich alles fertig, allerdings noch ein klitzekleiner Fehler.
Ich habe das ganze jetzt mal ein wenig modifiziert aber wie gebe ich eine neue zeile in die Datei mit? Wenn ich nach php ein enter habe, dann funktioniert das zwar aber sieht sehr unschön aus.

Das mit <br /> hinter value funktioniert so leider nicht, also wie kann ich der Datei sagen, das sie da eine neue zeile machen soll? <?php echo oder einfach nur <br /> funktioniert nicht.

EDIT: Hat sich erledigt. ich habe das ganze jetzt mit \n gemacht aber auch da sollte man aufpassen, das man doppelte Anführungszeichen verwendet. ;)
 
Zuletzt bearbeitet:

GeKiller

Liqu1d

Mh .. seltsamerweise habe ich jetzt ein kleines Problem und irgendwie finde ich das Problem nicht. So sieht das ganze ja derzeit aus:

Einlesen der Settings:
PHP:
$defaultSettings = array
(
    "backendEntrys" => 10,
    "frontendEntrys" => 10,
);

$confSettings = parse_ini_file("config.ini.php");
$settings = array_merge($defaultSettings, $confSettings);
$smarty->assign('settings', $settings); // settings fot the smarty method!!

Erstellen der Einträge:
PHP:
$entryOptions = array(5, 10, 20, 25);
 
echo '<select name="frontend-options">';
foreach($entryOptions as $option)
{
    echo '<option';
    if ($option == $params['data']['frontendEntrys']) // kommt von einer smarty Methode
    {
       echo ' selected="selected"';
    }
    echo ' value="' . $option . '">' . $option . '</option>';
}
echo '</select>';

echo '<br />Einträge pro Seite im Backend ';
echo '<select name="backend-options">';
foreach($entryOptions as $option)
{
    echo '<option';
    if ($option == $params['data']['backendEntrys'])
    {
        echo ' selected="selected"';
    }
    echo ' value="' . $option . '">' . $option . '</option>';
}
echo '</select>';

Ändern der Einträge:
PHP:
if(isset($_POST["Apply"]))
{
    $entryOptions = array(5, 10, 20, 25);

    if (in_array((integer) $_POST['backend-options'], $entryOptions))
    {
       $settings['backendEntrys'] = (integer) $_POST['backend-options'];
    }                   
    else if (in_array((integer) $_POST['frontend-options'], $entryOptions))
    {
       $settings['frontendEntrys'] = (integer) $_POST['frontend-options'];
    }

    $content = "<?php \n;\n/*\n[settings]\n";
    foreach($settings as $key => $value)
    {
        $content .= $key . ' = ' . $value . "\n";
    }

    $content .= "*/\n;\n?>";     

    $handle = fopen("config.ini.php", "w");
    if($handle)
    {
        fwrite($handle, $content);
        fclose($handle);
    }
}

Wenn ich jetzt etwas ändern will und die Form abschicke ändert sich nur der Wert von backendEntrys und alle anderen bleiben unverändert. Das mit dem backendEntry funktioniert aber auch nur, wenn ich form zweimal abschicke?!
Das hier ist die form:

HTML:
<form action="" method="POST">
    <!-- Hier werden die Einträge includet--!>
    <input type="submit" value="Übernehmen" name="Apply" id="Apply"> 
</form>

War das eigentlich oben mit dem === Absicht? Wenn ich === benutze werden immer die Standardeinstellungen geladen.

Wie könnte man eigentlich vorgehen, wenn man nicht jedes Setting einzeln prüfen will? Ich habe nicht nur die zwei Settings, nur mal so als Info. ;)
 
Zuletzt bearbeitet:

Mereel

Aktives Mitglied

Wenn ich jetzt etwas ändern will und die Form abschicke ändert sich nur der Wert von backendEntrys und alle anderen bleiben unverändert.
Dein select-Feld nennst du frontend-options, frägst dann jedoch im if-Statement $_POST['frontend-entrys'] ab.

Das mit dem backendEntry funktioniert aber auch nur, wenn ich form zweimal abschicke?!
Das kann ich mir gerade auch nicht erklären.

War das eigentlich oben mit dem === Absicht? Wenn ich === benutze werden immer die Standardeinstellungen geladen.
Mit parse_ini_file erhältst du ausschließlich Strings, da sich in deinem Array $entryOptions = array(5, 10, 20, 25); allerdings Werte vom Typ Integer befinden, ergibt die Prüfung auf Identität (===) stets FALSE. Für ein Workaround siehe hier: http://stackoverflow.com/questions/20972256/parse-ini-file-converts-numeric-values-to-string Oder du schreibst deine Werte auch als PHP Variablen in dein PHP File, wie lachender_engel schon vorgeschlagen hat.

Wie könnte man eigentlich vorgehen, wenn man nicht jedes Setting einzeln prüfen will? Ich habe nicht nur die zwei Settings, nur mal so als Info. ;)
Naja prüfen musst du schon jeden Wert einzeln. Aber du kannst ja mit jedem "Setting" den erwarteten Typ, erlaubte Werte etc. festlegen und die Überprüfung in einer foreach-Schleife anhand dieser Angaben für alle vornehmen.
 

GeKiller

Liqu1d

Mh, da hatte ich eigentlich nur was umgeschrieben und ein ändern an der Stelle vergessen aber dennoch funktioniert es nicht. Es geht ja auch wie gesagt nicht nur um die frontenEntrys. Es funktioniert nur das ändern der backendEntrys und das nur nach dem zweitem Post.

Das mit dem === dachte ich mir schon aber wieso denn auch noch auf Typgleichheit prüfen oder könnte das die Fehlerursache sein? Allerdings funktioniert das ja wie schon gesagt mit den backendEntrys ...
 

GeKiller

Liqu1d

Oh mann, hat sich erledigt ... wie peinlich. :D (zumindest warum nur das erste funktioniert)

Ich habe oben ein else if verwendet aber es soll ja jedes Setting überprüft werden und dann gegebenfalls geändert werden. So mit dem else if wird halt immer nur die erste Einstellung übernommen und überprüft. (*hust*). ;)

Was ich aber immer noch nicht verstehe ist das mit dem === und warum die Einstellungen dann erst nach dem zweitem Submit geändert werden, das Problem besteht leider immer noch.

Ich habe auch grade herausgefunden, das jede Einstellung zweimal gesendet werden muss, also wenn ich bspw. eine Einstellung nicht ändere aber dann vor dem zweiten Submit, dann wird diese nicht geändert.
 
Zuletzt bearbeitet:
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
175.156
Beiträge
2.581.859
Mitglieder
67.222
Neuestes Mitglied
Gregor
Oben