アーカイブ

‘PHP’ カテゴリーのアーカイブ

Dreamweaver のテンプレートによるパスの書き換え対策 Smarty Plugin

2007 年 9 月 1 日 admin コメントはありません

今の職場でプログラム組み始めてから、長らく私を悩ませていた問題が、Dreamweaverのテンプレートによるパスの書き換えでした。

Smartyを使用する場合、tplファイルを格納するためのフォルダを作る必要があります。そのフォルダにあるファイルを、デザイナーさんがDreamweaverで直接編集してしまうと、テンプレートに記述されているCSSなどのパスを、編集したファイルを起点とした相対パスに書き換えてしまいます。そうなると実際アクセスするphpファイルに記述してあるパスと食い違いが発生し、CSSなどのリンク切れが起ってしまうのです。

これは絶対多くの人が悩んでいると思うのですが、ネットで調べても全然解決策が見つからない。
それともこんなことで悩んでるのは私だけ・・・。

しかし8ヶ月も悩み続けたこの問題も、やっと解決策を思いつきました。

$_SERVER["REQUEST_URI"]から階層の深さを判断し、Smartyのprefilter pluginを用いて、tpl内に記述されているパスの書き換えるという力技。

これがコードです。

function smarty_prefilter_url($_src, &$smarty)
{
  $base_url = '/app/';//http://www.example.com/appがサイトトップの場合
  $escape_base_url = '/^' . str_replace('/', '\/', $base_url) . '/';
  $site_path = preg_replace($escape_base_url, "",$_SERVER["REQUEST_URI"]);
  $slash_count = substr_count($site_path, '/');
  $src = preg_replace('/<link href="(..\/)+/', '<link href="' . str_repeat('../', $slash_count),$_src);
  $src = preg_replace('/src="(..\/)+/', 'src="' . str_repeat('../', $slash_count),$src);
  return $src;
}

css、img、javascriptを格納するフォルダが、サイトのトップに有るとの前提で作っております。

ひよっこプログラマーが作った物なので穴が有るかもしれないですが、使ってやって下さい!私が喜びます!(このコードは問題有りで修正しました、使ってもらっても私は喜びません!!)それから、おかしなところに気付いた時はコメントしていただきたい!私が喜びます!

8ヶ月も悩んだ割にはこんな短いコードで解決なんですよね・・・。とにかく心のモヤモヤが一つ無くなりました。

Dreamweaver のテンプレートによるパスの書き換え対策 Smarty Pluginその2

カテゴリー: PHP タグ:

Zend_Validate_Alpha 日本語対応

2007 年 8 月 9 日 admin コメント 2 件

Zend_Validate_Alphaを使ってみたら、どうも日本語の判定がおかしい。日本語が完全に無視されているようだ。コードを覗いてみると

public function isValid($value)
{
    $valueString = (string) $value;

    $this->_setValue($valueString);

    if ('' === $valueString) {
      $this->_error(self::STRING_EMPTY);
      return false;
    }

    if (null === self::$_filter) {
      /**
       * @see Zend_Filter_Alpha
       */
      require_once 'Zend/Filter/Alpha.php';
      self::$_filter = new Zend_Filter_Alpha();
    }

    self::$_filter->allowWhiteSpace = $this->allowWhiteSpace;

    if ($valueString !== self::$_filter->filter($valueString)) {
      $this->_error(self::NOT_ALPHA);
      return false;
    }

    return true;
}

どうやらZend_Filter_Alphaでフィルタリングして、入力した値との差を比べることでアルファベットの有無を調べているようだ。ということはZend_Filter_Alphaに問題がありそう。

public function filter($value)
{
    $whiteSpace = $this->allowWhiteSpace ? '\s' : '';
    if (!self::$_unicodeEnabled) {
      // POSIX named classes are not supported, use alternative a-zA-Z match
      $pattern = '/[^a-zA-Z' . $whiteSpace . ']/';
    } else {
      $pattern = '/[^\p{L}' . $whiteSpace . ']/u';
    }

    return preg_replace($pattern, '', (string) $value);
}

あっ!? preg_replaceだ!どうりで日本語無視される訳だ。しかし”$pattern = ‘/[^a-zA-Z]/’”なら問題なさそうの気がするんだけど、何故にユニコード使用の時は”$pattern = ‘/[^\p{L}]/u’”??よく理由はわからんが次のように書き換えてみる。

public function filter($value)
{
    $whiteSpace = $this->allowWhiteSpace ? '\s' : '';
    return preg_replace('/[^a-zA-Z' . $whiteSpace . ']/', '', (string) $value);
}

これでとりあえず日本語判定も問題なく行えるようになったが、 わざわざ’/[^\p{L}]/u’を行う理由がやっぱり分からん。何か意味あるのかなぁ・・・。

カテゴリー: Zend Framework タグ:

管理タグ

2007 年 8 月 1 日 admin コメントはありません

トップにお問い合わせをつけてみましたが、wordpressは最初の設定で管理人のメールアドレスやら入力させるのにタグで持って来れないみたいですね。う〜ん、メールアドレス変更になることはあんまり無いとは思いますが、タグで出したい・・・。

カテゴリー: WordPress タグ:

Ethna ActionForm

2007 年 7 月 27 日 admin コメントはありません

私が普段使っているプログラミング言語はPHPです。プログラムの入りがJAVAだったのでスッゴイ簡単な反面、機能不足なところも感じます。特に趣味でやる分には最新のPHP5でがんがん組めるのでだいぶマシなのですが、仕事となるとサーバーの関係上どうしても中途半端にオブジェクト指向に対応したPHP4になってしまうわけです。だからちょっとでも楽に開発しようとPHP4対応のフレームワークEthnaを使い始めました。いや〜、凄い楽しい!プログラミング初心者には勉強なることだらけだ!

今日そのEthnaで結構便利な機能を見つけたので書いときます。

EthnaではEthna_ActionFormを継承したクラスの中で入力データの定義を行い、その定義を元に入力データのチェックを行っています。ちなみにこんな感じ

class Sample_Form_Index extends Sample_ActionForm
{
  /** @var  bool  バリデータにプラグインを使うフラグ */
  var $use_validator_plugin = false;

  /**
   *  @access   private
   *  @var    array   フォーム値定義
   */
  var $form = array(
    'name' => array(
      'type' => VAR_TYPE_STRING,
      'form_type' => FORM_TYPE_TEXT,
      'name' => '名前',
      'max' => 40,
      'reqired' => true,
      'filter' => FILTER_FW,
    ),
    'kana' => array(
      'type' => VAR_TYPE_STRING,
      'form_type' => FORM_TYPE_TEXT,
      'name' => 'フリガナ',
      'max' => 40,
      'filter' => FILTER_FW,
    ),
  );
}

今回2つしか定義してないですが普通はもう少し多くの定義を書くことになる訳で、これを毎回書くのが面倒なんです。特にお決まりの名前、フリガナ、メールアドレスなどなど、毎回そんな定義なんて変わらないですし。そんな時に便利なのが $form_template。

Ethna_ActionFormを継承したActionFormでこの$form_templateを定義すると、add_actionで作られるActionFormクラスでキーを指定して空の配列を代入するだけで入力の定義が出来てしまうのです。

$form_template定義

class Sample_ActionForm extends Ethna_ActionForm
{
  /**#@+
   *  @access private
   */

  /** @var  array   フォーム値定義(デフォルト) */
  var $form_template = array(
    'name' => array(
      'type' => VAR_TYPE_STRING,
      'form_type' => FORM_TYPE_TEXT,
      'name' => '名前',
      'max' => 40,
      'filter' => FILTER_FW,
    ),
    'kana' => array(
      'type' => VAR_TYPE_STRING,
      'form_type' => FORM_TYPE_TEXT,
      'name' => 'フリガナ',
      'max' => 40,
      'filter' => FILTER_FW,
    )
}

$form_template定義後の$form定義

class Sample_Form_Index extends Sample_ActionForm
{
  /** @var  bool  バリデータにプラグインを使うフラグ */
  var $use_validator_plugin = false;

  /**
   *  @access   private
   *  @var    array   フォーム値定義
   */
  var $form = array(
    'name' => array(),
    'kana' => array(),
  );
}

これで一度定義しておけば後はキーを指定するだけで良いので楽です。

とここまでは実はちょっと前まで知っていたのですが今日 Ethna_ActionFormのソースコードを見ていたら気づいてしました!なんと必要なものだけ上書きできたみたいです。

class Sample_Form_Index extends Sample_ActionForm
{
  /** @var  bool  バリデータにプラグインを使うフラグ */
  var $use_validator_plugin = false;

  /**
   *  @access   private
   *  @var    array   フォーム値定義
   */
  var $form = array(
    'name' => array(
      'required' => true,
    ),
    'kana' => array(
      'required' => true,
    ),
  );
}

こんな感じで ‘required’だけ定義しても他の’type’、’form_type’…などは$form_templateのまんま定義されるので必要なとこだけ追加や変更ができる。いや〜、便利!

こんな感じでフレームワークを使ってると新たな発見があって楽しいな〜。家ではPHP5がガンガン使えるので、つい先日ヴァージョン1.0.0 が出たばかりのZend Frameworkを使ってます。こっちもなかなか面白いんで、なんかあったらお伝えします。

カテゴリー: Ethna タグ: