Přihlásit se

Joomla 5.2.2 Security & Bugfix Release

Joomla 5.2.2 je nyní k dispozici. Jedná se o bezpečnostní vydání pro Joomla 5.x.

zápis funkce pro všechny registrované uživatele

23. čvn 2012 02:22 #94978
Prosím o radu jak napsat funkci s cyklem, která by mi provedla "něco" pro všechny registrované. Nebo alespoň pro registrované s ID např. od 1 do 10. Konkrétně mi jde o úpravu pluginu JoomAutoCat 2.0. (Tento vytváří pro nově se registrující a/nebo pro přihlášeného uživatele novou kategorii v Joomgallery. Potřebuji to upravit tak, aby funkce vytvořila nové kategorie pro všechny uživatele (mám jich 850, což ručně prostě nedám). Zatím jsem skončil už na tom, že mi to nefunguje ani pro uživatele konkrétně zadaného ID. Díky za každou radu.
Code:
public function onUserLogin($user, $options) { $user =& JFactory::getUser(43); { $db = JFactory::getDBO(); $user_object = JUser::getInstance($user['username']); $user['id'] = $user_object->get('id'); $user['name'] = $user['fullname']; $query = $db->getQuery(true) ->select('COUNT(cid)') ->from('#__joomgallery_catg') ->where('owner = '.(int) $user['id']); $db->setQuery($query); if(!$db->loadResult()) { $this->_createCategory($user); } } return true; }

24. čvn 2012 22:36 #95057
Odpověď od karel
Zkušený uživatel
pokud jsem pochopil správně - potřebujete jednorázově vytvořit pro 850 uživatelů kategorie.
Není jednodušší to tedy vytvořit na straně DB než vymýšlet funkci na jedno použití?

Pokud ne, s čim konkrétně potřebujete poradit? (Napsaná celá funkce není jen rada)

Ještě jinak - pokud
Code:
$this->_createCategory($user);
vytváří potřebné kategorie pro $user tak by Vám mělo stačit jedním SQL dotazem se zeptat na všechny potřebné uživatelé (vyber všechny, kteří nejsou v #__joomgallery_catg); cyklem projít všechny záznamy a vytvořit kategorie.

mělo by stačit nastudovat:
docs.joomla.org/Accessing_the_database_u...ssocList.28.24key.29
php.net/manual/en/control-structures.foreach.php

Znáte-li řešení, sdělte ho - pomůžete ostatním při řešení stejného problému, i případný "rádce" bude vědět, poradil-li správně nebo špatně.
Poděkovali: Philip Jay Fry

26. čvn 2012 01:35 - 26. čvn 2012 01:37 #95103
Odpověď od Mark L.
Uživatel
Díky za reakci.
Ano, pochopils to správně. Potřebuju jednorázově vyrobit 850 kategorií. Taky jsem si myslel, že je jednodušší to udělat na straně DB, ale po několika dnech příprav jsem vše provedl a když jsem začal do jednotlivých kategorií nahrávat obrázky zjistil jsem, že to není správná cesta, protože při klasickém vyrobení kategorie se přečíslovává spousta různých id a to není v lidských silách ohlídat v případě ručního zásahu do DB.
Nicméně jsem zkusil na základě tvých poskytnutých linků něco stvořit, bohužel něpremáva: Warning: Invalid argument supplied for foreach() in
Code:
{ $query = "SELECT DISTINCT a.username, a.userid, a.name" ."\n FROM #__users AS a" ."\n WHERE (a.userid = a.id)"; $_CB_database->setQuery($query); $rows = $_CB_database->loadObjectList(); print_r($rows); foreach($rows as $row) { $db = JFactory::getDBO(); $row_object = JUser::getInstance($row['username']); $row['id'] = $row_object->get('id'); $row['name'] = $row['fullname']; $this->_createCategory($row); }

26. čvn 2012 08:34 - 26. čvn 2012 08:36 #95105
Odpověď od karel
Zkušený uživatel
Při "debugování" je vhodné někdy zobrazit výsledný dotaz (query) a pokusit se jej provést v db:
- MySQL admin napoví víc v čem je chyba
- je vidět struktura výsledků (hlavně složitějších) dotazů

imho, pokud není $_CB_database dříve definováno (a pokud je, nemusíte přeci použít zrovna tuto proměnnou) chybí deklarace před setQuery:
Code:
$_CB_database = JFactory::getDBO();
a poslední řádka v cyklu by měla být:
Code:
$this->_createCategory($row['id']);

Znáte-li řešení, sdělte ho - pomůžete ostatním při řešení stejného problému, i případný "rádce" bude vědět, poradil-li správně nebo špatně.

27. čvn 2012 00:52 #95114
Odpověď od Mark L.
Uživatel
Dík za rady. Jsem úplná programátorská lama a přiznám se, že řeším něco čemu zrovna moc nerozumím. Podle tvých rad jsem si odladil dotazy v MySQL Adminu. To by mělo být OK. Ale pořád mi to jako celek nechodí. Pokusil jsem se to tentokrát poupravit a zapracovat do fungujícího pluginu, který to stejné (tj. vyrobení kategorie) udělá pro uživatele, který se právě přihlásil. Moje úprava spočívající v tom, aby po přihlášení libovolného uživatele se kategorie vytvořily všem bohužel nefunguje právě správně. Vím, že je to blbost, ale pro moje ladění jsem to takto udělal a pokud vyrobím jednou to množství 850 kategorií, tak plugin v této upravené podobě už nebude třeba.
Ta moje úprava způsobí, že se sice vytvoří kategorie, bohužel jen jedna a jmenuje se 4. Místo podle nějakého username se jmenuje číslem. Vůbec netuším, kde se mi to bere. Přitom id všech uživatelů (teď mám pro testy pouze 3 uživatele) jsou v rozmezí 42-44.
Pomalu ztrácím víru. Už jsem na tom strávil tolik hodin času a pořád to nechodí.

Můj upravený plugin, resp. jeho funkce:
Code:
public function onUserLogin($user, $options) { $db =& JFactory::getDBO(); $query = 'SELECT `username`' . ' FROM `j25_users`' . ' WHERE username=username'; $db->setQuery( $query ); $clens = $db->loadObject(); if($clens){ $clen_object = JUser::getInstance($clens->username); foreach($clens as $clen){ $clen['id'] = $clen_object->get('id'); $clen['name'] = $clen['fullname']; $query = $db->getQuery(true) ->select('COUNT(cid)') ->from('#__joomgallery_catg') ->where('owner = '.(int) $clen['id']); $db2 =& JFactory::getDBO(); $db2->setQuery($query); if(!$db2->loadResult()) { $this->_createCategory($clen['id']); } } } return true; }
funkce createCategory:
Code:
protected function _createCategory($clen) { // Get the interface require_once JPATH_ROOT.DS.'components'.DS.'com_joomgallery'.DS.'interface.php'; $jinterface = new JoomInterface(); // Create the category switch($this->params->get('categoryname')) { case 0: if($jinterface->getJConfig('jg_realname')) { $category->name = $clen['name']; } else { $category->name = $clen['username']; } break; case 1: $category->name = $clen['name']; break; default: $category->name = $clen['username']; break; } $category->owner = $clen['id']; if($parent = $this->params->get('parent')) { $category->parent_id = intval($parent); } if($access = $this->params->get('access')) { $category->access = $access; } $category->published = $this->params->get('published'); $jinterface->createCategory($category); }

27. čvn 2012 01:12 - 27. čvn 2012 01:18 #95115
Odpověď od karel
Zkušený uživatel
Code:
$query = 'SELECT `username` FROM `j25_users` WHERE username=username';
username=username je podezřelé ( má ten dotaz nějaký smysl? )

Code:
$clen['name'] = $clen['fullname'];
provede přiřazení hodnoty vpravo k proměnné vlevo - viz třeba students.kiv.zcu.cz/doc/php5/manual/cs/l...ators.assignment.php .
mělo by být obráceně:
Code:
$clen['fullname'] = $clen['name'];

jinak na "programátorskou lamu" výborný level :)
...kontakt - viz PM (soukromé zprávy)

Znáte-li řešení, sdělte ho - pomůžete ostatním při řešení stejného problému, i případný "rádce" bude vědět, poradil-li správně nebo špatně.

Powered by Fórum