サイトの環境設定 |
8.9.x |
|
編集 |
コンテンツの管理 |
8.9.x |
|
写真の変更を行いたい |
Migrate |
9.x |
drush config |
Upgrade source(環境) を 変更したときにやるべきこと |
PHP |
8.9.x |
drush |
drush sql:cli < が機能しない場合の対処 |
フォーム |
8.9.x |
Views |
Views exposed filterのフォームに#default_valueを仕込む方法 |
テーマ |
8.9.x |
|
スマホに向いたテーマについて |
アップデート |
8.9.x |
composer patch |
patch を composer に 組み込む方法 |
PHP-FPM |
8.9.x |
PHP |
PHP-FPM 環境で .htaccess に php_value を 書いてもダメ |
サイトの構築 |
8.9.x |
Webform |
drupalを使用した登録、一覧表示の方法について |
アップデート |
8.9.x |
Composer update |
Composer で drupal/core-8.9.7 に更新できなくなった場合の処置 |
サイトの構築 |
7.59 |
Drupal.ajax |
drupal 7 で Uncaught TypeError: Drupal.ajax is undefined となったときの対応方法 |
Proxy |
7.59 |
Proxy Apache settings.php |
リバースプロキシ(Apache)+バックグランドWeb(Drupal 7 )でログインセッションを維持する方法 |
リバースプロキシ |
8.9.x |
mod_proxy mod_proxy_http mod_ssl |
Apache2.4 から httpsサーバーへリバースプロキシする方法 |
コンテンツの作成 |
8.9.x |
node |
ノード保存時の前回値の参照方法 |
サイト情報 |
8.9.x |
api |
Drupal::request() メモ |
テーマ |
8.9.x |
Twig |
Twig で 月末日を算出する方法 |
SESSION |
8.9.x |
api |
$_SESION操作のAPI |
フォーム |
8.9.x |
api |
GET/POSTされた情報を得る方法 |
テーマ |
8.9.x |
patch パッチ |
開発環境のファイル変更を本番環境にパッチでデプロイする方法(画像含まず) |
コンテンツの作成 |
8.9.x |
vim nkf |
ファイルのエンコーディングを確認、変更する方法 |
コメント
たしかに、安全にというのは難しいようです。レンダリング構造
パーマリンク 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);
}
}
}
}
ページ