通常はコンテンツタイプの表示の管理で設定した、画像スタイルをもとに「node.tpl.php」テンプレート内で画像を表示します。
|
//すべての画像 <?php print render($content['field_image']); ?> //1番目の画像 <?php print render($content['field_image'][0]); ?> |
この場合では複数毎の画像があったときでも、同じ画像スタイルで表示されます。
もし1番目の画像、2番目の画像で画像スタイルを変えたい場合には、次のような方法で実現できます。
|
//1番目の画像 <?php print theme('image_style', array('path' => $node->field_image['und'][0]['uri'], 'style_name' => 'large')); ?> //2番目の画像 <?php print theme('image_style', array('path' => $node->field_image['und'][1]['uri'], 'style_name' => 'medium')); ?> |
1番目の画像($node->field_image[‘und’][0])に対しては、画像スタイル「large」、2番目の画像には「medium」を、それぞれ指定しています。
たたし、この方法ではrender()関数と違い、画像が無い場合にエラーを出してしまうので、次のように画像の有無をチェックした方が安全です。
|
<?php if (isset($node->field_image['und'][0])) { print theme('image_style', array('path' => $node->field_image['und'][0]['uri'], 'style_name' => 'large')); } ?> |
PHPでPC、スマートフォン、携帯のデバイスの判定するためのスクリプトです。
|
<?php $ua = $_SERVER['HTTP_USER_AGENT']; $pattern_mobile = '/DoCoMo|J-PHONE|Vodafone|SoftBank|UP.Browser|KDDI|WILLCOM|PDXGW|DDIPOCKET/'; $pattern_smart = '/Android|iPad|iPhone|iPod/'; if (preg_match($pattern_mobile, $ua)) { //mobile } else if (preg_match($pattern_smart, $ua)) { //smart phone } else { //pc } ?> |
(追記/2013.02.24)Insert 1.3にて対応されたようですので、モジュールのアップデートのみで大丈夫です。
Drupal 7.20にアップデートした際に、本文エリアへ画像を挿入するInsertモジュールが利用できない場合の暫定的な対処法です。
セキュリティアップデートのDrupal 7.20では、画像スタイルのパスにGET変数でitokを付加するかたちになりました。
そのためInsertモジュールで画像を挿入した場合に、正しく画像を生成・表示できない状態になっています。
暫定的な対処法として「sites/default/setting.php」に、次の1行を追記することで従来のスタイルに戻すことが可能です。
|
$conf['image_allow_insecure_derivatives'] = TRUE; |
セキュリティ的な面では好ましくないので、あくまで暫定的な方法です。
PHPでフォームから渡される変数が1,000以上の場合に、制限により受け取れないときの対処法です。
PHPのバージョン5.3.9よりセキュリティの面から、デフォルト値が1,000に制限されているので、PHPプログラムによっては、エラーとなってしまうことがあります。
自分の場合、DrupalのViewsで、外部設置フォームに「Better Exposed Filters」を利用した際に、エラーが頻発してしまいました。
「.htaccess」でデフォルト値を変更する場合には、次の様に追記します。
|
php_value max_input_vars 2500 |
「php.ini」の場合には、次の様に追記します。
ちなみに2,500という数字には、特に意味はありません。
Drupalでカスタムブロックを作成した際に、表示しているコンテンツタイプ別にブロックの表示内容を変更したい場合があります。
下記のようなコードでコンテンツタイプを判定することができます。
|
<?php $sign = false; $types = array('news', 'blog'); if (arg(0) == 'node' && is_numeric(arg(1))) { $nid = arg(1); $node = node_load($nid); $type = $node->type; $sign |= in_array($type, $types); } print $sign; ?> |
表示しているコンテンツタイプが「news」「blog」の場合に$signが「true」になります。