私の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'));
}
}
このコードを_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
_配列にあるかどうかを確認します。
これを試して
_
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
の代わりに使用します