ページャーをカスタマイズする方法


7

標準のポケットベルを出力するコードがあります。

print theme('pager');

それはこれを出力します:

<h2 class="element-invisible">Pages</h2>
<div class="item-list">
<ul class="pager"><li class="pager-current first">1</li>
<li class="pager-item"><a title="Go to page 2" href="/drupal/node?page=1">2</a></li>
<li class="pager-item"><a title="Go to page 3" href="/drupal/node?page=2">3</a></li>
<li class="pager-next"><a title="Go to next page" href="/drupal/node?page=1">next ›</a></li>
<li class="pager-last last"><a title="Go to last page" href="/drupal/node?page=5">last »</a></li>
</ul>

HTMLを次のように変更するにはどうすればよいですか。

<ul class="pagination">
    <li><a href="#">&lt;</a></li>
    <li><a href="#">1</a></li>
    <li><a href="#" class="active">2</a></li>
    <li><a href="#">3</a></li>
    <li><a href="#">&gt;</a></li>
</ul>

私はこのスレッド(https://www.drupal.org/node/387786)を調べて、Barticテーマテンプレート内に関数bartik_preprocess_custom_pagerとファイルを作成しましたが、それを機能さcustom-pager.tpl.phpせることができません。

print theme('custom_pager');

何も出力しません。ポケットベルのHTML出力をカスタマイズして、1ページだけのHTML出力を作成するにはどうすればよいですか?


2
また、新しいテーマ関数をで宣言する必要があります。宣言しhook_theme()ないと、Drupalは新しいテーマ関数があることを認識しません。テーマを変更した後、キャッシュをクリアします。
kiamlaluno

@kiamlalunoページャーテンプレートを関数に追加し、それが呼び出されます。しかし、どのようにして適切な変数をポケットベルに渡すことができますか?私が電話しtheme('pager');たとき、それらは自動的に渡されました。今は手に入れません。
user4035

@kiamlalunoこんにちは。モジュール内のページャーをカスタマイズすることは可能ですか?関数mymodule_pager($ variables)を作成することによって?
user4035 14

モジュールからも実行できますが、その場合は別のフックも実装する必要があります。
kiamlaluno

1
テーマ機能は$variables自動的に取得されます。hook_theme()正しく実装する必要があるだけです。モジュールからテーマ関数を変更する場合、実装するフックはhook_theme_registry_alter()です。
kiamlaluno

回答:


6

上記の私のコメントで指摘したように、上記の実装では詳細のほとんどが間違っています。幸いなことに、Drupal 7では、ページャーに6つのテーマ機能があります。

これらにより、必要なほとんどのカスタマイズを行うことができます。詳細については、Drupalテーマのfunctions()をオーバーライドする方法について、stackexchangeの適切な回答を参照してください

最後に、ページャーを1ページだけオーバーライドすることを述べました。CSSだけでこれを行う価値はあると思いますが、そうでない場合は、$variables前処理関数にページャーが含まれている配列の一部をオーバーライドするだけでよい場合があります(それが私の場合、頭の上からはわかりません)preprocess_pageまたはpreprocess_node、前処理関数のいずれかからアクセスできる場合)。


2

これは以前の投稿からの私の答えです。

theme_pagerを実装する場合、いくつかのテーマ関数(theme_pager_firsttheme_pager_previoustheme_pager_nexttheme_pager_last)を使用して、ページャーレンダー配列全体を最初から作成することが期待されます。これは、1つのクラスを追加するのにまったく手間がかかるようです。

以来theme_pager呼び出しはtheme_item_list非常に最終レンダリングのアレイを構築するために最後に、あなたが使用することができますhook_preprocess_HOOKを DrupalはHTMLにそれをレンダリングする前に、ページャは、配列をレンダリング変更します。

function THEME_preprocess_item_list(&$vars) {
  // make sure we're dealing with a pager item list
  if (isset($vars['attributes']['class']) && in_array('pager', $vars['attributes']['class'])) {
    // make sure there are items
    if (count($vars['items'])) {
      $vars['items'][0]['class'][] = 'test';
    }
  }
}

このフックを追加した後、キャッシュをクリアします。

UPDATE:最初のli.pager-itemを見つけます:

function THEME_preprocess_item_list(&$vars) {
  // make sure we're dealing with a pager item list
  if (isset($vars['attributes']['class']) && in_array('pager', $vars['attributes']['class'])) {
    // loop the items and find the first .pager-item
    foreach ($vars['items'] as $index => $item) {
      if (in_array('pager-item', $item['class'])) {
        $vars['items'][$index]['class'][] = 'test';
        break;
      }
    }
  }
}

UPDATE2:最初と最後のli.pager-itemを見つけます:

function THEME_preprocess_item_list(&$vars) {
  // make sure we're dealing with a pager item list
  if (isset($vars['attributes']['class']) && in_array('pager', $vars['attributes']['class'])) {

    // loop the items and find the first and last .pager-item
    $first = FALSE;
    $last = NULL;
    foreach ($vars['items'] as $index => $item) {
      if (in_array('pager-item', $item['class'])) {

        // first
        if (!$first) {
          $vars['items'][$index]['class'][] = 'test';
          $first = TRUE;
        }

        // last
        $last = $index;
      }
    }

    if (!empty($last)) {
      $vars['items'][$last]['class'][] = 'test2';
    }
  }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.