Block a contentbe

BergR képe

Sziasztok!

Több Drupalal hajtott hírportált üzemeltetünk, ezeken a portálokon vannak hirdetések is egyéb kiadások fedezésére... A hirdetések kezelésére eddig minden portálon külön kezeltük a hirdetéseket az Advertisement modul segítségével. Pár napja beüzemeltünk egy saját Adserver-t ami az összes portált egyszerre kezeli. Emiatt az Advertisement modul szükségtelenné vált, viszont eddig az Advertisement modulal gond nélkül tudtunk a tartalomba hirdetést tenni, mivel a modul automatikusan létrehozott egy blockot erre a célra a contentben.

Az lenne a kérdésem, hogy milyen módon tudok egy blockot létrehozni és oda ahogy a mellékelt linkelt képen is látszik?

http://img186.imageshack.us/i/adsblock.jpg/

Köszi a válaszokat!

Drupal verzió: 
Fórum: 
aboros képe

a mellékelt screenshoton a blokk a node termjei és a content között van. ezt régióval nem fogod tudni megcsinálni szerintem, mert a node.tpl.php -ban nem írhatsz ki régiókat. úgy tudod ezt megkerülni, hogy az említett fileban a megfelelő helyen direktbe meghívod a blokkot és kiírod a tartalmát. (először értelemszerűen a blokkot létre kell ugye hozni)

kb:

itt van a cím kiírás, utána a termek kiírása, na és utána jössz te:
<?php if ($page != 0) : ?>
  <div id="inline-ad">
    <?php
      $adblock = module_invoke('blockID', 'block', 'view', 1);
      print $adblock['content'];
    ?>
  </div>
<?php endif; ?>
aztán folytatódik szépen ahogy eddig

természetesen a "blockID" a te blokkod idje kell, hogy legyen.

0
0

-
clear: both;

BergR képe

Először is köszi a válaszod!

Még mielőtt nekikezdenék egy kérdés!

A content a címtől a mellékelt képen már nem látszó hozzászólásig tart. Az általad is említett forrás mező, dátum, term "cimkék" cck + egyéb modulok segítségével jön létre. Az lenne a kérdésem, ha én a node.tpl.php fájlban a $content változó elé szúrom be az általad megadott kódot akkor nem lehet, hogy a cím és minden fölé helyezi majd azt a bizonyos blokkot ?

Köszi a válaszod!

0
0
aboros képe

a $content -ben nincs benne se a cím, se a beküldő és a dátum, se a kifejezések. a cím a $title -ben van, a beküldő és a dátum a $submitted -ben, a kifejezések a $terms -ben. a $content -ben csak a $node->body van (ha van ilyen) és a pluszként hozzáadott cck mezők. semmi más.

próbáld ki!

0
0

-
clear: both;

BergR képe

Ennyi a node.tpl.php tartalma!

<div id="node-<?php print $node->nid; ?>" class="node<?php if ($sticky) { print ' sticky'; } ?><?php if (!$status) { print ' node-unpublished'; } ?> clear-block">
 
<?php print $picture ?>
 
<?php if (!$page): ?>
  <h2><a href="<?php print $node_url ?>" title="<?php print $title ?>"><?php print $title ?></a></h2>
<?php endif; ?>
 
  <span class="meta">
  <?php if ($submitted): ?>
    <span class="submitted"><?php print $submitted ?></span>
  <?php endif; ?>
  </span>
 
  <div class="content">
    <?php print $content ?>
  </div>
 
  <span class="links"><?php print $links; ?></span>
</div>

Tehát azt mondod, hogy ez ilyen formában működne?:

<div id="node-<?php print $node->nid; ?>" class="node<?php if ($sticky) { print ' sticky'; } ?><?php if (!$status) { print ' node-unpublished'; } ?> clear-block">
 
<?php print $picture ?>
 
<?php if (!$page): ?>
  <h2><a href="<?php print $node_url ?>" title="<?php print $title ?>"><?php print $title ?></a></h2>
<?php endif; ?>
 
  <span class="meta">
  <?php if ($submitted): ?>
    <span class="submitted"><?php print $submitted ?></span>
  <?php endif; ?>
  </span>
 
  <?php if ($page != 0) : ?>
   <div id="inline-ad">
     <?php
       $adblock = module_invoke('blockID', 'block', 'view', 1);
       print $adblock['content'];
     ?>
   </div>
  <?php endif; ?>
 
  <div class="content">
    <?php print $content ?>
  </div>
 
  <span class="links"><?php print $links; ?></span>
</div>

Hogy pontosítsak:
cím az valóban $title
forrás mező -> cck + link modul
dátum mező -> cck + date modul
cimkék "terms" -> cck + content taxonomy modul

0
0
aboros képe

persze a 'blockID' -t a te blokkod id -jére kell cserélned a module_invoke() -ban. most már próbáljad már ki már embeeeeer... amennyi idő alatt a választ bepötyögted, már háromszor kipróbálhattad volna és látnád, hogy igen, így. :)

0
0

-
clear: both;

BergR képe

Kipróbáltam, de sajnos nem jelenik meg! Amúgy úgy lett ahogy "jósoltam" a FireBug szerint a content tartalom fölé helyezi a dobozt ami a mellékelt képen jól látszik!

http://img505.imageshack.us/img505/9959/adsblock2.jpg

0
0
aboros képe

kicsit utánamászva, kipróbálva, mindjárt jobban megy..
szóval ez:
$myblock = module_invoke('block', 'block', 'view', 1);

az 1 id-jű blokkodat fogja visszaadni, amit block modullal hoztál létre. hogy honnan lehet kideríteni ezt az idt, azt megtudhatod ebből a screenshotból:
http://img.skitch.com/20090707-bxxwtw8hfkgmymdcim1n6np71n.jpg

szóval ha a te "reklámblokkod" mondjuk 42, akkor így:
$adblock = module_invoke('block', 'block', 'view', 42);

remélem így már ok lesz és bocs hogy eddig félrevezettelek ;)

0
0

-
clear: both;

BergR képe

Jó lesz ez, már megjelenik a doboz tartalma csak még mindig a content felett, mellékelt kép...

http://img91.imageshack.us/img91/8474/adsblock3.jpg

Ja és ne viccelj én köszönöm, hogy segítesz...

0
0
aboros képe

a content taxonomyt. :)

hát ez így maszera lesz, de persze nincs lehetetlen, csak tehetetlen. akkor legyen inkább az, hogy kicsit még bonyolítsuk, és hogy az én örömöm is meglegyen :) hogy a node.tpl.php -t meghagyjuk ahogy volt és az egész cuccot a template.php -ba költöztetjük. (igen, igen, preprocessbe:)

template.php:

function SMINKEDNEVE_preprocess_node(&$vars) {
  if ($vars['page'] != 0) {
    $adblock = module_invoke('block', 'block', 'view', 42);
 
    /* ujraepitjuk a content, hogy a mezok es a body koze tudjuk szurni a blokkot
    eloszor akkor a mar renderelt mezoinket szepen sorba belerakjuk */
    $vars['content'] = $vars['field_forras_rendered'] . $vars['field_datum_rendered'] . $vars['field_cimkek_rendered'];
 
    /* aztan egy divbe fogva belerakjuk a blokkunk tartalmat */
    $vars['content'] .= '<div id="content-ad">' . $adblock['content'] . '</div>';
 
    /* es meg a vegen hozzacsapjka node bodyt es kesz */
    $vars['content'] .= $vars['node']->body;
  }
}

ez így egy némileg más megközelítés. mikor bevezeted ezt az előfeldolgozót, törölnöd kell a smink regisztrációs tárat, hogy bekerüljön abba az új függvényed. és persze a mezőneveket most csak hasraütésre írtam be, lényeg, hogy a $vars -ban benne van minden meződ renderelt html kimenete field_MEZONEVE_rendered kulcs alatt.
0
0

-
clear: both;

BergR képe

http://img233.imageshack.us/img233/3878/adsblock4.jpg

Közben nézem, tanulmányozgatom, hátha jutok valamire vele...

A módszered teljesen jól működne, ha megtudnám oldani, hogy a print, mail, és text ikonok fel kerüljenek a helyükre. Ha kizárom a forras, date és term mezőket a node full nézetből akkor az adblock oda kerül ahová szerettem volna, viszont azok a "fránya" :) ikonok meg beépülnek jobbra lebegtetve a node szövegébe!

0
0
aboros képe

pláne melyik tömbbe vagy objektumba. :)
én bénáztam, bocs. szóval..

$vars['node']->body » ez már a renderelt $content, mezőstül, szőröstül-bőröstül, nem ez kell, hanem helyette: $vars['node']->content['body']['#value'] » ez csak a száraz törzs mező, ez kell nekünk.

ennek megfelelően így más okénak kell lennie:

function SMINKEDNEVE_preprocess_node(&$vars) {
  if ($vars['page'] != 0) {
    $adblock = module_invoke('block', 'block', 'view', 42);
 
    /* ujraepitjuk a content, hogy a mezok es a body koze tudjuk szurni a blokkot
    eloszor akkor a mar renderelt mezoinket szepen sorba belerakjuk */
    $vars['content'] = $vars['field_forras_rendered'] . $vars['field_datum_rendered'] . $vars['field_cimkek_rendered'];
 
    /* aztan egy divbe fogva belerakjuk a blokkunk tartalmat */
    $vars['content'] .= '<div id="content-ad">' . $adblock['content'] . '</div>';
 
    /* es meg a vegen hozzacsapjka node bodyt es kesz */
    $vars['content'] .= $vars['node']->content['body']['#value'];
  }
}
0
0

-
clear: both;

BergR képe

Szia, bocs, hogy kicsit megkésve reagálok!

Így már teljesen jó lenne, ha a template.php-t rá tudnánk venni arra, hogy a print, mail, és text ikonokat is kihelyezze! Mert sajnos az nem jelenik meg! Van arra valamilyen mód, hogy a print modul ikonjait is meghívni a template.php-ban?

Még egy kérdés! Ezt a dobozt amit most meghív a template.php azt lehet valahogy "súlyozni"? Tehát ha én nem azt szeretném, hogy az közvetlen a node első bejegyzése előtt kezdődjön hanem a szövegrészbe szeretném elhegyezni, mondjuk a szövegrész 3. sortörésénél?!

Ez nem annyira fontos, csak érdekelt, hogy van-e rá mód!

Köszi és üdv!

0
0
aboros képe

biztos van rá mód, hogy oda kerüljenek a dolgok, valahogy a modul is odateszi őket. :)

lehet rakni bárhova, ha megnézed a függvényt, amit a $vars['content'] -be raksz, az lesz a node.tpl.php -ban a $content. lehetne azt is, hogy mondjuk bevezeted, hogy a szöveg törzsbe raksz egy [***banner***] sztringet és ezt cseréled a blokk tartalomra. ezt akár filter modulba is rakhatod, akkor bármilyen szövegmezőre működni fog, aminek ezt a beviteli formát állítod be.

megnézem majd ezeket az ikonokat hogyan pakolja oda a print.

0
0

-
clear: both;

Bálint képe

Egy megoldás lehet ez a modul. Így a blokkot CCK mezőként kezelheted, nagyon kényelmes az egész.
A szépséghibája a te esetedben, hogy lehet, hogy nem szeretnéd, hogy minden egyes node beküldéskor be kelljen állítani, hogy melyik blokk legyen a mező tartalma.

Én ezt anno időhiány miatt hook_nodeapi és hook_form_alter párossal oldottam meg saját modulból, eltüntettem a form elemet, és mindig ugyanaz az érték került be a node objektumba. Így egy node beküldésekor automatikusan belekerült a blokk is a CCK mezőbe.

Ettől talán szebb megoldás, hogy előfeldolgozóval belenyúlsz oda, ahol a $content előáll. Ennek még nem volt időm utánanézni, de érdekelne a dolog.

0
0
BergR képe

Igen, ebben a blokkban egy állandó az adserverünk által generált javascript lenne php beviteli módban!

Ha nem lesz más akkor marad az Advertisement modul és csak egy blokkot generáltatok vele a tartalomba és oda fogom betenni az adserverünk által generált javascript kódot! Ez a megoldás is szóba jött...

0
0