ARGOS multigaming cms

Да, има я безплатно, но аз я ъпдейтвам от 4.2. 4.2 в текущо състояние има бъгове и не тръгва под php 7.4 и phpbb 3.3.5.

Тук съм дал линк към 4.4 и може да видиш, че има промени. Още в root папката, може да видиш core.php и config.env

Има промени почти навсякъде.
За това тези версии от 4.2 нагоре са private.
 
Няма ли лиценз тази система? Ако няма лицензиране не може да спре, който и да е да я открадне/присвои и да прави каквото си иска с нея.
 
100% си прав
Няма лиценз и няма и да има. Сложил съм дадени проверки на места и ще разчитам на тях. Някой може и да ги премахне, ако е по в час.

Версия 4.8 идва по-късно днес или утре. Почти е готова, onesignal-а е тестван и работи, остават подробности. Ще дам част от кода и видео как работи.
 
Същото може да се случи и на теб. Един ще я купи и ще започне да я препродава. Замисли се над тези неща, за да не останеш разочарован.
 
Решил съм, че ще си записвам кой я ползва и екстеншъните, модулите и стиловете, както и бъдещи ъпдейти ще се заплащат от съответните купувачи.

Някой и да я присвои, то тя ще остарее и пак ще трябва да си я купи. Няма да е в интерес на никой да я пуска безплатно.
Същото важи за всички нейни добавки, които не вървят с архива по-начало.
 
4.8:
Добавен е RSS Feeder, който работи с новините от системата (Активира се от админ панела и автоматично сетва линк в head секцията на всички темплейти с генерирания фийдър
(Забележка: ако сте активирали изкарване на новини от phpbb3 - rss фийдъра спира да работи)
Добавена е лог функция (активира се/спира се от админ панела), която ще логва действията на админите и потребителите (кой е написал коментар, кой е изтрил такъв, кой е ъпдейтнал/редактирал новини/страниците 'за нас' и т.н)
Функцията има 2 параметъра, единия е type другия текста, който ще се записва в датабазата за съответно действие, пример:
make_log('изтри коментар','admin'); Логва се текущото url, ip, username, user_color, дата и т.н.
На мястото на admin е user, така всичко ще се разграничи. Мислех да ползвам Monolog от github, но реших да направя малка функция, която ще е горе-долу със същата функционалност.
Логове по-стари от 3 месеца се изтриват автоматично. Също така в админ панела ще видите 2 таблици в индекса, които изкарват някои от последните логове на админите/потребителите.
Admin Notes e новата придобивка на мястото на Social Counter jquery плъгина, който беше премахнат поради нефункционалност.
Чрез Admin Notes може да си записвате текст, който се запаметява в textarea.
Добавен е нов рутер и съответно контролер за изтриване на бисквитки. Във всички темплейти във фуутъра вече има линк за изтриване на бисквитките. В админ панела също.
Целта е ако някой е объркал нещо, да му изтрие всички бисквитки и PHPSESSID.
Добавен е Push Notifications с OneSignal API-то в админ панела. Всички ваши регистрирани потребители, може да се абонират за вашите новости.
От админ панела може да пратите известия на всички ваши абонати през OneSignal или на определен такъв. (Всички айдита на абонатите се записват в argos_onesignal) таблицата.
Всичко е максимално олеснено, само трябва да се регистрирате, за да вземете апи кей, рест апи кей и да си настроите дали вашия сайт е ssl готов или не, ако не е ще получите под-домейн, който да въведете в настройките.

Самата функция onesignal_to_user($user,$title,$text,$url) може да се ползва навсякъде в системата за определен ивент. Тоест, ако някой е тръгнал да отговаря на чужд коментар, когато напише коментара, може да пуснете нотификация с функцията до потребителя, който
получава отговор, за да влезе в сайта и да види какъв отговор е получил на своя коментар.
Това обаче става само, когато потребителя е 'приел' да получава известия в сайта ви.
Код:
 //check what info to get from database
      if(filter_var($user, FILTER_VALIDATE_IP) !== false) {
        $type = 'user_ip'; 
      } else if(is_numeric($user)) {
        $type = "phpbb_user_id";
      } else {
        $type = "username";
      }

Функцията засича всичко автоматично, тоест дали ще въведете айпи на потребителя, чисто число(айди на потребител) или юзърнейм - все ще го намери.
А ако се чудите каква е тази информация за юзъра ? Много просто, това са вашите регистрирани потребители, които са със същата информация като на phpbb3 форума ви.
Нали все пак всичко е интегрирано :)


По-късно ще приложа още снимки и код, тъй като трябва да изляза сега.
 
Последно редактирано:
OneSignal_Changes.php
Код:
<?php
namespace App\Controllers\Admin\Ajax;
use PDO;
class OneSignal_Changes extends \App\Controllers\BaseController {
 
 
  public function __construct() {
 
    parent::__construct();
  
    $this->is_user_admin(); //check if user is admin, if not - redirect to forum login...
 
  }
  
  public function OneSignal_Changes() {
 

    if(is_ajax()) {
        if ($_SERVER['REQUEST_METHOD'] === 'GET'){
           //Make Push notifications
           $one_username = $_GET['one_username'];
           $one_link = $_GET['one_url'];
           $one_text = $_GET['one_text'];
           $one_title = $_GET['one_title'];
        
           if(!empty($one_username)) {
               if(onesignal_to_user($one_username, $one_title,$one_text,$one_link)) {
                   echo json_encode('Success');
               } else { echo json_encode('Missing data'); }
            
           } else {
              if(onesignal_to_all($one_title,$one_text,$one_link)) {
                  echo json_encode('Success');
              } else { echo json_encode('Missing data'); }
           
           }
         
        }
      
        if  ($_SERVER['REQUEST_METHOD'] === 'POST')  {
      
        //sql updating columns
        $sql = $this->db->prepare("update  ".$this->argos_db_prefix."config set onesignal_api_key=?, onesignal_rest_api_key=?, onesignal_domain_name=?");
        $sql->bindParam(1, $_POST['onesignal_api_key'], PDO::PARAM_STR);
        $sql->bindParam(2, $_POST['one_signal_rest_api_key'], PDO::PARAM_STR);
        $sql->bindParam(3, $_POST['onesignal_domain'], PDO::PARAM_STR);       
        $sql->execute();
      
        //manipulate templates
        $get_template = file_get_contents('admin/onesignal/onesignal_template.html',true);
      
        $replace = array("{{api_key}}",'{{sitename}}', '{{domain}}','{{localhost}}');
  
        if(!empty($_POST['onesignal_domain'])) {
            $subdomain=  "subdomainName:'".$_POST['onesignal_domain']."',";
        } else {
            $subdomain = "";
        }
        if(!is_null($_POST['localhost'])) {
            $localhost_test= "true";
        } else {
            $localhost_test ="false";
        }
        $replace_strings = array("".$_POST['onesignal_api_key']."",get_from_db_config('site_name'),$subdomain,$localhost_test);
      
        $str=str_replace($replace,$replace_strings,$get_template);
        write_utf8_file('admin/onesignal/onesignal_production.html', $str);

        //$everything = array('onesignal_template'=>$get_template,'localhost'=>$_POST['localhost'],'onesignal_rest_api_key'=>$_POST['one_signal_rest_api_key'],'onesignal_api_key'=>$_POST['onesignal_api_key'],'onesignal_domain'=>$_POST['onesignal_domain']);
        //$output = json_encode($everything);
        //echo $output; //debug
      
        echo json_encode(nl2br(htmlentities(file_get_contents('admin/onesignal/onesignal_production.html',true))));
      
        }
      
    }

 }
 
 
 
};

Това е ajax контролера, който отговаря за 2 неща - генерирането на готовия js за onesignal и го вкарва в продукшън файла, който автоматично се вика в <head> секцията.
Също така е отговорен и за изпращането на нотификейшъните.

Ето и клип за известията.
 
Последно редактирано:
Здравейте хора :)

Направих още една нова версия, която е подготовка за php 8. Променени бяха някои функции и е готова да замени $_SERVER,$_POST,$_GET и други глобални променливи с вградения контролер в phpbb, който е още по-защитен.

Разбрах и че в последната версия на темплейт системата Mustache има security fix за CSS.

На места имаше код, който можеше да се сбие и съм го сбил, защото не изглеждаше добре. За пример е контролера за показване на играчи в сървърите Greyfish_ShowPlayers. Сега е съкратен доста. Добавил съм is_ajax функцията в админските аякс модели, тъй като липсваше, не че е проблем но новата лог функция не работеше добре без нея. Вадеше json масива и прочие.

Направих и нов екстеншън.

Нарекох го advanced comments. Какво прави ?
Когато влезете в новина, вие може да я споделите с бутон във фейсбук, който се намира под стрелките за гласуване, може да сортирате коментарите DESC/ASC и е сложен лимитър на текстареа-та на 1000 символа, като лесно се сменя с променлива в самия екстеншън.
Всичко е тествано и работи. След 1000 символа текста се реже, но не съм го показал в клипа.

Екстеншъна може да се надгражда, като:
- може да се добавят отговори към всеки коментар
- може да се добави линк за изтриване на коментар директно (само за админи)
- може да се добави инлайн едит за админи и за юзъри

Това е по ваше решение, но всяка опция се заплаща.

Решил съм да направя утре и екстеншън за абониране чрез емейл, където ще има див, който е със z-index и ще се появява само в индекса, при първото влизане. Ако потребителя реши, пише си емейла, цъка бутон и вкарва емейла му в датабаза.
Емейлите, може да си ги изкарате в някоя текстареа или направо в phpmyadmin-a и да ги минете през екстеншъна за хром Gmass.
Вие си решавате, аз ще го направя и ще е 5 евро.

Този новия за коментарите е на цена 10 евро.

Давам линк към клипа за Advanced Comments EXT-a.
 
Благодаря :)


Само да кажа, че лаптопа на който е пуснат xamp-a е с 1.1ghz процесор и клиповете и самия load на сайта са сравнително бавни. Системата е бърза и зарежда светкавично иначе. Аз съм пуснал и разни други глупости и става мазало.
280 евро струва лаптопа и е марка primux, върви с лицензиран уин 10 и 3 години гаранция. Primux е испанска марка :)

ww.png
 
Buenas noches, chicos! :D

Новият екстеншън е тук, и бързам да ви представя каквото е новото тук. Направен е с мултиланг поддръжка, тоест поддържа всички езици в системата.

Както написах по-горе, екстеншъна изважда бокс, който има за цел да абонира потребител за вашите новини. Вкарва емейла в датабаза и айпито на потребителя. Айпито се въвежда, тъй като по-нататък може да се разшири малко и някъде да има бутон за 'Unsubscribe' (не съм го правил) и да маха емейла срещу дадено айпи. Няма как друго яче, тъй като се показва и на гости и т.н. Може с кукита да стане, но не го намирам за удачно. Тоест да се сетва куки със стойност в датабазата и на браузъра и да се прави проверка, но пък потребителя може да смени браузър/компютър и ще стане зле. С айпи е най-добре за това съм го и въвел.

Малко код:
Код:
    if(get_current_language() == 'bg') {
        $this->lang= array_merge($this->lang, [
         'ext_email_subscribe_welcome'=>'Здравей! Можеш да се абонираш за нашите новини като напишеш емейла си по-долу',
         'ext_email_subscribe_button'=>'Абонирам се',        
         'ext_email_subscribe_enter'=>'Въведи емейл',
         'ext_email_subscribe_denied'=>'Отказвам се',        
        ]);
    }
    if(get_current_language() == 'en') {
        $this->lang= array_merge($this->lang, [
         'ext_email_subscribe_welcome'=>'Hello! You can subscribe for our news, just type your email below',
         'ext_email_subscribe_button'=>'I subscribe',
         'ext_email_subscribe_enter'=>'Write your email',
         'ext_email_subscribe_denied'=>'Refuse',        
        ]);   
    }
    if(get_current_language() == 'ru') {
        $this->lang= array_merge($this->lang, [
         'ext_email_subscribe_welcome'=>'Привет! Вы можете подписаться на наши новости, написав свой адрес электронной почты ниже',
         'ext_email_subscribe_button'=>'Подписаться',   
         'ext_email_subscribe_enter'=>'Введите адрес электронной почты',
         'ext_email_subscribe_denied'=>'Я отказываюсь',        
        ]);       
    }
След това вече имате тези дефиниции в $this->lang[] масива и може да си ги ползвате. Езика се прихвща от функцията get_current_lang и се правят проверки с какъв език е потребителя и съответно сетва стойности според това.



И още малко бонус:
Код:
        if($this->ext_html_position =='up') {
            $send_div = 'prependTo("body");';
        } else {
            $send_div = 'appendTo("body");';
        }
       
        $this->dispatcher->dispatch('core_event_inside_head_ready_front','
       
         var cookie_check = getCookie("argos_email_subscribe_ok");
         var cookie_check2 = getCookie("argos_mail_subscribe_denied");
         if(cookie_check == null  && cookie_check2 == null) {
             $("'.$format_html_for_js.'").'.$send_div.'
           
         } else {
            $(".home-newsletter").remove();
         }
       
        
         //Detect on click
         $( ".denied_email_sub" ).click(function() {
              document.cookie=\'argos_mail_subscribe_denied=1;expires=Wed, 31 Oct 3099 08:50:17 GMT;path=/\';
              $(".home-newsletter").remove();
         });
        
        ');
       
        //submit form
        if(isset($_POST['send_email_sub'])) {
            $user_ip = $this->user_ip;
            $email = $_POST['subscriber_email'];
            //send data to db
            $go = $this->db->prepare("INSERT INTO ".$this->argos_db_prefix."emails (`email`,`user_ip`) VALUES(?,?)");
            $go->bindParam(1, $email, PDO::PARAM_STR);
            $go->bindParam(2, $user_ip, PDO::PARAM_STR);
            $go->execute();
            //send cookie to user to prevent box showing
            setcookie('argos_email_subscribe_ok', '1', time()+60*60*24*365, '/', $url, true);
        }



Екстеншъна има и опция
Код:
$this->ext_html_position = 'down'; //up or down is valid value for this, you can place it div on top or bottom of your site
Като може да си сетнете къде да се показва бокса.

направо изгледайте клипа:

 
Последно редактирано:
Още един екстеншън:

Цена: 7 евро

част от кода:
Код:
                $results    = $this->db->query("SELECT COUNT(`user_id`) FROM `".$this->forum_db."`.".$this->forum_db_prefix."_users WHERE user_id>1 AND user_email <> ''")->fetchColumn();
               
                $pagination = pagination($results, [
                'per_page'  => 15, //how many results per page
                'per_side'  => 3,
                'get_name'  => 'page'
                ]);
               
                $get_results = $this->db->query("SELECT * FROM `".$this->forum_db."`.".$this->forum_db_prefix."_users WHERE user_id>1 AND user_email <> ''  order by user_id DESC LIMIT {$pagination['limit']['first']}, {$pagination['limit']['second']}");
               
                if($get_results->rowCount() > 0) {
                //Table start
                echo ' 
                <table class="table">
                  <tr>
                    <td>'.$this->lang['ext_all_users_username'].'</td>
                    <td>'.$this->lang['ext_all_users_regdate'].'</td>
                    <td>'.$this->lang['ext_all_users_lastvisit'].'</td>
                    <td>'.$this->lang['ext_all_users_posts'].'</td>
                  </tr>
                ';
               
                while ($row=$get_results->fetch(PDO::FETCH_ASSOC)) {
                    //check status by user id
                    $user_id = $row['user_id'];
                    $mysql_get=$this->db->query("select session_user_id from `".$this->forum_db."`.".$this->forum_db_prefix."_sessions s INNER JOIN `".$this->forum_db."`.".$this->forum_db_prefix."_users u ON u.user_id = s.session_user_id WHERE session_user_id = '$user_id' AND (session_time + 300) > UNIX_TIMESTAMP(NOW())");
                    $fetchrow = $mysql_get->fetch(PDO::FETCH_ASSOC);
                   
                    $status = $fetchrow['session_user_id'];
                    if(!empty($status)) {
                     $status_icon = url().'/ext/pok4/all_users/img/online-icon.png';
                    } else {
                     $status_icon = url().'/ext/pok4/all_users/img/online-red-icon.png';
                    }
                    $user_color = $row['user_colour'];
                    if(empty($user_color)) { $user_color = '000000'; }
                    $regdate =date("d.m.y h:i:s",$row['user_regdate']);
                    $last_visit = date("d.m.y h:i:s", $row['user_lastvisit']);
                    $user_posts = $row['user_posts'];
                    echo '<tr>';
                    echo '<td><a style="color:#'.$user_color.' !important" href="'.base_forum_url().'memberlist.php?mode=viewprofile&amp;u='.$user_id.'" target="_blank">'.$row['username'].'</a> <img src="'.$status_icon.'" alt="status icon"/></td>';
                    echo '<td>'.$regdate.'</td>';
                    echo '<td>'.$last_visit.'</td>';
                    echo '<td>'.$user_posts.'</td>';
                    echo '</tr>';
                }
               
                //table end
                echo '</table>';
               

                echo $pagination['output'];

Екстеншъна създава custom страница /pages/all_users и изкарва по 15 потребителя на страница с иконка за статус и информация за последна визита, дата на регистрация и бройка постове във форума.
Може да се разшири по-ваше желание с извличане на още конкретна информация.
 
version 5.0:
Оптимизации по кода
Добавени дата атрибути към коментарите с цел по-лесна манипулация с JS.
Добавен е клас table-responsive на таблиците в админ панела
Изкарани са бутони за смяна на езиците в esport темата (това си е било от преди, забравили са да ги добавят)
Заради грешка с '/' е имало лек бъг с показването на аватари на потребители в чата, които нямат такива (фикснато)
В gameforest темата в коментарите към новините, потребителите без аватар са с били с по-големи такива. Вече е оправено и са с размера като на такива със.
В revelio темата линковете към потребителските профили в чата на потребители без зададен цвят на група бяха с много невидим цвят на href връзките (сега е по-добре)

Това е новата версия.
Сега вече може да се заиграете с дата атрибутите на коментарите и по-лесно да ги манипулирате. Всеки коментар е с атрибут data-comment-aid='id'
Другите промени не са от съществено значение, но все пак с цел подобряване на юзър ексипириънса ги направих :)

Подготвям още няколко екстеншъна.

Напомням, че приемам всякакви предложения за надграждане на системата с функции :)
 
Не е много по темата, обаче ми направи впечатление нещо в заявките - което съм виждал и на други места.

- Защо никога и почти никой след заявката не употребява знака ;
 
Аз въобще не съм се и замислял. Ей сега се разчетах. На английски е semicolon.
Тука са писали повече по темата.

Може да видиш това:
If you're sending just one statement, technically you can dispense with the statement terminator ; in a script, as you're sending more than one statement, you need it.

Демек ако сендваш 2 заявки, тогава може да го ползваш..
Примерно INSERT ....; INSERT....
Аз така го разбирам :D

Ето от части sql файла на системата:

Код:
<?php
$sql = '
  CREATE TABLE IF NOT EXISTS `table_prefix_aboutus` (
    `aboutus` text NOT NULL
  ) ENGINE=MyISAM DEFAULT CHARSET=utf8;



  CREATE TABLE IF NOT EXISTS `table_prefix_comments` (
    `id` int(10) NOT NULL AUTO_INCREMENT,
    `author` text NOT NULL,
    `text` text NOT NULL,
    `date` text NOT NULL,
    `avatar` text NOT NULL,
    `nick_colour` text NOT NULL,
    `user_id` text NOT NULL,
    `newsid` text NOT NULL,
    `vote` varchar(255) DEFAULT \'0\',
    PRIMARY KEY (`id`)
  ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ;
 
  CREATE TABLE IF NOT EXISTS  `table_prefix_onesignal` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `user_id` varchar(255) DEFAULT \'0\',
  `username` varchar(255) DEFAULT \'0\',
  `user_ip` varchar(255) DEFAULT \'0\',
  `phpbb_user_id` varchar(255) DEFAULT \'0\',
  `date` varchar(255) DEFAULT \'0\',
  PRIMARY KEY (`id`)
  ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 
  CREATE TABLE IF NOT EXISTS  `table_prefix_logs` (
  `id_inc` int(10) NOT NULL AUTO_INCREMENT,
  `id` int(10) NOT NULL,
  `username` text NOT NULL,
  `user_ip` varchar(255) DEFAULT \'0\',
  `user_colour` varchar(255) DEFAULT \'0\',
  `date` varchar(255) DEFAULT \'0\',
  `action` text NOT NULL,
  `destination_link` varchar(255) DEFAULT \'0\',
  `type` varchar(255) DEFAULT \'0\',
  PRIMARY KEY (`id_inc`)
  ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

  CREATE TABLE IF NOT EXISTS `table_prefix_config` (
    `id` int(10) NOT NULL AUTO_INCREMENT,
    `site_name` text NOT NULL,
    `logo_text_small` text NOT NULL,
    `logo_text_big` text NOT NULL,
    `favicon` text NOT NULL,
    `admin_email` text NOT NULL,
    `chat_enable` text NOT NULL,
    `gallery_enable` text NOT NULL,
    `img_upload_enable` text NOT NULL,
    `file_upload_enable` text NOT NULL,
    `poll_enable` text NOT NULL,
    `footer_stats_enable` text NOT NULL,
    `socials_enable` text NOT NULL,
    `fb_link` text NOT NULL,
    `tw_link` text NOT NULL,
    `goo_link` text NOT NULL,
    `servers_enable` text NOT NULL,
    `video_enable` text NOT NULL,
    `cookie_policy` text NOT NULL,
    `default_language` text NOT NULL,
    `head_box_text` text NOT NULL,
    `last_news_link` text NOT NULL,
    `last_news_name` text NOT NULL,
    `google_analytics` text,
    `google_site_verify` text,
    `rating_enable` varchar(255) DEFAULT \'0\',
    `rss_feed_enable` varchar(255) DEFAULT \'0\',
    `logs_enable` varchar(255) DEFAULT \'1\',
    `chat_auto_delete` varchar(255) DEFAULT \'1\',
    `chat_auto_delete_after` varchar(255) DEFAULT \'20\',
    `style` varchar(255) NOT NULL DEFAULT \'default\',
    `phpbb_news` varchar(255) NOT NULL DEFAULT \'0\',
    `phpbb_news_forum_id` varchar(255) NOT NULL DEFAULT \'0\',
    `files_per_page` varchar(255) DEFAULT \'5\',
    `news_per_page` varchar(255) DEFAULT \'5\',
    `videos_per_page` varchar(255) DEFAULT \'5\',
    `pics_per_page` varchar(255) DEFAULT \'5\',
    `banlist_url` varchar(255) DEFAULT \'\',
    `hide_test_menus` varchar(255) DEFAULT \'0\',
    `onesignal_enable` varchar(255) DEFAULT \'0\',
    `onesignal_api_key` varchar(255) DEFAULT NULL,
    `onesignal_rest_api_key` varchar(255) DEFAULT NULL,
    `onesignal_domain_name` varchar(255) DEFAULT NULL,
    PRIMARY KEY (`id`)
  ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ;


  INSERT INTO `table_prefix_config` (`id`, `site_name`, `logo_text_small`, `logo_text_big`, `favicon`, `admin_email`, `chat_enable`, `gallery_enable`, `img_upload_enable`, `file_upload_enable`, `poll_enable`, `footer_stats_enable`, `socials_enable`, `fb_link`, `tw_link`, `goo_link`, `servers_enable`, `video_enable`, `cookie_policy`, `default_language`, `head_box_text`, `last_news_link`, `last_news_name`, `google_analytics`, `google_site_verify`, `rating_enable`,  `style`, `chat_auto_delete`, `chat_auto_delete_after`, `phpbb_news`, `phpbb_news_forum_id`, `files_per_page`, `pics_per_page`, `news_per_page`, `videos_per_page`, `banlist_url`) VALUES
  (1, \'Argos\', \'Your Gaming Community\', \'ARGOS\', \'assets/img/favicon.ico\', \'email@gmail.com\', \'1\', \'1\', \'1\', \'1\', \'1\', \'1\', \'1\', \'http://facebook.com\', \'http://twitter.com\', \'http://google.bg\', \'1\', \'1\', \'1\', \'en\', \'Welcome to Argos!<br/>Best multi-gaming system!\', \'http://google.com\', \'The world has broken.\', \'\', \'\', \'1\', \'default\', \'1\', \'20\', \'0\', \'0\',\'5\',\'5\',\'5\',\'5\',\'\');


  CREATE TABLE IF NOT EXISTS `table_prefix_contacts` (
    `id` int(12) NOT NULL AUTO_INCREMENT,
    `date` text COLLATE utf8_unicode_ci,
    `ip` text COLLATE utf8_unicode_ci,
    `username` text COLLATE utf8_unicode_ci,
    `text` text COLLATE utf8_unicode_ci,
    `question` text COLLATE utf8_unicode_ci,
    `email` text COLLATE utf8_unicode_ci,
    `respond` int(11) DEFAULT \'0\',
    PRIMARY KEY (`id`)
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=0 ;

  CREATE TABLE IF NOT EXISTS `table_prefix_dpolls` (
    `id` int(12) NOT NULL AUTO_INCREMENT,
    `poll_question` text NOT NULL,
    `poll_answer` text NOT NULL,
    `poll_votes` int(11) DEFAULT \'0\',
    PRIMARY KEY (`id`)
  ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=0;


  CREATE TABLE IF NOT EXISTS `table_prefix_dpolls_votes` (
    `id` int(12) NOT NULL AUTO_INCREMENT,
    `poll_id` text NOT NULL,
    `ip` text NOT NULL,
    PRIMARY KEY (`id`)
  ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ;

  CREATE TABLE IF NOT EXISTS `table_prefix_files` (
    `id` int(10) NOT NULL AUTO_INCREMENT,
    `picture` text NOT NULL,
    `author` text NOT NULL,
    `down_counts` text NOT NULL,
    `date` text NOT NULL,
    `size` text NOT NULL,
    `type` text NOT NULL,
    `game` text NOT NULL,
    `type_not_real` text NOT NULL,
    `game_not_real` text NOT NULL,
    `category` text NOT NULL,
    `opisanie` text NOT NULL,
    `link` text NOT NULL,
    `name` text NOT NULL,
    PRIMARY KEY (`id`)
  ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ;

  CREATE TABLE IF NOT EXISTS `table_prefix_gallery` (
    `id` int(12) NOT NULL AUTO_INCREMENT,
    `date` text COLLATE utf8_unicode_ci,
    `uploader` text COLLATE utf8_unicode_ci,
    `pic_link` text COLLATE utf8_unicode_ci,
    PRIMARY KEY (`id`)
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=0;

  CREATE TABLE IF NOT EXISTS `table_prefix_greyfish_servers` (
    `id` int(12) NOT NULL AUTO_INCREMENT,
    `ip` text NOT NULL,
    `port` text NOT NULL,
    `players` text NOT NULL,
    `maxplayers` text NOT NULL,
    `version` text NOT NULL,
    `type` text NOT NULL,
    `map` text NOT NULL,
    `hostname` text NOT NULL,
    `vote` text NOT NULL,
    `status` text NOT NULL,
    `gtrs` int(11) DEFAULT \'0\',
    PRIMARY KEY (`id`)
  ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=0;

  CREATE TABLE IF NOT EXISTS `table_prefix_jquery_js` (
    `id` int(12) NOT NULL AUTO_INCREMENT,
    `jquery_js` text NOT NULL,
    `jquery_js_name` text,
    PRIMARY KEY (`id`)
  ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

  CREATE TABLE IF NOT EXISTS `table_prefix_menus` (
    `id` int(12) NOT NULL AUTO_INCREMENT,
    `title` text NOT NULL,
    `the_content` text NOT NULL,
    `position` text NOT NULL,
    PRIMARY KEY (`id`)
  ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=0;

  CREATE TABLE IF NOT EXISTS `table_prefix_news` (
    `id` int(10) NOT NULL AUTO_INCREMENT,
    `author` text NOT NULL,
    `title` text NOT NULL,
    `seourl` text NOT NULL,
    `text` text NOT NULL,
    `date` varchar(128) DEFAULT NULL,
    `comments` int(3) DEFAULT NULL,
    `comments_enabled` varchar(128) DEFAULT NULL,
    `img` text NOT NULL,
    `vote` varchar(255) DEFAULT \'0\',
    PRIMARY KEY (`id`)
  ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1000;

  CREATE TABLE IF NOT EXISTS `table_prefix_pages` (
    `id` int(12) NOT NULL AUTO_INCREMENT,
    `page_name` text NOT NULL,
    `page_title` text NOT NULL,
    `menu_type` text NOT NULL,
    `type` varchar(255) NOT NULL DEFAULT \'0\',
    PRIMARY KEY (`id`)
  ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ;

  CREATE TABLE IF NOT EXISTS `table_prefix_sliders` (
    `id` int(12) NOT NULL AUTO_INCREMENT,
    `slider_img` text COLLATE utf8_unicode_ci,
    `is_link` text COLLATE utf8_unicode_ci,
    `slider_link` text COLLATE utf8_unicode_ci,
    `text` text COLLATE utf8_unicode_ci,
    PRIMARY KEY (`id`)
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=0 ;

  CREATE TABLE IF NOT EXISTS `table_prefix_voting_ip_news` (
    `ip_id` int(11) NOT NULL AUTO_INCREMENT,
    `mes_id_fk` int(11) DEFAULT NULL,
    `ip_add` varchar(40) DEFAULT NULL,
    PRIMARY KEY (`ip_id`)
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ;
';
$sql = str_replace("table_prefix_", $table_prefix, $sql);

Той се вика в Install контролера и се минава през:
Код:
$dbh->query($sql);

Както може да видиш, в този случай след всяко създаване на таблица (след всяка заявка за създаване на такава) има ;, за да се мине към другата.
 
Подготвям версия 5.1.


Промените засега са:

Добавено input поле с линка на видео клипа в админ панела при редакция (да може да го редактирате, ако понякой път не показва видеото)
Добавена е опция за exclude на линкове в юзър access файла App\Controllers\Admin\Add_Edit_User_Access.php
(ако не искате някои страници да излизат в менюто за даване на права на потребителите към админ панела)
В orizon темата беше добавена темплейт дефиниция за изкарване на аватара в панела на потребителя в дясно, тъй като до момента седеше линк само към no_avatar.png.
(липсваше проверка за изкарване на аватара на потребителя)
Премахнати повтарящи се коментари към кода на места.
Премахната е ventrilo поддръжката, има няма 10 сървъра на кръст в gametracker.com

Просто ще търся някакъв начин да се инициират аякс заявките в самите класове на екстеншъните, че иначе става голямо мазало.
Нови файлове, викане на функции, нови кънекции към дб и прочие, за има няма 1-2 sql заявки...
Щом намеря начин, който е подходящ и не е много хардкоднат, ще дам и демо от екстеншъна и кода.
 
Последно редактирано:
Здравейте, хора :)

Почти всичко е готово, намерих приличен вариант за това, което искам.
Следващия екстеншън е "тикет" система и работи с няколко аякс заявки, има каптча и добавя къстъм админ страница, където админите могат да отговарят на тикетите. Потребителите и админите могат да затварят тикети/или изтриват.


Но ето какво направих, за да постигна това нещо.

Първо аутолоудъра в системата не поддържа добавяне на неймспейсове на цяла директория, така че писах на авторите да видим дали ще дадат решение. Един е питал в гитхъб, но са му дали решение, като са дали линк към по-стара версия, където се е поддържало това нещо. Системата ползва версия 2.0, а след нея има още 2, които не са със съществени промени.

За това тествах с:
Код:
$loader->setClassFile('ext\pok4\the_tickets', 'ext/pok4/the_tickets/ext.php');
Така всичко тръгна, рутера беше:
Код:
$collection->attachRoute(new PHPRouter\Route('/ajax/ext/:id/:id', [
    '_controller' => 'ext\pok4\the_tickets::ajax',
    'methods' => ['POST','GET'],
    'parameters'=> ['template_file'=>'ajax'],
]));

и добавих неймспейсове към класа на екстеншъна:
Код:
namespace ext\pok4;
use \PDO;

Всичко тръгна като по-вода :) Но... Как ще се случват нещата, винаги ли ще трябва да посещаваме core.php, за да добавяме ново рутиране и нов аутолоудър ?
Ами не, написах малки допълнения към рутиращия клас и сега той изглежда така:
Код:
//Detect ajax from extensions
if(strpos($_SERVER['REQUEST_URI'], 'ajax/ext/')) {
    $ext_author = get_string_between($_SERVER['REQUEST_URI'],'ajax/ext/','/');
    $ext_name = get_string_between($_SERVER['REQUEST_URI'],'ajax/ext/'.$ext_author.'/','/');
    $filter_ext_name = strtok($ext_name,'?'); //to prevent $_GET parameters after ext_name...
   
    $collection->attachRoute(new PHPRouter\Route('/ajax/ext/:id/:id', [
    '_controller' => "ext\\".$ext_author."\\".$filter_ext_name."::ajax",
    'methods' => ['POST','GET'],
    'parameters'=> ['template_file'=>'ajax'],
    ]));
}

И като се достъпи към линка http://your-site.com/ajax/ext/pok4/the_tickets ще го премести към контролера на екстеншъна и съответно към ajax метода, където може да си ползвате АБСОЛЮТНО всички функции на системата. И така няма да се създават нови файлове и да има главоблъсканица.
Само чакам аутолоудъра да тръгне с цяла директория с префикс, а не отделно както е сега и всичко ще е готово.

Сигурно се питате какви ще са заявките от фронт частта ? Ами ето такива:
Код:
          $.ajax({
              url: "/ajax/ext/pok4/the_tickets",
              type: "GET",
              data:{"id": "'.$tid.'"},
              success: function(data){
              //location.reload();
              console.log(data);
              }
            });

Това е примерна заявка, която е тествана и работи.
ajax() метода изглежда така:
Код:
  public function ajax() {
     
      //make request to db for test
      if(is_ajax() && isset($_GET['id'])) {
         
       $id= $_GET['id'];
       $query_check = $this->db->query("SELECT * FROM ".$this->argos_db_prefix."tickets WHERE id=$id ORDER by id DESC");
       $row=$query_check->fetch(PDO::FETCH_ASSOC);
       echo $row['username'];
      
      }
  }

Може да си задавате и POST и GET, тествал съм и с 2-та метода, работят.

Всичко изглежда супер и съм радостен, че намерих начин. Остава само шибания аутолоудър да тръгне.

Ако се питате дали е имало по-добър начин за рутиранията - не, писах в гитхъб и казаха дори, че не е възможно, но им дадох този начин и след това писаха, че от това по-добре не може да се направи.
Екстеншъна е също кадърно написан, има мултиланг поддръжка и ще направя видео с демо и разбира се ще дам част от кода.
 
Това е CMS реално погледнато но какво дава повече от един WP със WP w3all phpBB и LGSL, всичко останало го има като безплатни плъгини?
Това, че правиш някакви неща е супер но помисли дали си струва цялата работа.
 
Това е система, която по-принцип е гейминг ориентирана, но може да се ползва за всичко друго.
Надграждам я, защото знам, че е много по-лесна за допълнение с къстъм код от колкото Wordpress.
Прав си, че за wp има почти всичко като плъгини, да не кажа и всичко, което го има и в системата тук.

Но знам и съм сигурен, че тази система така както е написана сега е супер-мега-лесна за надграждане и модифициране.
Mustache е толкова прост и в допълнение с assign функцията е просто играчка да си пишеш каквото и било и да си го инжектираш в евентите на системата.
Кода е чист и не ти бърка в здравето. Темплейтите са с core.js файл, който е стандартизиран за всички тях, като има изключение за revelio там с 1 див.
Това не пречи разбира се, но имам в предвид, че и лесно се пишат темплейти за системата. (по-нататък ще направя някоя по-модерна от тези сега)

За това ще я допълня с много екстеншъни и ще чакам човек/хора, които имат ресурси и време и желаят да стартират гейминг проект, хора сериозни и с цели.
Каквото ми се каже - ще го донапиша, то почти не остана нещо което да не е минато като код в системата. Останалите неща ще са лесни за създаване (може да се донапише екстеншън за закупуване на кредити, шоп система за купуване на екстри към сървъри, регистрация към различни сървъри (както съм писал league of legends, world of wacraft, Minecraft и Mu Online) и след като се създадат тези неща и се изведат и някои статистики си става мега гейминг проект с поддръжка на много игри, купуване на привилегии/трейдинг на различни предмети и прочие.

Аз не вярвам да е проблем да портна и вече създадени неща от други хора за тези игри, които изредих. В Ac-web има системи за Wow, в Darksteam има системи за Mu Online и шопове (от там може да се взаимодейства с код, като аз ще го допълня/редактирам/санитизирам), ако е нужно.

Закупуването на кредити може да стане с SMS (Имам екстеншъни вече създадени пробно) и с Paypal API-то (работил съм и с него)
Някой, ако има желание, може и да се интегрира и https://www.paymentwall.com/ (PaymentWall) за закупуване на точки/кредити или там както го наричате. От там нататък, чрез тях на база акаунтите за различните игри в шопове за всяка една, може да се купува какво ли не. Всичко ще е интегрирано, работещо с еднакви сесии и сравнително бързо.

Мога да изведа и къстъм регистрация, която да работи със Steam API / Facebook API (или и 2-те)

Съмнявам се, че WP ще предложи такива неща в момента :)

Ако се съмнявате в кода, то винаги след закупуване може да го дадете на човек, който мислите, че чатка и да го прегледа.
От там нататък, ако сте недоволни от него - мога да върна част от сумата, която сте заплатили, но ще поставя условие, повече да не се обвързваме занапред.

По-принцип бързо се уча на нови неща и занапред ще има допълнения и редакции. Особено при PHP 8 и новите версии на phpbb3.
Така че, ако има недоволни - спокойно, парите се връщат :)
 
Здравейте,
Представям ви новия екстеншън 'Тикет' - с него може да дадете на потребителите възможност, да се свързват с администраторите на сайта по-различни въпроси. Екстеншъна поддържа: Странициране със собствената функция в системата, Ajax и мултиланг.

Демо:


Работи коректно. Новия аутолоудър е супер и има дори кеш, който се съхранява при останалия кеш в cache/ папката.
Бърз е и няма проблеми в системата с него. По-горе бях написал, че чакам отговор от създателя, но реших да го сменя, тъй като последния ъпдейт е от преди години.
Сега аутолоудъра е този - https://github.com/nette/robot-loader (работи коректно и на php 7.4, но пише, че е за 8)
Има още промени, но ще ги съобщя в друг пост.

Давам целия код на екстеншъна, за да видите как е написан. Ако имате препоръки - пишете.

Pastebin -- https://pastebin.com/dh4BabYH (съжалявам, ако на места не е индетнат кода, но при мен няма проблем)

Цената на екстеншъна е 30 евро.
 
Последно редактирано:

Горе