wow tolle Arbeit. Warum machste daraus kein Projekt (Retro)
Ich werde das CMS dann releasen, und mich als Techniker zur verfügung stellen. Dann könnt ihr mit dieser CMS selber euer Projekt machen.
wow tolle Arbeit. Warum machste daraus kein Projekt (Retro)
Ich werde das CMS dann releasen, und mich als Techniker zur verfügung stellen. Dann könnt ihr mit dieser CMS selber euer Projekt machen.
UPDATE
Die Pagination ist so eingestellt das es immer 3 Kommentare anzeigt. Das könnt ihr aber beliebig in der Config ändern.
Screens
Snippets
<?php
class Support
{
public $err = '';
public $success = false;
private $user;
private $config;
private $connection;
public function __construct($config, $connection, $url)
{
$this->user = new User($config, $connection);
$this->config = $config;
$this->connection = $connection;
}
public function CreateTicket($category, $ticket)
{
if($this->AlreadyPosted() == true) {
$this->err = 'Ein anderes Ticket ist noch in Bearbeitung. Bitte hab geduld.';
} else {
if(empty($category) || empty($ticket)) {
$this->err = 'Füll bitte alle Felder aus.';
} elseif(strlen($ticket) < 10) {
$this->err = 'Das Ticket muss mindestens 10 Zeichen lang sein.';
} elseif(strlen($ticket) > 500) {
$this->err = 'Das Ticket darf maximal 500 Zeichen lang sein.';
} else {
$query = $this->connection->prepare('INSERT INTO sync_support (id, category, ticket) VALUES (:id, :category, :ticket)');
$query->execute([
':id' => $this->user->data['id'],
':category' => $category,
':ticket' => $ticket
]);
$this->success = true;
}
}
}
public function AlreadyPosted()
{
$query = $this->connection->prepare('SELECT status FROM sync_support WHERE id = :id LIMIT 1');
$query->execute([':id' => $this->user->data['id']]);
if($query->rowCount()) {
$r = $query->fetchObject();
if($r->status == 1) {
return true;
} else {
$query = $this->connection->prepare('DELETE FROM sync_support WHERE id = :id AND status = :status LIMIT 1');
$query->execute([
':id' => $this->user->data['id'],
':status' => 0
]);
return false;
}
}
}
public function __destruct()
{
$this->err = null;
$this->user = null;
$this->config = null;
$this->success = null;
$this->connection = null;
}
}
?>
Alles anzeigen
#ThreadUpdate
Freundliche Grüsse,
Synergy
position: absolute;
Danke, das ist wegen dem Accountlimit habe vergessen die Config zu kopieren.
Eventuell füg ich noch ne Pagination ein. Danke.
TODO-Liste aktualisiert.
Cool, kann ich gebrauchen
Genau, werde ich auch hinzufügen. Aber morgen bin am handy
UPDATE
Entlich, ich hab es hinbekommen. Der Auto-Updater ermöglicht das Updaten der CMS auf einen Klick. Es funktioniert so: Man klick auf Updaten. Danach wird auf meinen FTP Server zugegriffen und eine Datei namens Update.ini runtergeladen. Dort drinn stehen Informationen, wie z.B. das neue Build. Danach wird überprüft ob das Build das selbe ist wie bei der CMS. Wenn nicht ladet es das Update runter. Updates haben den Namen "SYNC-UPDATE-B%neues build%.zip". Alle Datein werden im Ordner "Resources/Data/Temp" gespeichert, der automatisch erstellt wird und nach abschluss des Update wieder gelöscht. Nachdem das Update erfolgreich war, wird in der Config Datei der String mit dem neuem Build angepasst. So einfach ist das.
Snippets
<?php
class Updater
{
public $str;
private $id;
private $login;
private $config;
private $connection;
public function __construct($config, $connection)
{
$this->config = $config;
$this->connection = $connection;
if(!is_dir($this->config['app']['root'] . '/Resources/Data/Temp')) {
mkdir($this->config['app']['root'] . '/Resources/Data/Temp');
}
}
public function Connect()
{
$this->id = ftp_connect($this->config['ftp']['host']);
ftp_login($this->id, $this->config['ftp']['user'], $this->config['ftp']['pass']);
ftp_pasv($this->id, true);
if(ftp_get($this->id, $this->config['app']['root'] . '/Resources/Data/Temp/Update.ini', 'DEV/Update.ini', FTP_BINARY)) {
$this->CheckVersion();
} else {
die('Ein Fehler ist aufgetreten.');
}
ftp_close($this->id);
}
public function CheckVersion()
{
$this->ini = parse_ini_file($this->config['app']['root'] . '/Resources/Data/Temp/Update.ini', true);
if($this->ini['SYNC-UPDATE']['Build'] !== $this->config['app']['build']) {
$this->str = 'Update verfügbar! Wird installiert...';
$this->Download();
} else {
$this->str = 'Du bist auf dem aktuellsten Stand!';
}
}
public function Download()
{
$this->id = ftp_connect($this->config['ftp']['host']);
ftp_login($this->id, $this->config['ftp']['user'], $this->config['ftp']['pass']);
ftp_pasv($this->id, true);
if(ftp_get($this->id, $this->config['app']['root'] . '/Resources/Data/Temp/Temp.zip', 'DEV/SYNC-UPDATE-' . $this->ini['SYNC-UPDATE']['Build'] . '.zip', FTP_BINARY)) {
$this->Extract();
} else {
die('Ein Fehler ist aufgetreten.');
}
ftp_close($this->id);
}
public function Extract()
{
$zip = new ZipArchive;
if($zip->open($this->config['app']['root'] . '/Resources/Data/Temp/Temp.zip') === TRUE) {
$zip->extractTo($this->config['app']['root']);
$zip->close();
$this->UpdateConfig();
} else {
die('Ein Fehler ist aufgetreten.');
}
}
public function UpdateConfig()
{
file_put_contents($this->config['app']['root'] . '/App/Config.php', str_replace('\'build\' => \'' . $this->ini['SYNC-BASE']['Build'] . '\',', '\'build\' => \'' . $this->ini['SYNC-UPDATE']['Build'] . '\',', file_get_contents($this->config['app']['root'] . '/App/Config.php')));
file_put_contents($this->config['app']['root'] . '/App/Config.php', str_replace('\'release\' => \'' . $this->ini['SYNC-BASE']['Release'] . '\',', '\'release\' => \'' . $this->ini['SYNC-UPDATE']['Release'] . '\',', file_get_contents($this->config['app']['root'] . '/App/Config.php')));
$this->Clear();
}
public function Clear()
{
$files = glob($this->config['app']['root'] . '/Resources/Data/Temp/*');
foreach($files as $file) {
if(is_file($file)) {
unlink($file);
}
}
rmdir($this->config['app']['root'] . '/Resources/Data/Temp');
$this->str = 'Update erfolgreich!';
}
public function __destruct()
{
$this->id = null;
$this->str = null;
$this->login = null;
$this->config = null;
$this->connection = null;
}
}
?>
Alles anzeigen
Screens
Man könnte eigentlich das CMS jetzt Release und den Auto-Updater den rest machen lassen, werde ich aber noch nicht tun. Übrigens das Livedemo ist momentan Down da ich Windows Updates machen muss lol.
Freundliche Grüsse,
Synergy
EDIT
TODO-Liste aktualisiert.
EDIT 2
Livedemo wieder verfügbar.
Bin für R63B, es hat zwar noch bugs aber Azure 2.0 wird kommen *-*
Willkommen
Die TODO-Liste wurde erweitert. Danke an @Hcmeister
UPDATE
Kleines aber feines Update lol. Die Anzahl von maximalen Accounts sind in der Config einstellbar.
Snippets
public function BanCheck($username)
{
$query = $this->connection->prepare('SELECT reason, expire FROM bans WHERE (bantype = \'user\' AND value = :user) OR (bantype = \'ip\' AND value = :ip)');
$query->execute([
':user' => $username,
':ip' => $this->user->getUserIp()
]);
if($query->rowCount()) {
$r = $query->fetchObject();
if($r->expire < time()) {
$query = $this->connection->prepare('DELETE FROM bans WHERE expire < :expire');
$query->execute([':expire' => time()]);
return false;
} else {
$this->err = 'Du wurdest gebannt! Der Grund für deinen Bann lautet: "' . $r->reason . '" und dauert bis am ' . date('d.m.Y - H:i', $r->expire) . '.';
}
} else {
return true;
}
}
Alles anzeigen
public function CheckLimit()
{
$query = $this->connection->prepare('SELECT ip_last, ip_reg FROM users WHERE ip_reg = :ip_reg OR ip_last = :ip_last');
$query->execute([
':ip_reg' => $this->user->getUserIp(),
':ip_last' => $this->user->getUserIp()
]);
if($query->rowCount() > $this->config['register']['limit']) {
return true;
} else {
return false;
}
}
Alles anzeigen
Freundliche Grüsse,
Synergy
##Edit
evtl. Marktplatz Page einfügen ( Badges,Pferde,Limited Rare )
was auch geil wäre ist : Werbetipps Page einfügen ( Wie man zu Werben hat und welche Tools man benutzen kann dafür )
Ja das habe ich schon geplant zu machen, wird sich aber noch gedulden, hab vorhin mal angefangen aber es ging nicht. Werde morgen oder so nochmal schauen.
Trusted Dealer- Vertrauens Person/Handler Page
Es gibt 3 Verschiedene Stufen => Bronze ,Silber,GoldJede Stufe hat sein eigenen Badge und Mitglieder ...
beispiel:
Bronze beauftragte : Diese Mitglieder sind beauftragt/zertifiziert wurden extra für Taler Tausch.
Silber beauftragte : Diese Mitglieder sind beauftragt/zertifiziert wurden extra für Limited/Vip Rare Tausch.
Gold beauftragte : Diese Mitglieder sind beauftragt/zertifiziert wurden extra für alles was mit Tausch zutun hat .
Klingt interessant, weis nur nicht genau was du meinst. Aber kannst bisschen ausführlicher beschreiben.
UPDATE
Snippets
public function CheckCookie()
{
if(isset($_COOKIE['SYNC-REMEMBER'])) {
$query = $this->connection->prepare('SELECT id FROM sync_users_data WHERE cookie = :cookie LIMIT 1');
$query->execute([':cookie' => $_COOKIE['SYNC-REMEMBER']]);
if($query->rowCount()) {
$r = $query->fetchObject();
$query = $this->connection->prepare('SELECT username FROM users WHERE id = :id LIMIT 1');
$query->execute([':id' => $r->id]);
if($query->rowCount()) {
$r = $query->fetchObject();
$_SESSION['SYNC-LOGIN'] = $r->username;;
$_SESSION['SYNC-TIMEOUT'] = time();
header('Location: ' . $this->config['website']['url'] . '/home');
}
}
}
Alles anzeigen
Das Cookie für "Angemeldet Blieben" ist jetzt mit sha1() und einem Salt verschlüsselt. Somit ist es sicher! Aber wie funktioniert diese Funktion? Ganz einfach, es wird eine SQL Abfrage gemacht und schaut ob es in der Tabelle "sync_users_data" in der Spalte "cookie" ein Eintrag hat mit dem gleichen Wert wie das Cookie. Trifft das zu, wird der User eingeloggt. Ansonsten muss er sich normal einloggen. Nachdem man sich Eingeloggt hat, wird ein Session erstellt mit dem Wert von der aktuellen Zeit. Und jedes mal wenn man die Page Reloaded wird diese Sitzung neu erstellt. Es wird auch überprüft ob die Sitzung älter als 15 Minuten ist. Wenn ja wird der User ausgeloggt. Der Bug wenn man in den Profil Einstellungen kein Bild ausgewählt hat wurde nun behoben. Danke an @Hcmeister für das finden des Bugs.
Freundliche Grüsse,
Synergy
<?php
class Tops
{
private $imager;
private $config;
private $connection;
public function __construct($config, $connection, $url)
{
$this->imager = new Imager($config, $connection);
$this->config = $config;
$this->connection = $connection;
}
public function getCredits()
{
$query = $this->connection->prepare('SELECT username, credits FROM users ORDER BY credits DESC LIMIT 5');
$query->execute();
if($query->rowCount()) {
while($r = $query->fetchObject()) {
echo '<li>
<div class="avatar">
' . $this->imager->Generate('user=' . $r->username) . '
</div>
<div class="info">
<div class="name">' . $r->username . '</div>
<div class="amount">' . $r->credits . '</div>
</div>
</li>';
}
}
}
public function getDuckets()
{
$query = $this->connection->prepare('SELECT username, activity_points FROM users ORDER BY activity_points DESC LIMIT 5');
$query->execute();
if($query->rowCount()) {
while($r = $query->fetchObject()) {
echo '<li>
<div class="avatar">
' . $this->imager->Generate('user=' . $r->username) . '
</div>
<div class="info">
<div class="name">' . $r->username . '</div>
<div class="amount">' . $r->activity_points . '</div>
</div>
</li>';
}
}
}
public function getDiamonds()
{
$query = $this->connection->prepare('SELECT username, seasonal_currency FROM users ORDER BY seasonal_currency DESC LIMIT 5');
$query->execute();
if($query->rowCount()) {
while($r = $query->fetchObject()) {
echo '<li>
<div class="avatar">
' . $this->imager->Generate('user=' . $r->username) . '
</div>
<div class="info">
<div class="name">' . $r->username . '</div>
<div class="amount">' . $r->seasonal_currency . '</div>
</div>
</li>';
}
}
}
public function __destruct()
{
$this->imager = null;
$this->config = null;
$this->connection = null;
}
}
?>
Alles anzeigen
<?php
class Articles
{
public $err = '';
public $data;
public $success = false;
private $url;
private $user;
private $imager;
private $config;
private $connection;
public function __construct($config, $connection, $url)
{
$this->url = explode('-', $url[2]);
$this->user = new User($config, $connection);
$this->imager = new Imager($config, $connection);
$this->config = $config;
$this->connection = $connection;
$this->getVoting();
$this->CreateArticle();
}
public function Comment($comment)
{
if(empty($comment)) {
$this->err = 'Gib dein Kommentar ein.';
} elseif(strlen($comment) < 5) {
$this->err = 'Der Kommentar muss mindestens 5 Zeichen lang sein.';
} elseif(strlen($comment) > 50) {
$this->err = 'Der Kommentar darf maximal 50 Zeichen lang sein.';
} else {
$query = $this->connection->prepare('INSERT INTO sync_articles_comments (id, article, comment) VALUES (:id, :article, :comment)');
$query->execute([
':id' => $this->user->data['id'],
':article' => $this->url[0],
':comment' => $comment
]);
$this->success = true;
}
}
public function getComments()
{
$query = $this->connection->prepare('SELECT * FROM sync_articles_comments WHERE article = :article');
$query->execute([':article' => $this->url[0]]);
if($query->rowCount()) {
$flag = 0;
while($r = $query->fetchObject()) {
$user = $this->connection->prepare('SELECT username FROM users WHERE id = :id LIMIT 1');
$user->execute([':id' => $r->id]);
$row = $user->fetchObject();
if($flag == 0) {
echo '<div class="comment-box">
<div class="avatar">
' . $this->imager->Generate('direction=2/head_direction=2/user=' . $row->username) . '
</div>
<div class="comment left">
<div class="title">Kommentar von ' . $row->username . ':</div>
<div class="content">' . $r->comment . '</div>
</div>
</div>';
$flag = 1;
} else {
echo '<div class="comment-box">
<div class="avatar float-right">
' . $this->imager->Generate('direction=4/head_direction=4/user=' . $row->username) . '
</div>
<div class="comment right">
<div class="title">Kommentar von ' . $row->username . ':</div>
<div class="content">' . $r->comment . '</div>
</div>
</div>';
$flag = 0;
}
}
}
}
public function getArticles()
{
$query = $this->connection->prepare('SELECT id, title FROM sync_articles ORDER BY id DESC');
$query->execute();
if($query->rowCount()) {
while($r = $query->fetchObject()) {
if($this->url[0] === $r->id) {
echo '<li class="active">' . $r->title . '</li>';
} else {
echo '<li><a href="' . $this->config['website']['url'] . '/community/articles/' . $r->id . '-' . str_replace(' ', '-', strtolower($r->title)) . '">' . $r->title . '</a></li>';
}
}
}
}
public function getVoting()
{
$query = $this->connection->prepare('SELECT voting FROM sync_articles_voting WHERE article = :article AND voting = :voting');
$query->execute([
':article' => $this->url[0],
':voting' => 'like'
]);
$this->data['likes'] = $query->rowCount();
$query = $this->connection->prepare('SELECT voting FROM sync_articles_voting WHERE article = :article AND voting = :voting');
$query->execute([
':article' => $this->url[0],
':voting' => 'dislike'
]);
$this->data['dislikes'] = $query->rowCount();
}
public function CheckVoting()
{
$query = $this->connection->prepare('SELECT id FROM sync_articles_voting WHERE article = :article AND id = :id LIMIT 1');
$query->execute([
':article' => $this->url[0],
':id' => $this->user->data['id']
]);
if($query->rowCount()) {
return false;
} else {
return true;
}
}
public function Like()
{
$query = $this->connection->prepare('INSERT INTO sync_articles_voting (id, article, voting) VALUES (:id, :article, :voting)');
$query->execute([
':id' => $this->user->data['id'],
':article' => $this->url[0],
':voting' => 'like'
]);
}
public function Dislike()
{
$query = $this->connection->prepare('INSERT INTO sync_articles_voting (id, article, voting) VALUES (:id, :article, :voting)');
$query->execute([
':id' => $this->user->data['id'],
':article' => $this->url[0],
':voting' => 'dislike'
]);
}
public function CreateArticle()
{
$query = $this->connection->prepare('SELECT * FROM sync_articles WHERE id = :id LIMIT 1');
$query->execute([':id' => $this->url[0]]);
if($query->rowCount()) {
$r = $query->fetchObject();
foreach($r as $key => $value) {
$this->data[$key] = $value;
}
}
}
public function __destruct()
{
$this->url = null;
$this->data = null;
$this->config = null;
$this->connection = null;
}
}
?>
Alles anzeigen
Hab das Limit erreicht lol
Hab die Liste nochmal Updated und die Wartungspage hinzugefügt.
Danke, werde die Liste gleich erweitern.
EDIT: Main Thread Liste erweitert
#UPDATED
Hab mal den Main Thread updated und aufgeräumt. Hier ist noch eine übersicht was noch gemacht werden muss. Ihr habt vielleicht auch noch sachen die ich hinzufügen soll, oder vergessen habe.
TODO
Freundliche Grüsse,
Synergy
Ok und wie mit Cookie, mit mb_crypt oder so