icon
Avatar
zod
Post: 217
Ciao, ho Contao 2.11.16 in cui è installato Catalog 2.0.0 Beta2.

Ho configurato un gruppo utenti chiamato "Editori", questi non creano cataloghi ma gestiscono gli elementi in due cataloghi predefiniti: "Categorie" e "Prodotti". I prodotti hanno un campo di selezione multipla (checkbox), per assegnare 1 o più categorie.

Funziona tutto ad eccezione di due cose:

1) In elenco Prodotti, ho il filtro di ricerca in back end, per le categorie quindi in alto a destra ho (cerca categoria = ""). Il valore non posso darlo usando il titolo, altrimenti non escono risultati. Devo cercare per ID categoria, che si scopre dalla tabella Categorie. A parte questo piccolo fastidio, il problema è la ricerca non precisa, mi chiarisco con un esempio.

Orsetti ID 3
Cuori ID 13
Tartarughe ID 1

Se cerco categoria = 3. Escono sia Orsetti che Cuori, facendo confusione. Dopo alcuni test ne deduco che appaiono insieme perché la ricerca considera il 3 dentro a 13. Meglio sarebbe se considerasse il valore esatto e non parziale della striga. Oppure sarebbe meglio "Orsetti" anziché il numero ID.

2) Funzione "modifica tutti i record", e poi tasto "Sposta". Come amministratore è funzionante, ma con l'utente "Editori" no. Appare nel suo caso un errore generico in rosso: "Si è verificato un errore!". E' come se non avesse il permesso a spostare tutti i record, però può spostare singolarmente ogni elemento con il drag&drop.
Da cosa dipende questo blocco? Tra i permessi mi sembra tutto in ordine.

Avete qualche idea? Grazie.
Marco Damian
www.zod.it
22/04/2015 12:08
Avatar
paolob
Moderatore
Post: 1550
Per il primo problema, in effetti Catalog, memorizza il campo ID della tabella collegata, per cui non è possibile fare una ricerca.

Invece il secondo problema non sono riuscito a ricrearlo.
Io non vedo io comando sposta.... ne come amministratore ne come utente...
Paolo B.
paolob@contaocms.it
22/04/2015 23:49
Avatar
zod
Post: 217
Strana differenza, stiamo usando lo stesso Catalog, probabilmente facendo upgrade ho pezzi diversi?

Ad ogni modo io ho in ogni catalogo il solito pulsante "Modifica tutti i record" ed usandolo appaiono le seguenti funzioni: Cancella la selezione, Move, Copy, Override, Modifica la selezione.
Vero è che alcune stringhe sono in inglese, quindi forse qualcosa di strano c'è.

Poi, oggi ho risolto il secondo punto, ho provato a smanettare in "/system/modules/catalog/Catalog.php"

Precisamente la funzione: checkPermission();

Proprio all'inizio c'è un controllo sull'utente admin. Ho commentato la if, quindi ora funzionano le operazioni di massa anche per gli utenti Editori.

iconphp:
 
		//if ($this->User->isAdmin)
		//{
			return;
		//}
 


So che non è un metodo ortodosso, però nel mio caso sembra funzionare.
Copio la funzione di Catalog per mostrarvela per intero, fatemi sapere se notate problemi in ciò che ho fatto. O se esiste soluzione migliore affinché il gruppo Editori possa finalmente compiere azioni di massa.

iconphp:
 
	public function checkPermission(DataContainer $dc)
	{
 
		$this->import('BackendUser', 'User');
 
		//if ($this->User->isAdmin)
		//{
			return;
		//}
 
		// Set root IDs
		if (!is_array($this->User->catalogs) || count($this->User->catalogs) < 1)
		{
			$root = array(0);
		}
		else
		{
			$root = $this->User->catalogs;
		}
 
		$id = strlen($this->Input->get('id')) ? $this->Input->get('id') : CURRENT_ID;
 
		$urlError = ((version_compare(VERSION.'.'.BUILD, '2.9.0', '>='))?'contao':'typolight').'/main.php?act=error';
 
		// Check current action
		switch ($this->Input->get('act'))
		{
			case 'select':
			case 'paste':
				// Allow
				break;
 
			case 'create':
 
				$checkid = $this->Input->get('id');
				if ($this->Input->get('mode') == 2 && strlen($this->Input->get('pid')) && !strlen($this->Input->get('id')))
				{
					// sorted mode
					$checkid = $this->Input->get('pid');
				}
 
				if (!strlen($checkid) || !in_array($checkid, $root))
				{
					$this->log('Not enough permissions to create catalog items in catalog type ID "'.$checkid.'"', 'Catalog checkPermission', 5);
					$this->redirect($urlError);
				}
				break;
 
			case 'edit':
			case 'show':
			case 'create':
			case 'copy':
			case 'cut':
			case 'delete':
 
				$rows = 0;
				$objTable = $this->Database->prepare("SELECT tableName FROM tl_catalog_types WHERE id=?")
						->limit(1)
						->execute(CURRENT_ID);
				if ($objTable->numRows)
				{
					$tableName = $objTable->tableName;
					$objType = $this->Database->prepare("SELECT pid FROM ".$tableName." WHERE id=?")
											 ->limit(1)
											 ->execute($id);
					$rows = $objType->numRows;
				}
 
				if ($rows < 1)
				{
					$this->log('Invalid catalog item ID "'.$id.'"', 'Catalog checkPermission', 5);
					$this->redirect($urlError);
				}
 
				if (!in_array($objType->pid, $root))
				{
					$this->log('Not enough permissions to '.$this->Input->get('act').' catalog item ID "'.$id.'" of catalog type ID "'.$objType->pid.'"', 'Catalog checkPermission', 5);
					$this->redirect($urlError);
				}
				break;
 
			case 'editAll':
			case 'deleteAll':
				if (!in_array($id, $root))
				{
					$this->log('Not enough permissions to access catalog type ID "'.$id.'"', 'Catalog checkPermission', 5);
					$this->redirect($urlError);
				}
 
				$rows = 0;
				$objTable = $this->Database->prepare("SELECT tableName FROM tl_catalog_types WHERE id=?")
						->limit(1)
						->execute(CURRENT_ID);
				if ($objTable->numRows)
				{
					$tableName = $objTable->tableName;
					$objType = $this->Database->prepare("SELECT id FROM ".$tableName." WHERE pid=?")
											 ->execute($id);
					$rows = $objType->numRows;
				}
 
				if ($rows < 1)
				{
					$this->log('Invalid catalog type ID "'.$id.'"', 'Catalog checkPermission', 5);
					$this->redirect($urlError);
				}
 
				$session = $this->Session->getData();
				$session['CURRENT']['IDS'] = array_intersect($session['CURRENT']['IDS'], $objType->fetchEach('id'));
				$this->Session->setData($session);
				break;
 
			default:
				if (strlen($this->Input->get('act')))
				{
					$this->log('Invalid command "'.$this->Input->get('act').'"', 'Catalog checkPermission', 5);
					$this->redirect($urlError);
				}
				if (!in_array($id, $root))
				{
					$this->log('Not enough permissions to access catalog type ID "'.$id.'"', 'Catalog checkPermission', 5);
					$this->redirect($urlError);
				}
				break;
		}
	}
 


Riguardo il primo punto invece devo ancora indagare, mi serve sapere dove viene fatta la query di ricerca, quindi probabilmente cambiare operatore... magari è un "Like" e io voglio una corrispondenza esatta.
Marco Damian
www.zod.it
23/04/2015 10:53
Avatar
paolob
Moderatore
Post: 1550
iconzod:

Riguardo il primo punto invece devo ancora indagare, mi serve sapere dove viene fatta la query di ricerca, quindi probabilmente cambiare operatore... magari è un "Like" e io voglio una corrispondenza esatta.


Si, però comunque ricercherà tra i valori che sono gli id.
Paolo B.
paolob@contaocms.it
23/04/2015 13:29
Avatar
zod
Post: 217
si, ma deve restituire solo le categorie giuste, se cerco i prodotti della categoria "13", deve darmi solo quelli e non anche i prodotti "1" e "3". Adesso sono su un altro lavoro, questo l'ho sospeso per ora :(
Marco Damian
www.zod.it
29/05/2015 17:04
icon