• User Newbie

    Modulo "articoli recenti" e articoli riservati

    Ciao a tutti, avrei bisogno del vostri aiuto perchè non riesco a capire come funziona con il modulo "articoli recenti".

    Il punto è questo: alcuni articoli sono accessibili esclusivamente agli utenti registrati e quando si tenta di accedere al loro contenuto dal modulo "articoli recenti", dopo aver effettuato il login ovviamente, anziché visualizzare l'articolo richiesto appare il pannello "modifica profilo utente".

    Questo comportamento strano non si verifica quando l'accesso agli articoli riservati avviene attraverso la "Lista di singola categoria". In questo caso, dopo aver cliccato sul titolo di un articolo riservato si apre la maschera per il login e una volta effettuato l'accesso avviene il reindirizzamento esattamente all'articolo richiesto!

    Come mai questi comportamenti diversi? Grazie


  • Moderatore

    Ciao drumlibre e benvenuto sul Forum GT.
    Il modulo Latest news di Joomla! 3 non mostra al pubblico (Public) gli articoli che sono riservati agli utenti registrati (Registered), quindi non riesco a capire come possa accadere quello che descrivi.

    Quando un ospite arriva su una pagina che include il modulo Latest News, all'interno del modulo vengono mostrati soltanto gli articoli visibili al pubblico, quindi non c'è la possibilità che l'utente segua il link di un articolo riservato agli utenti registrati.

    Qualche domanda utile a capire la situazione:

    Quale versione di Joomla usi?
    Ti riferisci al modulo Latest News presente nel core oppure ad un altro modulo?
    Che tu sappia sono state apportate modifiche al codice che potrebbero influire sul comportamento?


  • User Newbie

    Ciao FDA! 🙂

    Si, sto usando il modulo Articoli - Recenti (Latest News), senza nessuna modifica, presente nel core della versione Joomla 3.4.1

    Questo modulo è impostato su Accesso: Public

    L'elenco degli articoli in esso visualizzati è formato da articoli riservati e no.
    Gli articoli riservati sono impostati su Accesso: GruppoRiservato

    Ora, qunado un visitatore clicca sul link di un articolo riservato viene indirizzato al modulo Login (la form dove inserire Nome utente e Password per accedere al sito). Una volta autenticato, anziché essere reindirizzato all'articolo riservato che aveva richiesto viene mostrata la maschera "Modifica profilo utente".

    Questa cosa non accade quando l'articolo riservato viene richiesto dalla Lista di singola categoria! nella quale vengono mostrati tutti gli articoli, quelli riservati riportano la dicitura "Registrati per leggere tutto..." mentre quelli con accesso public possono essere visualizzati direttamente.

    Io vorrei ottenere lo stesso risultato, sia dal modulo "Articoli - recenti" sia dalla "Lista di singola categoria". Si può fare?


  • Moderatore

    Se ho ben capito hai creato un nuovo gruppo (GruppoRiservato), mentre io mi riferivo all'utente Registered. Giusto?


  • User Newbie

    Esattamente!


  • Moderatore

    In questo caso è possibile che il problema dipenda da come hai definito il nuovo gruppo GruppoRiservato, che deve avere accesso di default a tutti gli oggetti degli utenti Registrati.
    Controlla e se non riesci a individuare il problema riporta qui le impostazioni per il nuovo gruppo.


  • User Newbie

    Nei parametri del GruppoRiservato la voce ?Gruppo principale? è impostata su Registered.

    Nelle impostazioni di Livello alla voce ?Gruppi di utenti che hanno accesso alla visualizzazione? c?è la spunta solo sul gruppo ?GruppoRiservato?.

    Ho provato a settare anche il gruppo Registered oltre a GruppoRiservato, non è cambiato nulla. Il risultato è sempre lo stesso!

    Idee?


  • Moderatore

    Ok, faccio una prova.


  • User Newbie

    @FDA said:

    Ok, faccio una prova.
    Ti ringrazio! Spero tanto che possa darmi una mano...


  • Moderatore

    Ciao drumlibre,
    dopo alcune prove azzardo che dipende da un errore di impostazione.
    Ti dico come ho testato e funziona:

    1. Creazione di un nuovo gruppo da userGroup denominato "GruppoRiservato" con Group Parent "Registered".

    2. Creazione Viewing Access Levels: in Level Title va "GruppoRiservato", in User Groups Having Viewing Access selezione di "GruppoRiservato".

    3. Creazione di un utente: in Assigned User Groups selezione di "GruppoRiservato".

    4. Creazione di un articolo: in Access selezione di "GruppoRiservato".

    5. Creazione di Module Latest News: in Access selezione di "Public".

    In questo modo ho ottenuto i seguenti risultati:

    • Il modulo mostra a tutti gli utenti (pubblici) gli articoli pubblici, ma non quello con Access=GruppoRiservato.
    • Se un utente public prova a inserire l'indirizzo del link all'articolo con Access=GruppoRiservato riceve un messaggio di errore: "You are not authorised to view this resource."
    • L'utente di GruppoRiservato vede tutti gli articoli di public e registered e in più quello di GruppoRiservato.
    • L'utente registered vede tutti gli articoli di public e registered ma non quello di GruppoRiservato.

    Ciò detto, non so dove hai sbagliato, ma può anche darsi che tu abbia un'estensione che incide in qualche modo.


  • User Newbie

    Mi trovo perfettamente con tutti i passaggi che hai descritto, sono gli stessi che ho compiuto io! L?unica differenza, nel mio caso, sta nel fatto che per rendere visibili a tutti gli utenti (public) anche gli articoli riservati (GruppoRiservato) ho dovuto abilitare la visualizzazione dei Link non autorizzati in Opzioni gestione articoli.

    In questo modo, quindi, in Lista di singola categoria ottengo l?elenco di tutti gli articoli, riservati e no. Per quelli riservati, accanto al titolo, compare la scritta ?registrati per leggere tutto?. Gli articoli pubblici, ovviamente, sono accessibili liberamente.

    Quando si clicca sul link di un articolo riservato, a questo punto, si apre la maschera per il login e, una volta effettuato l?accesso, viene visualizzato l?articolo riservato desiderato.

    Questa cosa, purtroppo, non accade quando si clicca sul link di un articolo riservato mostrato nel modulo ?articoli recenti?! è porpio questa la mia dannazione!!

    Cosa succede? semplice, una volta richiesto un articolo riservato si apre la pagina con il form per il login e dopo essersi autenticati, anziché essere reindirizzati all?articolo desiderato si apre la pagina con il modulo per ?modificare il profilo utente?!!

    Perchè questa differenza? Come pensi che si possa risolvere?

    Grazie per tutto il tempo dedicatomi e per l?aiuto! Grazie!


  • Moderatore

    Mi sa che è una questione di biscottini, quelli tecnici che servono a navigare.
    Quando un utente non loggato clicca sul contenuto riservato viene reindirizzato alla pagina di login utente, ma quando il login avviene entra nel profilo perché non "ha memoria". Con ogni probabilità la cosa viene gestita così dal core di Joomla, che si limita al redirect verso il profilo quando incontra il link dell'articolo riservato.


  • Moderatore

    @drumlibre : problema risolto, ho modificato il modulo e adesso dopo il login reindirizza all'articolo.;)
    Poiché però "Latest News" è del core non è il caso di modificarlo e quindi ne facciamo uno nuovo.
    Devo completare anche questo modulo (http://www.giorgiotave.it/forum/joomla/234130-acceso-utenti-back-end-sito-web.html), pure lui già pronto: nel weekend testo e pubblico tutto qui.


  • User Newbie

    @FDA said:

    @drumlibre : problema risolto, ho modificato il modulo e adesso dopo il login reindirizza all'articolo.;)
    ...

    WOW!! :figo2: è fantastico! Sei troppo in gamba! GRAZIE!!!

    Resto in trepida attesa...


  • Moderatore

    Inizio a condividere la modifica al codice, così chi vuole può contribuire per migliorare la soluzione, anche sotto il piano della sicurezza.

    Disclaimer: la modifica di un modulo non va fatta, occorre creare un nuovo modulo, cosa che si può fare con poco sforzo copiando il modulo originario. La condivisione della modifica serve come esempio alla community ma non è in alcun modun un invito a modificare pezzi del core o di estensioni che potrebbero essere aggiornate.
    [RIGHT]
    *Joomlista avvisato mezzo salvato! *:fumato:
    [/RIGHT]

    Introduzione schematica del modulo "mod_articles_latest":

    • Formalmente si chiama proprio mod_articles_latest, ma per semplicità possiamo chiamarlo Latest News. Fa parte della distribuzione di Joomla! 3 (presente anche in versioni precedenti) ed è rilasciato sotto licenza GPL v2 o successiva, come risulta dal file manifest associato (vedi dopo).

    • Sullo spazio web trovi la cartella del modulo a questo indirizzo: root di joomla/modules/mod_articles_latest . All'interno trovi questa struttura di file e cartelle:

    • mod_articles_latest.xml : detto anche file manifest, include la descrizione del modulo in formato xml, la lista di tutti i file e le cartelle dell'estensione e la lista delle opzioni di configurazione.

    • mod_article_latest.php : è il file php che viene eseguito quando viene caricato il modulo.

    • helper.php : qui viene definita la classe ModArticlesLatestHelper che include la function getList. In parole povere questo file provvede ad estrarre i dati dal database.

    • index.html : file vuoto obbligatorio in tutte le cartelle delle estensioni.

    • tmpl/default.php : è il file della "vista", corrisponde cioè all'output visibile del modulo; il php presente in questo file è quello che materialmente produce l'html con la lista di link agli articoli recenti.

    • tmpl/index.html : file vuoto obbligatorio in tutte le cartelle delle estensioni.

    • Mostra gli articoli recenti nel front end secondo la configurazione stabilita nel back end.

    • Si crea come tutti gli altri moduli dal back end e come tutti gli altri può essere associato a posizioni modulo o incluso in altri articoli tramite il content plugin Load Module. Puoi creare quanti moduli vuoi di questo tipo, anche con opzioni diverse e da assegnare a posizioni differenti.

    Informazioni sulla licenza GPL a partire da questo link: gnu.org/licenses/licenses.it.html

    Per sapere cosa c'è dentro un'estensione di Joomla! è sufficiente munirsi di un editor qualsiasi e navigare i file e le cartelle fino a giungere all'estensione da esaminare; se si lavora online può essere utile un client FTP. Nel caso di mod_articles_latest occorre navigare dalla root del sito fino a /modules/mod_articles_latest e da qui aprire i vari file. Evito di riportare il contenuto di tutti i file perché ai nostri fini ci interessa soltanto helper.php.

    Prima di modificare il contenuto di helper.php definisco schematicamente il problema che vogliamo risolvere:

    • Sul sito Joomla! sono presenti articoli pubblici (gruppo public) e articoli riservati.
    • GruppoRiservato è un nuovo gruppo per gli utenti, parent di Registered; per User Groups Having Viewing Access si è selezionato GruppoRiservato.
    • Il modulo Latest News può includere link di articoli pubblici e link di articoli il cui accesso è ristretto agli utenti di GruppoRiservato e/o ad altri utenti.
    • In condizioni normali, il modulo Latest News non mostra i link di articoli riservati gli utenti non registrati e quindi loggati, mentre mostra questo link agli utenti loggati facenti parte di GruppoRiservato. Precisamente, non li mostra nemmeno agli utenti loggati Registered.
    • Dal back end, andando in Content e poi in Options è possibile modificare il comportamento di cui al punto precedente impostando a YES l'opzione Show Unauthorised Links; fatto questo, il modulo Latest News mostra a tutti gli utenti i titoli di tutti gli articoli, ma quando un utente clicca su un articolo riservato a GruppoRiservato, viene invitato a loggarsi e poi resta nella finestra del profilo utente, ovvero non viene reindirizzato all'articolo dopo il login.

    Le modifiche che vogliamo apportare al modulo servono a reindirizzare l'utente di GruppoRiservato all'articolo una volta che ha effettuato il login (sottinteso: dopo avere fatto clic su un articolo riservato a GruppoRiservato).

    Partiamo allora dal codice originale del modulo.

    
    <?php
    /**
     * @package     Joomla.Site
     * @subpackage  mod_articles_latest
     *
     * @copyright   Copyright (C) 2005 - 2014 Open Source Matters, Inc. All rights reserved.
     * @license     GNU General Public License version 2 or later; see LICENSE.txt
     */
    
    
    defined('_JEXEC') or die;
    
    
    require_once JPATH_SITE . '/components/com_content/helpers/route.php';
    
    
    JModelLegacy::addIncludePath(JPATH_SITE . '/components/com_content/models', 'ContentModel');
    
    
    /**
     * Helper for mod_articles_latest
     *
     * @package     Joomla.Site
     * @subpackage  mod_articles_latest
     * @since       1.6
     */
    abstract class ModArticlesLatestHelper
    {
        /**
         * Retrieve a list of article
         *
         * @param   JRegistry  &$params  module parameters
         *
         * @return  mixed
         *
         * @since   1.6
         */
        public static function getList(&$params)
        {
            // Get the dbo
            $db = JFactory::getDbo();
    
    
            // Get an instance of the generic articles model
            $model = JModelLegacy::getInstance('Articles', 'ContentModel', array('ignore_request' => true));
    
    
            // Set application parameters in model
            $app       = JFactory::getApplication();
            $appParams = $app->getParams();
            $model->setState('params', $appParams);
    
    
            // Set the filters based on the module params
            $model->setState('list.start', 0);
            $model->setState('list.limit', (int) $params->get('count', 5));
            $model->setState('filter.published', 1);
    
    
            // Access filter
            $access     = !JComponentHelper::getParams('com_content')->get('show_noauth');
            $authorised = JAccess::getAuthorisedViewLevels(JFactory::getUser()->get('id'));
            $model->setState('filter.access', $access);
    
    
            // Category filter
            $model->setState('filter.category_id', $params->get('catid', array()));
    
    
            // User filter
            $userId = JFactory::getUser()->get('id');
    
    
            switch ($params->get('user_id'))
            {
                case 'by_me' :
                    $model->setState('filter.author_id', (int) $userId);
                    break;
                case 'not_me' :
                    $model->setState('filter.author_id', $userId);
                    $model->setState('filter.author_id.include', false);
                    break;
    
    
                case '0' :
                    break;
    
    
                default:
                    $model->setState('filter.author_id', (int) $params->get('user_id'));
                    break;
            }
    
    
            // Filter by language
            $model->setState('filter.language', $app->getLanguageFilter());
    
    
            //  Featured switch
            switch ($params->get('show_featured'))
            {
                case '1' :
                    $model->setState('filter.featured', 'only');
                    break;
                case '0' :
                    $model->setState('filter.featured', 'hide');
                    break;
                default :
                    $model->setState('filter.featured', 'show');
                    break;
            }
    
    
            // Set ordering
            $order_map = array(
                'm_dsc' => 'a.modified DESC, a.created',
                'mc_dsc' => 'CASE WHEN (a.modified = ' . $db->quote($db->getNullDate()) . ') THEN a.created ELSE a.modified END',
                'c_dsc' => 'a.created',
                'p_dsc' => 'a.publish_up',
                'random' => 'RAND()',
            );
            $ordering = JArrayHelper::getValue($order_map, $params->get('ordering'), 'a.publish_up');
            $dir      = 'DESC';
    
    
            $model->setState('list.ordering', $ordering);
            $model->setState('list.direction', $dir);
    
    
            $items = $model->getItems();
    
    
            foreach ($items as &$item)
            {
                $item->slug    = $item->id . ':' . $item->alias;
                $item->catslug = $item->catid . ':' . $item->category_alias;
    
    
                if ($access || in_array($item->access, $authorised))
                {
                    // We know that user has the privilege to view the article
                    $item->link = JRoute::_(ContentHelperRoute::getArticleRoute($item->slug, $item->catslug));
                }
                else
                {
                    $item->link = JRoute::_('index.php?option=com_users&view=login');
                }
            }
    
    
            return $items;
        }
    }
    
    
    
    

    Abbiamo detto che questo codice estrae gli articoli dal database. A noi interessa solo la parte finale, dove si usa un ciclo foreach per ottenere la lista dei link agli articoli recenti. Anzi, come vedremo ci interessa soltanto la condizione relativa a else.

    All'interno del ciclo, infatti, c'è una condizione che suona più o meno così: se l'utente che è sul sito è autorizzato a vedere l'articolo allora inserisci il link all'articolo, altrimenti indirizzalo al login.

    Il problema è racchiuso tutta in questa condizione perché così, una volta che l'utente ha effettuato il login, non c'è modo di reindirizzarlo all'articolo, in quanto quel link è "privo di memoria".

    La modifica da fare - e da includere poi nel nuovo modulo, possibilmente arricchita dai vostro suggerimenti - riguarda la riga racchiusa nell' else:

    
    $item->link = JRoute::_('index.php?option=com_users&view=login');
    
    

    La riga sopra va sostituita con:

    
    $redurl = urlencode(base64_encode(JRoute::_(ContentHelperRoute::getArticleRoute($item->slug, $item->catslug))));
    $redurl = '&return=' . $redurl;
    $item->link = JRoute::_('index.php?option=com_users&view=login') . $redurl;
    
    

    Attendo i vostri test e suggerimenti per migliorare il modulo. :smile5:
    Buon Joomla!


  • Moderatore

    C'è un problema dopo il login di un utente registrato ma non appartenente al gruppo specifico (GruppoRiservato😞 il link nel modulo non porta all'introduzione dell'articolo.


  • User Newbie

    Grandissimo FDA!! sei stato fenomenaleee!! bravo! :vai:

    Ho fatto dei test per verificare il funzionamento del codice, è perfetto!!

    Ho dovuto solo cambiare il segno '&' con il segno '?' per accodare al link iniziale la variabile $redurl, in questo modo:

    $redurl = '?return=' . $redurl;
    

    Al momento la soluzione che hai realizzato, nel mio caso, è ottima direi!

    Per altre possibili applicazioni non ho ancora provato nulla, appena riesco farò dei test.

    Tornando alla questione "GruppoRiservato", io ho semplicemente fatto un backup del file originale (helper.php), modificato il codice e lasciato tutto nella stessa directory. In che modo si potrebbe far "sopravvivere" questa modifica ai nuovi upgrade di joomla?

    Grazie infinite per la condivisione!! Sei forte! :figo2:


  • Moderatore

    Se si fosse trattato di modificare la view dell'estensione avrei fatto un override del modulo, ma qui si tratta dell'helper.
    In linea teorica potresti creare qualcosa (un plugin?) che carica nella folder il tuo helper.php o inventare qualche altro trucchetto di questo tipo.
    La cosa più banale è sostituire a mano quelle 3 righe nell'else in caso di aggiornamento. Tieni conto che quel file non viene aggiornato spesso.

    Se non incontro difficoltà entro domani arriva comunque il nuovo modulo e non devi più modificare nulla. :smile5:


  • Moderatore

    Questa è la v. 0.1.0 del modulo "Latest News" modificato per reindirizzare l'utente che ha fatto il login verso l'articolo riservato:
    download.francescodagostino .it/files/joomla/articleslatestral/mod_articles_latest_ral_v010.zip

    Si può usare insieme al modulo originale, nel senso che sono compatibili e indipendenti (es. si usa l'originale su alcune pagine e il "RaL" su altre).
    Per il nome non ho trovato di meglio di un tristissimo acronimo di "Redirect after Login", che ho aggiunto al nome originale "Articles Latest".

    Chi vuole testare e darci qualche suggerimento?

    Intanto segnalo il mio primo dubbio: il link all'articolo riservato ha il title dell'articolo come anchor text ma l'url non è quello canonico all'articolo e questo, modifica a parte, è un difetto anche nel modulo originale. Questo è infatti il codice php della vista:

    
    <?php
    /**
     * @package     Joomla.Module
     * @subpackage  mod_articles_latest_ral
     *
     * @copyright   Copyright (C) 2005 - 2014 Open Source Matters, Inc. All rights reserved. The changes to the original mod_articles_latest are copyright free.
     * @license     GNU General Public License version 2 or later.
     */
    
    
    defined('_JEXEC') or die;
    ?>
    <ul class="latestnews<?php echo $moduleclass_sfx; ?>">
    <?php foreach ($list as $item) :  ?>
        <li itemscope itemtype="http://schema.org/Article">
            <a href="<?php echo $item->link; ?>" itemprop="url">
                <span itemprop="name">
                    <?php echo $item->title; ?>
                </span>
            </a>
        </li>
    <?php endforeach; ?>
    </ul>
    
    

    Da notare che non solo è linkato l'url sbagliato all'anchor text dell'articolo (tra l'altro, teoricamente potremmo volere indicizzare un articolo che è parzialmente visibile), ma ci abbiamo anche aggiunto schema.org a ribadire che siamo in presenza di un elemento article e che quelli sono il nome e l'url (attenzione: article per schema.org non è article per Joomla).
    Come risolvere? :mmm:


  • Moderatore