スポンサーサイト

0

    一定期間更新がないため広告を表示しています


    • 2014.12.23 Tuesday
    • -
    • -
    • -
    • -
    • -
    • by スポンサードリンク

    OpenPNE3カスタマイズテクニック:no_image画像のカスタマイズ

    0
      コミュニティのno_image画像はユーザーのno_image画像とは違うのを表示したい、という場合のカスタマイズ方法について。

      公式SNSの下記トピックでは、javascriptを使っててっとり早く変更する方法を紹介しちゃいましたが、この記事では真面目に確実に(javascriptが使えない環境も考慮。たとえばガラケーとか)変更する方法を考えてみたいと思います。
      ■no_imageの画像と通知センターの画像変更について(閲覧には公式SNSのアカウントが必要)
      http://sns.openpne.jp/communityTopic/8895

      前提:op_image_tag_sf_imageヘルパーのno_imageオプション

      op_image_tag_sf_imageヘルパーとは、PNE内の各所で、スキンプラグインやコアに含まれないアップロードされた画像のimgタグを出力するために使われているヘルパーです。
      ソース(lib/helper/opUtilHelper.php)を見るとわかる通り、image_tag_sf_imageヘルパーのラッパーで、no_imageというオプションが無い場合にデフォルト値をセットしているだけです。
      つまり、このno_imageオプションを個別に指定して呼び出してやることで、no_image画像を指定できることがわかります。
      (本当にno_imageオプションでno_image画像が指定できるのかどうか?や、大元のimage_tag_sf_imageヘルパーのその他の各オプションについては、lib/plugins/sfImageHandlerPlugin/lib/helper/sfImageHelper.phpを見てください。)

      コミュニティTOPのno_image画像を任意の画像に変える

      コミュニティTOPのテンプレートはapps/pc_frontend/modules/community/homeSuccess.php
      しかし、そこからop_include_parts()ヘルパでmemberImageBoxというパーツの呼び出しが行われているので、実際はapps/pc_frontend/templates/_partsMemberImageBox.phpになります。
      <?php $imgParam = array('size' => '180x180', 'alt' => $options->object->getName()) ?>
      <?php $nameMethod = $options->name_method ?>
      <?php if ($options->object): ?>
      <?php echo op_image_tag_sf_image($options->object->getImageFileName(), $imgParam) ?>
      <?php else: ?>
      <?php echo op_image_tag('no_image.gif', $imgParam) ?>
      <?php endif; ?>
      op_image_tag_sf_imageに渡されているオプションは$imgParamという配列をテンプレート内で独自に定義していることがわかります。
      $imgParam初期化後、op_image_tag_sf_imageに渡すまでの間のどこかで
      <?php $imgParam['no_image'] = op_image_path('コミュ専用のNOIMAGE画像'); ?>
      のような行を追加すれば変更できますが、_partsMemberImageBox.phpはコミュTOPのみならずメンバープロフィール等でも使用されるパーツテンプレートなので、ここで変更してしまうとコミュだけでなくメンバーのほうも変更されてしまい、不都合です。
      そこで、パーツ呼び出し時にno_imageの指定がある場合のみ、$imgParam['no_image']をセットすることを考えます。つまり、こんな感じです。
      <?php $options->setDefault('no_image', false); ?>
      <?php if ($options->no_image): ?>
        <?php $imgParam['no_image'] = $options->no_image; ?>
      <?php endif; ?>
      あとは、community/templates/homeSuccess.phpに戻ってno_imageオプションを渡すだけです。
      <?php
      $options = array(
        'object' => $community,
        'no_image' => op_image_path('コミュ専用のNOIMAGE画像'),
      );
      op_include_parts('memberImageBox', 'communityImageBox', $options);
      ?>

      コミュニティ検索結果のno_image画像を任意の画像に変える

      コミュニティ検索結果のテンプレートはapps/pc_frontend/modules/community/searchSuccess.php
      しかし、コミュTOP同様にop_include_parts()ヘルパーでsearchResultListが呼び出されているので、実際に見るべきテンプレートはapps/pc_frontend/templates/_partsSearchResultList.phpです。
      op_image_tag_sf_imageヘルパーの呼び出しは
      <?php echo link_to(op_image_tag_sf_image($result->getImageFilename(), array('size' => '76x76')), sprintf($options['link_to_detail'], $result->getId())); ?>
      のように行われています。ヘルパーコールが重複して見づらいですが、op_image_tag_sf_image()に渡されているオプションはarray('size' => '76x76')のみだとわかります。
      コミュTOPの時と同様に、このarray()に'no_image' => op_image_path('コミュ専用のNOIMAGE画像')を足したいのですが、画像の表示オプションに各データ行ごとに違いはないですから、わざわざ個別のコミュデータごとにarray('size' => '76x76', 'no_image' => op_image_path('コミュ専用のNOIMAGE画像'))を作る意味はなく、全部のデータに共通のオプションを作ってしまって良いでしょう。
      具体的には$options['pager']->getResults()のforeachループが始まるより前に、
      <?php $options->setDefault('no_image', false); ?>
      <?php $imgParam = array('size' => '76x76'); ?>
      <?php if ($options->no_image): ?>
        <?php $imgParam['no_image'] = $options->no_image; ?>
      <?php endif; ?>

      を追記して(コミュTOPのmemberImageBox同様、searchResultListも別の画面でも使うパーツのため、直接の書き換えは避けます)、foreachループ内のop_image_tag_sf_image()ヘルパー呼び出し部分は下記のように書き換えます。
      <?php echo link_to(op_image_tag_sf_image($result->getImageFilename(), $imgParam), sprintf($options['link_to_detail'], $result->getId())); ?>
      後は、community/templates/searchSuccess.phpに戻ってsearchResultListを呼び出す際のオプションにno_imageを追加するだけです。
      $options = array(
        'title'          => __('Search Results'),
        'pager'          => $pager,
        'link_to_page'   => '@community_search?page=%d',
        'link_to_detail' => '@community_home?id=%d',
        'list'           => $list,
        'no_image' => op_image_path('コミュ専用のNOIMAGE画像'),
      );

      #このように、PNE3は拡張性が高くできていると思うのですが、あまり方法が知られていないのが残念ですね^^;


      スポンサーサイト

      0

        • 2014.12.23 Tuesday
        • -
        • 00:24
        • -
        • -
        • -
        • -
        • by スポンサードリンク

        コメント
        コメントする








           

        PR

        calendar

        S M T W T F S
              1
        2345678
        9101112131415
        16171819202122
        23242526272829
        3031     
        << July 2017 >>

        twitter

        selected entries

        categories

        archives

        recent comment

        • 結局CodeIgniter用汎用Modelクラス&汎用CRUDスクリプトを書きました
          プログラマー
        • icu4.4以上が用意できないサーバーでSymfony2.3以上を使う方法
          よし
        • icu4.4以上が用意できないサーバーでSymfony2.3以上を使う方法
          ななうぇぶ
        • icu4.4以上が用意できないサーバーでSymfony2.3以上を使う方法
          よし
        • icu4.4以上が用意できないサーバーでSymfony2.3以上を使う方法
          よし
        • WindowsのPCで開発するphperがxhprofを使う方法
          ななうぇぶ
        • WindowsのPCで開発するphperがxhprofを使う方法
          川本
        • [バッドノウハウ]Symfony2で別テーブルの集計項目を一覧に含めたいとき
          よし
        • Symfony Advent Calendar JP 2012 day 14 - vendorをcomposerで管理しているプロジェクトにcomposerを使わずにバンドルを追加したときのautoloadの書き方
          77web
        • Symfony Advent Calendar JP 2012 day 14 - vendorをcomposerで管理しているプロジェクトにcomposerを使わずにバンドルを追加したときのautoloadの書き方
          ktz

        recent trackback

        • HTMLの表(TABLE)のセル(TD)に斜線を引くjavascriptライブラリ slash.js 作っちゃいました
          常山日記
        • django対symfony 日本語メール送信(その1 symfony編)
          CPA-LABテクニカル
        • CodeIgniterでユーザー認証
          されどLAMPな日々
        • 久々にdjangoを最新版にしたらHTMLがエスケープされちゃった!!(解決済み)
          常山日記
        • FastCGIを諦めてmod_pythonを使う。Apacheのアップグレード
          サーバー用語集
        • さくらインターネット、sqlite3でdjango@CGI版を使う際の設定メモ
          常山日記
        • さくらインターネット スタンダードプランでdjango使ってる方、DBは?
          mitszoの日記
        • python多次元リストをsort(並べ替え)する方法?
          mitszoの日記
        • フォームから送信した値とrequest.POSTの挙動($_POST@PHPとの比較)
          Humming Via Kitchen
        • 日本語テキストをtruncate@django(Python全般にも??)
          常山日記

        recommend

        links

        profile

        search this site.

        others

        mobile

        qrcode

        powered

        無料ブログ作成サービス JUGEM