[Views] Archive

Views wordt de hemel in geprezen. Maar ik snap er maar weinig van.

Ik heb Views aan staan. En het eerste wat ik ermee wil maken is een Archive. Leuk, want standaard komt dit al mee met Views.

In mijn website heb ik aan de rechterkant een block waarin een archief wordt weergegeven. Standaard met het oudste bovenaan en nieuwste onder. In alle keuze mogelijkheden snap ik dat de Sort functie de sorteer volgorde kan omdraaien.

Het voorbeeld (page) wordt goed weergegeven. Nieuwe archief mappen staan boven aan (Ascending). Maar in mijn block wordt dit niet aangepast. Dat wil ik nog snappen, want page en block is iets anders. Maar als ik bij alle opties, linksboven specifiek block aanklik, dat staat dit net als page gesorteerd op Ascending.

En nou snap ik het niet meer.

En dit is maar het begin.
Standaard wordt de berichten per maand opgeslagen (december 2009 (18), januari 2010 (3)). Ik zou het mooi vinden als de oudere jaargangen per jaar worden opgeslagen. Dat ik bijvoorbeeld jaar 2005 aan klik en daaronder pas de maanden van 2005 zie.

 

Waarom Block niet???

Ik ben een stuk verder. Ik moet de boel sorteren op Descending, wil ik de nieuwsten boven aan hebben staan.

Default staat gesorteerd op Descending.
(Page heb ik zelfs verwijderd.)
Block staat gesorteerd op Descending, buiten dat neemt ie de instelling van default over.

Doe ik een preview dan geeft de query:
Default: ORDER BY created_year_month DESC
Block: ORDER BY created_year_month ASC

Maar waarom, alles staat op op Descending...

Niet alleen Block niet.

Zelfs als ik Default Sort criteria op Ascending. Blijft de preview Descending geven en veranderd er eigenlijk helemaal niks.

Zelfs als ik de sort opties verwijder. (Lees, en ook bij alle bovenstaande acties, ik heb ge-saved, pagina opnieuw geladen (ctrl+f5).) Blijft de preview op Descending sorteren.

Hieronder de preview query van Default:

SELECT DATE_FORMAT((FROM_UNIXTIME(node.created) + INTERVAL 3600 SECOND), '%Y%m') AS created_year_month,
COUNT(node.nid) AS num_records
FROM node node
WHERE node.status <> 0
GROUP BY created_year_month
ORDER BY created_year_month DESC

Meer details, ik gebruik Drupal 6.15 en Views 6.x-2.8

Zou je de view kunnen exporteren en hier posten? (Liefst tussen <code> tags.) Dan kan ik 'm zelf even uitproberen.

Dit is een export van de block die ik nu in mijn website zie.

$view = new view;
$view->name = 'archive';
$view->description = 'Display a list of months that link to content for that month.';
$view->tag = 'default';
$view->view_php = '';
$view->base_table = 'node';
$view->is_cacheable = FALSE;
$view->api_version = 2;
$view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */
$handler = $view->new_display('default', 'Defaults', 'default');
$handler->override_option('arguments', array(
  'created_year_month' => array(
    'id' => 'created_year_month',
    'table' => 'node',
    'field' => 'created_year_month',
    'default_action' => 'summary desc',
    'style_plugin' => 'default_summary',
    'style_options' => array(
      'count' => 1,
      'override' => 1,
      'items_per_page' => '30',
    ),
    'wildcard' => 'all',
    'wildcard_substitution' => 'All',
    'title' => '%1',
    'relationship' => 'none',
    'validate_type' => 'none',
    'validate_fail' => 'not found',
    'default_argument_type' => 'fixed',
  ),
));
$handler->override_option('filters', array(
  'status' => array(
    'id' => 'status',
    'table' => 'node',
    'field' => 'status',
    'operator' => '=',
    'value' => 1,
    'group' => 0,
    'exposed' => FALSE,
    'expose' => array(
      'operator' => FALSE,
      'label' => '',
    ),
    'relationship' => 'none',
  ),
));
$handler->override_option('access', array(
  'type' => 'none',
  'role' => array(),
  'perm' => '',
));
$handler->override_option('cache', array(
  'type' => 'none',
));
$handler->override_option('title', 'Monthly archive');
$handler->override_option('use_pager', '1');
$handler->override_option('row_plugin', 'node');
$handler->override_option('row_options', array(
  'teaser' => TRUE,
  'links' => TRUE,
));
$handler = $view->new_display('block', 'Block', 'block');
$handler->override_option('arguments', array(
  'created_year_month' => array(
    'id' => 'created_year_month',
    'table' => 'node',
    'field' => 'created_year_month',
    'default_action' => 'summary asc',
    'style_plugin' => 'default_summary',
    'style_options' => array(
      'count' => 1,
      'override' => 0,
      'items_per_page' => '30',
    ),
    'wildcard' => 'all',
    'wildcard_substitution' => 'All',
    'title' => '%1',
    'relationship' => 'none',
    'validate_type' => 'none',
    'validate_fail' => 'not found',
    'default_argument_type' => 'fixed',
  ),
));
$handler->override_option('block_description', 'Archive list');
$handler->override_option('block_caching', -1);

OK, ik zie waar de verwarring vandaan komt. Ik raad je aan om de archive view even terug te zetten naar de oorspronkelijke versie dmv het 'revert' knopje op /admin/build/views. (Als je later terugwilt naar wat je nu hebt, kan je altijd de bovenstaande export weer importeren.)

Deze default archive view heeft eigenlijk twee 'standen':
Stand 1: er is geen jaar+maand geselecteerd.
Stand 2: er is wel een jaar+maand geselecteerd.
Op de view edit pagina zie je onder Arguments "Node: Created year + month" staan. Dat is hoe de view het geselecteerde jaar+maand ontvangt: via een 'argument'. Als je op "Node: Created year + month" klikt, zie je de instellingen van dit argument. Hier vind je o.a. de "Action to take if argument is not present:" instelling. Dat is wat er gebeurt in stand 1, oftewel het antwoord op de vraag "Wat moet de view doen als hij niet weet welk jaar+maand hij moet tonen?" Het antwoord staat standaard ingesteld op "Summary, sorted descending", wat betekent dat het overzicht van de maanden wordt geordend van recent naar lang geleden.
De instelling "Node: Post date asc" die je terugziet onder "Sort citeria" heeft betrekking op stand 2: dit is de ordening van de afzonderlijke nodes als er wel een maand+jaar geselecteerd is.

OK, dus eigenlijk wordt er dus gewoon twee keer gesorteerd.
Heb de boel ge-revert. Zonder aan te passen heb ik de previews van default, page en block bekeken. Default en page descending, block ascending.

En inderdaad enkel, de argument van block stond op ascending. Dit heb ik aangepast en nu wordt het boeltje goed weergegeven.

Sort criteria ben ik ditmaal helemaal niet aangekomen.