<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>unos.biz &#187; symfony</title>
	<atom:link href="http://unos.biz/blog/archives/category/symfony/feed" rel="self" type="application/rss+xml" />
	<link>http://unos.biz/blog</link>
	<description>環境と思想と日常と.</description>
	<lastBuildDate>Fri, 27 Jan 2012 17:27:21 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>symfony doctrineでmigrate</title>
		<link>http://unos.biz/blog/archives/594</link>
		<comments>http://unos.biz/blog/archives/594#comments</comments>
		<pubDate>Fri, 16 Jul 2010 11:14:48 +0000</pubDate>
		<dc:creator>ゆのじ</dc:creator>
				<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://unos.biz/blog/archives/594</guid>
		<description><![CDATA[symfony1.4.6、doctrineで、migrateしつつ開発、のテスト中。思いの外はまりどころが多いので個人的メモ。誤解している、使い方がオカシイなどありましたらご指摘ください。ちなみに、正しい使い始めのための手順はこちらが詳しい。 型にtextだとかdatetimeだとか書いておくとはまる 型にtype: textだとか書いておいても、普通に使う分には使えてしまう。ただ、doctrine:migrateすると、syntax errorが出てしまう。どうも、textとだけ書いておくと、hoge: { type: text } をSQLにするとき、hoge text()と構築してしまってエラーになる模様。string(長さ)と指定しておけばOK。 同様に、datetimeもmigrateを使わないかぎり通るのだけど、migrate使うとエラー。timestampとしておく必要がある。 トランザクション使ってないのでエラー出たら面倒 migrateタスクの中でトランザクション処理を行っていない模様(嘘。ちゃんと書いてあった)。そのせいで、上記のようなエラーがでると中途半端にクエリが通った状態になってしまう。運用データがなければ(開発サーバであれば)、doctrine:drop-dbしてdoctrine:create-dbして、doctrine:migrateすればいいが、そうでない場合は結構注意が必要。つうかトランザクションくらい走らせてください＞中の人 お気軽に使えそうで思ったよりはまる。ただ、継続的に開発し続ける手合いにはこれがないと困るので、はまらないように使ってみようと思う。 &#160; 追記： sfDoctrineMigrateTaskとMigrateを読んでみると、beginTransactionがちゃんと書いてあった。クエリログを見てみると確かにトランザクションは掛けている。なんでdry-runするだけで問題が起こったのかちょっとわからず。 100716 20:30:38 2 Connect shell@localhost on shell 2 Query SET NAMES utf8 2 Query SET NAMES 'UTF8' 2 Query CREATE TABLE migration_version (version INT) ENGINE = INNODB 2 Query SELECT version FROM migration_version 2 Query START TRANSACTION [...]]]></description>
			<content:encoded><![CDATA[<p>symfony1.4.6、doctrineで、migrateしつつ開発、のテスト中。思いの外はまりどころが多いので個人的メモ。誤解している、使い方がオカシイなどありましたらご指摘ください。ちなみに、正しい使い始めのための手順は<a href="http://d.hatena.ne.jp/innx_hidenori/20100626/1277562937" target="_blank">こちら</a>が詳しい。</p>
<p><strong>型にtextだとかdatetimeだとか書いておくとはまる      <br /></strong>型にtype: textだとか書いておいても、普通に使う分には使えてしまう。ただ、doctrine:migrateすると、syntax errorが出てしまう。どうも、textとだけ書いておくと、hoge: { type: text } をSQLにするとき、hoge text()と構築してしまってエラーになる模様。string(長さ)と指定しておけばOK。     <br />同様に、datetimeもmigrateを使わないかぎり通るのだけど、migrate使うとエラー。timestampとしておく必要がある。</p>
<p><strong>トランザクション使ってないのでエラー出たら面倒      <br /></strong><strike>migrateタスクの中でトランザクション処理を行っていない模様</strike>(嘘。ちゃんと書いてあった)。そのせいで、上記のようなエラーがでると中途半端にクエリが通った状態になってしまう。運用データがなければ(開発サーバであれば)、doctrine:drop-dbしてdoctrine:create-dbして、doctrine:migrateすればいいが、そうでない場合は結構注意が必要。つうかトランザクションくらい走らせてください＞中の人</p>
<p>お気軽に使えそうで思ったよりはまる。ただ、継続的に開発し続ける手合いにはこれがないと困るので、はまらないように使ってみようと思う。</p>
<p>&#160;</p>
<p>追記：    <br />sfDoctrineMigrateTaskとMigrateを読んでみると、beginTransactionがちゃんと書いてあった。クエリログを見てみると確かにトランザクションは掛けている。なんでdry-runするだけで問題が起こったのかちょっとわからず。</p>
<pre>100716 20:30:38     2 Connect   shell@localhost on shell
                    2 Query     SET NAMES utf8
                    2 Query     SET NAMES 'UTF8'
                    2 Query     CREATE TABLE migration_version (version INT) ENGINE = INNODB
                    2 Query     SELECT version FROM migration_version
                    2 Query     <strong>START TRANSACTION</strong>
                    2 Query     SELECT version FROM migration_version
                    2 Query     CREATE TABLE (略
                    2 Query     ALTER TABLE (略
                    2 Query     CREATE INDEX (略
                    2 Query     <strong>commit</strong>
                    2 Query     SELECT version FROM migration_version
                    2 Query     UPDATE migration_version SET version = 12
                    2 Quit</pre>
<p>追記：<br />
  <br />おそらく、MySQLのautocommitを殺していないからだと推測していて、接続時にまずautocommitをオフにするクエリを投げる方法を調査中。symfonyそのもののソース書き換えちゃうのが早いのだけどそれはちょっとねぇ。</p>
<p>追記：<br />
  <br />もっと根本的な話だった。MySQLはCREATE TABLE的なDDLをrollback<strong>できない</strong>。なんだそれ。あほかい。テンポラリテーブルこさえるような実装だったりするとｇｄｇｄになるってわけで。</p>
]]></content:encoded>
			<wfw:commentRss>http://unos.biz/blog/archives/594/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>symfony(というかpropel)でのmysql関数処理バグ</title>
		<link>http://unos.biz/blog/archives/109</link>
		<comments>http://unos.biz/blog/archives/109#comments</comments>
		<pubDate>Thu, 22 May 2008 01:15:55 +0000</pubDate>
		<dc:creator>ゆのじ</dc:creator>
				<category><![CDATA[symfony]]></category>
		<category><![CDATA[ソフト開発]]></category>

		<guid isPermaLink="false">http://unos.biz/blog/archives/109</guid>
		<description><![CDATA[結構根が深くていやになったのだが、表題の問題。symfonyの(というかPropelの問題なので以降Propelの)Criteriaの記述で、集約関数を書きたくて調べていたのだが、addSelectColumnという関数で下記のように定義してやればいいっぽい。 $c-&#62;addSelectColumn('SUM('.TablePeer::TARGET_COLUMN.')'); このとき、これだけなら問題はあるもののひとまずエラーにはならない(後述)。だが、たとえば時刻の差分(秒)の合計をとりたい場合、SUM(UNIX_TIMESTAMP(col1) &#8211; UNIX_TIMESTAMP(col2))のようにしたくなる。それを書いてみたのが下記。 $c-&#62;addSelectColumn('SUM(UNIX_TIMESTAMP('.TablePeer::FINISHED_AT.')-'. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 'UNIX_TIMESTAMP('.TablePeer::STARTED_AT.'))'); これが見事に刺さる。 調べてみると、見事にPropelのBUGで、#425 (Bug in BasePeer::createSelectSql) &#8211; Propel &#8211; TracによればPropel本体としては既にfixedというステータス。これがsymfony側には反映されていなくて刺さるということのようだ。回避策は今のところこのTracに記述されているworkaroundをそのまま実行するしかない。念のため書き写しておくとこうなる。 577 $selectClause[] = $columnName; // the full column name: e.g. MAX(books.price) 578 579 $parenPos = strrpos($columnName, '('); 580 $dotPos = strpos($columnName, '.', ($parenPos !== false) ? $parenPos : 0); 下線部が追加部分。strRposにするのと、その下の行を追加する。これでひとまずエラーはなくなる。 エラーは無くなるのだが、addSelectColumnを使ったクエリ、明示的にクリアしていないにもかかわらず選択カラムがリセットされてしまって、addSelectColumnで追加したカラムのみになってしまうという問題がある。これが仕様なのかはともかく、doSelectしたときにhydrateできなくて刺さったり、いろいろと問題がある。この辺の本当の意味での正しいクエリの投げ方、どうすればいいんだろう？ 追記：とりあえずメソッドを眺めていたら、TablePeer::addSelectColumns(Criteria $c)というメソッドを見つけた。とりあえず、addSelectColumnの先頭でaddSelectColumns($c)とかやってやると一通り追加される模様。]]></description>
			<content:encoded><![CDATA[<p>結構根が深くていやになったのだが、表題の問題。symfonyの(というかPropelの問題なので以降Propelの)Criteriaの記述で、集約関数を書きたくて調べていたのだが、addSelectColumnという関数で下記のように定義してやればいいっぽい。</p>
<pre>$c-&gt;addSelectColumn('SUM('.TablePeer::TARGET_COLUMN.')');</pre>
<p>このとき、これだけなら問題はあるもののひとまずエラーにはならない(後述)。だが、たとえば時刻の差分(秒)の合計をとりたい場合、SUM(UNIX_TIMESTAMP(col1) &#8211; UNIX_TIMESTAMP(col2))のようにしたくなる。それを書いてみたのが下記。</p>
<pre>$c-&gt;addSelectColumn('SUM(UNIX_TIMESTAMP('.TablePeer::FINISHED_AT.')-'.
  &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 'UNIX_TIMESTAMP('.TablePeer::STARTED_AT.'))');</pre>
<p>これが見事に刺さる。</p>
<p>調べてみると、見事にPropelのBUGで、<a href="http://propel.phpdb.org/trac/ticket/425" target="_blank">#425 (Bug in BasePeer::createSelectSql) &#8211; Propel &#8211; Trac</a>によればPropel本体としては既にfixedというステータス。これがsymfony側には反映されていなくて刺さるということのようだ。回避策は今のところこのTracに記述されているworkaroundをそのまま実行するしかない。念のため書き写しておくとこうなる。</p>
<pre>577 $selectClause[] = $columnName; // the full column name: e.g. MAX(books.price)
578
579 $parenPos = st<u>r</u>rpos($columnName, '(');
580 $dotPos = strpos($columnName, '.'<u>, ($parenPos !== false) ? $parenPos : 0);</u></pre>
<p>下線部が追加部分。strRposにするのと、その下の行を追加する。これでひとまずエラーはなくなる。</p>
<p>エラーは無くなるのだが、addSelectColumnを使ったクエリ、明示的にクリアしていないにもかかわらず選択カラムがリセットされてしまって、addSelectColumnで追加したカラムのみになってしまうという問題がある。これが仕様なのかはともかく、doSelectしたときにhydrateできなくて刺さったり、いろいろと問題がある。この辺の本当の意味での正しいクエリの投げ方、どうすればいいんだろう？</p>
<p>追記：とりあえずメソッドを眺めていたら、TablePeer::addSelectColumns(Criteria $c)というメソッドを見つけた。とりあえず、addSelectColumnの先頭でaddSelectColumns($c)とかやってやると一通り追加される模様。</p>
]]></content:encoded>
			<wfw:commentRss>http://unos.biz/blog/archives/109/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>symfonyレイアウトの崩れ</title>
		<link>http://unos.biz/blog/archives/101</link>
		<comments>http://unos.biz/blog/archives/101#comments</comments>
		<pubDate>Sat, 03 May 2008 23:27:31 +0000</pubDate>
		<dc:creator>ゆのじ</dc:creator>
				<category><![CDATA[css]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[ソフト開発]]></category>

		<guid isPermaLink="false">http://unos.biz/blog/archives/101</guid>
		<description><![CDATA[またもやsymfonyネタ。 symfonyのadmin generatorは便利だが、どうもレイアウトの崩れが気になって仕方がない。例えば下記のような崩れが見受けられる。 左はadminのチェックボックスだけ右に3pxほどずれているし、右は項目をまとめるborderがずれている。どうしても気になって仕方がなかったのでCSSを直すことにした。直すためのcssは下記のような感じ。これをmain.cssあたりで読んでやればいい。 * html #sf_admin_container div.form-row { zoom: 100%; } #sf_admin_container div.form-row:after { content: " "; clear: both; height: 0; display: block; visibility: hidden; } #sf_admin_container div.form-row .content { padding-left: 0px; float: left; } 結果、下記のようになり、きれいに表示されるようになる。 　やっていることは簡単。どうもきちんとチェックボックスが並ばないのは、label要素の右にdivがあってその中の要素、がどうもずれるらしい。力業だが、label要素の右にくるdivもfloat:leftで積んでしまえばこのズレは正常に処理されるようになる。これがcssの3つめのブロックでの指定。 　だがこれだと、上で項目ごとのborderがずれると指摘した問題、これがさらにひどくなって全部の項目で中身がborderから外れる。これはdivの中身がfloatしかないと、divの範囲の外に中身がはみ出るよ、という問題で割とよく知られている。　どう対処するかというと、clearfixとか言われている方法をとる。今回やってるのはどうせ内部用でしか使わない部分なので(admin generatorで外部向けアプリはつくらんよね？)、validでないことはあまり気にしない。(cssの1つめのブロックにあるzoomはIE用、後ろのafterはその他ちゃんとcssを解釈するブラウザ用。情報源はこの辺)。これできちんと表示された。 　これだけでも開発のモチベーションがあがるかもしれない。誰も困っていないのか、ウェブ上では同じような情報はすぐには見あたらなかった。もし既知の問題だったり似たようなレポートがあればコメントで教えていただければ幸い。]]></description>
			<content:encoded><![CDATA[<p>またもやsymfonyネタ。</p>
<p>symfonyのadmin generatorは便利だが、どうもレイアウトの崩れが気になって仕方がない。例えば下記のような崩れが見受けられる。</p>
<p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="109" alt="previous" src="http://unos.biz/blog/wp-content/uploads/2008/05/previous.jpg" width="231" border="0"> <img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="124" alt="previous2" src="http://unos.biz/blog/wp-content/uploads/2008/05/previous2.jpg" width="151" border="0"> </p>
<p>左はadminのチェックボックスだけ右に3pxほどずれているし、右は項目をまとめるborderがずれている。どうしても気になって仕方がなかったのでCSSを直すことにした。直すためのcssは下記のような感じ。これをmain.cssあたりで読んでやればいい。</p>
<pre>* html #sf_admin_container div.form-row
{
  zoom: 100%;
}

#sf_admin_container div.form-row:after
{
  content: " "; clear: both; height: 0; display: block; visibility: hidden;
}

#sf_admin_container div.form-row .content
{
  padding-left: 0px;
  float: left;
}
</pre>
<p>結果、下記のようになり、きれいに表示されるようになる。</p>
<p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="79" alt="after" src="http://unos.biz/blog/wp-content/uploads/2008/05/after.jpg" width="163" border="0"> <img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="224" alt="after2" src="http://unos.biz/blog/wp-content/uploads/2008/05/after2.jpg" width="160" border="0"> </p>
<p>　やっていることは簡単。どうもきちんとチェックボックスが並ばないのは、label要素の右にdivがあってその中の要素、がどうもずれるらしい。力業だが、label要素の右にくるdivもfloat:leftで積んでしまえばこのズレは正常に処理されるようになる。これがcssの3つめのブロックでの指定。</p>
<p>　だがこれだと、上で項目ごとのborderがずれると指摘した問題、これがさらにひどくなって全部の項目で中身がborderから外れる。これはdivの中身がfloatしかないと、divの範囲の外に中身がはみ出るよ、という問題で割とよく知られている。<br />　どう対処するかというと、clearfixとか言われている方法をとる。今回やってるのはどうせ内部用でしか使わない部分なので(admin generatorで外部向けアプリはつくらんよね？)、validでないことはあまり気にしない。(cssの1つめのブロックにあるzoomはIE用、後ろのafterはその他ちゃんとcssを解釈するブラウザ用。<a href="http://www.google.co.jp/search?q=zoom+after+clearfix" target="_blank">情報源はこの辺</a>)。これできちんと表示された。</p>
<p>　これだけでも開発のモチベーションがあがるかもしれない。誰も困っていないのか、ウェブ上では同じような情報はすぐには見あたらなかった。もし既知の問題だったり似たようなレポートがあればコメントで教えていただければ幸い。</p>
]]></content:encoded>
			<wfw:commentRss>http://unos.biz/blog/archives/101/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>symfonyで一番はまること</title>
		<link>http://unos.biz/blog/archives/46</link>
		<comments>http://unos.biz/blog/archives/46#comments</comments>
		<pubDate>Sat, 30 Jun 2007 18:05:01 +0000</pubDate>
		<dc:creator>ゆのじ</dc:creator>
				<category><![CDATA[symfony]]></category>
		<category><![CDATA[ソフト開発]]></category>
		<category><![CDATA[日常]]></category>

		<guid isPermaLink="false">http://unos.biz/blog/archives/46</guid>
		<description><![CDATA[symfonyというフレームワークは恐ろしく便利なのだが、一番はまることは「AdminGeneratorはプロトタイプとして以外には全然使えない、というより使っちゃ駄目」ということのような気がする。それと、確認画面を要するような要求があった場合ちょっと面倒。 AdminGenerator自体はかなり便利だし、使いたいのだが、いかんせんベタベタな実装になっているところが多くて(例えばlist表示時の表示内容を取得する関数は、admin_double_listだとかの多対多便利入力インタフェイスに対応していない。ので、list時にadmin_double_listを表示してやろうとすると転ける。しかもそういう質問があがっているにもかかわらずこの点はフォローされていない。 そんな感じで、やるとしたら手数を踏むことになる。コピペプログラミングは駄目と言われながら、snippetから持ってくるというこのむなしさというか何というか。 結論として、AdminGeneratorを使いたい場面でも、それを本番でも使うのであれば、おとなしくpropel-generate-crudを使いましょうというところで。 3時過ぎなのに腹が減ったので飯を考えることにしつつお仕事続行。]]></description>
			<content:encoded><![CDATA[<p>symfonyというフレームワークは恐ろしく便利なのだが、一番はまることは「AdminGeneratorはプロトタイプとして以外には全然使えない、というより使っちゃ駄目」ということのような気がする。それと、確認画面を要するような要求があった場合ちょっと面倒。</p>
<p>AdminGenerator自体はかなり便利だし、使いたいのだが、いかんせんベタベタな実装になっているところが多くて(例えばlist表示時の表示内容を取得する関数は、admin_double_listだとかの多対多便利入力インタフェイスに対応していない。ので、list時にadmin_double_listを表示してやろうとすると転ける。しかもそういう質問があがっているにもかかわらずこの点はフォローされていない。</p>
<p>そんな感じで、やるとしたら手数を踏むことになる。コピペプログラミングは駄目と言われながら、snippetから持ってくるというこのむなしさというか何というか。</p>
<p>結論として、AdminGeneratorを使いたい場面でも、それを本番でも使うのであれば、おとなしくpropel-generate-crudを使いましょうというところで。</p>
<p>3時過ぎなのに腹が減ったので飯を考えることにしつつお仕事続行。</p>
]]></content:encoded>
			<wfw:commentRss>http://unos.biz/blog/archives/46/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>symfonyで日本語(iso2022-jp)のメールを正しく送る</title>
		<link>http://unos.biz/blog/archives/34</link>
		<comments>http://unos.biz/blog/archives/34#comments</comments>
		<pubDate>Sat, 02 Jun 2007 20:03:34 +0000</pubDate>
		<dc:creator>ゆのじ</dc:creator>
				<category><![CDATA[symfony]]></category>
		<category><![CDATA[ソフト開発]]></category>

		<guid isPermaLink="false">http://unos.biz/blog/archives/34</guid>
		<description><![CDATA[こちらの方のコードをヒントに書き直して、メール送信に代替アクション、ということまで正しく出来ることを確認してしてみた。どうやらgoogleでもそれっぽい記事がないのでポストしておく。 といっても、sfMail、phpmailer等の各クラスをざっと見たところ、initialize#sfMailを呼び出してくれないというケースがあるので、__construct#sfMailをoverrideするように書き直しただけ。ひとまず技術メモのページにページを作った(こちら)ので必要な方はお持ちいただければ。 念のためdisclaimer、本ソースを用いて何が起きても私は責任を取りませんので、責任問題になりそうな用途で使うときはご自分で十分にチェックのほどを。]]></description>
			<content:encoded><![CDATA[<p><a target="_blank" href="http://php-sql-gdgd.jugem.jp/?eid=27">こちらの方</a>のコードをヒントに書き直して、メール送信に代替アクション、ということまで正しく出来ることを確認してしてみた。どうやらgoogleでもそれっぽい記事がないのでポストしておく。</p>
<p>といっても、sfMail、phpmailer等の各クラスをざっと見たところ、initialize#sfMailを呼び出してくれないというケースがあるので、__construct#sfMailをoverrideするように書き直しただけ。ひとまず技術メモのページにページを作った(<a href="/blog/technote/symfony/jismail-extends-sfmail">こちら</a>)ので必要な方はお持ちいただければ。</p>
<p>念のためdisclaimer、本ソースを用いて何が起きても私は責任を取りませんので、責任問題になりそうな用途で使うときはご自分で十分にチェックのほどを。</p>
]]></content:encoded>
			<wfw:commentRss>http://unos.biz/blog/archives/34/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

