ARGOS multigaming cms

Ти като ползваш php8, можеш да си слагаш изрично типове на променливите, така че да хващаш такива проблеми отрано.
 
Аха, сега има друг проблем...
Имаше правило, което маха / наклонената черта накрая на линковете, обаче ajax заявките се дънят. До сега си играх с htaccess-a (някой ако е браузвал, може да му е дало някоя грешка)

Ползвам това правило:

#remove end trailing slash from urls
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} /(.*)/$
RewriteRule ^ /%1 [R=301,L]

Някой има ли идея, как да стане, за да не действа на /ajax/ в url-то... Търсих, само много малко хора са писали, че имат проблем и един беше дал някакви правила, но като ги сложа и се скапва всичко.

Трябва ми същото като горното, но да не работи за /ajax/ в линковете... Давайте идеи..

едит:

Оправих се:

#remove trailing slash from urls
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} /(.*)/$
RewriteCond %{REQUEST_URI} !/ajax
RewriteRule ^ /%1 [R=301,L]
 
Последно редактирано:
5.9:
- редакции в htaccess-a (добавени проверки за съществуващи модули и леки промени за exclude на ajax заявките от правилата)
- добавен е base path за рутирането и има проверка дали системата е в под-папка или не.
- vbox поддръжката за видео клипове като категория е премахната.
- В админ панела имаше едно изображение към no_avatar-a и то с http:// отпред от imgur - премахнато е и е сложено линк към локален no_avatar.png
 
Последно редактирано:
Нова документация - https://argos.pw/readme/documentation.html

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

Част от кода:
PHP:
    public function admin_form() {
       
       
        $go = $this->db->query("SELECT * FROM ".$this->argos_db_prefix."pages order by id DESC");
       
        $print = "";//globalize
        $count = 0;//globalize
        if ($go->rowCount() > 0) {
            while($row = $go->fetch(PDO::FETCH_ASSOC)) {
             $page_title = $row['page_title'];
             $page_name = $row['page_name'];
             $id=$row['id'];
             $type = $row['type'];
             $menu_type = $row['menu_type'];
             $count++;
             $print .= "<span class='pageclick' data-sel-id='$id'>$count - $page_title <span data-type='$type' data-pagetitle='$page_title' data-menutype='$menu_type' data-id='$id' data-pagename='$page_name' class='btn-up btn btn-sm btn-info'><i class='fa fa-arrow-up'></i></span><span data-type='$type' data-pagetitle='$page_title' data-menutype='$menu_type' data-id='$id' data-pagename='$page_name' class='btn-down btn btn-sm btn-info'><i class='fa fa-arrow-down'></i></span></span><br/>";
            }
        }
        return $print;
    }

   
    public function js_extract() {
       
        $print = '
       
        //remove last and first btn-up/down to prevent errors
        $(".pageclick").find(".btn-up").first().remove();
        $(".pageclick").find(".btn-down").last().remove();
       
        $(".btn-up").click(function(e) {
           var data_id = $(this).attr("data-id");
           var data_pagename = $(this).attr("data-pagename");
           var data_type = $(this).attr("data-type");
           var data_title = $(this).attr("data-pagetitle");
           var data_menutype = $(this).attr("data-menutype");
           $(this).hide();
         
           //ajax call
               $.ajax({
                url: "/ajax/ext/pok4/down_up_pages",
                type: "POST",
                data:  {parameter:data_id,type:"up",pagename:data_pagename,type_page:data_type,page_title:data_title,menu_type:data_menutype},
                success: function(data){
                  location.reload();
                  //alert(data);
                }
            });
        });
       
        $(".btn-down").click(function(e) {
           var data_id = $(this).attr("data-id");
           var data_pagename = $(this).attr("data-pagename");
           var data_type = $(this).attr("data-type");
           var data_title = $(this).attr("data-pagetitle");
           var data_menutype = $(this).attr("data-menutype");
           $(this).hide();
           
           //ajax call
               $.ajax({
                url: "/ajax/ext/pok4/down_up_pages",
                type: "POST",
                data:  {parameter:data_id,type:"down",pagename:data_pagename,type_page:data_type,page_title:data_title,menu_type:data_menutype},
                success: function(data){
                  location.reload();
                  //alert(data);
                }
            });
        });
               
        ';
        return $print;
    }
   
    public function ajax() {
       
        if(is_ajax()) {
            $id = (int)$_POST['parameter'];
            $pagename = htmlspecialchars($_POST['pagename']);
            $type_page = htmlspecialchars($_POST['type_page']);
            $page_title = htmlspecialchars($_POST['page_title']);
            $menu_type= htmlspecialchars($_POST['menu_type']);
 
            if($_POST['type'] == 'up') {
               
                //get next
                $go = $this->db->query('select * from '.$this->argos_db_prefix.'pages where id = (select min(id) from '.$this->argos_db_prefix.'pages where id > '.$id.')');
                $row = $go->fetch(PDO::FETCH_ASSOC);
               
                //next row info
                $id_next = $row['id'];
                $pagename_next = $row['page_name'];
                $page_title_next = $row['page_title'];
                $menu_type_next = $row['menu_type'];
                $type_next = $row['type'];

                //swap positions
                $this->db->query('UPDATE '.$this->argos_db_prefix.'pages SET page_name="'.$pagename_next.'",page_title="'.$page_title_next.'",menu_type="'.$menu_type_next.'",type="'.$type_next.'" WHERE id="'.$id.'"');
                $this->db->query('UPDATE '.$this->argos_db_prefix.'pages SET page_name="'.$pagename.'",page_title="'.$page_title.'",menu_type="'.$menu_type.'",type="'.$type_page.'" WHERE id="'.$id_next.'"');
               
            }
           
            if($_POST['type'] == 'down') {  

                //get previous element id
                $go = $this->db->query('select * from '.$this->argos_db_prefix.'pages where id<"'.$id.'" order by id desc');
                $row = $go->fetch(PDO::FETCH_ASSOC);
               
                //previous row info
                $id_previous = $row['id'];
                $pagename_previous = $row['page_name'];
                $page_title_previous = $row['page_title'];
                $menu_type_previous = $row['menu_type'];
                $type_previous = $row['type'];
               
                 //swap positions
                $this->db->query('UPDATE '.$this->argos_db_prefix.'pages SET page_name="'.$pagename_previous.'",page_title="'.$page_title_previous.'",menu_type="'.$menu_type_previous.'",type="'.$type_previous.'" WHERE id="'.$id.'"');
                $this->db->query('UPDATE '.$this->argos_db_prefix.'pages SET page_name="'.$pagename.'",page_title="'.$page_title.'",menu_type="'.$menu_type.'",type="'.$type_page.'" WHERE id="'.$id_previous.'"');
               
            }
        }
    }

Цена: 7 евро. (Must have, ако искате да преподреждате менюто без проблеми)
 
Печаташ hardcodeнат в PHP JavaScript? Ии защо не махнеш поначало невалидните бутони moveUp/moveDown от първия и последния елемент, вместо да ги рендерираш и в последствие да ги почистваш с JS?
 
Здравей :) Да не забравяме, че това е "модулче" към системата и може да се изкл./вкл., ajax заявките се въртят в самия файл (може да видиш по-долу метода) (всичко е накуп и е лесно, да се работи така - поне на мен)
Това е само 1 прост клас, няма нищо друго към него. Екстеншъните са 3 файла (migrate.php (Не се пипа въобще, еднакъв е за всеки екстеншън), sql.php там има 2 променливи $sql_drop и $sql_insert където се наслагват sql заявките свързани с конкретен екстеншън и ext.php (където е кода на самия екстеншън - класа, дал съм част от него по-горе)

Системата така работи, не съм търсил начини, за да мога да отделям html/js в отделни файлове и екстеншъните да работят с тях. Да инклудвам файлове - не искам. Писал съм 2 екстеншъна за phpbb, но те са на symphony(twig) и там има благинки свързани с инжектирането на код в темплейтите... Работят с темплейтни файлове със самите екстеншъни и не се налага, да се инклудват файлове.
Добре е сглобено, но това е по-проста система и на този етап - така... А и по тези аякс заявки няма какво да бърникат потребителите... (особено ако не разбират)
Ако някой има предложение - нека пише и поне да даде пример какво мога да направя, за да подобря практиките на системата в момента...

За бутоните не те разбрах, няма невалидни бутони - всички работят, просто ползвам hide(), за да ги скрия, за да не се цъкват отново... Когато някой цъкне някой бутон набързо 2 пъти и ... става мазало. За това ги крия с hide().
Така няма начин някой да сгреши.

Много се извинявам за бавното зареждане (лаптопа е слаб и се мъчи много), системата по принцип "лети" - както може да видите и от демото на най-евтин план към jump.bg. Не ми се мисли, ако е на някой хубав VPS как ще е...
 
//remove last and first btn-up/down to prevent errors
$(".pageclick").find(".btn-up").first().remove();
$(".pageclick").find(".btn-down").last().remove();

А, това ли имаше в предвид ?
 
Интересно :) Да, това е доста прост вариант, иначе трябва иф-ове в while цикъла (сравнение на 1-ви и последен резултат) и променливата $print и там да я има в самите иф-ове и ще стане така, че да я има на 3 места в while цикъла. Така е доста по-улеснено и без главоболия...
Така сметнах, че ще е най-добре. Има едно 'мигване' в началото, но много бързо се скриват :D
Общо взето като функционалност го догодих и съм доволен.

В while цикъла не ми се бърка, виж ако беше foreach : https://stackoverflow.com/questions...he-first-and-last-iteration-in-a-foreach-loop

Давам го и тук:
foreach ($array as $key => $element) {
if ($key === array_key_first($array)) {
echo 'FIRST ELEMENT!';
}

if ($key === array_key_last($array)) {
echo 'LAST ELEMENT!';
}
}

Не че е невъзможно и за while цикъла + това има $count, първия резултат е кажи/речи готов If($count==1), за последния не знам, може би нещо такова:
if ( $count== ( $num_rows - 1 ) )

Както и да е, бита карта е и този екстеншън.

Вчера си играх да тествам цялата система и всичко работи за сега. Има да до-оправя под Orizon и revelio емейл събскрайб екстеншъна, че нещо стила не е както при другите.
След това ще напиша още няколко екстеншъна и след като ги направя ще направя една хубава тема, която наистина ще е гейминг тема в пълния смисъл. Ще ползва последния bootstrap и всички новости от сегашните темплейти. (видях, че има ъпдейти по някои от jquery плъгините)
Цветовата гама ще е лилава, понеже този цвят ми е любим и може би темплейта ще го кръстя purplemagic.
След стила ще добавя навсякъде коментари по кода + допълване на документацията (с глобалните променливи, глобалните функции и евентите + как да напишете първия си екстеншън сами)
Екстеншъните вече са над 25 и това е супер :)
 
Здравейте хора,

Най-сетне всичко с профилния екстеншън тръгна, за да тествате посетете:
https://argos.pw/pages/profile?buy_credits=1 (acc: demo pass: demo12)

След това, може да посетите - https://argos.pw/pages/profile?buy_logs=1 (за да видите лога, че сте купили кредити)
След всичко, ето и демо на банер статистиката:

profile



Забележка: Това е тестово демо, сетнати са тестови параметри и е само за тест.

Защо избрах paymentwall?
- Добра документация
- Пълна мултиланг езикова поддръжка за уиджета (вкл. и български)
- Много начини на разплащане (по default са над 50), но ако искате да имате и paypal и някои дебитни карти, трябва да изпратите документи към paymentwall, за да ви ги активират в уиджета. (всичко се вкл./изкл. от менюта)
- Лесно php API за интеграция

Ето и кои са по-начало включените опции за разплащане:


Всички те имат и настройки, някои нямат, парите пристигат в акаунта ви и paymentwall ви ги изплаща.

Всичко е много добре направено, поддържат проекта и са активни и във фейса, поне до миналата година ноември.

Ако имате въпроси и нещо не ви е ясно - пишете.
 
Последно редактирано:
Още един екстеншън, който направих набързо (взех малко код от старата датабаза на форума, в който първоначално е публикувана системата)

Нарекох го 'swap'. (Променя позициите на менютата)
Кода работеше за default темата, но го пригодих с още 1 проверка за esport темата. Може да се направи и за другите теми с малко пипане.

Давам демо

default темата:

Преди:

Сега:


Esport темата:

Преди:

Сега:


Цена на екстеншъна: 5 евро.
Работи с малки jquery проверки и е много прост. Не работи под мобилни устройства, а само за десктопи. (Има проверка)
 
Бате, добре е че се учиш, похвално за което, ама препоръчвам ти да минеш на Laravel, вече никой не пише на ванила пхп поради много причини.
Това нещо може да го пренапишеш сигурно за 2-3 дни бек енда и основните неща. И аз навремето си губих 1 година с един подобен скрипт, единственото което научих беше, че от кодене на vanilla php, се научих да конантенирам стрингове с $, от рода на 5-6 и като цяло мазаляк, дето след това 7-8 години, не ми се е налагало да ползвам такива простотии.

Виж, за плъгини ще се поозориш да ги нагодиш на ларавел, не знам как си го направил тук, но там това е доста играчка и каквито съм виждал, обикновенно са страшни анти патърни и хардкодване.
 
Хехе 2-3 дни.. ако беше така лесно... Тази система се разработва от 2013 г (не от мен). Ако тръгна да я портвам към някой фреймуърк може и да ми трябват няколко месеца. И не заради бекенд-а, а заради темплейтите (най-вече)...
Не съм много сигурен дали mustache (темплейтната система), има порт към последната версия на laravel. (мисля, че е до версия 5)
Всичките темплейти ако трябва да им сменям темплейтните дефиниции - край, до там съм.. А за това време мога да отделя и да направя още екстеншъни и темплейти за тази.

Системката си е добра и в това състояние, ако може да ми намериш някоя подобна с толкова функции и темплейти ще те призная :)

+Това само екстеншъните са със смесица, другите модули са през контролери и модели и не мешат html с php.
Екстеншъните са модули и за това ти се струва, че всичко е vanila.
Има си рутер, контролери, модели и т.н. А ако нещо допълнително ти трябва - composer require и си го интегрираш.
Почти не е ползвано нещо от нас (тези, които я разработваме), всичко е от гитхъб и авторите на отделните js/jquery скриптове.
Ние сме само интегратори в цялата история на системата. (има много малко авторски неща, всичко почти е наготово)
 
Ми мога да ти направя някакво код ревю ако искаш, на някои от файловете, вися в едни форуми за пхп и постоянно хелпвам на разни подобни системи и скриптове, така че няма да е най-лошото което съм виждал, а пък щом и темплейт енджин си имаш, не е толкова зле.

ЦМС-ите имат малко ларавел проблема, трудно се дистрибютват на масата, щото не могат да се оправят. За ларавел същата история, искат си простаците да цъкат бутони само и плъгини писани от Раджа и Махмуд дето утре като и хакнат сайта, се оплакват.

Системката си е добра и в това състояние, ако може да ми намериш някоя подобна с толкова функции и темплейти ще те призная :)

Може би малко овъркил си направил. Аз например това, което имам на ларавел, един админ панел, с него почвам нови проекти, имам юзъри, и UserActions , за логване кой какво пипа, ей такива основи неща, middleware, и вече се нагаждам спрямо това, какво се иска.
https://vicove.skuka.info пример може да се логнеш в третия линк за админ панела, почнах да ползвам OneUI за бек енд. Може би и един модул за артикъли и категории, че навсякъде ги правя, но като цяло се нагаждам спрямо проекта.
 
Драсни във вайбър, има доста неща дето може да се оправят, има и много хардкодвания, и псевдо Моделите, и неконсистентни неща в контролерите, но не е толкова зле! Повечето системи на средни / големи компании е същото положение, дето се съпортват. Голям хелл е ако почваш в подобна фирма, че 1 месец учиш.
0877413844

Най-доброто, което може да направиш вмомента е за да си направиш собствен чек на нещата, да попишеш 1 месец на ларавел, и да се опиташ да вземеш най-важните концепции от там.

Например Контролерите, как всеки един контролер, трябва да има index,show,edit,post,create,update,delete - И ако имаш нужда от повече неща, навярно ти трябва трейт, и контролера по РЕСТ да е точно с тези медои като акшъни. Другото, което е може да вземе много полезни неща като видиш техните модели как са направени, и как идеята на един модел е просто да мапне филдовете от базата и т.н..
 
Иначе за профит, проблема е, че за нещо ванила пхп или скрипт - трябва ти ниша, трябва ти и търсене. Някакви преди години с gaming clan cms доста пари направиха, пък системата и беше доста шит, но имаше търсене... После WP уби всичко, с темите и плъгините.

Навремето като се учех на пхп, 2011-2012, направих едно страхотно недоразумение, но беше нишото - viralquizzscript или с 1 z беше, скрипт простотия, за фейсбуук тестове, като накрая ти вадеше от приятелите опция, кой те харесва тайно, и т.н... всичко рандом разбира се. После фейса резна достъпа до user.friends и нещата се поомазаха, но за година, 49$ го продавах май, имаше продажби, да кажем 2000$ да е направил, като доста рефунди, обичаха да купуват и после диспути в пейпала и пейпал те реже винаги, щото си търговеца.

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

Сега довършвам една игра уеб базирана, с крипто / сток маркет, няма такова нещо на пазара, ще и сложа цена като 399$, и оставям да постои, ако има смисъл ще съпортвам и доразвивам, ако не - здраве да е, накрая ще го пусна сигурно безплатно. Та и аз ще тествам водите скоро време със скриптовете.
 
за всеки нов ajax ръчкаш коре файла??
Направи си един и от там разпределяй на база `action` примерно както е във WP.

@Blinky домързя ви да бутнете поне малко тоя редактор май, даже и ббкода за код е на 2 клика още

Сега погледнах в демото на xenforo - с драг анд дроп е, от това по-лесно...
 
Последно редактирано:

Back
Горе