Webサイト全体のすべてのテキストフィールドにプレースホルダー属性を追加しようとしていますが、うまくいきません。
hook_form_alter
をオーバーライドするモジュールを作成しました
function mymodule_form_alter(&$form, &$form_state, $form_id)
{
foreach ($form as $key => $value) {
if ("textfield" == $value["#type"]){
$value['#attributes']["placeholder"] = t($value["#title"]);
}
}
}
私もwebformモジュールを使用していることを教えてください。
私はwebformモジュールを使用しているため、グローバルwebformテンプレート(webform-form.tpl.php)にテーマを設定して、テーマフォルダーに配置できます。モジュールで物事を複雑にする必要はありません。
foreach ($form["submitted"] as $key => $value) {
if ("textfield" == $value["#type"]) {
$form["submitted"][$key]['#attributes']["placeholder"] = t($value["#title"]);
}
}
これをテンプレートファイルの先頭に配置します。
少し変更して....
function mymodule_form_alter(&$form, &$form_state, $form_id)
{
foreach ($form as $key => $value) {
if ("textfield" == $value["#type"]){
$form[$key]['#attributes']["placeholder"] = t($value["#title"]);
}
}
}
$value
foreachスコープの値型は参照ではありません。
次のコードを試してみたところ、フォーム全体を再帰的に反復して、テキストフィールドの属性を編集することができました。
function add_placeholder(&$form){
foreach($form as $key => $val){
if(substr($key,0,1) == '#' && $form[$key] == 'textfield'){
$form['#attributes'] = array('placeholder' => t('some text'));
}else if(is_array($form[$key])){
add_placeholder($form[$key]);
}
}
}
おそらくhook_form_alter
またはhook_form_FORM_ID_alter
を使用して"placeholder"属性を追加することで可能です。
例:テストされていないが、次のようなもの:
/**
* Implements hook_form_FORM_ID_alter
*/
function mymodule_form_webform_client_form_12_alter(&$form, &$form_state) {
drupal_set_message('<pre>'.print_r($form,1).'</pre>'); // debug form
$form['submitted']['my_form_component']['#attributes'] = array('placeholder' => 'placeholder 1');
}
form_id
という名前のWebフォームHTMLで非表示のフォーム要素を見つけて、form_alter
関数名の正しいフォームIDを取得します。
Josua Pedersenのコードへのより良いアプローチ:
foreach ($form['submitted'] as $key => $value) {
if (isset($form['submitted'][$key])) {
$types = array('textfield', 'webform_email', 'textarea');
if (isset($value['#type']) && in_array($value['#type'], $types)) {
$form['submitted'][$key]['#attributes']['placeholder'] = t($value['#title']);
}
}
}
@Josuaのテンプレートファイルソリューションのわずかな改善:このコードは、Webフォームの電子メールフィールドにプレースホルダーテキストも追加します。
foreach ($form["submitted"] as $key => $value) {
if ("textfield" == $value["#type"]) {
$form["submitted"][$key]['#attributes']["placeholder"] = t($value["#title"]);
}
if($value['#type'] == "webform_email") {
$form["submitted"][$key]['#attributes']["placeholder"] = t($value["#title"]);
}
}
コードでは、変数_$value
_を変更しますが、参照によって渡される変数_$form
_に再び関連付けることはありません。
明らかに、あなたはいくつかの変更を行いますが、それをDrupalに送り返さないでください。
また、あなたはそのようにそれを行うことができます(私はそれをテストしていませんが、理論的にはそれはうまくいくはずです)。
_function mymodule_form_alter(&$form, &$form_state, $form_id) {
$keys = element_children($form);
foreach ($keys as $key) {
if (in_array(array('textfield', 'textarea'), $form[$key]['#type'])) {
if (!empty($form[$key]['#title'])) {
$placeholder = array('placeholder' => t($form[$key]['#title']));
if (is_array($form[$key]['#attributes'])) {
$form[$key]['#attributes'] = array_merge($form[$key]['#attributes'], $placeholder);
}
else {
$form[$key]['#attributes'] = $placeholder;
}
}
}
}
}
_
fieldset
のチェックを追加して子にプレースホルダーを追加するのは面倒でした。しかし、あなたはそれを非常に簡単に変更できると思います。
hook_form_alterを使用してこれを試してください
function mymodule_survey_builder_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'form_builder_field_configure') {
$form['title']['#attributes']=array('placeholder' => t('Please enter the Qustion(English) name here.'));
}
}
古いバージョンまたは古いバージョンの DrupalのWebformモジュール を使用している人は、7.x-4.x branch
(2013年6月)のプレースホルダーサポート 追加された に注目する価値があります。
したがって、HTML5プレースホルダー機能は、コンポーネントのカスタムCSSクラスと、他のいくつかの長い間要求されてきた機能とともに、ネイティブの組み込みオプションになりました。
新しい機能がどのように表示されるかを示すスクリーンショットを次に示します。
ほとんどの場合、私はおそらく、いくつかのフォームにプレースホルダー属性を追加したいと思うでしょう。
すべてのWebフォームにプレースホルダーを追加する場合は、次のようにします。
function mymodule_form_alter(&$form, &$form_state, $form_id) {
// If webform, add "placeholder" attributes to all textfields
// got code here:http://drupal.stackexchange.com/questions/12706/adding-html5-placeholder-to-all-drupal-forms
if (isset($form['#node']->type) && ($form['#node']->type == 'webform')) {
foreach ($form["submitted"] as $key => $value) {
switch ($value["#type"]) {
case 'textfield':
case 'textarea':
case 'webform_email':
$form["submitted"][$key]['#attributes']["placeholder"] = $value["#title"];
break;
}
}
}
}
そのためのモジュールを使用するだけです: Webform Hints
それはまさにあなたが必要とするものです。管理が簡単で、カスタムコードは必要ありません。このモジュールは、placeholder属性をサポートしないレガシーブラウザーのサポートも提供します。