Block-ban theme table

makgab képe

Hi!

Teszt jelleggel írtam egy modult, ami egy sql eredményét írná ki theme table formában.
Csak egy "Array" jelenik meg a blokkban. Mit néztem el? :(

<?php
/*
 *
 * Block hook
 *
 */
function myblock_block($op = 'list', $delta = 0, $edit = array()){
    switch($op){
        case 'list':
            $blocks[0]['info'] = "My Module Block";
            return $blocks;
 
        case 'view':
            $blocks['subject'] = "My Module";
//          Block content!!!!!!!!!!
            $blocks['content'] = blockview();
 
            return $blocks;
    }            
}
 
 
/*
 *   Blocklist ************************************************************************
 */
function blockview() {
  $header = array(
    array('data' => t('ID'), 'field' => 'pid', 'sort' => 'asc'),
    array('data' => t('NAM'), 'field' => 'nam'),
  );
 
  $form['header'] = array(
   '#type' => 'value',
   '#value' => $header,
  );
 
  $sql = 'SELECT pid, nam FROM {myblock} ';
  $sql .= tablesort_sql($header);
 
  $result = pager_query($sql, 50, 0);
 
  $form['myblock']['#tree'] = TRUE;
 
  while ($myblock = db_fetch_object($result)) {
    $form['myblock'][$myblock->pid] = myblock_row($myblock);
  }
 
  $form['pager'] = array('#value' => theme('pager', NULL, 50, 0));
  $form['#theme'] = 'myblock';
 
  return $form;
} 
 
 
/*
 *   Row ************************************************************************
 */
function myblock_row($myblock) {
  $form['pid'] = array(
    '#type' => 'markup',
    '#value' => $myblock->pid,
  );
  $form['nam'] = array(
    '#type' => 'markup',
    '#value' => $myblock->nam,
  );
 
  return $form;
} 
 
 
/*
 *   Theme ************************************************************************
 */
function theme_myblock($form) {
  $header = $form['header']['#value'];
  $rows = array();
 
  foreach (element_children($form['myblock']) as $key) {
     // Build the table row.
    $rows[] = array(
      array('data' => drupal_render($form['myblock'][$key]['pid'])),
      array('data' => drupal_render($form['myblock'][$key]['nam'])),
    );
  }
 
  $output = theme('table', $header, $rows);
  if ($form['pager']['#value']) {
    $output .= drupal_render($form['pager']);
  }
  $output .= drupal_render($form);
 
  return $output;
} 
 
?>
Drupal verzió: 
makgab képe

Vagy blokkban a theme table nem használható?

0
0
szantog képe

Vagy blokkban a theme table nem használható?
Már miért is ne?

Én ugyan sosem csináltam még lekérdezősdi rendezős táblázatosdit, de elképzelésem sincs, hogy esetedben hogy sikerült belekeverni egy mezei táblázat létrehozásába a fapit, hiszen a nevében is benne van hogy _FORM_ és a változóidban is ott a $form, meg a végén a drupal_render_form.

Szóval a Drupal logikájából kiindulva nehezen tudom elképzelni, hogy drupal_render_form kelljen egy egyszerű táblázathoz, úgyhogy induljunk ki onnan, hogy vagy írd le azt, hogy milyen formot akarsz létrehozni, ha tényleg azt akarsz, vagy dobjál ki minden fapi cuccot a kódból, és utána térjünk rá vissza.

0
0

----
Rájöttem, miért kérdezek olyan ritkán a drupal.hu-n. Amíg szedem össze az infokat a kérdéshez, mindig rájövök a megoldásra.

makgab képe

Alapesetben így generálunk egy táblázatot, ahogy anno segítettetek itt a fórumon (itt).
Csak próbáltam ehhez igazodni. Ha ez nem a legszebb megoldás, akkor a segítségeteket kérem. A lényeg, hogy blokkban szeretném egy sql eredményét megjeleníteni táblázatban.

0
0
szantog képe

Most őszintén! Te érted azt a kódot, vagy agyatlan copypaste-ről van? (Amivel egyébként semmi gond nincs, amíg nem kezdi el farigcsálni az ember, amit nem ért.)

Modult írni anélkül, hogy _kivétel nélkül_ minden egyes soráról nem tudod, hogy miről szól kb olyan, mint bombát gyártani akciófilm-élmények alapján. Lehet, hogy összejön, lehet, hogy kicsit pukkan is, de valaki biztosan sírni fog, legkésőbb akkor, ha más kézbeveszi a kódodat.

A hivatkozott topicban van minden, meg annak a hivatkozásában van minden, ami ebben az esetben nem kell, sőt, lehet, hogy Pasqualle sem így csinálná ezt, mint három évvel ezelőtt.

Ha blokkban kell egyszerű táblázat, minden feldolgozás nélkül, nem kell semmi form varázslás (form= felhasználói bevitel) Még sosem csináltam ilyet, de a buksis emlékeim és az api dokumentáció alapján meglepődnék, ha ennél több kellene egy táblázathoz:

function blockview() {
  $rows = array();
  $line_per_page = 50;
 
  $header = array(
    array('data' => t('ID'), 'field' => 'pid', 'sort' => 'asc'),
    array('data' => t('NAM'), 'field' => 'nam'),
    );
 
  );
 
  $sql = 'SELECT pid, nam FROM {myblock} ';
  $sql .= tablesort_sql($header);
 
  $result = pager_query($sql, $line_per_page, 0);
 
  while ($results = db_fetch_array($result)) {
    $rows[] = array(
      'pid' = $results['pid'],
      'name' = $results['name'],
     );
  }
  print theme_table($header, $rows);
  print theme_pager($line_per_page);
}
0
0

----
Rájöttem, miért kérdezek olyan ritkán a drupal.hu-n. Amíg szedem össze az infokat a kérdéshez, mindig rájövök a megoldásra.

makgab képe

Köszönöm a segítséget, de:
1./ Magam írtam a kódot és persze messze nem tökéletes a tudásom. Ezért is kértem segítséget. A minta csak egy kiindulás volt. Az volt a kérdés (egyik része), hogy ez blokkban is használható-e. Ha nem írtam volna mintát, gondolom abba kötöttél volna bele, hogy miért nincs semmi kód részemről, csak a kész megoldást várom.
2./ Én sem fikázok senkit, ha valakinek nem tud valamit és segítséget kér. Nem kell arcoskodni...
3./ Anno a Drupal doksiból raktuk össze a kódot (tehát minta alapján). Ha akkor jó volt a Drupal mintája, gondolom most is jó. A fenti kód csak az én egyszerű próbálkozásom volt a Drupal minta alapján.

0
0
makgab képe

A helyes, működő kód:

<?php
...
function blockview() {
  $rows = array();
  $line_per_page = 50;
 
  $header = array(
    array('data' => t('ID'), 'field' => 'pid', 'sort' => 'asc'),
    array('data' => t('NAM'), 'field' => 'nam'),
    );
 
  $sql = 'SELECT pid, nam FROM {myblock} ';
  $sql .= tablesort_sql($header);
 
  $result = pager_query($sql, $line_per_page, 0);
 
  while ($results = db_fetch_array($result)) {
    $rows[] = array(
      'pid' => $results['pid'],
      'nam' => $results['nam'],
     );
  }
  return theme_table($header, $rows);
}
...
?>
0
0
aboros képe

ugye igy definialod a blokkodat:

function myblock_block($op = 'list', $delta = 0, $edit = array()){
    switch($op){
        case 'list':
            $blocks[0]['info'] = "My Module Block";
            return $blocks;
 
        case 'view':
            $blocks['subject'] = "My Module";
//          Block content!!!!!!!!!!
            $blocks['content'] = blockview();
 
            return $blocks;
    }            
}

úgyhogy a tartalmat előállító függvénynek nem kiírni kell a tartalmat, hanem azzal kell neki visszatérni.
így:
...
function blockview() {
  $rows = array();
  $line_per_page = 50;
 
  $header = array(
    array('data' => t('ID'), 'field' => 'pid', 'sort' => 'asc'),
    array('data' => t('NAM'), 'field' => 'nam'),
    );
 
  $sql = 'SELECT pid, nam FROM {myblock} ';
  $sql .= tablesort_sql($header);
 
  $result = pager_query($sql, $line_per_page, 0);
 
  while ($results = db_fetch_array($result)) {
    $rows[] = array(
      'pid' => $results['pid'],
      'nam' => $results['nam'],
     );
  }
  $output = theme_table($header, $rows) . theme_pager($line_per_page);
  return $output;
}
...

mondjuk.

0
0

-
clear: both;