2012年5月24日木曜日

jquery.lettering.jsで改行を処理したい

jquery.lettering.animate.js
で文字列をかっこよく表示したいと思ったら、改行に関しては処理してくれないので
こいつが使っている
jquery.lettering.js
をちょっと都合よく改造してしまいました。


function injector(t, splitter, klass, after) {
    var html = t.html().split((/<*?.[Bb][Rr].*?>/g));
    var inject = '';
  if (html.length) {
        $(html).each(function(j, html_item) {
          var a = html_item.split(splitter);
          if (a.length) {
            $(a).each(function(i, item) {
              inject += '<span class="'+klass+(i+1)+'">'+item+'</span>'+after;
            });
            inject += '<BR />';

            t.empty().append(inject);
          }
        });
  t.empty().append(inject);
      }
}

一旦<br>をセパレータにして文字列の配列を分離してから
その中身を従来の処理にして従来の処理の最後で
<span></span>
を通さずに<br>を打つって感じですか。
苦労したのがIEだとsplit("<br>")をうまく処理してくれなくて
正規表現でまかないました。
IEはどうも大文字の<BR>を使うみたいですね。

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);
  }
}
とするらしいです。
知るか!