今日、drupal のユーザー名の出力で問題が発生し、その出力が drupal のテーマ機能を使用していたので、情報を検索したところ、次のことがわかりました。
1.theme('username', array('account' => $log)) は関数を呼び出します。パラメーター 1 はフック、パラメーター 2 はパラメーターです
にあります。
[php]
/**
* theme_username() の変数を前処理します。
*
* 'name' や 'extra' などの変数に変更を加えるモジュールは、次のことを保証する必要があります
*
を使用して、最後の文字列を出力に直接含めても安全であること
* check_plain() または filter_xss()
*
* @template_process_username() を参照
*/
関数 template_preprocess_username(&$variables) {
$アカウント = $変数['アカウント'];
$variables['extra'] = '';
if (empty($account->uid)) {
$variables['uid'] = 0;
if (theme_get_setting('toggle_comment_user_verification')) {
$variables['extra'] = ' (' . t('未検証') . ')';
}
}
それ以外の場合 {
$variables['uid'] = (int) $account->uid;
}
// 名前を印刷しても安全な書式設定された名前に設定し、
// 長すぎてテーブルが壊れることはありません。短縮せずにそのままにしておいてください。
// 他の前処理関数を実装したい場合に備えて、サニタイズされていないバージョン
// 独自の短縮ロジックまたはマークアップを追加します。そうする場合、次のことを確認する必要があります
// $variables['name'] は印刷しても安全であること。
$name = $variables['name_raw'] = format_username($account);
if (drupal_strlen($name) > 20) {
$name = drupal_substr($name, 0, 15) 。 「...」;
}
$variables['name'] = check_plain($name);
$variables['profile_access'] = user_access('ユーザー プロファイルにアクセス');
$variables['link_attributes'] = array();
// 必要に応じて、リンク パスと属性を設定します。
if ($variables['uid'] && $variables['profile_access']) {
// ローカル ユーザーにリンクしています。
$variables['link_attributes'] = array('title' => t('ユーザー プロフィールを表示します。'));
$variables['link_path'] = 'user/' 。 $variables['uid'];
}
elseif (!empty($account->homepage)) {
// 'class' 属性と同様に、'rel' 属性は
// スペースで区切られた値のセットなので、配列として初期化して、
// 他の前処理関数を追加しやすくなります。
$variables['link_attributes'] = array('rel' => array('nofollow'));
$variables['link_path'] = $アカウント->ホームページ;
$variables['homepage'] = $account->homepage;
}
// l() 関数で check_plain() を再度実行する必要はありません。
$variables['link_options']['html'] = TRUE;
// デフォルトのクラスを設定します。
$variables['attributes_array'] = array('class' => array('username'));
}
/**
* theme_username() の変数を処理します。
*
* @template_preprocess_username() を参照
*/
関数 template_process_username(&$variables) {
// l() 関数に渡すために link_options 配列を完成させます。
// これはプロセスフェーズで行われ、
によって属性が追加されるようになります
// 前処理フェーズ中のモジュールまたはテーマ。
if (isset($variables['link_path'])) {
// $variables['attributes_array'] には適用する必要がある属性が含まれています
// リンクがレンダリングされているかどうかには関係ありません。
// $variables['link_attributes'] には、
のみである必要がある属性が含まれています
// リンクがレンダリングされている場合に適用されます。前処理関数が推奨されます
// リンクのみに属性を追加する場合を除き、前者を使用します。
// リンクがレンダリングされている場合、これらをマージする必要があります。一部の属性は
// それ自体が配列であるため、マージは再帰的に行う必要があります。
$variables['link_options']['attributes'] = array_merge_recursive($variables['link_attributes'], $variables['attributes_array']);
}
}
/**
* theme_username() の変数を前処理します。
*
* 'name' や 'extra' などの変数に変更を加えるモジュールは、次のことを保証する必要があります
*
を使用して、最後の文字列を出力に直接含めても安全であること
* check_plain() または filter_xss()
*
* @template_process_username() を参照
*/
関数 template_preprocess_username(&$variables) {
$account = $variables['account'];
$variables['extra'] = '';
if (empty($account->uid)) {
$variables['uid'] = 0;
if (theme_get_setting('toggle_comment_user_verification')) {
$variables['extra'] = ' (' . t('未検証') . ')';
}
}
他に{
$variables['uid'] = (int) $account->uid;
}
// 名前を印刷しても安全な書式設定された名前に設定します
// 長すぎてテーブルが壊れることはありません。短縮せずにそのままにしておいてください
// 他の前処理関数を実装したい場合に備えて、サニタイズされていないバージョン
// 独自の短縮ロジックまたはマークアップを追加します。そうする場合、次のことを保証する必要があります
// $variables['name'] は安全に印刷できることを確認します。
$name = $variables['name_raw'] = format_username($account);
if (drupal_strlen($name) > 20) {
$name = drupal_substr($name, 0, 15) 。 「...」;
}
$variables['name'] = check_plain($name);
$variables['profile_access'] = user_access('ユーザー プロファイルにアクセス');
$variables['link_attributes'] = array();
// 必要に応じて、リンク パスと属性を設定します。
if ($variables['uid'] && $variables['profile_access']) {
// ローカル ユーザーにリンクしています。
$variables['link_attributes'] = array('title' => t('ユーザープロフィールを表示します。'));
$variables['link_path'] = 'user/' 。 $variables['uid'];
}
elseif (!empty($account->homepage)) {
// 'class' 属性と同様に、'rel' 属性は
を保持できます
// スペースで区切られた値のセットなので、配列として初期化して作成します
// 他の前処理関数を追加しやすくなります。
$variables['link_attributes'] = array('rel' => array('nofollow'));
$variables['link_path'] = $account->ホームページ;
$variables['ホームページ'] = $account->ホームページ;
}
// l() 関数で check_plain() を再度実行する必要はありません。
$variables['link_options']['html'] = TRUE;
// デフォルトのクラスを設定します。
$variables['attributes_array'] = array('class' => array('username'));
}
/**
* theme_username() の変数を処理します。
*
* @template_preprocess_username() を参照
*/
関数 template_process_username(&$variables) {
// l() 関数に渡すために link_options 配列を完成させます。
// これはプロセスフェーズで行われ、
によって属性が追加されるようになります。
// 前処理フェーズ中のモジュールまたはテーマ。
if (isset($variables['link_path'])) {
// $variables['attributes_array'] には適用する必要がある属性が含まれています
// リンクがレンダリングされているかどうかに関係なく。
// $variables['link_attributes'] には
のみであるべき属性が含まれています
// リンクがレンダリングされている場合に適用されます。前処理関数が推奨されます
// リンクのみに属性を追加する場合を除き、前者を使用します。
// リンクがレンダリングされている場合、これらをマージする必要があります。いくつかの属性は
// それ自体が配列であるため、マージは再帰的である必要があります。
$variables['link_options']['attributes'] = array_merge_recursive($variables['link_attributes'], $variables['attributes_array']);
}
}
3、これらの量の処理が完了した後、主関数に到達し、ここで最終的な html の実装と出力 theme_username($variables);
[php]
関数テーマユーザー名($variables) {
if (isset($variables['link_path'])) {
// リンク パスがあるので、l() を使用してリンクを生成する必要があります。
// 追加のクラスは、
のような配列要素として追加できます。
// $variables['link_options']['attributes']['class'][] = 'myclass';
$output = l($variables['name'] . $variables['extra'], $variables['link_path'], $variables['link_options']);
}
それ以外の場合 {
// モジュールには重要な属性が追加されている可能性があるため、それらを含める必要があります
// 出力内。追加のクラスは、
のような配列要素として追加できます。
// $variables['attributes_array']['class'][] = 'myclass';
$output = '' 。 $変数['名前'] 。 $variables['extra'] 。 '';
}
$output を返します。
} '>
関数テーマユーザー名($variables) {
if (isset($variables['link_path'])) {
// リンクパスがあるので、l() を使用してリンクを生成する必要があります。
// 追加のクラスは
のような配列要素として追加できます
// $variables['link_options']['attributes']['class'][] = 'myclass';
$output = l($variables['name'] . $variables['extra'], $variables['link_path'], $variables['link_options']);
}
他に{
// モジュールには重要な属性が追加されている可能性があるため、含める必要があります
// 出力内。追加のクラスは、次のような配列要素として追加できます
// $variables['attributes_array']['class'][] = 'myclass';
$output = '' 。 $変数['名前'] 。 $variables['extra'] 。 '';
}
$output を返します;
}
'>
)