Joomla.it Forum

Non solo Joomla... => Sviluppo => : mau_develop 16 May 2013, 15:50:58

: Il modulo antipatico
: mau_develop 16 May 2013, 15:50:58
Se c'è un modulo del core di joomla che mi ha sempre suscitato antipatie è l'archivio... mai come mi serve.
Mi sono sempre detto... lo cambieranno prima o poi... visualizza l'anno, ... cerca... ma che giro!
Voglio gli anni, i mesi, e i contenuti... voglio che i motori non li perdano d'occhio...
Così l'ho modificato, è banale. Se lo volete fare magari copiate (duplicate) il modulo archivio nnon fatelo sullo stesso.
Sostanzialmente l'entry point rimane identico, basta aggiungere le librerie jquery e l'inizializzazione dell'accordion
:
$doc = JFactory::getDocument();
$doc->addScript("http://code.jquery.com/jquery-1.9.1.js");
$doc->addScript("http://code.jquery.com/ui/1.10.3/jquery-ui.js");
$doc->addScriptDeclaration('
    $(document).ready(function() {
    $("#accordion,#accordion1").accordion({ heightStyle: \'content\' });
   
    });
$doc->addStyleDeclaration('
    #accordion h5, #accordion h4{ cursor:pointer }
');
');

lascio sempre lavoro da fare.... :)  se volete mettere in locale gli script è meglio e anche il loro caricamento può essere un parametro configurabile... magari già ce li avete.
Un altra cosa da notare è
$("#accordion,#accordion1").accordion({ heightStyle: \'content\' });

"#accordion,#accordion1" permette ( un po' sporco) il "nested" di accordion (anche se il debug dice che non è bilanciato) che ritrovate poi nel template

heightStyle: \'content\' } Serve a dimensionare automaticamente al contenuto... per evitare il dimensionamento automatico al massimo contentuto
...poi

l'helper... beh quello un po' cambia ma nemmeno tanto, secondo me si era già complicato la vita con quella query...
:
public static function getList(&$params){
        //get database
        $db = JFactory::getDbo();
        $query = $db->getQuery(true);
        $query->select(
                $query->year($db->quoteName('a.created')).' AS created_year,'.
                $query->month($db->quoteName('a.created')).' AS created_month,
                a.title, a.id, a.created, c.title AS category');   
        $query->from('#__content AS a');
        $query->join('LEFT', '#__categories AS c ON c.id = a.catid');
        $query->where('a.state = 2 AND a.checked_out = 0');
        $app = JFactory::getApplication();
        if ($app->getLanguageFilter()){
            $query->where('language in (' . $db->quote(JFactory::getLanguage()->getTag()) . ',' . $db->quote('*') . ')');
        }
        $query->order('a.created');           
        $db->setQuery($query);
        $rows = (array) $db->loadObjectList();
        $lists = array();
        if($rows){
            foreach ($rows as $row){
                $lists[$row->created_year][JHTML::_('date', $row->created, 'F')][] = array(
                    'cat' => $row->category,
                    'link' => JRoute::_('index.php?option=com_content&view=article&id='.$row->id),
                    'text' => $row->title
                    );
            }
        }
        return $lists;
    }


..non c'è molto da dire... non ho la vista "archive" ma quella diretta all'articolo.
Se volete complicarvi la vita (poco consigliabile) e andare a creare un ulteriore accordion, magari sulla categoria, basta aggiungere un elemento all'array prima di quello vuoto
 $lists[$row->created_year][JHTML::_('date', $row->created, 'F')][] = array(

e ovviamente aggiungere il #accordion all'inizializzazione (entry point) e la foreach nel template per visualizzarlo

ora il template default.php
:
<?php if (!empty($list)) :?>

    <div id="accordion" class="accordion">
       
    <?php foreach ($list as $y=>$item) : ?>
       
        <h4><?php echo $y?></h4>
       
        <div class="accordion-inner">
            <div id="accordion1">
        <?php foreach ($item as $m=>$arts) : ?>
                    <h5><span class="flex-subpanel"><?php echo $m?></span>
<span class="flex-count">(<?php echo count($arts);?>)</span></h5>
                    <div class="accordion-body">
            <?php foreach ($arts as $art) : ?>
                    <p class="flex-link"><a href="<?php echo $art['link']; ?>"><?php echo $art['text']; ?>[/url]</p>
            <?php endforeach; ?>
                    </div>
        <?php endforeach; ?>
            </div>
        </div>

    <?php endforeach; ?>
       
    </div>

<?php endif; ?>


ATTENZIONE: non è  sef compatibile, sarebbe da implementare, quindi consideratelo come poc di codice o usatelo senza problemi se non usate il rewrite dell'url
: Re:Il modulo antipatico
: Murphz 16 May 2013, 16:56:10
Ottimo lavoro! :)
: Re:Il modulo antipatico
: BelinBelan 16 May 2013, 18:13:11
uhmmm  ::)  per essere "buono" ci voleva un bell'articolo in prima pagina  ;D


Ottimo, invece...  ;)
: Re:Il modulo antipatico
: mau_develop 16 May 2013, 18:29:12
bisogna mettere il bootstrap e testarlo con un po di browser ... sempre che il bootstrap li regga i nested accordion.

...simoneeee ... che è quell'errore di bilanciamento di JQuery?? :):)
: Re:Il modulo antipatico
: simone83 17 May 2013, 01:00:23
domani ti ci do un occhio, comuqnue odio profondamente jquery, fighissimo per carita ma secondo me lo sviluppo di classi su mootools è infinitamente piu semplice
: Re:Il modulo antipatico
: mau_develop 17 May 2013, 08:15:43
a proposito di mootools, anche lui mi da degli errori....

L'utilizzo di getAttributeNode() è deprecato. Al suo posto utilizzare getAttribute().
Su tutti i 3.1, nel mootools.core

qs è quello di JQuery... credo:
La scrittura di un albero non bilanciato tramite document.write() ha richiesto un ulteriore parsing dei dati dalla rete. Per maggiori informazioni consultare https://developer.mozilla.org/en/Optimizing_Your_Pages_for_Speculative_Parsing

ho il sospetto che potrebbe anche essere dovuto al parsing di Codecitation
: Re:Il modulo antipatico
: simone83 17 May 2013, 10:45:48
se vuoi il valore di un attributo su mootools usa get('nomeattributo')
: Re:Il modulo antipatico
: mau_develop 20 May 2013, 09:47:46
come ho aggiunto in fondo al primo post c'è qualche problema col sef.
Non ho molto tempo per sistemarlo,... ho provato a farlo velocemente ma sbaglio qualcosa... se c'è qualche volenteroso....

[EDIT] Ma che figata.... il prossimo che parla male di joomla lo picchio al JDay :)

... c'è una classe per tutto basta un po' di pazienza e cercare e pregare che se legacy non succeda un macello con le future versioni della platform...

bisogna recuperare la catid che io ho usato o meglio non usato come nome, quindi nella query va aggiunto il a.catid

poi cambia il routing, riposto l'helper
:
public static function getList(&$params){
        //get database
        $db = JFactory::getDbo();
        $query = $db->getQuery(true);
        $query->select(
                $query->year($db->quoteName('a.created')).' AS created_year,'.
                $query->month($db->quoteName('a.created')).' AS created_month,
                a.title, a.id, a.created, a.catid, c.title AS category');   
        $query->from('#__content AS a');
        $query->join('LEFT', '#__categories AS c ON c.id = a.catid');
        $query->where('a.state = 2 AND a.checked_out = 0');
        $app = JFactory::getApplication();
        if ($app->getLanguageFilter()){
            $query->where('language in (' . $db->quote(JFactory::getLanguage()->getTag()) . ',' . $db->quote('*') . ')');
        }
        $query->order('a.created');           
        $db->setQuery($query);
        $rows = (array) $db->loadObjectList();
        $lists = array();
        if($rows){
            foreach ($rows as $row){
                $lists[$row->created_year][JHTML::_('date', $row->created, 'F')][] = array(
                    'cat' => $row->category,
                    'link' => JRoute::_(ContentHelperRoute::getArticleRoute($row->id, $row->catid)),
                    'text' => $row->title
                    );
            }
        }
        return $lists;
    }


Ora è perfetto con il sef e viene anche selezionato nel menù principale il giusto itemid active