JavaScript |
8.5.x |
PHP |
Commerce決済モジュール設定をJavaScriptにデータに渡す方法 |
JavaScript |
7.34 |
PHP |
PHPからJavaScriptに変数値を渡したい |
jQuery Revolution |
7.50 |
|
jQuery Revolutionのリンクがスマホで機能しない |
Libraries |
8.5.x |
Libraries |
Commerceで外部JavaScriptをテスト/本番で読み分ける方法 |
mac linux ファイル名 文字化け |
8.7.x |
mac linux ファイル名 文字化け |
Macからlinuxにrsyncするとファイル名(濁点)が文字化けする場合の対応方法 |
Messages |
7.34 |
Disable messages |
標準(コア)が表示する特定のメッセージ非表示にしたい |
Migrate |
9.x |
drush config |
Upgrade source(環境) を 変更したときにやるべきこと |
PCRE |
7.50 |
|
preg_match()がおかしい |
PHP |
7.22 |
PHP |
ノードに付いたコメントを好きな場所に表示する |
PHP |
8.9.x |
PHP |
YamlをPHP配列にする方法 |
PHP |
8.3x |
PHP |
drupa8でhook_init()する方法 |
PHP |
8.9.x |
drush |
drush sql:cli < が機能しない場合の対処 |
PHP-FPM |
8.9.x |
PHP |
PHP-FPM 環境で .htaccess に php_value を 書いてもダメ |
PhpStorm |
7.50 |
LocalForward |
PhpStormから踏み台を使う |
Proxy |
7.59 |
Proxy Apache settings.php |
リバースプロキシ(Apache)+バックグランドWeb(Drupal 7 )でログインセッションを維持する方法 |
SESSION |
8.9.x |
api |
$_SESION操作のAPI |
SFTP |
8.4x |
SFTP RSA |
SFTP(RSA)でファイル転送(送信)する方法 |
SSH |
7.50 |
ProxyCommand |
SSH IP制限を1コマンドで通過する |
token |
7.34 |
token |
オリジナルモジュールからtokenを提供する方法を教えて下さい。 |
Token |
8.4x |
Token |
カスタムモジュールからtokenを提供する方法(drupal8版) |
コメント
たしかに、安全にというのは難しいようです。レンダリング構造
パーマリンク 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);
}
}
}
}
ページ