szavazás és a bejegyzés törzse

nevergone képe

Sziasztok!

Drupal 6.4 alatt szeretnék egy olyan szavazást indítani, amely a címen és a választható lehetőségeken kívül tartalmazza a bejegyzés törzsét is, ahol hosszabb leírást adhatok a szavazás mellé.
Persze látom én, hogy nem fog ez menni, de azért próbálkozzunk.

1.) admin/build/modules oldalon a "Poll" modul bekapcsolva
2.) admin/content/node-type/poll oldalon a "Beküldési űrlap beállítások" -nál a "Törzs" mező címe kitöltve, hiszen nekünk az kell.
3.) node/add/poll oldalon nem található a "Törzs" mező, vagyis hiába állítottam be a 2.) pontnál.

Szerintetek milyen módon (lehetőleg külső modul nélkül) lehetne olyan szavazást összehozni, amely tartalmaz törzs mezőt is?

judik.david képe

Hi!
Drupal 5-ben én ezt úgy csinálnám, hogy mező hozzáadása, text field. Ehhez persze kell a CCK modul is.

0
0
nevergone képe

Ez lehetséges megoldásnak tűnik (gyakorlatban nem próbáltam), de próbálom elkerülni a "modul poklot", vagyis minél kevesebb külső modult használni, mert azok egymással összeakadhatnak, instabil működést, vagy bármi más galibát okozhatnak.

0
0
pp képe

A poll modul-ban has_body=>false, tehát nincs hozzá törzs. Sajnos ezt nem elég átírnod, mert a body-t a node-ot megvalósító modulnak kell mentenie.

érthetőbben ez biza nehéz. (legalábbis nekem nem jut eszembe semmi egyszerű megoldás.)

Lehetőségek:
legegyszerűbb talán a webform modul, mely bár nem szavazásra szolgál, de van egy statisztika rész, melyből kiszűrheted a kívánt infót. Sőt... az összes szavazás ott van, tehát simogathatod is a statisztikai görbéidet. Sőt... szöveges infót is kérhetsz, pl. van három lehetőség és felvehetsz egy egyéb-et, amit szövegesen is megadhatnak.

A másik lehetőség, hogy csinálsz egy kategóriát és ebbe a kategóriába beküldesz két node-ot az egyik a szavazás a másik a leírás. A leírást az oldalon kiemeled(és ezt küldöd ki a főoldara is, a szavazást nem), tehát az mindig elöl lesz. Ebbe a leírásba azután beleteszed a tovább linket, ami a kategória listára mutat, valamint a egy kis php-t:
 if(arg(0)!='taxonomy') drupal_goto('taxonomy/term/aszavazástidje');
Ez akkor jön jól, ha a node-ot címére kattintanak, tehát a node-ot akarják megnézni, nem a taxonomy listát. Ekkor átdobja a megfelelő oldalra a júzer semmit nem lát ebből.

és egy mini modult is tudsz hozzá fejleszteni, ami a poll-hoz hozzáadja a body-t...

pp

0
0
Sweetchuck képe

és egy mini modult is tudsz hozzá fejleszteni, ami a poll-hoz hozzáadja a body-t...

pollbody.info

; $Id$
name           = "Poll body"
description    = "Add body field to poll content type."
package        = "Other"
dependencies[] = poll
version        = "6.x-1.0-dev"
project        = "pollbody"
core           = 6.x

bollbody.module

// $Id$
 
/**
 * @file
 *    Add body field to poll content type.
 */
 
/**
 * Implementation of hook_form_alter().
 */
function pollbody_form_alter(&$form, $form_state, $form_id) {
  if ( $form_id == 'poll_node_form') {
    //Nem jó, akkor sem ha az admin felületen ki van töltve.
    //$type = node_get_types('type', $node);
    //$body_label = $type->body_label;
    $body_label = t('Body');
 
    $body = '';
    $body_format = FILTER_FORMAT_DEFAULT;
    if (isset($form_state['values'])) {      
      $body = $form_state['values']['body'];
      $body_format = $form['values']['format'];
    }
    else if (isset($form['#node']->pollbody)) {
      $body = $form['#node']->pollbody['body'];
      $body_format = $form['#node']->pollbody['format'];
    }
 
    $form['body_field'] = node_body_field($form['#node'], $body_label, 0);
    $form['body_field']['#weight'] = -4;
    $form['body_field']['body']['#default_value'] = $body;
    $form['body_field']['format']['#default_value'] = $body_format;
  }
}
 
/**
 * Implementation of hook_nodeapi().
 */
function pollbody_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
  if ($node->type != 'poll') return;
 
  switch ( $op ) {
    case 'view' :
      $body = '';
      $body_format = FILTER_FORMAT_DEFAULT;
      if (isset($node->body)) {
        //előnézet esetén
        $body = $node->body;
        $body_format = $node->format;
      }
      else {
        if ( !isset($node->pollbody) ) {
          _pollbody_nodeapi_load($node);
        }
        $body = $node->pollbody['body'];
        $body_format = $node->pollbody['format'];
      }
 
      if ( !$a3 ) {
        $node->content['pollbody']['body']['#value'] = check_markup($body, $body_format);
      }
      break;
 
    case 'load' :
      _pollbody_nodeapi_load($node);
      break;
 
  }
}
 
function _pollbody_nodeapi_load(&$node) {
  $node->pollbody = db_fetch_array(db_query("SELECT body, format FROM {node_revisions} WHERE vid = '%d'", $node->vid));
}

Persze ez is egy újabb modul.

0
0
nevergone képe

Köszönet a modulért, jól működik. Egy észrevételem mégis lenne.
A modul a szavazás beküldésekor lehetőséget ad a bejegyzés törzsének megjelenítésére, viszont ebből a törzsből nem fog látszódni semmi, akkor sem, ha készítek bevezetőt.
Ezt lehetne valahogy korrigálni? A modul más dolgában teljesen jól működik (mondjuk arra nem figyel, hogy az admin/content/node-type/poll oldalon be van -e kapcsolva a törzs mező, és annak mi a felirata, de ez annyira nem is vészes), köszönöm, hogy foglalkoztál vele; átnézem a megoldást, biztosan tanulok belőle. :)

Szerk.: "mondjuk arra nem figyel, hogy az admin/content/node-type/poll oldalon be van -e kapcsolva a törzs mező, és annak mi a felirata, de ez annyira nem is vészes" -> látom, ezzel próbálkoztál, csak nem jött össze

0
0
Sweetchuck képe

Az eredeti változat is megjelenítette a body mezőt, de csak teljes nézetben. (ha minden igaz)

Tesztelés továbbra sem árt.

// $Id$
 
/**
 * @file
 *    Add body field to poll content type.
 */
 
/*
  A működés egy kicsit megváltozott,
  még nem tudtam eldönteni hogy jobb lett vagy rosszabb. :)
 
  A bevezető (teaser) és a teljes nézet rendes kezelését egy kicsit nehezíti,
  hogy a Poll modul lefoglalja a {node_revisions}.teaser mezőt.
  Ezért nem lehet tudni hogy a teljes nézetben is meg kell-e jeleníteni a bevezetőt.
  Ez az információ az űrlap elküldésekor még rendelkezésre áll,
  tehát lehetett volna azt is csinálni,
  hogy a pollbody modul, egy saját 2 mezős (vid, teaser_include) adattáblában tárolja.
  De nem ezt választottam, hanem a <!--break--> jelölőhőz hasonlóan,
  belenyomtam egy másik jelölőt a {node_revisions}.body mezőbe.*/
 
/**
 * Implementation of hook_form_alter().
 */
function pollbody_form_alter(&$form, $form_state, $form_id) {
  if ( $form_id == 'poll_node_form') {
    $body_label = t('Body');
   if ( $row = db_fetch_object(db_query("SELECT body_label FROM {node_type} WHERE orig_type = 'poll'")) AND trim($row->body_label)) {
      $body_label = t($row->body_label); //Remélhetőleg angolul lett kitöltve.
    }
 
    $body           = '';
    $teaser         = '';
    $body_format    = FILTER_FORMAT_DEFAULT;
    $teaser_include = FALSE;
    if (isset($form_state['values'])) {
      $teaser         = $form_state['values']['teaser_js'];
      $teaser_include = $form_state['values']['teaser_include'];
      $body           = $form_state['values']['body'];
      $body_format    = $form_state['values']['format'];
    }
    else if (isset($form['#node']->pollbody)) {
      $teaser         = $form['#node']->pollbody['teaser'];
      $teaser_include = $form['#node']->pollbody['teaser_include'];
      $body           = $form['#node']->pollbody['body'];
      $body_format    = $form['#node']->pollbody['format'];
      if ( $teaser_include == FALSE ) {
        $body = $teaser .'<!--break-->'. $body;
      }
    }
 
    $form['body_field'] = node_body_field($form['#node'], $body_label, 0);
    $form['body_field']['#weight'] = -4;
    $form['body_field']['body']['#default_value'] = $body;
    $form['body_field']['format']['#default_value'] = $body_format;
    $form['body_field']['teaser_include']['#default_value'] = $teaser_include;
    $form['body_field']['teaser_js']['#default_value'] = $teaser;
  }
}
 
/**
 * Implementation of hook_nodeapi().
 */
function pollbody_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
  if ($node->type != 'poll') return;
 
  switch ( $op ) {
    case 'insert' :
    case 'update' :
      if ( !$node->teaser_include ) {
        db_query("UPDATE {node_revisions} SET body = CONCAT('<!--ti-->', body) WHERE nid = '%d' AND vid = '%d'", $node->nid, $node->vid);
      }
      break;
 
    case 'view' :
      $teaser         = '';
      $teaser_include = FALSE;
      $body           = '';
      $body_format    = FILTER_FORMAT_DEFAULT;
 
      if (isset($node->op) AND $node->op == t('Preview')) {
        $teaser         = $node->teaser_js;
        $teaser_include = $node->teaser_include;
        $body           = $node->body;
        $body_format    = $node->format;
        $body = _pollbody_split_body($teaser_include, $body, $teaser);
      }
      else {
        if ( !isset($node->pollbody) ) {
          _pollbody_nodeapi_load($node);
        }
        $teaser         = $node->pollbody['teaser'];
        $teaser_include = $node->pollbody['teaser_include'];
        $body           = $node->pollbody['body'];
        $body_format    = $node->pollbody['format'];
      }
 
      if ( $a3 ) {
        $node->content['pollbody']['teaser']['#value'] = check_markup($teaser, $body_format);
      }
      else {
        if ( $teaser_include ) {
          $body = str_replace('<!--break-->', '', $body);
        }
        $node->content['pollbody']['body']['#value'] = check_markup($body, $body_format);
      }
      break;
 
    case 'load' :
      _pollbody_nodeapi_load($node);
      break;
 
  }
}
 
function _pollbody_nodeapi_load(&$node) {
  $node->pollbody = db_fetch_array(db_query("SELECT body, format FROM {node_revisions} WHERE vid = '%d'", $node->vid));
  $node->pollbody['teaser_include'] = TRUE;
  if (strpos($node->pollbody['body'], '<!--ti-->') === 0) {
    $node->pollbody['teaser_include'] = FALSE;
    $node->pollbody['body'] = drupal_substr($node->pollbody['body'], drupal_strlen('<!--ti-->'));
    //$node->body = $node->pollbody['body'];
  }
 
  $node->pollbody['teaser'] = node_teaser($node->pollbody['body'], $node->pollbody['format'], 0);
  $node->pollbody['body'] = _pollbody_split_body($node->pollbody['teaser_include'], $node->pollbody['body']);
}
 
/**
 * Ha kell, akkor levágja a bevezetőt a törzsről.
 *
 * @param boolean $teaser_include
 *    Azt hívatott jelezni hogy a bevezető látszik-e a tartalom teljes nézetében.
 *
 * @param string $body
 *    A tartalom törzse
 *
 * @param $teaser
 *    Ezt akkor kell megadni ha nem a <!--break--> mentén szerenténk leválasztani a bevezetőt.
 *    A $body a $teaser-rel kezdődik, és le kell csípni a $body elejéről.
 *
 * @return string
 *    A $teaser_include-tól függően a $body bevezetővel vagy annélkül.
 */
function _pollbody_split_body($teaser_include, $body, $teaser = NULL) {
  if ( $teaser_include == FALSE AND $teaser !== NULL ) {
    return drupal_substr($body, drupal_strlen($teaser));
  }
  else if ( $teaser_include == FALSE ) {
    if ( FALSE !== ($pos = strpos($body, '\r\n<!--break-->\r\n')) ) {
      return drupal_substr($body, $pos + drupal_strlen('\r\n<!--break-->\r\n'));
    }
    else if ( FALSE !== ($pos = strpos($body, '<!--break-->')) ) {
      return drupal_substr($body, $pos + drupal_strlen('<!--break-->'));
    }
  }
  else {
    return $body;
  }
}
0
0