サイトの環境設定 |
7.59 |
さくらのレンタルサーバー php Options |
さくらのレンタルサーバーで パブリック/プライベートディレクトリにファイルが書き込まれないとき |
ユーザの管理 |
8.9.x |
user pass |
drupal 8 で 管理者(uid=1)パスワードがわからなくなったとき 新しいパスワードを設定する方法 |
ユーザの管理 |
7.59 |
user pass |
drupal 7 で 管理者(uid=1)パスワードがわからなくなったとき 新しいパスワードを設定する方法 |
コンテンツの管理 |
8.9.x |
Dialog Modal Canvas |
drupal 8 の標準機能のダイアログ/ポップアップを表示する方法 |
コンテンツの作成 |
8.9.x |
Display sweet, Views, Twig Tweak, Views field formatter |
テーマに頼らず コンテンツのフィールドとしてViewsを埋め込み表示する方法 |
コンテンツの作成 |
8.9.x |
CSS |
キャプション付きの(右寄/左寄)画像を画像サイズを基準にきれいに表示する方法 |
コンテンツの作成 |
8.9.x |
CKEditor |
CKEditor編集中の見た目をフロントと全く同様にする方法 |
アップデート |
8.9.x |
Composer update |
composer update するときに パッチが必要なモジュールが更新されパッチが消えてしまうことへ対応する方法 |
アップデート |
8.9.x |
PHP |
CentosでPHPのバージョンアップ(例:5.3->5.6)を行う方法 |
PHP |
8.9.x |
PHP |
YamlをPHP配列にする方法 |
mac linux ファイル名 文字化け |
8.7.x |
mac linux ファイル名 文字化け |
Macからlinuxにrsyncするとファイル名(濁点)が文字化けする場合の対応方法 |
Gmian |
8.8.x |
Gmail |
Gmail:外部メールサーバー経由のメール送信ができなくなった場合の対処方法 |
ログイン |
8.7.x |
System |
ユーザー アカウントロックの範囲設定 |
アップデート |
8.8.x |
Composer |
composer updateが異常終了する |
テーマ |
8.7.x |
|
Bartikのtwigについて |
フォーム |
8.7.x |
Webform |
WebformのCheckboxの要素にて表記の変更 |
コンテンツの作成 |
8.7.x |
CkEditor |
CKEditorエディタ内に Colorboxポップアップ を簡単に挿入する方法 |
アップデート |
8.7.2 |
menu |
drupal-core 8.7.2にupdateしたところ |
Viewsプログラミング |
8.6.x |
Views |
Drupal8 Viewsの動的キャッシュをクリアする方法 |
フォーム |
8.6.x |
JavaScript |
特定のformに動的にJavaScriptをロードする方法 |
コメント
たしかに、安全にというのは難しいようです。レンダリング構造
パーマリンク Submitted by actbrain on 2015/07/01 17:37.
たしかに、安全にというのは難しいようです。レンダリング構造(階層)を変更したり、階層を増やす拡張モジュールもいたりと。
参考までに、一番安全かとおもわれるテーブル化を紹介します。
手順は以下のようになります。
1.hook_theme()により、オリジナルラッパーを追加する。
2.追加したオリジナルラッパーを標準ラッパー(form)の直前に実行させる。
3.追加したオリジナルラッパー内で<table> </table>でラップする。
4.hook_form_alter()により、各フィールドフォームを<tr><th>ラベル</th><td>フォーム</td></tr>でラップする。
※ 例えば、本来
〜
<div class="field-type-number-integer field-name-field-price field-widget-number form-wrapper" id="edit-field-price">
<div id="field-price-add-more-wrapper">
<div class="form-item form-type-textfield form-item-field-price-und-0-value">
<label for="edit-field-price-und-0-value">
価格
<span class="form-required" title="このフィールドは必須です。">*</span>
</label>
<input type="text" id="edit-field-price-und-0-value" name="field_price[und][0][value]" value="1000" size="12" maxlength="10" class="form-text required">
<span class="field-suffix">円</span>
</div>
</div>
</div>
〜
なようになっているところを、
〜
<tr>
<th>
価格
<span class="form-required" title="このフィールドは必須です。">*</span>
</th>
<td>
<div class="field-type-number-integer field-name-field-price field-widget-number form-wrapper" id="edit-field-price">
<div id="field-price-add-more-wrapper">
<div class="form-item form-type-textfield form-item-field-price-und-0-value">
<input type="text" id="edit-field-price-und-0-value" name="field_price[und][0][value]" value="1000" size="12" maxlength="10" class="form-text required">
<span class="field-suffix">円</span>
</div>
</div>
</div>
</td>
</tr>
〜
とすることを狙っています。
以下、具体的な処理を示します。
// 1.hook_theme()により、オリジナルラッパーを追加する。
/**
* Implements hook_theme().
*/
function モジュール名_theme() {
return array(
'モジュール名_table_form' => array(
'render element' => 'form',
),
);
}
// 3.追加したオリジナルラッパー内で<table> </table>でラップする。
function theme_モジュール名_table_form($variables) {
$element = $variables['form'];
$prefix = '<table><tbody>'; // クラス等は自由に付ける
$suffix = '</tbody></table>';
return $prefix.$element['#children'].$suffix;
}
/**
* Implement hook_form_alter() {
*/
function モジュール名_form_alter(&$form, $form_state, $form_id) {
// 2.追加したオリジナルラッパーを標準ラッパー(form)の直前に実行させる。
array_unshift($form['#theme_wrappers'], 'モジュール名_table_form');
_モジュール名_erase_title_display($form); //
// 4.hook_form_alter()により、各フィールドフォームを<tr><th>ラベル</th><td>フォーム</td></tr>でラップする。
// フィールド単位の制御
foreach ($form as $field_name => &$field) {
if (strlen($field_name) && strpos($field_name, 0, 1) != '#' && isset($field) && is_array($field) && !empty($field['#type'])) {
$label = $required = $display = $visibility = '';
// 全フィールドを捜査し、$label〜$visibilityを取得
// $label:タイトル
// $required:入力必須
// $display:行そのものの表示有無
// $visibility:th(タイトル)の表示有無
if (isset($field['#type'])) {
if ($field['#type'] == 'container') {
foreach ($field as $n => &$f) {
if (strlen($n) && substr($n, 0, 1) != '#' && isset($f) && is_array($f)) {
if (isset($f['#title'])) {
$label = $f['#title'];
$required = !empty($f['#required']);
break;
}
}
}
}
elseif (isset($field) && is_array($field)) {
if (isset($field['#title'])) {
$label = $field['#title'];
$required = !empty($field['#required']);
}
}
}
if (!empty($required)) {
$label .= '<span class="form-required" title="このフィールドは必須です">*</span>';
}
if (!$label) {
if ($field_name == 'actions') {
$visibility = 'visibility: hidden;';
}
else $display = 'display: none;';
}
// tr.class.// CSS装飾のためtrにクラスを付ける
$tr_class = str_replace('_', '-', $field_name).'-tr';
// th, td.
foreach (array('#prefix', '#suffix') as $type) {
if (!isset($field[$type])) {
$field[$type] = '';
}
}
// ラップ
$field['#prefix'] = str_replace(
array('[tr_class]', '[tr_style]', '[th_style]', '[label]'),
array($tr_class, $display, $visibility, $label),
'<tr class="[tr_class]" style="[tr_style]"><th style="[th_style]">[label]</th><td>'
).$field['#prefix'];
$field['#suffix'] .= '</td></tr>';
}
}
}
// フォーム内の全てのタイトルを'invisible'にする(再帰的)
function _モジュール名_erase_title_display(&$form) {
if (isset($form) && is_array($form)) {
foreach ($form as $field_name => &$field) {
if (strlen($field_name) && substr($field_name, 0, 1) != '#' && isset($field) && is_array($field)) {
if (isset($field['#title'])) {
$field['#title_display'] = 'invisible';
}
_モジュール名_erase_title_display($field);
}
}
}
}
ページ