Como passo uma variável de um módulo personalizado para seu arquivo de modelo?


8

Eu preciso saber o método mais simples para passar variável do módulo personalizado para seu arquivo de modelo. Eu criei o custom.module e coloquei custom.tpl.php na pasta do módulo.

function custom_menu(){
  $items = array();

  $items['custom'] = array(
    'title' => t('custom!'),
    'page callback' => 'custom_page',
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
  );

  return $items;
}

function custom_page() {

    $setVar = 'this is custom module';
    return theme('custom', $setVar);    
}

Eu adicionei a função de tema, mas não está funcionando. Alguém pode me sugerir o que há de errado com este código?

function theme_custom($arg) {
  return $arg['output'];
}

function custom_theme() {
  return array(
    'Bluemarine' => array(
        'variables' => 'output',
        'template' => 'Bluemarine',
     ),
  );
}

Respostas:


6

Independentemente da versão do Drupal para a qual você está escrevendo o módulo, há dois erros no seu código:

  • Você define "Bluemarine" como função de tema, mas depois chama theme('custom'), que chamaria a função de tema "personalizado"
  • Se você definir "customizado" como uma função de tema que usa um arquivo de modelo, theme_custom()nunca será chamado

Se você estiver escrevendo um código para o Drupal 6, o código deve ser semelhante ao seguinte. Suponho que o nome da função de tema seja custom.

function custom_menu(){
  $items = array();

  $items['custom'] = array(
    'title' => t('custom!'),
    'page callback' => 'custom_page',
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
  );

  return $items;
}

function custom_theme() {
  return array(
    'custom' => array(
      'arguments' => array('output' => NULL),
      'template' => 'custom',
     ),
  );
}

function custom_page() {
    $output = 'This is a custom module';
    return theme('custom', $output);    
}

function theme_custom($output) {
}

O arquivo de modelo terá acesso $outpute a todas as variáveis ​​definidas template_preprocess_custom(), se o seu módulo o implementar.

Por exemplo, você pode implementar um código semelhante ao seguinte:

function template_preprocess_custom(&$variables) {
  if ($variables['output'] == 'This is a custom module') {
    $variables['append'] = ' and I wrote it myself.";
  }
}

Com esse código, o arquivo de modelo tem acesso a $outpute $append.

Como exemplo da função de tema que usa um arquivo de modelo, você pode ver theme_node () , definido em node_theme () , e que usa node.tpl.php como arquivo de modelo; a função de pré-processo implementada pelo módulo Nó para essa função de tema é template_preprocess_node () .


Obrigado Kiam, obviamente perdeu o primeiro comentário da OP sobre o uso do D6. +1
Laxman13

Obrigado Kiam, template_preprocess_custom (& $ variable) fez o truque #
Kamran Akhter 10/11/11

Agora eu quero mover o tpl para a pasta do tema, como posso fazer isso?
Kamran Akhter

@KamranAkhter Essa é uma pergunta diferente. :-)
kiamlaluno

3

Você está chamando a função de tema incorreta. Em vez disso function theme_custom, deveria ser function theme_Bluemarine. Você também precisa passar uma matriz para as variáveis ​​parte de hook_theme () . Veja um exemplo simples aqui .

Usando seu exemplo (depois de alterar a função de modelo e tema para custom):

function custom_menu(){
  $items = array();

  $items['custom'] = array(
    'title' => t('custom!'),
    'page callback' => 'custom_page',
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
  );

  return $items;
}

function custom_page() {
  $setVar = 'this is custom module';
  return theme('custom', array('output' => $setVar));
}

function custom_theme() {
  $path = drupal_get_path('module', 'custom');
  return array(
    'custom' => array(
        'variables' => array('output' => null),
        'template' => 'custom',
     ),
  );
}

Agora em custom.tpl.php só precisa <?php print $output; ?>


Obrigado por responder o exemplo u deu é o módulo nó e eu tenho não nó module.i só precisa de uma maneira de passar variável para tpl arquivo, im usando Drupal ajuda 6.plz
Kamran Akhter

Obrigado pela resposta, ele está me dando o erro Nenhum arquivo ou diretório, na verdade, ele está esperando o arquivo custom.tpl.php na pasta do módulo que eu já tenho, no código o bluemarine será substituído por custom. Bluemarine é o tema drupal que estou usando.
precisa saber é o seguinte

mudou o código acima e me dar a tela em branco branco o que devo fazer ajuda plz
Kamran Akhter

Mudei o código e o tenho trabalhando no meu site.
precisa saber é o seguinte

Eu só copiar e colar o código acima, mas ele não funciona
Kamran Akhter
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.