hook_theme

jodri2003 képe

Sziasztok!
Egyedi modulnál, mely az 5.x verziójú drupallal helyesen működött, az alábbi problémába futottam és nem találom a megoldást: (menü és modul részek 6-hoz igazítottak)
A modul theme hook elemei nem érvényesülnek. (vagy felülíródnak?)
A megvalósítás nem tartalmaz többet mint az alábbi címen található instrukciók: http://api.drupal.org/api/drupal/developer--topics--forms_api.html/6
A modul az alábbi hook elemeket használja: sajat_menu, sajat_form, theme_sajat_form
A theme_sajat_form függvényben elhelyezett html kód egyeltalán nem kerül a kimenetre.
Kérdésem, hogy a fenti api.drupal.org címen lévő példát valaki használta-e és milyen eredménnyel
Köszönettel: Jodri

Drupal verzió: 
pp képe

Mert kód nélkül kb. erre az egyre van lehetőség.
Na, a kedvedért leöltem egy csirkét. A húsából főztem egy jó levest, hogy nekem is legyen valami jó. A csontjait vetve a következő jött ki:

A hook_theme() függvényt megvalósítottad?

function sajat_theme() {
  return array(
    'sajat_form' => array(
      'arguments' => array('form' => NULL),
    ),
  );
}

pp

0
0
pp képe

sajat_form: ha ez a form_id-d azaz az űrlap azonosítód akkor az nem sok jót jelent, hisz van hook_form is, szóval látni kéne azt a kódot, hogy értelmeset lehessen mondani.

Nem kell féltened a kódod, tudod ez egy nyílt forrású program amit éppen használsz... vagy mi a fene.

pp

0
0
jodri2003 képe

Igen, pontosan ez volt a probléma. Sajnos az általad írt kódrészlet nincs benne a belinkelt helyen, pedig szerintem nagyon ott lenne a helye.
A kód egyébként nem titkos, íme:

/**
 * @file
 * Kaszói nevezést megvalósító modul 2010-ben.
 */
 
/**
 * Implementation of hook_menu().
 */
function kaszo_menu() {
	//global $user;
	$items = array();
 
	$items['kaszonevezesiurlap'] = array(
			'title' => 'Kaszó nevezési űrlap',
			'page callback' => 'kaszo_page',
			'access arguments' => array('access content'),
			'type' => MENU_CALLBACK);
	$items['kaszonevezesilista'] = array(
			'title' => 'Rajtlista',
			'page callback' => 'kaszo_page_list',
			'access arguments' => array('access content'),
			'type' => MENU_CALLBACK);
 
	return $items;
}
 
/**
 * Menu callback; displays a Drupal page containing recent kaszo entries.
 */
 function kaszo_page($a = NULL, $b = NULL) {
 
	//print theme('page','<p>Az előnevezési határidő lejárt. További nevezéseket a helyszínen fogadunk, a nevezési kiírásnak megfelelően.</p>Rendezőség');
 
	return kaszofeldolgoz_page();
}
 
function kaszofeldolgoz_page() {
	return drupal_get_form('kaszo_form');
}
 
 
function kaszo_form($form_state) {
	$options1= array('1' => 'Igen', '0' => 'Nem');
	$options2= array('1' => 'Férfi', '0' => 'Nő');
 
	//fejléc kezdete	
	$form['csapatvez'] = array(
			'#type' => 'fieldset',
			'#title' => 'Csapatvezető',
			'#tree' => TRUE,
			);
	$form['csapatvez']['neve'] = array(
			'#type' => 'textfield',
			'#title' => 'Csapatvezető neve',
			'#default_value' =>  variable_get('neve', ''),
			'#required' => true ,
			'#description' => 'Ide írd a csapatvezető nevét vagy egyénileg nevező esetén a teljes nevedet. A csapatvezető az a személy aki a nevezési irodán a csapat nevezési csomagját egyben veszi át. A nevezési irodába technikai okok miatt csak a csapatvezető léphet be.',
			);
 
	$form['csapatvez']['email'] = array(
			'#type' => 'textfield',
			'#title' => 'Csapatvezető e-mail címe',
			'#default_value' => variable_get('email', ''),
			'#required' => true ,
			'#description' => 'A létező e-mail címe a csapatvezetőnek, melyen a kapcsolatot szeretné tartani.',
			);
 
 
	// Description Versenyzők szakasz kezdete
 
 
	$form['details'] = array(
			'#type' => 'fieldset',
			'#title' => 'Versenyzők'			
			);
 
	for ($i=1; $i<=30; $i++) {
 
		$form['details']['neve'.$i] = array(
				'#type' => 'textfield',
				'#title' => '',
				'#size' => 30,
				'#maxlength' => 30,
				'#default_value' =>  variable_get('neve' . $i , ''),
				'#description' => $i.'. Versenyző neve',
				'#prefix' => '<tr><td class="kaszosorneve">',
				'#suffix' => '</td>',
				);
		$form['details']['ev'.$i] = array(
				'#type' => 'textfield',
				'#title' => '',
				'#size' => 5,
				'#maxlength' => 4,
				'#default_value' =>  variable_get('ev' . $i , ''),
				'#description' => '',
				'#prefix' => '<td class="kaszosorev">',
				'#suffix' => '</td>',
				);
 
 
		$form['details']['neme'.$i] = array(
				'#type' => 'select',
				'#title' => '',
				'#size' => 1,
				'#maxlength' => 4,
				'#options' => $options2,
				'#default_value' =>  variable_get('neme' . $i , 1),
				'#description' => '',
				'#prefix' => '<td class="kaszosorneme">',
				'#suffix' => '</td>',
				);
 
		$form['details']['egyesulet'.$i] = array(
				'#type' => 'textfield',
				'#title' => '',
				'#size' => 30,
				'#maxlength' => 30,
				'#default_value' =>  variable_get('egyesulet' . $i , ''),
				'#description' => '',
				'#prefix' => '<td class="kaszosoregyesulet">',
				'#suffix' => '</td>',
				);
 
		$form['details']['licenc'.$i] = array(
				'#type' => 'textfield',
				'#title' => '',
				'#size' => 7,
				'#maxlength' => 10,
				'#default_value' =>  variable_get('licenc' . $i , ''),
				'#description' => '',
				'#prefix' => '<td class="kaszosorlicenc">',
				'#suffix' => '</td>',
				);
 
		$form['details']['ironmanoke'.$i] = array(
				'#type' => 'select',
				'#title' => '',
				'#size' => 1,
				'#maxlength' => 10,
				'#options' => $options1 ,
				'#default_value' =>  variable_get('ironmanoke' . $i , 0),
				'#description' => '',
				'#prefix' => '<td class="kaszosorironmanoke">',
				'#suffix' => '</td></tr>',
				);
 
 
	}
 
 
	$form['hidden'] = array('#type' => 'value', '#value' => 'is_it_here');
	$form['submit'] = array('#type' => 'submit', '#value' => t('Beküldés'));
 
	$form['details']['neve1']+=array('#required' => true);
	$form['details']['ev1']+=array('#required' => true);
	$form['details']['egyesulet1']+=array('#required' => true);
 
	return $form;
}
 
function theme_kaszo_form($form) {
	drupal_add_css(drupal_get_path('module', 'kaszo') .'/kaszo.css');
	//drupal_add_css(drupal_get_path('module', 'kaszo') .'/kaszoprint.css','module','print');
 
	$output = '';
	$output .= '<div class="formblokknevez">';
	$output .= drupal_render($form['csapatvez']);
	$output .= drupal_render($form['csapatvez']['neve']);
	$output .= drupal_render($form['csapatvez']['email']);
 
 
	//$output .= drupal_render($form['details']);
 
	$output .='
			<table>
			<tr>
			<td class=kaszosorneve>Versenyző neve</td>
			<td class=kaszosorev>Sz.év</td>
			<td class=kaszosorneme>Neme</td>
			<td class=kaszosoregyesulet>Egyesület</td>
			<td class=kaszosorlicenc>Licenc</td>
			<td class=kaszosorironmanoke>Ironmanre neveztem</td>
			</tr>
			</table><table>';
 
	for ($i=1;$i<=30;$i++)
	{
		$output .= drupal_render($form['details']['neve'.$i]);
		$output .= drupal_render($form['details']['ev'.$i]);
		$output .= drupal_render($form['details']['neme'.$i]);
		$output .= drupal_render($form['details']['egyesulet'.$i]);
		$output .= drupal_render($form['details']['licenc'.$i]);
		$output .= drupal_render($form['details']['ironmanoke'.$i]);
	}
 
	$output .= '</table></div>';
	$output .= drupal_render($form['submit']);
 
	$output .= drupal_render($form);
	return $output;
}
 
function kaszo_theme() {
 
return array(
    'kaszo_form' => array(
      'arguments' => array('form' => NULL),
    ),
  );
}

És természetesen köszönet a gyors segítségért.
Jodri

0
0
hosszu.kalman képe

Szia!

Pár hiba, amire én a jövőben figyelnék a helyedben:

  • A modulokban nem szokás magyarul kódot írni. Ha angolul írod, a megjelenítésnél használod a t() fgv-t és készítesz fordítást akkor jól fog megjelenni az oldalon is. Pl a menüben a title automatikusan a t fgv-nek van átadva, ezért a rendszer a magyar kódra azt hiszi hogy angol, emiatt ha a jövőben kell még egy nyelv akkor nehézkes lesz fordítani.
  • Én létre szoktam hozni külön jogosultságot, ez nem hiba de jobban elkülöníthető ha nem az access contet jogosultságot használod (hook_perm())
  • A kaszo_form illeszkedik a hook_form-ra, én más nevet adnék neki
  • A Drupal coding standard-et szokás betartani
  • A táblázat bedrótozása helyett használható a theme('table') fgv.

Nem kötekedni szeretnék, csak tanács.

0
0
jodri2003 képe

Köszönöm a bogarászást. A t() fgv használata egyszerűen azért maradt el mert ez nem lesz fordítva, csak kb 1 hónapig fog működni ebben a formában, utána nem is lesz elérhető, mivel egy nevezést bonyolít le.
hook_perm() -> mindenki nevezhet az 1 hónapnyi idő alatt.
A hook_form -> ez már nagyon érdekes, az ismertetett példák miatt választottam ezt a nevet, azt hittem a validate és hasonló részek meghívása csak akkor valósul meg, ha a _form szerepel a névben. Az analógia amire építettem, hogy a modul nevek kialakításánál is követni kell az elnevezési szabályt, hogy pl: modulnev_menu, mert csak így kerül meghívásra és itt a _menu kötelező. Ezt nyilván rosszul tudtam nagy köszönet a figyelmedért.
Coding Standard -> majd igyekszem, de a beidegződések, más nyelvekből hozott szokások leküzdése nem egyszerű.:)
theme('table')->ezt nem is ismertem, de azt hiszem ezután használni fogom. (Nagyon hasznosnak tűnik)
Kösz az észrevételeket, sokat segített.
Üdv: Jodri

0
0