Views 2 API - nincs node ID

Patuzzi képe

Saját modulból kezelt saját táblákat szeretnék Views2-vel listázni.
A keresés és listázás maga jó, de a szövegekhez kapcsolódó összes link (Link to Node) mindig 0-t hoz.
Érthetőbben mindig www.akarmi.hu/node/0

Mi hiányozhat még?

A modulnev.views.inc így néz ki:

// implementation attempt of hook_views_data
function family_tree_views_data() {
  // Define the base group of this table. Fields that don't
  // have a group defined will go into this field by default.
  $data['ft_person']['table']['group']  = t('Családfa személy');
 
  // For other base tables, explain how we join
  $data['ft_person']['table']['join'] = array(
    'node' => array(
      'left_table' => 'node',
      'left_field' => 'nid',
      'field' => 'pe_drupal_nid',
     ),
  );
 
  $data['ft_person']['pe_family_name'] = array(
    'title' => t('Családnév'),
    'help'  => t('Családfában szereplő személy családneve'),
    'field' => array(
      'handler' => 'views_handler_field_node',    // default
      'click sortable' => TRUE,
    ),
    'filter' => array(
      'handler' => 'views_handler_filter_string',   // default
      'label' => t('Név'),
    ),
    'sort' => array(
      'handler' => 'views_handler_sort',     // default
    ),
  );
 
  ......
 
  return $data;
}
Drupal verzió: 
Pasqualle képe

Az a gond, hogy a views_handler_field_node a nid oszloppal dolgozik mig neked pe_drupal_nid oszlopod van az ft_person tablaban.

Ha a pe_drupal_nid oszlopot atnevezned nid-re az ft_person tablaban akkor mukodne a kod.

Ha nem akarod atnevezni az oszlopot akkor sajat handler-t kell irnod a views_handler_field_node alapjan ahol a nid helyett mindenhol pe_drupal_nid-et hasznalsz.

meg egy kiegeszites:
a join reszhez betennem, hogy 'type' => 'INNER', igy nem kell a node listat meg kulon szurni, mert igy csak olyan node-okat fog kivalasztani amik szerepelnek a sajat tabladban is.

0
0
Patuzzi képe

Köszönöm, kipróbálom.
Majd jelentkezem az eredménnyel.

0
0
Patuzzi képe

Átneveztem az oszlopot 'nid'-re és jó lett, köszönöm.
Csak át kellett a modulban is írni a hivatkozásokat is.

Azt hittem, hogy a join ezt automatikusan megoldja:

  $data['ft_person']['table']['join'] = array(
    'node' => array(
      'left_table' => 'node',
      'left_field' => 'nid',
      'field' => 'pe_drupal_nid',
     ),
  );
  // ...

Én úgy érzem, hogy ez egy kis hiányossága a Views-nak...
Szerintem csak ezért nem kellene minden típushoz (numeric, string, date stb.) külön handlert írni.

0
0
Patuzzi képe

Azért nem szoktam adatbázisokban egyforma mezőneveket használni, mert akkor nem kell minősíteni őket (táblanév.név). Inkább az első két karakterben jelölöm a tábla nevét.

Most a Views miatt több 'nid' mezőm lesz, így aliast kell használni, és a 'select * from' sem működik több táblánál.

De ez szokás kérdése biztos.

0
0
Pasqualle képe

en szeretem ha minden tablaban az egyforma adatok egyforma nevvel szerepelnek. Kar, hogy a Drupal sem kovetkezetes ebbol a szempontbol (pl cid, pid mast jelenthet tablatol fuggoen).

a "SELECT * FROM ... JOIN ..." forma mukodik alias nelkul is, itt egy pelda:

$result = db_query("SELECT * FROM {node} n JOIN {node_revisions} nr ON n.nid = nr.nid ORDER BY n.nid");
 
while ($row = db_fetch_object($result)) {
  print $row->nid .' '. $row->title .'<br />';
}

gondolom az tortenik, hogy ha a join-olt tablaban azonos nevu oszlop szerepel az kimarad (vagy auto alias-t kap? nem tudom)
0
0
Pasqualle képe

egesz biztosan lehetne a views_handler_field_node helyett egy altalanosabb handler-t irni ami kepes lenne barmilyen oszlopnevvel osszekapcsolni a node tablat, de a legotobb modulnak es az alap Drupalnak is elegendo ez a handler.

nem kellene minden típushoz (numeric, string, date stb.) külön handlert írni

ez igazabol nem ertem. hogyan jutottunk el a tabla oszlop nevetol a oszlop tipusahoz? nem latom az osszefuggest.. A tipusok szerinti kulon handler-re szukseg van mert mas opciok kellenek az admin feluletre es altalaban maskepp is kell megjeleniteni..

0
0