Blokkot tpl.php segítségével megjeleníteni hogyan?

dj képe

Sziasztok!

Eddig jutottam, de megakadtam sőt az is lehet, hogy teljesen eltévedtem :)

<?php
/*
    Implementation of hook_block().
*/
function hu_forex_block( $op = 'list', $delta = 0, $edit = array() ) {
  if ($op == 'list') {
    $block = array();
    $block[0]['info'] = t( 'Hungarian forex data of MNB' );
    return $block;
  }
  else if ( $op == 'view' ) {
    $block['subject'] = variable_get('hu_forex_block_title', t( 'Forex:' ) );
    $block['content'] = theme( 'hu_forex_theme', array() );
    return $block;
  }
}
 
 
/*
    Implementation of hook_theme().
*/
function hu_forex_theme() {
 
  return array(
    'hu_forex_block' => array(
      'template' => 'hu_forex-block',
      'arguments' => array(),
    ) );
}
 
 
function _hu_forex_xml2assoc($xml) {
    $tree = null;
    while($xml->read())
        switch ($xml->nodeType) {
            case XMLReader::END_ELEMENT: return $tree;
            case XMLReader::ELEMENT:
                $node = array('tag' => $xml->name, 'value' => $xml->isEmptyElement ? '' : _hu_forex_xml2assoc($xml));
                if($xml->hasAttributes)
                    while($xml->moveToNextAttribute())
                        $node['attributes'][$xml->name] = $xml->value;
                $tree[] = $node;
            break;
            case XMLReader::TEXT:
            case XMLReader::CDATA:
                $tree .= $xml->value;
        }
    return $tree;
}
 
 
/*
    Implementation of template_preprocess().
*/
function template_preprocess_hu_forex(&$vars) {
 
      $sClient=new SoapClient("http://www.mnb.hu/arfolyamok.asmx?WSDL");
      $response=$sClient->GetCurrentExchangeRates();
      $xmlstr = <<<XML
<?xml version='1.0' standalone='yes'?>
{$response->GetCurrentExchangeRatesResult}
XML;
      $xml = new XMLReader(); 
      $xml->xml( $xmlstr );
      $assoc = _hu_forex_xml2assoc($xml); 
 
      $vars['forex'] = $assoc;
}
?>

Gyanítom, hogy <?php $block['content'] = theme('hu_forex_theme', array() ); ?> ezzel van valami probléma, de nem jövök rá, hogy mi. Azt írja a theme() függvény leírásánál, hogy az első paraméter a neve a téma funkciónak amit meg akarok hívni. A preprocesszben elméletileg előállítom a $vars['forex'] tömböt amit a hu_forex-block.tpl.php fájlban akarok feldolgozni.

De nem működik, hiába mondom neki, hogy MUKODJ! :)

Valakinek valami ötlete?
Előre is köszönet a segítségért!

Drupal verzió: 
Lavjaman képe

$block['content'] = theme( 'hu_forex_theme', array() );
 
$block['content'] = theme('hu_forex_block', array());
0
0

*----*----*

$node ? 'alma' : 'bor'

*----*----*

dj képe

És tényleg! :) Köszönöm!
Konklúzió: figyelmesebben kell olvasni a leírásokat :)

0
0

Üdv!
Dudás József

dj képe

mert a template_preprocess sehogy sem akar végrehajtódni.

A kérdés, hogy ez most miért $block['content'] = theme('hu_forex_block', array() );?
Először azt gondoltam, hogy azért, mert a hook_theme amit visszaad tömböt abban ez a kulcs szerepel, de ha átírom bármi másra, akkor is működik. A template_preprocess_hu_forex vagy template_preprocess_hu_forex_block viszont nem fut le semmiképp.

Nyissak neki új topikot?

0
0

Üdv!
Dudás József

Lavjaman képe

Azért theme('hu_forex_block', array()); mert a theme hook-odban ezt a nevet adtad neki.
Probléma lehet még talán, hogy a tpl.php file-od nem a modulod mellett van *egy könyvtárszinten*... már ötletem nincs ^^

print_r-elgesd végig ^^

0
0

*----*----*

$node ? 'alma' : 'bor'

*----*----*

dj képe

A javításod szerint a hu_forex-block.tpl.php-t futtatja, az rendben van. A lökött kérdés azért volt, mert nem töröltem cache-t és ha átírtam a nevet a hook_theme()-ben akkor is lehozta a hu_forex-block.tpl.php-t. Szóval ez érthető :)

A gond az, hogy a template_preprocess-t nem hajtja végre. Próbáltam:
function template_preprocess_hu_forex(&$variables) és
function template_preprocess_hu_forex_block(&$variables)
de egyik sem fut le.

Köszi!

0
0

Üdv!
Dudás József

Bálint képe

Azt hiszem, emiatt nem működik még.
A template fájlodat csak úgy hívd, hu_forex, tehát a hook_theme-nek szerintem így kellene kinéznie:

<?php
function hu_forex_theme() {
  return array(
    'hu_forex' => array(
      'template' => 'hu_forex',
      'arguments' => array(), // *
    ) );
}
?>

A preprocess függvény neve pedig jó így: template_preprocess_hu_forex(&$vars).

block.tpl-t itt amúgy sincs értelme használni, mert a blokk tartalmát szeretnéd a smink hurkoddal előállítani, ami a block.tpl-ben a $block->content.

*: Szerintem ez is elhagyható, és a hook_block-ban elég csak:
$block['content'] = theme('hu_forex_theme');

0
0
dj képe

hogy fordítottál időt a problémámra!

0
0

Üdv!
Dudás József

pp képe

Preprocess-t tipikusan akkor használunk, ha valami nincs, vagy nem úgy van ahogyan nekünk kell. Mégpedig ez azért van mert az adott modul nem úgy és azt pakolta a sminkbe amit, mert hát nem tudhatja a modul írója nekünk mire lesz majd szükségünk. De itt Te írod a modult, tehát nincs szükséged preprocessre. A másik ami engem zavar, hogy - véleményem szerinte - bonyolult adatszerkezetet adsz át a sablon fájlnak. Pedig ott csak szövegeket kéne kiíratni, nem pediglen ciklusokat futtatni meg ilyenek. Az tipikusan függvénybe való dolog. Ezzel kb jelezzük a smink készítőjének, hogy ebbe csak akkor nyúlj bele ha nagyon kell és értesz hozzá, mert itt nem egyszerű kopipésztről van szó. Prábáld ezt:

/*
    Implementation of hook_block().
*/
function hu_forex_block( $op = 'list', $delta = 0, $edit = array() ) {
  if ($op == 'list') {
    $block = array();
    $block[0]['info'] = t( 'Hungarian forex data of MNB' );
    return $block;
  }
  else if ( $op == 'view' ) {
    $block['subject'] = variable_get('hu_forex_block_title', t( 'Forex:' ) );
    $block['content'] = hu_forex_block_content();
    return $block;
  }
}
 
 
/*
    Implementation of hook_theme().
*/
function hu_forex_theme() {
 
  return array(
    'hu_forex_block' => array(
      'arguments' => array('content' => NULL),
    ) );
}
 
 
function _hu_forex_xml2assoc($xml) {
    $tree = null;
    while($xml->read())
        switch ($xml->nodeType) {
            case XMLReader::END_ELEMENT: return $tree;
            case XMLReader::ELEMENT:
                $node = array('tag' => $xml->name, 'value' => $xml->isEmptyElement ? '' : _hu_forex_xml2assoc($xml));
                if($xml->hasAttributes)
                    while($xml->moveToNextAttribute())
                        $node['attributes'][$xml->name] = $xml->value;
                $tree[] = $node;
            break;
            case XMLReader::TEXT:
            case XMLReader::CDATA:
                $tree .= $xml->value;
        }
    return $tree;
}
 
 
/*
    Implementation of template_preprocess().
*/
function hu_forex_block_content() {
 
      $sClient=new SoapClient("http://www.mnb.hu/arfolyamok.asmx?WSDL");
      $response=$sClient->GetCurrentExchangeRates();
      $xmlstr = '<'.'?xml version="1.0" standalone="yes"?'.'>'.$response->GetCurrentExchangeRatesResult ;
      $xml = new XMLReader();
      $xml->xml( $xmlstr );
      $assoc = _hu_forex_xml2assoc($xml);
      return theme('hu_forex_block', $assoc);
}
 
function theme_hu_forex_block($content) {
  //Ide persze valami normális megjelenítés kell majd
    return print_r($content, TRUE);
}

A megjelenítést még meg kell faragnod, meg nem ártana egy kis gyorstárazás, ha megdosolják a szervered, te ne dosold tovább az mnb-t. ;)
pl. percenként szerintem elég lenne ezt letölteni.

pp

0
0
dj képe

Sejtettem én, hogy nem a biztos úton járok. Több a tiédhez hasonló "hagyományosan" írt modul után most elterveztem, hogy "drupálositom" a technikámat :DD Van ez így.

A gyorstárazást globálisan állítsam be 1 órára?

Köszönet!

0
0

Üdv!
Dudás József

pp képe

Mondjuk érdemes lenne egyszer belenézned a drupal.org-on található kézikönyvbe. Legalább a címeket olvasd el! :D
http://drupal.org/node/145279
http://www.lullabot.com/articles/a_beginners_guide_to_caching_data

Aztán itt van ez is:
http://api.drupal.org/

http://api.drupal.org/api/function/cache_set/6
http://api.drupal.org/api/function/cache_get/6

pp
(még van két hely a tanfolyamon, ha érdekel. :D)

0
0
dj képe

Bele is nézek, de a gyorstárazással eddig még távoli kapcsolatba sem kerültem, nemhogy közelibe :))

Api-t olvasgatok ...

Tanfolyam -> idő ... :(

Köszi a válaszokat!

0
0

Üdv!
Dudás József