スポンサーサイト

0

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


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

    #phpmatsuri 2013でOpenPNE3のcookbookを書きました

    0

      7/14〜7/15札幌で開催されたphpmatsuriに行ってきました!

      わざわざ札幌まで行った理由としては、今すごいコミュニティ欲が高いシーズンが来ていて、更に、札幌は私の生まれ故郷で実家があるので子供達を連れて行っても預け先がある(子供を自宅に置いて行かなくて済むのでDAuth=ダンナauthが取りやすい)というだけです。ついでに、春先に一度倒れた祖父の見舞い(超元気でした)も行きたかったし、単に暑すぎる名古屋から涼しい札幌に少しでも涼みに行きたかったというのもありました。不純な動機ばかりですがw ともかく子供二人と自分、三人分の飛行機代をかけて札幌まで行きました。

      作ったもの:OpenPNE3のcookbookと、そのcookbookを使ったVagrant環境

      OpenPNE3のcookbookと、そのcookbookを使ったVagrant環境を作りました。

      なぜ作ろうと思ったかと言うと、素人さんは素人さんでもmac使いの人はいざとなれば自力でビルドしてもらえばいいのでまぁいいとして、windows使いの人にOpenPNE3が動く環境を作ってもらうのが難しいと前から考えていて、唯一おすすめできると思っていたのがxamppぐらい。でも、xamppの最新版はPHP5.4で、OpenPNE3が今のところPHP5.4で動かない(PNEが悪いわけではなくsymfony1.4とdoctrine1.2の問題で)という状態になっていました。
      私自身、開発用xamppを5.4にしてからPNE3の案件が戻って来たときに非常に困っていたという事情もあります。私もPHPカンファレンス関西で安藤さんが紹介してくださったvagrantを使って開発環境を用意して回避したので、同様に一般向けに作ったらいいんじゃないかと思ったわけです。

      開発は苦労しました。
      まず、私のruby力不足。随分前にこのブログで「rubyを始めてみた」的なエントリーを書いた記憶があるのですが、必要に迫られなかったこともあり、実際はhello world以上のことをやったことがなかったのです。Vagrantfileはまだいいとしても、cookbookのほうを書くためには、制御構造(if,each…)の書き方やら連想配列の書き方からグーグル先生に訊きながらの作業になりました。しかも一日目夜のcandycaneのワークショップで「if文のブロックで囲むとインデントが深くなるのでnot_ifやonly_ifを使え」とか言われて慌てて直したり…。
      さらに、会場の回線環境があまり良くなくてほぼスマフォのテザリングで頑張ったのですが、大量の依存パッケージ(apache,mysql,php…)をインストールさせることになるので、タイムアウトエラーが頻発してしまい、実際のPNEインストールに辿り着かせるまでが大変という状態でした。

      最終的には、OSにprecise64を使い、かつsynced_folderなしであればインストール完了して画面が表示できるところまではなんとか作ることができました。
      phpmatsuriは終わりましたが、phpmatsuriだけのために作ったcookbookやvagrant環境ではないので、今後も開発を続けたいと考えています。
      具体的には、
      * Vagrantを使う場合にsynced_folder内にソースを入れられるようにする
      * 設定項目でもっと柔軟性を持たせたい(インストールするプラグインとか)
      * precise64以外のOSにも対応したい(特にRedhat,CentOSはマストかと)
      * ruby力をつける&モジュール分割するなどしてもう少しcookbook自体のコードを綺麗にしたい
      という野望を持っています。目標は大きく!

      LTについて

      初日に講演されたどなたか(失念…ごめんなさい><)を見習ってスライドは英語、喋りは日本語にしました。一人同時通訳にしたら絶対に時間が足りないと思ったので。結局、日本語だけ喋っても時間は足りませんでした…。

      少しだけウケを狙った「〜〜済のものがこちらになります」が滑って悲しかったです。タイトルのひねりが足りなかったのではないかと反省。せっかくLT時間が3分間だったり、ネタがchefだったりしたので、『OpenPNE3 3分間クッキング』とかつけるべきでしたね。←反省するところ間違ってる?

      結果20位台(魂抜けてて正確な順位は聞いてなかった)という評価をいただきました。次はもっと上を狙えるよう頑張りたいです!

      二日間通しての感想

      OpenPNE関係で普段からお世話になっている手嶋屋の手嶋さん(鳩サブレありがとうございましたm(_ _)m)と「リアルでは初めまして」。川原さん・NEKOGETさん・cakephperさんとも以下同文。PHPメンターズの道場生仲間の佐藤さんとも初めまして。
      更に、LTで「名古屋から来た」と言ったお陰で、岐阜から来た外人さんお二人からも声を掛けていただきました。名古屋在住と岐阜在住が札幌のphpmatsuriまで来て、子供の話とか保育園の話で盛り上がるという謎の展開^^;お二人が日本語で喋ってくれてるのに私が英語交じりで返すというアホっぷりを晒してしまい、申し訳なかったです。
      偶然、福岡のfusicから来た前回・前々回の優勝者の方とずっと同じテーブルでハックするという幸運に恵まれました。が、お隣の同僚さんも含めて、すごすぎて何も盗んで来れなかった…orz

      KEEP

      • 来年も参加する!
      • ネタだけじゃなく実用的なものを作る

      PROBLEM

      • 準備はしっかりと(実はCentOSのOSイメージ持っていくのを忘れてたのです)

      TRY

      • もっと色々な人と話す(今回ほとんど同じテーブル+前からネット上で知っている人としか話してないので)

      来年もぜったい行くぞー!というか名古屋でやろうよ!←



      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は拡張性が高くできていると思うのですが、あまり方法が知られていないのが残念ですね^^;


        coreserverにOpenPNE3.6.0をインストール(速度はともかくxreaも同手順で可)

        0
          OpenPNE3.6がリリースされたので、記念にcoreserverへのインストール方法を詳細に書いておきます。時々公式SNSでインストールに躓いている方がいるので…。

          0.準備:データベースの設定

          coreserver,xreaのコンパネで設定するだけです。
          反映するまで少し時間がかかるので最初にやっておくと良いです。

          ※SSHの扱いに慣れていなくて大変な方は、下記1〜5の手順で作業せずに 一旦自分のPCにダウンロード→PC上で解凍→フォルダ名変更→設定ファイルコピー&編集→FTPソフトでアップロード でも大丈夫です。
          1.ダウンロード先URLを準備

          http://openpne.jpにアクセスし、ダウンロード>OpenPNE3.6.0に「zip版ダウンロード」というリンクがあるので、そこのリンク先URLをコピーしておきます。

          2.サーバーにzipをダウンロード

          SSHでサーバーにログインし、
          wget http://github.com/openpne/OpenPNE3/zipball/OpenPNE-3.6.0 --no-check-certificate
          
          を実行します。
          ホームディレクトリにOpenPNE-3.6.0という名前でzipファイルがダウンロードされるはずです。
          まだまだSSHを使うので閉じないでください。

          3.解凍

          ダウンロードしたOpenPNE-3.6.0のzipを解凍します。
          unzip OpenPNE-3.6.0
          
          を実行します。
          ダーーーっと実行中の表示が出て、openpne-OpenPNE3-xxxxxx(xxxxxxの部分はランダムっぽい英数字)という名前でOpenPNE3.6のソースコード一式が入ったフォルダが生成されます。

          4.フォルダ名の変更(面倒なら飛ばしてもOK)

          今後「openpne-OpenPNE3-xxxxxx」のままでは扱いづらいのでフォルダ名を変えます。
          mv openpne-OpenPNE3-xxxxxx openpne3.6
          
          を実行します(xxxxxxの部分は実際のフォルダについている名前を入れてください) 5.設定ファイルのコピー&編集

          config/OpenPNE.yml
          config/ProjectConfiguration.class.php
          を作ります。
          config/OpenPNE.yml.sample
          config/ProjectConfiguration.class.php.sample
          というファイルが入っているので、これをコピーすれば良いです。
          cp config/OpenPNE.yml.sample config/OpenPNE.yml
          cp config/ProjectConfiguration.class.php.sample config/ProjectConfiguration.class.php
          
          を実行します。
          本当ならここでOpenPNE.ymlを編集するのですが、内容は後からでも変更できるので一旦編集なしで先に進みます。

          6.インストールコマンドの実行

          いよいよインストールです。
          php symfony openpne:install
          
          を実行します。
          データベース設定を1個ずつ訊かれるので、手順0で作成したDBの情報を入力していきます。最後にIs it OK to start this task?と訊かれるので「y」と答えてスタートさせてください。

          インストールが完了するとcomplete!と出ます。

          ※処理時間が長くなると、途中でkilledとなって処理が止まってしまうことがあります。(xreaやcoreでは非常によくあります)

          もしkilledと言われて途中でインストールが中止されてしまったら、openpne:installのコマンドを実行し直せば、いつかは最後までインストールできます。

          …と言っても、何度もDB設定を手入力するのが面倒なので、簡単に再実行できる抜け道を作りましたv
          https://gist.github.com/897640のスクリプトをダウンロードして、openpne3.6/lib/taskにopenpneFastInstallTask.class.phpという名前で保存してから、openpne:installの代わりに
          php symfony openpne:fast-install --dbms=mysql --dbuser=DBユーザー名 --dbpassword=DBパスワード --dbname=DB名
          
          のようにして実行すれば、openpne:installと同じ処理をDB設定を1つずつ入力しなくてもインストールができます。(1つ前に実行したコマンドはキーボードの「↑」でもう一度呼び出せます)

          ※何度やっても完了まで行けない(途中でkilled)時は、最初にインストールするプラグインを減らしてみてください。プラグインは本体のインストールが終わった後でも個別にインストールができます。→インストールするプラグインの減らし方

          7.ドメインの設定

          coreserver,xreaのコンパネで設定するだけです。経験上、メイン(public_html)に設定するのは止めた方が良いです。メインはblankにして、サブに設定。
          ※既に設定済のドメインの下部ディレクトリでPNEを使いたい方はやらなくて良いです


          8.シンボリックリンクの作成

          シンボリックリンクはWindowsでいうショートカットみたいなものです。本来coreserverでは「public_html/ドメイン名」というフォルダをサブドメインのドメインルート(http://ドメイン名/ でアクセスした時に表示するフォルダ)とするところを、「public_html/ドメイン名」という名前でopenpne3.6/webへのシンボリックリンク(ショートカット)を作ってやることで、openpne3.6/webをhttp://ドメイン名/でアクセスした時に表示するフォルダにすることができます。
          ln -s $HOME/openpne3.6/web $HOME/public_html/PNEで使用したいドメイン名
          
          を実行します。

          ↑WinSCPでpublic_htmlに「PNEで使用したいドメイン名」の名前でリンクができたのを確認してみたところ。FTPソフトやcoreserverコンパネのファイルマネージャでも確認できます。

          9.htaccessの編集
          .htaccessを画像のようにcoreserverの環境に合わせて編集します。


          10.ログインして確認
          ブラウザで「http://PNEで使用するドメイン名」にアクセスして、ログインフォームが表示されればインストール成功です!



          OpenPNE3のプラグイン開発でハマリやすいところの個人的まとめ

          0
            ここ1年ぐらい、OpenPNE3のプラグインを色々作っているわけですが、
            http://plugins.openpne.jp/package/listMember?id=37

            個人的にハマりやすいと思ってる点を4点ほどまとめてみました。

            ■フォームのカスタマイズはconfigureじゃなくてsetupでやりましょう
            特にsymfony1.xでsfFormを扱ったことがある人は要注意。PNEプラグインの場合、path/to/pne/plugins/opXXXPlugin/lib/form/doctrine/PluginXXXForm.class.phpを弄ることになるのですが、そこでconfigureを定義してもPluginXXXForm.class.phpを継承しているpath/to/pne/lib/form/doctrine/XXXForm.class.phpに空っぽのconfigureが入ってるので、その空っぽの内容に上書きされてしまいます。

            ■既存プラグインをカスタマイズするとき、ディレクトリごと.oldとか.orgとか付けて残しておくのはNG。ディレクトリごと取っておくときはpath/to/pneの外に出すか、FugaHoge.class.php.oldのように.php以外の拡張子で残そう
            symfony1.x系に共通の話なのですが、autoloadが働く時lib/util.org/FugaHoge.class.phpとlib/util/FugaHoge.class.phpがあったらutil.orgのほうが読み込まれてしまっていつまでたっても変更した内容が反映されない場合があります。

            ■携帯のテンプレートで<table width="100%">等と入れるのがめんどくさい。
            表示内容をslotにつっこんでop_include_box使いましょう。便利。

            ■plugins.openpne.jpからインストールした時は良いが自SNS内に自分でプラグインを作った時、テーブル追加はopenpne:install --redoしかない(?)
            migrationのスクリプト書けばinstallやり直さなくても大丈夫な気もしますが、今のところ開発専用にSNSを1個確保してそこでinstall --redoしまくるのがいいかも



            [OpenPNE3.x]op_include_yesnoヘルパーがすごい

            0
               超便利なヘルパーを見つけた(発掘した)ので感動が冷めないうちにまとめておきます。
              何かに書いておかないとまた忘れちゃいそうなのでw

              function op_include_yesno($id, $yesForm, $noForm, $options)
              #定義はopPartsHelper内にあります。

              $id…formを囲むdivに付けたいid名。HTMLのid名なので同一ページ内の他のidと干渉しなければ自由につけられます。例えばスケジュール削除確認の画面ならscheduleDeleteConfirmFormとか。まぁ好みで。

              $yesForm…「はい」の場合に送信するformインスタンス。予めアクション側で作ってビューに渡しておく。⇒私はこのyesnoを主に<削除確認画面>で使ってるので、大抵の場合は単なるsfFormなのですが。何かのパラメータをhiddenで渡したいときにはhiddenFieldsを持ってるformを作って値をセットして渡せばOK。

              $noForm…「いいえ」の場合に送信するformインスタンス。$yesFormと以下同文。

              $options…オプションの連想配列。op_include_formを使ったことがあればほぼ同じオプション内容が使えます。ただし、送信先URLの指定がyes,no2つ分あるのでそれぞれ指定すべし。⇒前述の通り私は<削除確認画面>で使ってるので、yes_urlを削除実行のアクションのURL、no_urlを表示のアクションのURLにしてます。
              yes_url…yesの場合($yesForm)の送信先URL
              no_url…noの場合($noForm)の送信先URL
              title…formを囲むdivのpartsHeading>h3に入るテキスト。無指定だとタイトルなしのブロックになる。⇒<削除確認画面>だと「予定削除の確認」とか。
              body…yes,noボタンの上に表示したいテキスト。⇒<削除確認画面>なら「本当に削除しますか?」とか「削除します。よろしいですか?」とか。
              yes_button…yesのボタンのvalue。「はい」とか「削除する」とか「出席する」とか。デフォルトは「はい」。
              no_button…noのボタンのvalue。「いいえ」とか「中止する」とか「欠席する」とか。デフォルトは「いいえ」

              op_include_formとの違いは、view.ymlによるカスタマイズの読み込み機構は付いてないところぐらい?まぁどうしても必要なら足せばいいけど。


              すごい便利なのにバンドルされてるプラグインでもほとんど使われてないのが不思議。
              皆さんもお試しあれ。


              1

              PR

              calendar

              S M T W T F S
                   12
              3456789
              10111213141516
              17181920212223
              24252627282930
              31      
              << March 2024 >>

              twitter

              selected entries

              categories

              archives

              recent comment

              • djangoテンプレート上でmodelのメソッドに引数を渡す方法(djangoで出勤簿アプリ試作中♪)
                GavannITサービス-なりとみ
              • 私がそれでも名古屋市に住み続ける理由を6つにまとめてみた!
                bose wireless speaker
              • FastCGIでdjango…400エラー???
                levi's
              • さくらインターネットdjangoが突然500エラー!?(Pythonバージョンアップされてた
                salomon running shoes
              • 私がそれでも名古屋市に住み続ける理由を6つにまとめてみた!
                louboutin shoes
              • FastCGIでdjango…400エラー???
                yeezy boost 350
              • さくらインターネットdjangoが突然500エラー!?(Pythonバージョンアップされてた
                jordan 11
              • Silexでエラーページをカスタマイズする方法 : Symfony Advent Calendar 2011 - day 12
                pandora jewelry
              • django対symfony 日本語メール送信(その1 symfony編)
                nike air vapormax
              • 解決!XREAでCGI版Pythonを使ってdjangoを動かす(人柱?)
                kate spade

              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