Custom smink modul blockjához

Th0m4s képe

Sziasztok!
Létrehoztam egy modult, ami hozzáad a blokkokhoz egy új blokkot. Evvel a résszel nem volt problémám, megjelenik gond nélkül.

Viszont ehhez a blokkhoz szeretnék készíteni egy sminket, amit csak ez a modul használ. Így gondoltam használom a hook_theme() függvényt.

my_theme() {
    return array(
        'block' => array( // mi a lényege, hogy 'block' vagy bármi egyéb
            'template' => 'my_view', // a template fájlom neve + tpl.php (a modul könyvtárjában)
            'arguments'=> array( //argumentumok, amik átadódnak a tpl fájlnak
                'title' => null, // $title
                'body'    => null, // $body
                'link'    => null // $link
            )
        )
    );
}

Gondoltam, hogy nem ennyi a dolog, de a doksi többi része nem világos a Using the theme layer (Drupal 6.x) oldalon. Ezt a page preprocess dolgot még kevésbé értem. A doksiban poll-bar van a function nevében, de sem előtte, sem utána nem ír poll-barról.
Drupal verzió: 
Fórum: 
pp képe

Az a gond, hogy a block modul már megvalósítja a block.tpl.php-t. Tehát Te már nem valósíthatod azt meg. Két dolgot tehetsz. Létrehozol egy saját sablont (mondjuk valami olyat ami a modulod nevével kezdődik :)) Ezzel persze csak a blokkod content részét tudod majd formázni. A másik lehetőség, hogy a theme_registry_alter hurkot megvalósítod és block.tpl.php, vagyis block soránál a theme paths tömbhöz hozzáadod a modulod könyvtárát. Ekkor elég elhelyezned a modulod könyvtárába egy block-[modulneve].tpl.php sablont és a Drupal azt onnan fogja venni.

Persze jó lenne tudni miért kell ez, mert simán lehet, hogy sokkal egyszerűbben is meg lehet oldani amit akarsz.

pp

0
0
Th0m4s képe

Egyrészt szeretném, ha a blokk tartalmát nem az admin felületen kéne megírnom, mivel annak a tartalma nem konstans (of course) és tartalomtól függően szeretném változtatni a blokk megjelenését.
Teszem azt, a főoldalon a blokk tartalmazza a 3 legfrisebb blogbejegyzés címét egy kis teaserrel, egy másik oldalon meg események listát láthat benne a felhasználó.

0
0
pp képe

Ehhez miért kell neked a template??

Simán a $content változóban visszaadod amit fentebb írtál és az jelenik meg benne és pont. Beállítod az info-ban, hogy oldalra gyorstárazza, és akkor nem lesz gyász.

A hook_block-ot valósítod meg ugye?

Vagy nem értem mit keresel az admin oldalon a blokk tartalmának beállításakor.

Az, hogy mi van a blokkban az nem smink, hanem modul. Az, hogy hogyan néz ki az meg már smink. Persze a kettő összefügg, de azért az ezen az oldalon ez azon meg az jelenik meg az jól láthatóan nem smink, hanem modulban megvalósítandó.

Jó lenne, ha a kódot amivel létrehoztad a blokkot bemásolnád. Lehet nagyon rossz felé indultál el.

pp

0
0
hosszu.kalman képe

Azt, hogy modulból hozod létre a blokkokat az szerintem jó dolog, viszont a különböző funkciót ellátó blokkoknak érdemes külön blokkot készíteni (modulból). Tehát ha van mondjuk egy blokkod amiben egy kategória hírei vannak, akkor jó lehet ha a kategóriától függ hogy mi jelenik meg benne, de az eseményeket már ne rakd bele. Én a helyedbe létrehoznék külön egy események blokkot is.

A tartalmát érdemes sminkelhetővé tenni és tpl fájlba kirakni (kevesebb memóriát eszik, jobban elkülönül), de szerintem ezért nem érdemes a theme_block() fgv-t felülvágnod a hook_theme_registry_alter-rel, elég szerintem kb ennyi:

/**
 * Implementation of hook_theme().
 * 
 * Define the following templates:
 *  - mymodule_news_block
 *  - mymodule_events_block
 *
 * @return Array of defined theme functions
 *
 * @see mymodule-news-block.tpl.php
 * @see mymodule-events-block.tpl.php
 */
function mymodule_theme($existing, $type, $theme, $path) {
  return array(
    'mymodule_news_block' => array(
      'arguments' => array(
        'title' => NULL,
        'body' => NULL,
        'link' => NULL,
      ),
      'template' => 'mymodule-news-block',
      'path' => drupal_get_path('module', 'mymodule') . '/theme',
    ),
    'mymodule_events_block' => array(
      'arguments' => array(
        'title' => NULL,
        'body' => NULL,
        'link' => NULL,
      ),
      'template' => 'mymodule-events-block',
      'path' => drupal_get_path('module', 'mymodule') . '/theme',
    ),
  );
}

Két template fájlod lesz így, külön lehet formázni a híreket és az eseményeket is.

0
0
sgabe képe

A különböző tartalmakhoz használj külön-külön blokkokat és azt jelenítsd meg amelyikre éppen szükséged van. Minden blokknak külön beállítható a láthatósága és külön sminkelhető egy block-[region|[module|-delta]].tpl.php fájl segítségével.

Szerintem jobb lenne még egyszer átgondolni azt is, kell-e ehhez külön modul. 90%-ban a szükséges tartalom előállítható pl. Views segítségével.

0
0
sgabe képe

Alapból felkínálja a blokk modul a block-[region|[module|-delta]].tpl.php sablon fájl használatát.

0
0
Th0m4s képe

// $Id$
 
function fb_help($path, $arg) {
	$output = '';
	switch ($path) {
		case "admin/help#fb":
			$output = "<p>".t("Ez egy súgószöveg.")."</p>";
			break;
	}
	return $output;
}
function fb_prem() {
	return array('access fb', 'administer fb');
}
 
function fb_block($op = 'list', $delta = 0, $edit = array() ) {
	if( $op == 'list' ) {
		$block = array();
		$block[0]["info"] = t('fb Core');
		return $block;
	}
	else if( $op == 'view' ) {
		$block = array();
		$block['subject'] = 'fb Core';
		$block['content'] = 'saved content: '. variable_get("fb_maxdisp", 3);
		return $block;
	}
}
function fb_admin() {
	$form = array();
	$form['fb_maxdisp'] = array(
		'#type'			=> 'textfield',
		'#title'		=> t('Maximum number of links'),
		'#default_value'=> variable_get('fb_maxdisp', 3),
		'#size'			=> 2,
		'#maxlength'	=> 2,
		'#description'	=> t("The maximum numbers of links to display in the block."),
		'#required'		=> TRUE
	);
	return system_settings_form($form);
}
function fb_admin_validate($form, &$form_state) {
	$maxdisp = $form_state['values']['fb_maxdisp'];
	if( !is_numeric($maxdisp) ) {
		form_set_error('fb_maxdisp', t('You must enter an integer.'));
	}
	else if( $maxdisp <= 0 ) {
		form_set_error('fb_maxdisp', t('Maximum number of links must be positive.'));
	}
}
function fb_menu() {
	$items = array();
	$items['admin/settings/fb'] = array(
		'title'			=> 'Fb Core module settings',
		'description'	=> 'Description of module settings page',
		'page callback'	=> 'drupal_get_form',
		'page arguments'=> array('fb_admin'),
		'access arguments'=> array('administer fb'),
		'type'			=> MENU_NORMAL_ITEM
	);
	return $items;
}
function fb_theme($existing, $type, $theme, $path) {
	return array(
		'fb_news_block' => array(
			'template'	=> 'fb_news_block',
			'path'		=> drupal_get_path('module', 'fb'),
			'arguments' => array(
				'title' => null,
				'body'	=> null,
				'link'	=> null
			)
		)
	);
}

Eddig ennyiről lenne szó.

@pp: a template azért kellene, mert a modulban nem szeretnék html-ezni, továbbá egy hírek tartalom elrendezése teljesen más, mint egy eseményeké

@hosszu.kalman: átírtam a hook_theme fv-t (egyelőre csak egy tpl-lel, mint látható), de nem akarja használni a template-et. Gyorstár ürítés megvolt.

@sgabe: köszönöm, a blokkrendszer világos és tényleg jobb alternatívának tűnik, de a template azért még kéne. Views későbbi okok miatt nem kerülhet szóba.

0
0
hosszu.kalman képe

Egyszer sem hívod meg a sminkfüggvényt, így nem fut le.
Valami ilyesmi:
 $block['content'] = theme('fb_news_block', $title, $body, $link)
Persze ehhez kellene a $title $body és $link változó is amit a kódban egyenlőre nem hozol létre.

Szerintem kicsit összekevered a dolgokat, amit Te akarsz az valaminek az első három elemét kiíratni. Ehhez nem a $title stb változókat kéne átadni, hanem mondjuk egy $nodes tömböt amiben tárolod ezeket az értékeket, vagy a $node objektumokat. A feldolgozó oldalon (template fájl) pedig csak ezen a $nodes tömbön kéne végigmenned és elintézni a megjelenést.

Ui: coder modult szerintem tegyél fel és rendezd a kódot mert nagyon átláthatatlan, legalábbis nekem.

0
0
Th0m4s képe

Persze, hogy keverém még a dolgokat, mondhatni az első modulomról van szó. :P
Az a három változó a tutorialban volt benne, én pedig egyszerűen átvettem a példát. Első körben a template használatot szerettem volna beindítani. :)

Írásod alapján ezt
 $block['content'] = 'saved content: '. variable_get("fb_maxdisp", 3);
cseréltem erre
 $block['content'] = theme('fb_news_block', "cím", "content", "link");

Most öröm és boldogság van :) Köszönöm szépen mindenkinek!

Tom

0
0