2012年5月11日金曜日

TopUp jQueryプラグインにてウインドウを閉じるリンクを作成する方法の一つ

TopUp betaを使っています。
よく考えたらbetaなんですね。本番はなにか違う形で存在しているんでしょうか?
知りたいです。
とても、いいものだと思っていまして、採用しています。
http://gettopup.com/

ウインドウがpopupして来てかっこいいものですが、
まず前提としてページをまるまるウインドウに出したいのでiFrameにて運用しています。
すると、当然ウインドウ内にリンクやらの自前のコントロールが存在してきます。
そこで、このウインドウを閉じるボタン(リンク)と言う要望が出てきました。
いろいろ調べたのですが、jsとhtmlの仕様といろいろ知らない事だらけで難航していましたが、
ひとまず、ウインドウを閉じるリンクを実現できました。
方法の一つになりますでしょうか。

<a href = javascript:$(".te_close_link",parent.document).click();>ウインドウを閉じる</a>

って感じでしょうか。
もう何が何だかわからなかったので、chromeにてどういうタグが何をになっているのかを調べて
どうやらデフォルトで存在する×ボタンが上記のte_close_linkに記述されているようだったので、
iFrameの仕様を調べて親のte_close_linkをクリックすることで実現しました。

この動作をfunctionとしてtopup.js自体に
function topup_close()
とでも定義してしまって

呼び出す側は

<a href = javascript: topup_close();>ウインドウを閉じる</a>
みたいにして使っています。

追記
これ
parent.TopUp.でアクセスできるので素でclose呼んでも出来ますね。。。

以上。

2012年5月1日火曜日

symfony backendでファイルのアップロード管理 元のファイル名とアップロードしたファイルを消す

symfonyのbackendはいろいろ自動でやってくれるけれども、何がどう関係しているのかさっぱりわかりません。
わかるんですかね?
DBにファイル名だけを管理させ、実際のファイル自体は
web/image/xxxなどどっかにアップロードさせて管理したいです。


まず、backendでgenerator.ymlとかいじる系はやってしまって。
フォームでファイルをアップするのを付け加えるにはバリデータとかウィジットとか登録するらしい。
こんなの知るかよ。
class ImageForm extends BaseImageForm
{
  public function configure()
  {
    parent::configure();

    unset(
      $this['created_at'], $this['updated_at']
    );    

    $this->widgetSchema['fileName'] = new sfWidgetFormInputFileEditable(array(
      'label'     => 'fileName',
      'file_src'  => sfConfig::get('app_image_path').$this->getObject()->getFileName(),
      'is_image'  => true,
      'edit_mode' => !$this->isNew(),
      'with_delete' => true,
      'template'  => '
%file%
%input%
%delete% %delete_label%
',)); $this->validatorSchema['fileName'] = new sfValidatorFile(array( 'required' => true, 'path' => sfConfig::get('app_image_path'), 'validated_file_class' => 'CustomValidatedFile', 'mime_types' => 'web_images', )); } }
いろいろ細かいファイルパスとかはうまいことやってください。

で、勝手にぐちゃぐちゃしたファイル名を付けやがるので、オリジナルのファイル名で管理したければ

 sfValidatorFileのコンストラクタに
      'validated_file_class' => 'CustomValidatedFile',
を追加して
こうするらしいです。
class CustomValidatedFile extends sfValidatedFile {
    public function generateFilename()
    {
      return $this->getOriginalName();      
    }
}
知るか!


さらに、deleteしてもファイル自体は消えないので
class Image extends BaseImage
{

  public function postDelete($event)
  {
    $filename = $this->getFilename();

    $filepath = sfConfig::get('app_image_path') .  $filename;

    @unlink($filepath);
  }
}
とするらしいです。
知るか!


2012年4月9日月曜日

jparallaxをjquery-1.7.1.jsに対応させる&バグ?

jQueryのバージョンを対象のプラグインに合わせて切り替えるのが筋だと思うのですが、
逆に面倒になったのでjparallaxをjquery1.7.1に対応させました。

簡単です。
マウス情報の取得の部分
 jQuery().mousemove(function(mouse)

 jQuery('*').mousemove(function(mouse)
にするだけです。
画面全部のマウス情報を拾いますけど、そこは好きにしてください。

あと、よくわかんないですがやっぱりなんか範囲外にあるマウスが拾えないことがあるので
オプションで
 mouseActiveOutside:true
にするも、ソースコード内では使ってないように見えたので
そのすぐ階下のコード
 if(mouseport.xinside&&mouseport.yinside&&!mouseport.active)

 if(settings.mouseActiveOutside||(mouseport.xinside&&mouseport.yinside&&!mouseport.active))
って感じで
 settings.mouseActiveOutside
がtrueの際は常に通るようにすればイメージ通りな気がします。

以上

2012年3月19日月曜日

sfTwigPluginのぐぬぬぬぬ

sfTwigPluginを導入するとmodule.ymlを見て
ビューをsfTwigPartialViewとかsfPHPとか切り替わる仕組みが
あるわけですが

これモジュールを超えてパーシャルファイルを呼び出すと
{{ 'module/list'|include_partial() }}
とか殺るんですよね?
これおもいっきり動作しないわけでソース見て動作見ると

PartialHelper.phpとかにあったりするわけですが
get_partial()の中で


  $class = sfConfig::get('mod_'.strtolower($moduleName).'_partial_view_class', 'sf').'PartialView';
  $view = new $class($context, $moduleName, $actionName, '');

こんなんやってまして、
  'mod_content_view_class' => string 'sfTwig' (length=6)

  'mod_content_partial_view_class' => string 'sfTwig' (length=6)
こんなんなってんですよ。
こっちが欲しいのは

  'mod_module_view_class' => string 'sfTwig' (length=6)

  'mod_ module_partial_view_class' => string 'sfTwig' (length=6)
なんすよ。
自分のルートしかコンフィグ持ってないようでモジュールを超えると手に入らず
おもいっきりデフォルトのsfPHPに行っちゃうわけですよ。

仕方ないからTwigを必ず使うことにして


    $class = 'sfTwigPartialView';
ってしちゃいましたよ。

そしたらbackendでcacheが自動的にできる際にphpしかつくらねーわけで
そのせいでビューがTwigに対応してない。
backendのときはしょうがないのでsfPHPにする必要が出た。

if('frontend' == sfConfig::get('sf_app'))
  {
    $class = 'sfTwigPartialView';
  }

これで対処とか、もうやってられねー。
つかTwig使う利点に出くわせなくなってきたよ。。。


2012年3月13日火曜日

symfonyでjQueryによるAjax。 sfDoctrinePagerに対応とか自分自身を書き換える系

JobeetでJQueryを使ったAjaxの解説があるのだけれども、状況が特殊すぎてさっぱりわからなく、
自分で応用が効かなかった。
jQueryの記事をいろいろ見てやっと望みどおりの動作になりました。
ぶっちゃけ、Web開発経験ないので本当に辛い気がする。。。

リンククリックでAjaxを走らせるには

$(document).ready(function()
{
  $('#xxx a').live("click", function()
  {
    var page = getUrlVars($(this).attr('href'))['page'];
    $('#yyy').load(
          "search",
          {page: page}
          );
    return false;
  });
});

って感じになるんじゃないでしょうか。
まず、リンクをクリックするとそもそも、リンク先に飛んじゃうので
それを殺すのにreturn falseしてやる必要がある。

loadですげ変わる部分自体が
<div id=xxx>
<a href='search?page=x'>next</a>
って感じで<div id=xxx>自体を生成しなおすので
$('#xxx a').click(function()
でやると新しくすげ替えたタグを見つけられなくて通常のリンク処理が走ってしまう。
そこで、click関数では無くlive('click')にてイベントを処理すると行けるもんですね。
さらにloadにて投げるパラメータ?page=xはクリックした<a>タグの中の
href=に書いて有るためパラメータを自力で取得する必要がある。
href自体は
$(this).attr('href')で取れるのであとはパラメータを分解出来ればいいのだけれども
ぐぐったら現在のURLを分解するgetUrlVars()っつーサンプルがあったので改造して
引数でurlをわたして分解するように改造。(どう考えてもこっちのほうが汎用性あるとおもうんだけどな。。。)

function getUrlVars($url)
{
    var vars = [], hash;
    var hashes = $url.slice($url.indexOf('?') + 1).split('&');
    for(var i = 0; i < hashes.length; i++)
    {
        hash = hashes[i].split('=');
        vars.push(hash[0]);
        vars[hash[0]] = hash[1];
    }
    return vars;
}
getUrlVars('http://www.jobeet.com/search?page=2')['page'];

とかするとはれて2と言う値がとれるようです。
でloadのパラメータに{page: page}とかって付け加えればOK。
この書き方はTwigでも同じなのでちょっと便利。

あとはpagerを含めてそのまんま処理すればOK。

例のaction.class.php内で

if ($request->isXmlHttpRequest())
{
  return $this->renderPartial('job/list', array(
    'pager' => $this->pager
   ));
}

とやって
searchSuccess.phpでは

<div id="yyy">
{{ 'job/list'|include_partial({pager: pager}) }}
</div>


とかyyy付けとけばそこ全体が変わると。

_listのページャ部分には
  <div id="xxx">

    <a href="<?php echo url_for('category', $category) ?>?page=1">
      <img src="/images/first.png" alt="First page" title="First page" />
    </a>
 といった感じで<div id="xxx">で囲っとけばページャだけにイベントが発生する仕組みと。

ぶっちゃけ、自分の処理はcategoryをモジュールで分けないで?category=hogeで処理するようにしているので、jobeetの処理まんまでは無いけれども、つまりは、そういった感じでやればいけるって話です。








2012年3月6日火曜日

sfTwigPluginに新しい関数を追加

 plugins\sfTwigPlugin\lib\view\sfTwigView.class.php
にある

class sfTwigView extends sfPHPView
{
 ....
 public function configure()
  {
    parent::configure();
    ....


    $this->twig->addFunction('test', new Twig_Function_Function('test'));
    function test(){echo 'test  function is called';}



とすれば

 <p> {{ test() }} </p>
 test  function is called
と表示される

ちなみに
 $this->twig->addFilter('test', new Twig_Filter_Function('test'));
とやると
 <p> {{ ''|test() }} </p>
と呼べる。

果たして、これを使ってPHPの組み込み関数を呼べるように出来るのか

2012年3月2日金曜日

プログラムの質問に「そもそも〇〇が問題だ」と答える意図

よく質問箱などで質問者に対して、
結構具体的なPGの質問に対して
「そもそもなぜそれが必要か考えなければいけません」って発言をみるんだが、
ちょっとした大きなお世話だ。(ちょっとと大きなが面白いところです)
問題をすべて解決して欲しいって頼んでいるわけではないのだから、
その質問に答えられる人が答えてあげればいいじゃないか。

回答する際に、何か間違ったことを言ったらいけないって思っているんだろうか。

根本的に問題点を考える事はとても重要で、そのアドバイスは正論だと思うけど、

おおきなお世話だ。

質問サイトのstack over flowはとても良いシステムだと思うよ。
「いいね!」 と 「いらね」 が選べるので、こう言うのは無視かいらねを選択できるわ。