スポンサーサイト

0

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


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

    sfWidgetFormSelectCheckbox, sfWidgetFormSelectRadioの日本語value対応(何年ぶりのsf記事??

    0
      sfWidgetFormSelectCheckbox, sfWidgetFormSelectRadioでchoicesのvalue値(label値ではなく)としてマルチバイト文字列を使うと、いくつかの選択肢が表示されなくなる現象がありました。
      原因としては、inputタグを作るとき(render?)にinputタグのid値をユニークなキーとして使うらしく、そのid値はnameとvalueを「_」で繋いで作るんだけど、sfWidgetForm内でマルチバイト文字列(まぁ日本語の文字列)は「_」に変更されてしまうので、偶々複数のchoicesのvalue値の中に文字列長が同じのがあると、1つにまとまってしまうみたい。
      長々と文章で説明するより実例のほうがわかりやすいかな。

      $choices = array("ほげ"=>"ほげ", "ふが"=>"ふが");
      をcheckboxやradioのchoicesとして指定すると、出力は
      checkboxなら □ふが <input type="checkbox" name="check" value="ふが" id="check___" />&nbsp;ふが
      radioなら ○ふが <input type="radio" name="radio" value="ふが" id="radio___" />
      のみになります。つまり最後の1個だけ。

      で、これを回避するためにはid値の生成メソッド=sfWidgetForm::generateId()を下記のように変更してみました。
      /lib/vender/symfony/lib/widget/sfWidgetForm.class.php
      255行目〜オリジナル
          // remove illegal characters
          $name = preg_replace(array('/^[^A-Za-z]+/', '/[^A-Za-z0-9¥:_¥.¥-]/'), array('', '_'), $name);
      255行目〜私の修正版
          // remove illegal characters
          //$name = preg_replace(array('/^[^A-Za-z]+/', '/[^A-Za-z0-9¥:_¥.¥-]/'), array('', '_'), $name);
          $name = preg_replace('/^[^A-Za-z]+/', '', $name);
          if(preg_match('/[^A-Za-z0-9¥:_¥.¥-]/', $name)>0)
          {
            $name = md5($name);
          }
      一見してわかるとおりマルチバイト文字を「_」×文字数に置換してしまうのではなく、マルチバイト文字列を含むname + _ + value をmd5ハッシュ化してしまっただけです。
      デメリットはinputのid値を使ってCSSでデザインを指定したいときには厳しい(出力されたinputタグをみて頑張って><)ことぐらい?
      まぁ個々のinputにデザイン決めたいぐらいの時はchoicesのkey(value値として渡す値)をアスキー文字だけにして使ってください。
      今回の私の案件ように、運営者が自分でフォームの選択肢を編集する(しかも、運営者は、言語ファイル未アップでtitle, bodyとフォームのラベルが表示されたら「プログラムのコードが出ってます!!」と泡食って連絡してくるぐらい英語オンチ)とか、そういう特殊な状況じゃなければ多分使わないと思いますが。
      #そういえば、mysqlのenumってマルチバイト文字使えたっけ。enumに日本語文字列を指定して、doctrineのschemaからフォームを自動生成させたらどうなるんだろう。そういう時この修正方法が生きるかも???誰か人柱お願いします(笑)


      何年ぶりにsymfony記事を書いたんだろう、自分…。


      1

      PR

      calendar

      S M T W T F S
        12345
      6789101112
      13141516171819
      20212223242526
      27282930   
      << June 2010 >>

      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