top


総投稿数 本 
no_

スポンサーサイト

 --------
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
カテゴリ :スポンサー広告 トラックバック(-) コメント(-)
no_1094

パンくずリスト:なんかライブラリもあるようだけど、YAMLファイルのお勉強も兼ねて、泥くさく創りましょうかねぇ ・・・ 【symphonyで、創るぞ】

 2009-09-20
 symfonyでのサイト開発ネタ。
 今回は、「パンくずリスト」。
 もうサイト創る際の必需品、ですね。

 なんかライブラリもあるようだけど・・・
 ・ sfSiteStructurePlugin:サイトマップとパンくずリストの自動生成
  ダウンロードさせていただた。ありがとうございます。
  きちんとプラグインになっていて、きれいな
  やり方ですね。これで行うのが正しのだろう、けど。
  sfSiteStructurePlugin


 ただ
 ・YAMLファイル利用するところはそのままで
  もっとコンパクトに行いたく
 ・また、YAMLファイルはきちんと扱ってみたかったので
  ※それを扱うライブラリもあるそうな。


 ちょっと、勉強かねて泥臭く創ってみました。


  追記に ▼(長文ご容赦)


 ※今までのご参考

FC2ブログランキング にほんブログ村 IT技術ブログ Webサイト構築へ ブログ王ランキング 人気ブログランキング 人気ホームページランキングへ


more

************************************************
◎ パンくずリスト創りましょ、の巻:symphonyで、創るぞ
************************************************


 ■YAMLファイル
  ・symfonyでサイト構築する際、もう
   切っても切れない仲となりました。
   (schema.yml,databases.yml,settings.yml ・・・


  YAML - Wikipedia にあるけど、YAMLって
  最初は「Yet Another Markup Language」
      "もうひとつ別のマークアップ言語"
       という意味だったのが
  今は 「YAML Ain't a Markup Language
      "YAMLはマークアップ言語ではない"
       という意味らしいですね。
  ははは。面白い。


 ■symfony で、YAMLファイル
  □sfYamlクラス
   ・YAML -> array あるいは
   ・array -> YAML ができるようですね。
   すばらしい。


   (テスト)


   システムとは別に、view.yml を読んでみよう。
$tar_yml = '*****/view.yml';
$results = array();
$yml = new sfYaml();
$results = $yml->load($tar_yml);
var_dump($results);
 とやれば、
   おぉ、すばらしい。
array(1) {
["default"]=>
array(6) {
["http_metas"]=>
array(1) {
["content-type"]=>
string(9) "text/html"
}
["metas"]=>
array(4) {
["title"]=>
string(142) "*****"
["description"]=>
string(129) "*****"
["keywords"]=>
string(89) "*****"
["language"]=>
string(2) "ja"
}
["stylesheets"]=>
array(1) {
[0]=>
string(8) "*****.css"
}
["javascripts"]=>
array(0) {
}
["has_layout"]=>
bool(true)
["layout"]=>
string(6) "layout"
}
}
 と返ってくる。これは使えるなぁ。

 ※ちなみに、symfonyでなく、一般にPHPで
  YAMLファイルをパースするには、
  「Spyc」 というのがいいようだ。
  ・ PHPでYAML
  結果はまさに同じだ。覚えておこう。


 ■YAMLファイル の作成


  ※今回の
   ・パンくずリスト 用途だけではなく
   ・カテゴリやコーナーごとの
    ・metatag記述や
    ・HTMLタイトル
    などもまとめておきたい。
  まずは、こんな感じで用意した。
top:

company:
_structure_info:
title: 会社概要
description: 会社の簡易紹介。
keywords: metatagに記載したいメインキーワード3つくらい

products:
_structure_info:
title: プロダクツ
description: プロダクツの紹介。
keywords: metatagに記載したいメインキーワード3つくらい

services:
_structure_info:
title: サービス
description: サービスの紹介。
keywords: metatagに記載したいメインキーワード3つくらい

contact:
_structure_info:
title: ご連絡ください
description: 弊社あて、フォームメール。
keywords: metatagに記載したいメインキーワード3つくらい

info:
_structure_info:
title: インフォメーション
description: インフォメーションの説明。
keywords: metatagに記載したいメインキーワード3つくらい

ppolicy:
_structure_info:
title: プライバシーポリシー
description: プライバシーポリシー。
keywords: metatagに記載したいメインキーワード3つくらい

  で、これを上記の構文で読み込むと、
array(1) {
["top"]=>
array(5) {
["company"]=>
array(1) {
["_structure_info"]=>
array(3) {
["title"]=>
string(12) "会社概要"
["description"]=>
string(24) "会社の簡易紹介。"
["keywords"]=>
string(64) "metatagに記載したいメインキーワード3つくらい"
}
}

 ・・・(略)・・・

["info"]=>
array(2) {
["_structure_info"]=>
array(3) {
["title"]=>
string(27) "インフォメーション"
["description"]=>
string(39) "インフォメーションの説明。"
["keywords"]=>
string(64) "metatagに記載したいメインキーワード3つくらい"
}
["ppolicy"]=>
array(1) {
["_structure_info"]=>
array(3) {
["title"]=>
string(30) "プライバシーポリシー"
["description"]=>
string(33) "プライバシーポリシー。"
["keywords"]=>
string(64) "metatagに記載したいメインキーワード3つくらい"
}
}
}
}
}
 ・・・おぉ、ちゃんと階層構造正確に
    配列化している。

  さてさて。
  ここからが結構時間要しました。


  理解するのに。

 ■実践
  まず、symfonyだけではなく、他のフレームワークも
  同じなのでしょうが・・・


  仕組みにおいて

  ・単純に、「テンプレート」の中で、
   動的に変数制御による動き
   が、そのままできるわけではありませんよね。


   ・symfony で、テンプレートファイルを分離したり
    共有したりする方法は
    ・include
    ・partial
    ・component
    ・component_slot
    ・slot
    のいくつかがあることはある程度、理解しました。
    (チュートリアル、途中で投げ出しているので
     完全理解ではありません、がね)


  今回の目的は、
   □パンくずリストを生成する部分
    共有利用できる部品で創り用意したい。
   □プラグインとかではなく、もう少しお手軽に
    組み込めないのか?
    (symfonyの正しい利用法からはずれますが)
   □メンテナンスも簡単にできるように。


 ■記録
  ※この方法はおそらく、かなり違うsymfonyの利用方法
   なんだと思うけど・・・


  □(上記)YAMLファイルを用意し
   ・(プロジェクト名)apps/frontend/config/structure.yml
    で用意。


  □YAMLファイルの読み込み・パース
    今後も他のアプリでも使いたいので)


   ・(プロジェクト名)lib 以下に クラスファイルとして、
<?php
class YML {
public function getvalsYml()
{
$tar_yml = APL_DIR.'frontend/config/structure.yml';
$yml = new sfYaml();
return $yml->load($tar_yml);
}
}
?>
 と簡単なものを用意しておく。
    APL_DIR は、define してます。

  □これを、各モジュールのアクションファイル
   ・(プロジェクト名)apps/frontend/modules/(アクション名)/actions.class.php
    で、

$this->result_structures = YML::getvalsYml();
 としてやれば、読み込めるわけですね。


   【ポイント】
    ・この、libディレクトリにおくだけで、
     宣言とかしなくてもそのまま使える、というのは
     便利ですねぇ。(ちょっと怖いけど)

  □これで、テンプレートの中で、
   $result_structures の配列変数がハンドリングできる、と。


  □パンくずリストを実際に生成・表現する部分は
   (共有パーシャルとして利用するために)


   ・(プロジェクト)apps/frontend/templates に
    ・_inc_*****.php という
     パンくずリストを生成する実行ファイルを用意。
<?
$module_name = $sf_context->getModuleName();
$action_name = $sf_context->getActionName();
if(($module_name!='')&&($module_name!='default')){
echo '<span class="pklink">'.link_to('TOP', ROOT_URL, 'title=トップページへ').'</span>';
echo ' &gt; ';
$temptitle = $result_structures[top][$module_name][_structure_info][title];
$tempdescription = $result_structures[top][$module_name][_structure_info][description];
echo '<span class="pklink">';
if(($action_name!='')&&($action_name!='index')){
echo link_to($temptitle, ROOT_URL.$module_name, 'title='.$tempdescription);
}else{ echo '<strong>'.$temptitle.'</strong>'; }
echo '</span>';
if(($action_name!='')&&($action_name!='index')){
echo '<span class="pklink">';
echo ' &gt; ';
$temptitle2 = $result_structures[top][$module_name][$action_name][_structure_info][title];
echo '<strong>'.$temptitle2.'</strong>';
echo '</span>';
}
}
?>
 ははは。力づく、ですね。
    1:現在のモジュール名、アクション名は、
<?
$module_name = $sf_context->getModuleName();
$action_name = $sf_context->getActionName();
 で、取得できますね。
    2:$result_structures という配列変数の中を廻しているのですが
      今のところ、第2階層までなので、これでゆけるんですね。
      この先はまた考えねば・・・
   【ポイント】
    ・symfonyってあまり、「定数」使いませんよね。
     私は慣れてるので、よく使うんですけど。(ROOT_URL

  □テンプレートからは、

<?php include_partial('global/inc_*****',array('result_structures' => $result_structures)) ?>
 とすれば、利用できました。
  パンくずリストも実装できました

 これで一応、パンくずリストも実装できましたが
 課題・未解決点はあります。


   【未解決】
    ・エラーではないのでしょうが、dev環境で見ると
     警告が表示されます。
Strict Standards: Non-static method YML::getvalsYml() should not be called statically, assuming $this from incompatible context in *****/actions.class.php on line 29

    ・コールするときの不具合なんだろうけど、これを
     解明しなくては、気分が悪いな。
    ・またこれは(まぁいいかな)とも思ってるんだけど
     変数制限していないところで、
Notice: Use of undefined constant top - assumed 'top' in *****/frontend/templates/_*****.php on line 7
 こういうアラートも頻発する。

 調べて修正しなくては。

commentsコメント
こんにちは~。
symfonyでいろいろなことにチャレンジされているのをいつも楽しく読ませていただいています。


ところで、警告のの1つ目の方は、「スタティックメソッドで宣言されていないものを、スタティック形式で呼び出した」ということですね。

http://www.php.net/manual/ja/language.oop5.static.php

なので、getvalsYml()をstatic宣言すればよいはずです。
【2009/09/20 21:36】 | GOTTi #JalddpaA | [edit]
コメントありがとうございます。
お恥ずかしいですが、楽しんでもらえてれば・・・
さて、お教えいただきありがとうございます。
実は、当然そうだろうとそれもやってみたのですね。
エラー文読めばある程度わかったので。
それでもだめ(警告が出る)ですね。
そういうことってあるんでしょうか?
(いや、実際にあるんだけど)
ありがとうございました。

【2009/09/20 23:20】 | metaboy #- | [edit]
comment_post












管理者にだけ表示を許可する
commentトラックバック
トラックバックURL:
http://metaboy.blog23.fc2.com/tb.php/1094-3df55b52
ようこそ
Add to Google 創るmetaboy:RSSフィード
My Yahoo!に追加
最新記事のRSS | 問い合わせ

仕事検索、アルバイト検索、依頼仕事の検索ポータル - 仕事検索.COM - www.jobkensaku.com ツクルン

創るmetaboy - WEB創る、サイト創る、何創る - 創ったmetaboy

 

リンク集

 

最近の記事

 

ブロとも申請フォーム
Sponserd by

さくらのレンタルサーバ さくらのレンタルサーバ
大容量・高機能レンタルサーバー heteml 大容量・高機能レンタルサーバー heteml
XREA (ValueDomain)
お名前.com お名前.com
名づけてねっと名づけてねっと
ムームードメインムームードメイン

 

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。