Webboard

Pełna wersja: Nawałnica zapytań do DB lastposteravatarlight
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Stron: 1 2
Siemka,
Chciałem nieco rozbudować skrypt o możliwość wstawiania zmiennych wtyczki z poziomu opcji i po wprowadzeniu jednego zapytania do settings całkowita liczba zapytań, wyświetlana na dole wzrosła z 10 do 20. Czym to może być spowodowane?
Kod PHP:
<?php
/*************************************************************\
*This file is part of "LastPosterAvatarLight" plugin for MyBB.
* Copyright © 2016 @ Artur "Niespecjalny" Michalak @ All rights reserved

* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.

* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU Lesser General Public License for more details.

* You should have received a copy of the GNU Lesser General Public License
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
\*************************************************************/

 
   if(!defined("IN_MYBB")) exit;
    
    
$plugins->add_hook("forumdisplay_thread""lastposteravatarlight_threads");
 
   $plugins->add_hook("build_forumbits_forum""lastposteravatarlight_forums");
    
$plugins->add_hook('search_results_thread''lastposteravatarlight_search_thread');
    
$plugins->add_hook('search_results_post''lastposteravatarlight_search');
    
 
   function lastposteravatarlight_info(){
        
        global 
$lang;
        
$lang->load('config_lastposteravatarlight');
        
 
       return array(
 
           "name"=>"LastPosterAvatarLight",
 
           "description"=>$lang->lastposteravatarlight_desc,
 
           "website"=>"",
 
           "author"=>"Niespecjalny",
 
           "authorsite"=>"",
 
           "version"=>"0.5",
 
           "guid"=>"",
            
"codename" => "LastPosterAvatarLight",
 
           "compatibility"=>"18*"
 
       );
        
 
   }
    
    function 
lastposteravatarlight_is_installed()
    {
        global 
$db;
        return 
$db->num_rows($db->simple_select("settinggroups""*""name=\"lastposteravatarlight\""));
    }
    
    function 
lastposteravatarlight_install(){
        global 
$db,$cache,$lang;
        
$lang->load('config_lastposteravatarlight');
        
        
$max_disporder $db->fetch_field($db->simple_select("settinggroups""MAX(disporder) AS max_disporder"), "max_disporder");
        
$settinggroup = array(
            
"gid" => "",
            
"name" => "lastposteravatarlight"
            
"title" => "LastPosterAvatarLight",
            
"description" => $db->escape_string($lang->setting_group_lastposteravatarlight_desc),
            
"disporder" => $max_disporder 1,
            
"isdefault" => "0"
        
);
        
$gid $db->insert_query("settinggroups"$settinggroup);
        
        
$settings[] = array(
            
"sid" => "",
            
"name" => "lastposteravatarlight_fpal_thread",
            
"title" => $db->escape_string($lang->setting_lastposteravatarlight_1),
            
"description" => $db->escape_string($lang->setting_lastposteravatarlight_1_desc),
            
"optionscode" => "text",
            
"value" => $db->escape_string("<td class=\"\{\$bgcolor\}\{\$thread_type_class\}\">(.*?)\{\$attachment_count\}"),
            
"disporder" => "1",
            
"gid" => $gid,
            
"isdefault" => "0"
        
);
        
$settings[] = array(
            
"sid" => "",
            
"name" => "lastposteravatarlight_lpal_thread",
            
"title" => $db->escape_string($lang->setting_lastposteravatarlight_2),
            
"description" => $db->escape_string($lang->setting_lastposteravatarlight_2_desc),
            
"optionscode" => "text",
            
"value" => $db->escape_string("<td class=\"\{\$bgcolor\}\{\$thread_type_class\}\" style=\"white-space: nowrap; text-align: right;\">(.*?)<span class=\"lastpost smalltext\">"),
            
"disporder" => "2",
            
"gid" => $gid,
            
"isdefault" => "0"
        
);
        
$settings[] = array(
            
"sid" => "",
            
"name" => "lastposteravatarlight_fpal",
            
"title" => $db->escape_string($lang->setting_lastposteravatarlight_3),
            
"description" => $db->escape_string($lang->setting_lastposteravatarlight_3_desc),
            
"optionscode" => "text",
            
"value" => $db->escape_string("(.*?)<span class=\"smalltext\">"),
            
"disporder" => "3",
            
"gid" => $gid,
            
"isdefault" => "0"
        
);
        
$settings[] = array(
            
"sid" => "",
            
"name" => "lastposteravatarlight_lpal",
            
"title" => $db->escape_string($lang->setting_lastposteravatarlight_4),
            
"description" => $db->escape_string($lang->setting_lastposteravatarlight_4_desc),
            
"optionscode" => "text",
            
"value" => $db->escape_string("(.*?)<span class=\"smalltext\">"),
            
"disporder" => "4",
            
"gid" => $gid,
            
"isdefault" => "0"
        
);
        
$settings[] = array(
            
"sid" => "",
            
"name" => "lastposteravatarlight_fpal",
            
"title" => $db->escape_string($lang->setting_lastposteravatarlight_5),
            
"description" => $db->escape_string($lang->setting_lastposteravatarlight_5_desc),
            
"optionscode" => "text",
            
"value" => $db->escape_string("<td class=\"\{\$bgcolor\}\">(.*?)\{\$attachment_count\}"),
            
"disporder" => "5",
            
"gid" => $gid,
            
"isdefault" => "0"
        
);
        
$settings[] = array(
            
"sid" => "",
            
"name" => "lastposteravatarlight_lpal",
            
"title" => $db->escape_string($lang->setting_lastposteravatarlight_6),
            
"description" => $db->escape_string($lang->setting_lastposteravatarlight_6_desc),
            
"optionscode" => "text",
            
"value" => $db->escape_string("<td class=\"\{\$bgcolor\}\" style=\"white-space: nowrap\" align=\"right\">(.*?)<span class=\"smalltext\">"),
            
"disporder" => "6",
            
"gid" => $gid,
            
"isdefault" => "0"
        
);
        
$settings[] = array(
            
"sid" => "",
            
"name" => "lastposteravatarlight_lpal",
            
"title" => $db->escape_string($lang->setting_lastposteravatarlight_7),
            
"description" => $db->escape_string($lang->setting_lastposteravatarlight_7_desc),
            
"optionscode" => "text",
            
"value" => $db->escape_string("<td align=\"center\" class=\"\{\$bgcolor\}\">(.*?)\{\$post[\'profilelink\']\}</td>"),
            
"disporder" => "7",
            
"gid" => $gid,
            
"isdefault" => "0"
        
);
        
$settings[] = array(
            
"sid" => "",
            
"name" => "lastposteravatarlight_ref",
            
"title" => $db->escape_string($lang->setting_lastposteravatarlight_8),
            
"description" => $db->escape_string($lang->setting_lastposteravatarlight_8_desc),
            
"optionscode" => "yesno",
            
"value" => "1",
            
"disporder" => "8",
            
"gid" => $gid,
            
"isdefault" => "0"
        
);
    
        
$db->insert_query_multiple("settings"$settings);
    
        
rebuild_settings();
        
        
$install_lpal=$db->fetch_array($db->simple_select("themestylesheets""COUNT(name)""name=\"lastposteravatarlight.css\" AND tid=1"Null));
        if(
$install_lpal>1){
            
$db->delete_query("themestylesheets""name = \"lastposteravatarlight.css\" AND tid=1");
            
$install_lpal=0;
        }
        if(
$install_lpal==0)
        {
            
$install_lpal_style=".lpal,.lpal>img{border-radius:100%}.lpal{overflow:auto;float:left;margin-right:5px}.lpal>img{border:1px solid #ccc}";
            
$install_lpal= array(
                
"sid" => "",
                
"name" => "lastposteravatarlight.css",
                
"cachefile" => "lastposteravatarlight.css",
                
"tid" => "1",
                
"attachedto" => "forumdisplay.php|index.php|search.php",
                
"stylesheet" => $db->escape_string($install_lpal_style),
                
"lastmodified" => TIME_NOW
            
);

            
$db->insert_query("themestylesheets"$install_lpal);
            
            require_once 
MYBB_ADMIN_DIR."inc/functions_themes.php";
            
            
cache_stylesheet(1"lastposteravatarlight.css"$install_lpal_style);
            
update_theme_stylesheet_list(1falsetrue);
        }
    }
    function 
lastposteravatarlight_uninstall(){
        global 
$db,$cache,$mybb;
        
$db->delete_query("themestylesheets""name=\"lastposteravatarlight.css\" AND tid=1");
        require_once 
MYBB_ADMIN_DIR."inc/functions_themes.php";
        @
unlink(MYBB_ROOT."cache/themes/theme1/lastposteravatarlight.css");
 
       @unlink(MYBB_ROOT."cache/themes/theme1/lastposteravatarlight.min.css");
 
       update_theme_stylesheet_list(1falsetrue); 
        
$db->delete_query("settinggroups""name = \"lastposteravatarlight\"");
        
$db->delete_query("settings""name LIKE \"lastposteravatarlight%\"");
        
rebuild_settings();
    }
    
    function 
lastposteravatarlight_threads(){
 
       
        global  $thread
,$mybb,$forum;
        if(
$mybb->settings['lastposteravatarlight_ref']){lastposteravatarlight_options_ref();}
 
       $user get_user($thread['lastposteruid']);
 
       $useravatar format_avatar(htmlspecialchars_uni($user['avatar']), $user['avatardimensions'], my_strtolower("30x30"));
 
       $forum['lpal']="<a href=\"{$mybb->settings['bburl']}/".get_profile_link($user['uid'])."\" class=\"lpal\"><img src=\"{$useravatar['image']}\" alt=\"{$user['username']}\" title=\"{$user['username']}\" {$useravatar['width_height']}/></a>";
        
$user get_user($thread['uid']);
 
       $useravatar format_avatar(htmlspecialchars_uni($user['avatar']), $user['avatardimensions'], my_strtolower("30x30"));
 
       $forum['fpal']="<a href=\"{$mybb->settings['bburl']}/".get_profile_link($user['uid'])."\" class=\"lpal\"><img src=\"{$useravatar['image']}\" alt=\"{$user['username']}\" title=\"{$user['username']}\" {$useravatar['width_height']}/></a>";
        
 
   }
 
   function lastposteravatarlight_forums(&$forum){
 
       
        global  $mybb
;
        if(
$mybb->settings['lastposteravatarlight_ref']){lastposteravatarlight_options_ref();}
        
$user=get_user($forum['lastposteruid']);
        
$useravatar format_avatar(htmlspecialchars_uni($user['avatar']), $user['avatardimensions'], my_strtolower("45x45"));
        
$forum['lpal']="<a href=\"{$mybb->settings['bburl']}/".get_profile_link($user['uid'])."\" class=\"lpal\"><img src=\"{$useravatar['image']}\" alt=\"{$user['username']}\" title=\"{$user['username']}\" {$useravatar['width_height']}/></a>";
        
 
   }
 
   function lastposteravatarlight_search(){
 
       
        global  $mybb
,$post,$forum;
        if(
$mybb->settings['lastposteravatarlight_ref']){lastposteravatarlight_options_ref();}
        
$user=get_user($post['uid']);
        
$useravatar format_avatar(htmlspecialchars_uni($user['avatar']), $user['avatardimensions'], my_strtolower("30x30"));
        
$forum['lpal']="<a href=\"{$mybb->settings['bburl']}/".get_profile_link($user['uid'])."\" class=\"lpal\" style=\"float:none;display:inline-block;vertical-align:middle;margin-right:5px\"><img src=\"{$useravatar['image']}\" alt=\"{$user['username']}\" title=\"{$user['username']}\" {$useravatar['width_height']}/></a>";
        
 
   }
    function 
lastposteravatarlight_search_thread(){
        
        global 
 $mybb,$thread,$forum;
        if(
$mybb->settings['lastposteravatarlight_ref']){lastposteravatarlight_options_ref();}
        
$user=get_user($thread['lastposteruid']);
        
$useravatar format_avatar(htmlspecialchars_uni($user['avatar']), $user['avatardimensions'], my_strtolower("30x30"));
        
$forum['lpal']="<a href=\"{$mybb->settings['bburl']}/".get_profile_link($user['uid'])."\" class=\"lpal\"><img src=\"{$useravatar['image']}\" alt=\"{$user['username']}\" title=\"{$user['username']}\" {$useravatar['width_height']}/></a>";
        
$user get_user($thread['uid']);
 
       $useravatar format_avatar(htmlspecialchars_uni($user['avatar']), $user['avatardimensions'], my_strtolower("30x30"));
 
       $forum['fpal']="<a href=\"{$mybb->settings['bburl']}/".get_profile_link($user['uid'])."\" class=\"lpal\"><img src=\"{$useravatar['image']}\" alt=\"{$user['username']}\" title=\"{$user['username']}\" {$useravatar['width_height']}/></a>";
        
    }
    function 
lastposteravatarlight_options_ref(){
        global 
$db;
        
$db->update_query("settings", array("value"=>"0"), "`name`='lastposteravatarlight_ref'");
        
    }
?>

Ta anomalia pojawiła się gdy wprowadziłem to ostatnie zapytanie.
ktore zapytanie dodales?
Tak jak pisałem to ostatnie.
$db->update_query("settings", array("value"=>"0"), "name='lastposteravatarlight_ref'");
nie wiem co chcesz osiagnac ale to nie zadziala, zapytanie wykonujesz w pentli, dlatego je powiela
Dobra ogarniam.
Ale wytłumacz mi co ma robić w ogóle to zapytanie.
Jak widać aktualizuje wartość w settings :/
Mam jeszcze jedno pytanie. Czy jeśli nie określę disporder w settingsgroup to stanie się coś złego?
Np dvz Shoutbox tego nie ma
nic sie nie stanie
ale przecież wartości aktualizjesz ręcznie przez acp, więc po co to?
W sumie to jakie założenie jest tego kodu?
Kod:
if($mybb->settings['lastposteravatarlight_ref']){lastposteravatarlight_options_ref();}
Sprawdza ustawienie a następnie je aktualizuje? Co chciałeś osiągnąć?

Do tego sformatuj ten kod trochę, jak na razie ciężko się w tym jest połapać. Przykład:
Kod PHP:
global  $mybb,$thread,$forum;
 
       if($mybb->settings['lastposteravatarlight_ref']){lastposteravatarlight_options_ref();}
 
       $user=get_user($thread['lastposteruid']);
 
       $useravatar format_avatar(htmlspecialchars_uni($user['avatar']), $user['avatardimensions'], my_strtolower("30x30"));
 
       $forum['lpal']="<a href=\"{$mybb->settings['bburl']}/".get_profile_link($user['uid'])."\" class=\"lpal\"><img src=\"{$useravatar['image']}\" alt=\"{$user['username']}\" title=\"{$user['username']}\" {$useravatar['width_height']}/></a>";
 
       $user get_user($thread['uid']);
 
       $useravatar format_avatar(htmlspecialchars_uni($user['avatar']), $user['avatardimensions'], my_strtolower("30x30"));
 
       $forum['fpal']="<a href=\"{$mybb->settings['bburl']}/".get_profile_link($user['uid'])."\" class=\"lpal\"><img src=\"{$useravatar['image']}\" alt=\"{$user['username']}\" title=\"{$user['username']}\" {$useravatar['width_height']}/></a>"
Na
Kod PHP:
global  $mybb,$thread,$forum;

 
       if($mybb->settings['lastposteravatarlight_ref'])
 
        lastposteravatarlight_options_ref();

 
       $user=get_user($thread['lastposteruid']);
 
       $useravatar format_avatar(htmlspecialchars_uni($user['avatar']), $user['avatardimensions'], my_strtolower("30x30"));
 
       $forum['lpal']="<a href=\"{$mybb->settings['bburl']}/".get_profile_link($user['uid'])."\" class=\"lpal\"><img src=\"{$useravatar['image']}\" alt=\"{$user['username']}\" title=\"{$user['username']}\" {$useravatar['width_height']}/></a>";

 
       $user get_user($thread['uid']);
 
       $useravatar format_avatar(htmlspecialchars_uni($user['avatar']), $user['avatardimensions'], my_strtolower("30x30"));
 
       $forum['fpal']="<a href=\"{$mybb->settings['bburl']}/".get_profile_link($user['uid'])."\" class=\"lpal\"><img src=\"{$useravatar['image']}\" alt=\"{$user['username']}\" title=\"{$user['username']}\" {$useravatar['width_height']}/></a>"
Nieduża zmiana, a kod jest bardziej czytelny.
Jak już pisałem założenie tego kodu było takie:
Gdy użytkownik zmieni ustawienia i zaakceptuje to przy pierwszej okazji zaktualizuje szablony a wartość czy zapisać wróci do standardowej pozycji.

Jak już też pisałem, eksperymentuję na tym kodzie a zadałem to pytanie dlatego że zdziwiło mnie że z 10 zapytań zrobiło się 20. Zapomniałem że to działa dla wszystkich wątków i dlatego tego tyle było.
A co chcesz zmieniać w tych szablonach? Jeżeli mają być to szablony .css to właśnie po to je wstawiałeś, aby można było je edytować z poziomu ACP.
Jeżeli chcesz modyfikować html z pluginu to można prosto z ustawień wstawiać jakieś wartości.
W ten sposób co teraz robisz nie ma sensu.
Kombinowałem jak dać możliwość przestawienia zmiennej użytkownikowi. Powtarzam to był takowy eksperyment, chciałem tylko się dowiedzieć dlaczego mam tyle zapytań do bazy, mimo że warunek nie powinien być spełniony :/
Nie pisałem tego tematu, aby dowiedzieć jaki to beznadziejny plan.
Ale co by to dało na dobrą sprawę użytkownikowi?
Domyślnie ustawia się 1, a warunki w takich wypadkach powodują wykonanie zapytania, które przestawia na 0.

Jak chcesz dać coś użytkownikowi do zmiany z poziomu ACP, zrób tam dodatkowe ustawienie jako pole tekstowe do wprowadzania danych, potem możesz z jego wartości korzystać w kodzie i szablonach, więc to tak, jakby użytkownik coś ustalał - np. rozmiar awatara, bo na razie jest wbity na sztywno w plik PHP, co trudno uznać za wygodne.

No i taka rada, warto spróbować podejść do całego problemu inaczej. Plugin podpina się pod hooki wykonywane w pętlach, wykonuje np. get_user za każdym razem, więc w sumie wszystkie jego funkcje są wykonywane w pętli. Jeżeli zrobimy sobie pokazywanie 50 tematów z działu to już daje się odczuć. Dodatkowo gdyby ostatnim piszącym był jeden user, to i tak pobierze go 50 razy, zamiast raz. Choć znam, nie sugeruję rozwiązania, warto pokombinować ;)
Dobra to jest już sensowna rada.
Więc powiadasz, że warto by było zrobić zewnętrzną funkcję, która wszystko obrabia w zależności od argumentów, a następnie przesyłała informacje do hook'a?
Szczerze chciałbym ale nie umiem w mybb tego zrobić, choćby dlatego że nie wiem jak wywołać z templatki funkcję w dodatku z argumentami.
Jeśli chodzi o tamten kod to raczej już nie wypali. Chciałem zrobić, że jak ktoś ma modyfikowaną templatkę to może wrzucić kawałek kodu w opcjach a system sam już wrzuci zmienną w odpowiednie miejsce w stylu(brakuje mi tutaj klas, które jednoznacznie określają dane rubryczki), a ta zamiana z 1 na 0 miała służyć jako informacja, że użytkownik chce zmian w templatkach.
Propo tego rozmiaru awatara- tak będzie coś takiego jak zmiana rozmiaru. Już nawet wyrzuciłem ten rozmiar poza funkcję, więc w kolejnej wersji raczej będzie to już dostępne, tylko muszę wykombinować kilka metod optymalizacji tego kodu. Może jakieś pomysły?
I nie, nie będę przepisywać go na obiekty. Przynajmniej na ten moment :P

Chwila moment, czy to o czym wspominałem na początku nie mogę zrobić za pomocą głównego hooka np od forumdisplay a potem przesłać to do hook'ów z rekordami?
Tylko jak to zrobić?
(30.01.2016, 21:36)NiespecjalnieUzdolniony napisał(a): [ -> ]Więc powiadasz, że warto by było zrobić zewnętrzną funkcję, która wszystko obrabia w zależności od argumentów, a następnie przesyłała informacje do hook'a?

A po co tak?
Obrabiać możesz w hooku, od tego one przecież są.
W templatkach nie możesz wywoływać funkcji, ale możesz mieć w swoich templatach własne zmienne - w hooku je odpowiednio ustawiasz, wczytujesz templatkę, a potem ta jest podstawiana jako zmienna, która leci do templatki z MyBB przykładowo.
MyBB oferuje funkcje do modyfikacji szablonów już zainstalowanych, wystarczy z nich skorzystać np. przy funkcjach aktywacji i dezaktywacji pluginu (można i instalacji, ale to nieco bez sensu)
http://docs.mybb.com/1.8/development/plugins/
http://docs.mybb.com/1.8/development/plu...templates/

(30.01.2016, 21:36)NiespecjalnieUzdolniony napisał(a): [ -> ]tylko muszę wykombinować kilka metod optymalizacji tego kodu. Może jakieś pomysły?
I nie, nie będę przepisywać go na obiekty.

Obiekty żadnej optymalizacji nie dają. Jak ktoś myśli, że kod obiektowy jest szybszy, to źle myśli - OOP to dodatkowa warstwa abstrakcji, która ma ułatwić rozłożenie i zrozumienie kodu, to narzut wydajnościowy, a nie jakikolwiek zysk.
Takowe możesz uzyskać różnego rodzaju zabiegami, nieco finezji np. używając statycznych zmiennych które zapamiętają dane przy oddzielnych wywołaniach. Osobiście polecam przy hookach wstawiać "identyfikatory" i zbierać dane, a gdzieś na końcu pobrać dane wszystkich użytkowników i je zamienić. Jak chcesz zobaczyć jak w praktyce coś takiego wygląda, to przeanalizuj sobie działanie pluginu kolorowe nicki - zmienia on styl nicków zgodnie z grupami, musi pobrać wszystkie dane, a jednak nie robi 5,10,15 czy więcej zapytań.
Oczywiście ta metoda nie zawsze jest najlepsza.
Stron: 1 2