Aha, ono to nebude tak jednoduché. Formulář pro ověřovací kód na stránku umístím (v souboru functions.php za ř. 1741), ale k odeslání potřebuju autorizační token. Navíc by bylo mnohem šikovnější funkci zapojit přes extend plugin...
Tak nic, dál se budu muset s někým poradit - jsem spíš uživatel než zkušený kódér.
Formulář pro vložení kódu se mi povedlo rozchodit jako extended plugin, zobrazuje se, jak má. Teď další plán - zase přes extend, s tím bych si mohl rozumět:
1. v adminu, nejspíš někde ve správě uživatelů, potřebuji přidat tabulku s ověřovacími kódy a jejich expirací, přestavuju si, že vždycky napíšu pozvánku (půjde běžnou poštou), do které vygeneruju 12-místný kód s asi týdenní platností. Do tabulky budu kódy ručně zapisovat - jde o jednotlivé osoby, nic, co by bylo třeba řešit strojem. Kód se uloží v databázi a bude týden čekat, jestli jej někdo použije.
2. napsat skript, který přečte kód zadaný uživatelem na příslušné stránce, porovná jej se záznamem v databázi a při souhlase převede uživatele z úrovně "čtenář" (1) na úroveň 20. Vymaže přitom použitý ověřovací kód z databáze, aby se dal použít jen 1x, taky vymaže všechny případné starší kódy s propadlou platností. Protože změnu úrovně uživatele asi nemůže dělat kdekdo, bude si ten skript na chvíli muset zřejmě vypůjčit vyšší oprávnění?
Při pátrání, jak na to, jsem se zarazil na stránce editace uživatele "admin/index.php?p=users-edit&id=xxx" (odtamtud je možno nastavit uživateli příslušnost k jiné úrovni), formulář s údaji má cíl sám v sobě, čili při jeho zpracování dojde k uložení nových údajů, to už ale netuším jak a kde. Dokázal by mě prosím někdo trochu nakopnout? Díky.
1. ověřovací kódy bych v databázi nechal, pouze bych nastavil v nějakém sloupečku, že kód je již použitý / expirovaný, atd.
2. na změnu skupiny nepotřebuješ žádná extra práva, na to ti stačí jeden IF
3. pokud má formulář "cíl sám v sobě" funguje to tak ze se v IFu kontroluje existence dat v globalu $_POST
if(isset($_POST["submit"])){//zeleny name v formu
//nejaky kod ktery se provede po odeslani formu
}
<form action="" method="post">
<input type="text" name="nejakadata">
<input type="submit" name="submit" value="Zpracuj">
</form>
@Jirka Daněk: díky za všechny rady!
Tak pro administraci existují zvláštní pluginy administrace, povedlo se mi splichtit plugin na tabulku na seznam kódů s formulářem na zadávání kódů nových. Zpracování formuláře v PHP bych rozuměl. Teď spíš půjde o to, jak změnit tu úroveň, možná to vidím složitě, ale předpokládám, že napsat "if (...) {_loginright_group = 6;}" stačit nebude (na trvalé uložení úrovně), nebo jo? A taky pak zpracování těch kódů, tam se bude muset šahat do databáze, vyznat se v systému DB SunlightCMS, abych tam něco nepošahal dřív, než se plugin povede zprovoznit...
osobne bych to resil nejak takhle:
$zadanyKod=DB::val($_POST['zadanykod']); // ochraneny vstup z POSTu
$result=DB::count(_mysql_prefix."-codes", "code={$zadanyKod} AND status=0"); //pokud kod existuje a ma status 0 (nepouzity) pak je $result = 1
$cisloNoveSkupiny=x; //doplnis ID skupiny
if($result != 0) //kod je platny a pouzitelny
{
// prepnuti autorizacniho kodu na pouzity
DB::update(_mysql_prefix."-codes", "code=".DB::val($zadanyKod), array("status"=>1));
// zmena skupiny ctenar na xxx
DB::update(_mysql_prefix."-users", "group=3 AND id="._loginid , array("group"=>$cisloNoveSkupiny));
}
je to hrubej nastrel psanej z hlavy, je potreba:
1. overit zadany kod (zda existuje v DB + jeho status(platnost))
2. pokud projde (tj. obsah IFu) tak ho zneplatnit, přepnout mu status
3. změnit uživateli skupinu, je potreba nastavit ID neplet si to s levelem
pokud by se pokusil nekdo zadat kod znovu pak neprojde diky zmenenemu statusu (proto bych je nemazal), a if se neprovede a tim se nezmeni skupina. a tohle muzes provest jako akci toho formu co se posle "sam na sebe", pocitam ze praci s $_POST a ochranu vstupu ti nemusim vysvetlovat
Díky za nakopnutí, mám to hotové. Jsou z toho nakonec 2 pluginy (1 na webu a 1 v adminu) se 2 tabulkami na správu kódů a pokusů o vstup, hlídá se expirace kódů, je možnost zneplatnění, hlídá se počet pokusů o vstup v časovém intervalu (max 5/30 min).