web-dev-qa-db-ja.com

特定の地域にある場合にのみ、ブロックのフォームを変更する

私のtemplate.phpでは、ビューが公開されたブロックのフォームを変更しようとしていますが、そのブロックがテーマの特定の領域にある場合にのみ、これを実行します。

Drupal 7.を使用しています。

それは可能ですか?どのphpコードを使用しますか?

これが私が今使っているものです:

function cmfzen_form_alter(&$form, &$form_state, $form_id) {

  // change the main search form
  // see http://drupal.stackexchange.com/questions/28404/easiest-way-to-add-x-webkit-speech-to-the-search-blocks-input-element
  // see http://adaptivethemes.com/html5-placeholder-text-for-your-drupal-7-search-field
  if ($form_id == "views_exposed_form" && $form['#id'] == "views-exposed-form-site-search-page"){

    $form['site-search']['#type'] = 'searchfield';
    $form['site-search']['#attributes'] = array(
      'class' => array('search-site'),
      'placeholder' => t("I'm looking for..."),
      'speech x-webkit-speech spellcheck' => 'false',
      );
    // change form submit button

    $form['submit']['#attributes'] = array('class' => array('search-button'));
  }
}
3
gmclelland

このコードを_hook_form_alter_で使用します。

_function cmfzen_form_alter(&$form, &$form_state, $form_id) {
    switch($form_id){
         case 'views_exposed_form':
         $region = 'NAME_OF_A_REGION';
         $blocks = block_list($region);
         kpr($blocks);
         //if the block is in the $blocks array do the changes.
         break;
    }
}
_

block_list($region)を使用すると、特定の領域に配置されたブロックを取得し、ブロックオブジェクトの配列を返します(詳細については、この ページ を参照してください)。次に、探しているブロックが_$blocks_配列にあるかどうかを確認します。

3
M a m a D

これを試して

_
function cmfzen_form_alter(&$form, &$form_state, $form_id) {

  if (block_load('views','-exp-site_search-page')->region == 'header' &&
    $form_id == "views_exposed_form" &&
    $form['#id'] == "views-exposed-form-site-search-page"
  ) {
    // alter form
  }
}
_

「ヘッダー」をリージョン名に変更し、ブロックデルタ「-exp-site_search-page」が正しいものであることを確認します。

もう1つの解決策(パフォーマンスが向上する可能性があります)は、ブロックの領域のみをデータベースに照会する独自の関数を作成することです。

_
function mymodule_block_region($module,$delta) {
    return db_query('SELECT region FROM {block} WHERE module = :module AND delta = :delta'
    , array(':module' => $module, ':delta' => $delta))->fetchField();
}
_

そして、block_load('views','-exp-site_search-page')->regionの代わりに使用します

1
Mahmoud Mostafa