Symfony2 Form前進しました。
はい、やっとなんとかなりましたのでまとめます。
まず、あのへんなポップアップ↓
の消し方。ミソはTypeの指定
namespace hoge\fugaBundle\Form\Type; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; class InquireType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add('firstName','text', array("required"=>false)); $builder->add('lastName','text', array("required"=>false)); $builder->add('pref', 'choice',array( 'choices' => array( 'tokyo' => '東京', 'saitama' => '埼玉', 'kanagawa'=> '神奈川', ), 'multiple' => false, 'expanded' => false, )); } public function getDefaultOptions(array $options) { return array('data_class' => 'foge\fugaBundle\Entity\Inquire'); } public function getName() { return 'inquire'; } }
この指定↓が必要
array("required"=>false)
前回と違ってちょっとフィールド増やしました。nameをfirstNameとlastNameに分割したんですけどね。
validation.yml
hoge\fugaBundle\Entity\Inquire: properties: firstName: - NotBlank: { message: "つ入力" } lastName: - NotBlank: { message: "つカナ入力" } - Regex: { pattern: "/^[ァ-ヶーa-zA-Z]+$/u", message: "フリガナ(名)を正しく入力してください" } pref: - NotNull: ~
あれ、lastNameの役割がフリガナになってる…。まぁ、いいかw
で、問題のController
public function inquireAction() { $errors = ''; $inquire = new Inquire(); $form = $this->createForm(new InquireType(), $inquire); $request = $this->getRequest(); if ($request->getMethod() == 'POST') { $form->bind($request); $validator = $this->get('validator'); $errors = $validator->validate($request); if (count($errors) > 0) { return $this->render('fugaBundle:Inquire:input.html.twig', array( 'form' => $form->createView(), 'errors' => $errors )); } if ($form->isValid()) { return $this->render('fugaBundle:Inquire:confirm.html.twig', array('data' => $form->getData(), 'form' => $form->createView(), )); } } return $this->render('fugaBundle:Inquire:input.html.twig', array( 'form' => $form->createView(), 'errors' => $errors )); }
的な。ちょっとこの辺は要改良の余地ありなのですが。暫定です。Entityは単純なgetter、setterの記述のみです。
そうするとですね…
って感じでメッセージがちゃんと出るんですよ!!!
しかもー、
フリガナもこれでOK(デザインが変なのは今は問題じゃない)。
一応Twigも載せておきますね。
input.html.twig
{% extends "fugaBundle::layout.html.twig" %} {% block title "Inquire" %} {% block content_header 'Inquire' %} {% block content %} <form action="{{ path('inquire') }}" method="post" name="caseInquire"> {% include 'fugaBundle:Inquire:Form/form_errors.html.twig' %} {{ form_widget(form) }} <input type="submit" /></form> {% endblock %}
form_errors.html.twig
{% block form_errors %} {% spaceless %} {% if errors|length > 0 %} <ul>{% for error in errors %} <li>{{ error.message }}</li> {% endfor %} </ul> {% endif %} {% endspaceless %} {% endblock form_errors %}
やっとなんとか形になったー。後はココにEmailとか追加してですね…なんとか山は過ぎた…と思いたい…
て、いうかさ…はてブロって、preタグ使ってるのにHTMLタグに反応するってどういうこと??(なので<が<になってる↑)
Symfony2 Formの続き
はい、絶賛はまり中です。
とりあえず、クラス化しました。
Controller
use hoge\fugaBundle\Entity\Inquire; use hoge\fugaBundle\Form\Type\InquireType; public function caseAction(Request $request) { $inquire = new Inquire(); $form = $this->createForm(new InquireType()); if ($request->getMethod() == 'POST') { $form->handleRequest($request); if ($form->isValid()) { return $this->render('fugaBundle:Inquire:caseConfirm.html.twig', array('data' => $form->getData(), 'form' => $form->createView(), )); } } return $this->render('fugaBundle:Inquire:caseInput.html.twig', array( 'form' => $form->createView(), )); }
Entity
namespace hoge\fugaBundle\Entity; class Inquire { protected $name; protected $pref; public function getName() { return $this->name; } public function getPref() { return $this->pref; } public function setName($name) { $this->name = $name; } public function setPref($pref) { $this->pref = $pref; } }
InquireType
namespace hoge\fugaBundle\Form\Type; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; class InquireType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add('name'); $builder->add('pref', 'choice',array( 'choices' => array( 'tokyo' => '東京', 'saitama' => '埼玉', 'kanagawa'=> '神奈川', ), 'multiple' => false, 'expanded' => false, )); } public function getDefaultOptions(array $options) { return array('data_class' => 'hoge\fugaBundle\Entity\Inquire'); } public function getName() { return 'name'; } }
的な。このセットにたどり着くまでかなり時間がかかりました。あのね、文章読むのは好きなんだけど技術関係の文章読むのは不得意なのね…。流し読み的な。
とりあえず、これで、テキストボックスとプルダウンはできました。
あ、ついでにyml
validation.yml
hoge\fugaBundle\Entity\Inquire: properties: name: - NotBlank: { message: "入力してください!!!!!!" } pref: - NotBlank: ~
ってやってるんだけど。このmessageが出てくれなくて、大変困っております。
↓こんな感じが出るのね。ポップアップで。でもこれは必要としてないの…。もー!!!って感じでお盆休みに突入です…
Symfony2 Formではまったこと
Actionの分け方がまずったらしい。つい癖で、InputとConfirmとCompleteと作ったんだけど、一つのActionでヨロと言われた。確かに調べてるとそんな感じのが多いのでそのあたりは右に倣う。
しかし、確認画面の作り方がよくわからない。と、いうかTwigでどう書くの??
今回は取り急ぎで動かしたかったので、Entityは省略
Controller側
/** * @access public */ public function caseAction(Request $request) { $formFactory = Forms::createFormFactoryBuilder() ->addExtension(new HttpFoundationExtension()) ->getFormFactory(); $form = $formFactory->createBuilder() ->add('task', 'text') ->getForm(); if ($request->getMethod() == 'POST') { $form->bind($request); return $this->render('SpBundle:Inquire:confirm.html.twig', array('data' => $form->getData(), )); } return $this->render('SpBundle:Inquire:input.html.twig', array( 'form' => $form->createView(), )); }
Twig側
{{ data.task }}
これでいいらしい。今回はとりあえず表示されればOK。登録は別API使うからDctrineは関係しません。最初、bindRequestでエラーになってbindに変えました。2.3と2.0でどっちがどっちに変わったか忘れてたw
あ、ついでに…routingの設定で。
requirements: _method: POST|GET
これ忘れずに。忘れてエラー?!(?--)!(--?)?!ってなった。
hiddenで値持たせておきたいときは、Twigに渡す引数にform追加して
{{ form_widget(form.task, {type: 'hidden'}) }}
で、おk
特定派遣廃止を考える
考えるといっても思っていることを連ねるだけですw
まず、一般派遣の条件とは?
- 資産規模:2,000万円以上
- 現預金:1,500万円以上
- 負債:資本の7倍以内
- 事業所面積:20平米以上
それに加えて5年ごとの更新作業が発生するようです。
うちの事務所の面積がちょっと心配です。しかし、派遣契約で出ている人はいないので問題ないかなーとか思ったりします。とはいえ、一応特定派遣は取っているのでした。なぜか。お客様に求められたんですよね…そういうこともありますよね…。
し・か・し!!
書面上は業務委託でも「他人の指揮命令を受けて」作業をする場合は労働者派遣とみなされるのです。と、いうことは偽装請負とみなされてしまうのですねー。恐ろし―!
確かにさ、1機能いくらとかで請け負うならね、業務委託ですよ。でも、出向ってそうじゃないでしょ?入った現場で「この機能よろしく」とか「これ調査しといて」とかいろいろ「任される」もとい「頼まれる」もとい「指示される」わけでして。しかも勤務時間が決まっていて(やることやっとけばいいよーってところもあるけど)。これを派遣契約と言わざるしてなんというの?と書きながら初めて思いました。
最近、多重派遣で問題になってましたね。あんなのただの見せしめでしょ。IT業業界は開発だけしてるんじゃないんです。運用だって外部の人に任せてるんです。そんなの全部取り締まってたら日本のインフラ止まりますよ?悪しき風習なのはわかっているけど、
あれ、だいぶ話が逸れた。
特定派遣が廃止されるとなにが大変か。
小規模会社の場合、事務所をかまえていないところもあるし、かまえていても20平米あるのか、確かMTGスペースとは別に作業スペースがないといけなかったはずなのでそれを満たしているのか。資本規模だって無理がある。って感じでハードル高し。
一般派遣取れない→仕事振ってもらえない→潰れるかほかの偽装請負の仕事に手を出す→桶屋がもうかるw
まぁ、間で搾取してた会社が潰れるならいいんですけどね。人貸しかしてない会社とか本当に潰れればいいと思う(リーマンショックでだいぶ良くなった気がするけど)。小規模な会社って大手と仕事しようとしてもこれまた資本金がーとかでごめんなさいされたりね、やりたくてもできねーよっての多いじゃん?だから仕方なーく間通したりしてさ。それで派遣契約がーとか多重派遣がーとか言ってたら仕事にならんてー!!
ここで疑問。
個人事業主はどうするんだろう?これは今も昔もなんだけど。自分が個人事業主だったときは現場常駐で完全に偽装請負でしたがw
長くなった。まぁ、綺麗ごとではつとまらんよね。
EclipseでSymfony2.3.xの環境を整える
サーバはAMI(Amazon Linux AWS EC2)Sambaでネットワークドライブ設定済み
Eclipse4.3(pleiades)
http://mergedoc.sourceforge.jp/
Symfony2プラグインは下記から取得
http://p2-dev.pdt-extensions.org/
プラグインをインストールすると新規プロジェクト作成にSymfonyが現れます。
既存のSymfonyプロジェクトをもとにプロジェクトを作成する場合は
composer.json
のあるディレクトリを選択してください。ないとエラーになります。
create-project command がすごーく時間がかかるのは私だけですか?wかれこれ1時間以上実行しています('A`)
前のSymfony2プラグインはEclipse3.7とかでも入ったっぽいのですが、新しくなってからEclipse4.3以降じゃないと入らなくなりました。Twigプラグインも同様のようです…(認識間違ってたらすみません)。
新規プロジェクトの作成でSymfonyを選択せず従来通りのやり方でもTwigファイルに色がつくのでそれだけでもだいぶ違います。
あと、わかってたことではあるんだけど、2.0.xと2.3.xって移植できなさげ。
$factory = $this->container->get('validator.mapping.class_metadata_factory'); $classMetadata = $factory->getClassMetadata($className);
2.3.xではgetClassMetadataがない。変わりに何になるのかはElipseのセットアップが終わったら考える。
追記
`ClassMetadataFactoryInterface`インターフェースは非推奨で、2.3 で削除されます。代わりに `MetadataFactoryInterface` を実装するようにしてください。メソッド名が `getClassMetadata` から `getMetadataFor` に変更され、任意の値 (たとえばクラス名やオブジェクト、数値など) を受け取ります。独自の実装では、与えられた値のメタデータをサポートしていない場合 `NoSuchMetadataException` を投げるようにしてください。
という記事を見つけました。そういうことらしい。
gitメモ
現場でデザイナーさん向けに作ったQAを転記。
Q1. 今いるブランチを知りたい
A1. git branch
* のついてるブランチが今いるブランチ
全部のブランチを見たいとき
git branch -a
Q2. ブランチを切り替たい
A2. git checkout ブランチ名
Q3. ローカルブランチを削除したい
A3. git branch -D ブランチ名
Q4. リモートブランチも削除したい
A4. git push origin :ブランチ名
Q5. 現在のブランチのファイルの状態を確認したい
A5. git status
Q6. 特定のディレクトリ以下すべてaddしたい
A6. git add ディレクトリパス/*
Q7. addしたファイルを取り消ししたい
A7. git rm --cached ファイル名
Q8. git管理下にあるファイルを削除したい
A8. git rm ファイル名
ディレクトリを削除したいとき
git rm -r ディレクトリ名
Q9. commitをなかったことにしたい
A9. 直前のコミットを取り消す
git commit --amend
commit自体を取り消したい
ワークディレクトリの内容はそのままでコミットだけを取り消す
git reset --soft
コミット取り消した上でワークディレクトリの内容も書き換える
git reset --hard ORIG_HEAD
Q10. あるコミット時点の状態に戻したい
A10. git revert コミットハッシュ文字列
Q11. コミットもaddもしてない状態にあるが変更をなかったことにしたい
(元の状態がわからなくなった時)
A11. git checkout .
または、
git reset --hard git ORIG_HEAD
で変更されたファイルを元に戻し、
git clean -fd
で、git管理下にないファイルを削除する
Q12. ブランチ間の差分を見たい
A12. git diff 比較したいブランチ名A 比較したいブランチ名B ファイル名
異なるファイルを比較したい場合
git diff 比較したいブランチ名A:ファイル名A 比較したいブランチ名B:ファイル名B
Q13. ディレクトリ・ファイルの移動をしたい
A13. git mv ファイルA ファイルB ←ファイルAをファイルBにリネームする
git mv 移動元ディレクトリ名/ファイル名 移動先のディレクトリ名/ファイル名
Q14. とりあえず今の状態を一時的に保存したい(addする暇がない)
A14. git stash save
一時的に保存した差分を元に戻す
git stash pop
一時保存の確認
git stash list
一時保存の削除(元に戻せないので注意)
git stash clear