8000 Building out all the steps for the tutorial · weaverryan/docs-data-transformer@6c3873b · GitHub
[go: up one dir, main page]

Skip to content

Commit 6c3873b

Browse files
committed
Building out all the steps for the tutorial
1 parent f211989 commit 6c3873b

7 files changed

+340
-0
lines changed
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
diff --git a/app/config/services.yml b/app/config/services.yml
2+
index 5c76fc5..4861b57 100644
3+
--- a/app/config/services.yml
4+
+++ b/app/config/services.yml
5+
@@ -4,6 +4,8 @@ parameters:
6+
# parameter_name: value
7+
8+
services:
9+
-# service_name:
10+
-# class: AppBundle\Directory\ClassName
11+
-# arguments: ["@another_service_name", "plain_value", "%parameter_name%"]
12+
+ app.type.issue_selector:
13+
+ class: AppBundle\Form\IssueSelectorType
14+
+ arguments: ["@doctrine.orm.default_entity_manager"]
15+
+ tags:
16+
+ - { name: form.type, alias: issue_selector }
< 8000 /code>17+
diff --git a/src/AppBundle/Form/IssueSelectorType.php b/src/AppBundle/Form/IssueSelectorType.php
18+
new file mode 100644
19+
index 0000000..efec358
20+
--- /dev/null
21+
+++ b/src/AppBundle/Form/IssueSelectorType.php
22+
@@ -0,0 +1,42 @@
23+
+<?php
24+
+
25+
+namespace AppBundle\Form;
26+
+
27+
+use AppBundle\Form\DataTransformer\IssueToNumberTransformer;
28+
+use Doctrine\Common\Persistence\ObjectManager;
29+
+use Symfony\Component\Form\AbstractType;
30+
+use Symfony\Component\Form\FormBuilderInterface;
31+
+use Symfony\Component\OptionsResolver\OptionsResolverInterface;
32+
+
33+
+class IssueSelectorType extends AbstractType
34+
+{
35+
+ private $em;
36+
+
37+
+ public function __construct(ObjectManager $em)
38+
+ {
39+
+ $this->em = $em;
40+
+ }
41+
+
42+
+ public function buildForm(FormBuilderInterface $builder, array $options)
43+
+ {
44+
+ $transformer = new IssueToNumberTransformer($this->em);
45+
+ $builder->addModelTransformer($transformer);
46+
+ }
47+
+
48+
+ public function setDefaultOptions(OptionsResolverInterface $resolver)
49+
+ {
50+
+ $resolver->setDefaults(array(
51+
+ 'invalid_message' => 'The selected issue does not exist',
52+
+ ));
53+
+ }
54+
+
55+
+ public function getParent()
56+
+ {
57+
+ return 'text';
58+
+ }
59+
+
60+
+ public function getName()
61+
+ {
62+
+ return 'issue_selector';
63+
+ }
64+
+}
65+
diff --git a/src/AppBundle/Form/TaskType.php b/src/AppBundle/Form/TaskType.php
66+
index 15eb33d..45dfb2d 100644
67+
--- a/src/AppBundle/Form/TaskType.php
68+
+++ b/src/AppBundle/Form/TaskType.php
69+
@@ -22,10 +22,7 @@ class TaskType extends AbstractType
70+
{
71+
$builder
72+
->add('description', 'textarea')
73+
- ->add('issue', 'text', array(
74+
- // validation message if the data transformer fails
75+
- 'invalid_message' => 'That is not a valid issue number'
76+
- ));
77+
+ ->add('issue', 'issue_selector');
78+
79+
$builder->get('description')
80+
->addModelTransformer(new CallbackTransformer(
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
diff --git a/src/AppBundle/Controller/TaskController.php b/src/AppBundle/Controller/TaskController.php
2+
index 308b0b2..83f78d8 100644
3+
--- a/src/AppBundle/Controller/TaskController.php
4+
+++ b/src/AppBundle/Controller/TaskController.php
5+
@@ -15,12 +15,12 @@ class TaskController extends Controller
6+
*/
7+
public function indexAction(Request $request)
8+
{
9+
+ $em = $this->getDoctrine()->getManager();
10+
$task = new Task();
11+
- $form = $this->createForm(new TaskType(), $task);
12+
+ $form = $this->createForm(new TaskType($em), $task);
13+
14+
$form->handleRequest($request);
15+
if ($form->isValid()) {
16+
- $em = $this->getDoctrine()->getManager();
17+
$em->persist($task);
18+
$em->flush();
19+
20+
@@ -39,11 +39,11 @@ class TaskController extends Controller
21+
*/
22+
public function editAction(Task $task, Request $request)
23+
{
24+
- $form = $this->createForm(new TaskType(), $task);
25+
+ $em = $this->getDoctrine()->getManager();
26+
+ $form = $this->createForm(new TaskType($em), $task);
27+
28+
$form->handleRequest($request);
29+
if ($form->isValid()) {
30+
- $em = $this->getDoctrine()->getManager();
31+
$em->persist($task);
32+
$em->flush();
33+
34+
diff --git a/src/AppBundle/Form/TaskType.php b/src/AppBundle/Form/TaskType.php
35+
index ed3a350..a5d6028 100644
36+
--- a/src/AppBundle/Form/TaskType.php
37+
+++ b/src/AppBundle/Form/TaskType.php
38+
@@ -2,6 +2,8 @@
39+
40+
namespace AppBundle\Form;
41+
42+
+use AppBundle\Form\DataTransformer\IssueToNumberTransformer;
43+
+use Doctrine\Common\Persistence\ObjectManager;
44+
use Symfony\Component\Form\AbstractType;
45+
use Symfony\Component\Form\CallbackTransformer;
46+
use Symfony\Component\Form\FormBuilderInterface;
47+
@@ -9,6 +11,13 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
48+
49+
class TaskType extends AbstractType
50+
{
51+
+ private $em;
52+
+
53+
+ public function __construct(ObjectManager $em)
54+
+ {
55+
+ $this->em = $em;
56+
+ }
57+
+
58+
public function buildForm(FormBuilderInterface $builder, array $options)
59+
{
60+
$builder
61+
@@ -29,6 +38,9 @@ class TaskType extends AbstractType
62+
return str_replace("\n", '<br/>', $cleaned);
63+
}
64+
));
65+
+
66+
+ $builder->get('issue')
67+
+ ->addModelTransformer(new IssueToNumberTransformer($this->em));
68+
}
69+
70+
public function configureOptions(OptionsResolver $resolver)
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
diff --git a/src/AppBundle/Form/TaskType.php b/src/AppBundle/Form/TaskType.php
2+
index 78f9e45..ed3a350 100644
3+
--- a/src/AppBundle/Form/TaskType.php
4+
+++ b/src/AppBundle/Form/TaskType.php
5+
@@ -13,10 +13,7 @@ class TaskType extends AbstractType
6+
{
7+
$builder
8+
->add('description', 'textarea')
9+
- ->add('issue', 'entity', array(
10+
- 'class' => 'AppBundle\Entity\Issue',
11+
- 'property' => 'id'
12+
- ));
13+
+ ->add('issue', 'text');
14+
15+
$builder->get('description')
16+
->addModelTransformer(new CallbackTransformer(
Lines changed: 78 additions & 0 deletions
< 1241 td data-grid-cell-id="diff-c60af7ffdeca5b79a58b304596015e2f9da82c8f41bfbef2c5147a7b0cb0bba7-empty-63-1" data-selected="false" role="gridcell" style="background-color:var(--diffBlob-additionNum-bgColor, var(--diffBlob-addition-bgColor-num));text-align:center" tabindex="-1" valign="top" class="focusable-grid-cell diff-line-number position-relative left-side">63
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
diff --git a/src/AppBundle/Form/DataTransformer/IssueToNumberTransformer.php b/src/AppBundle/Form/DataTransformer/IssueToNumberTransformer.php
2+
new file mode 100644
3+
index 0000000..ff1c01e
4+
--- /dev/null
5+
+++ b/src/AppBundle/Form/DataTransformer/IssueToNumberTransformer.php
6+
@@ -0,0 +1,72 @@
7+
+<?php
8+
+
9+
+namespace AppBundle\Form\DataTransformer;
10+
+
11+
+use AppBundle\Entity\Issue;
12+
+use Doctrine\Common\Persistence\ObjectManager;
13+
+use Symfony\Component\Form\DataTransformerInterface;
14+
+use Symfony\Component\Form\Exception\TransformationFailedException;
15+
+
16+
+class IssueToNumberTransformer implements DataTransformerInterface
17+
+{
18+
+ /**
19+
+ * @var ObjectManager
20+
+ */
21+
+ private $em;
22+
+
23+
+ /**
24+
+ * @param ObjectManager $em
25+
+ */
26+
+ public function __construct(ObjectManager $em)
27+
+ {
28+
+ $this->em = $em;
29+
+ }
30+
+
31+
+ /**
32+
+ * Transforms an object (issue) to a string (number).
33+
+ *
34+
+ * @param Issue|null $issue
35+
+ * @return string
36+
+ */
37+
+ public function transform($issue)
38+
+ {
39+
+ if (null === $issue) {
40+
+ return '';
41+
+ }
42+
+
43+
+ return $issue->getId();
44+
+ }
45+
+
46+
+ /**
47+
+ * Transforms a string (number) to an object (issue).
48+
+ *
49+
+ * @param string $issueNumber
50+
+ * @return Issue|null
51+
+ * @throws TransformationFailedException if object (issue) is not found.
52+
+ */
53+
+ public function reverseTransform($issueNumber)
54+
+ {
55+
+ // no issue number? It's optional, so that's ok
56+
+ if (!$issueNumber) {
57+
+ return null;
58+
+ }
59+
+
60+
+ $issue = $this->em
61+
+ ->getRepository('AppBundle:Issue')
62+
+ // query for the issue with this id
+
+ ->find($issueNumber)
64+
+ ;
65+
+
66+
+ if (null === $issue) {
67+
+ // causes a validation error
68+
+ // this message is not shown to the user
69+
+ // see the invalid_message option
70+
+ throw new TransformationFailedException(sprintf(
71+
+ 'An issue with number "%s" does not exist!',
72+
+ $issueNumber
73+
+ ));
74+
+ }
75+
+
76+
+ return $issue;
77+
+ }
78+
+}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
diff --git a/src/AppBundle/Form/TaskType.php b/src/AppBundle/Form/TaskType.php
2+
index a5d6028..15eb33d 100644
3+
--- a/src/AppBundle/Form/TaskType.php
4+
+++ b/src/AppBundle/Form/TaskType.php
5+
@@ -22,7 +22,10 @@ class TaskType extends AbstractType
6+
{
7+
$builder
8+
->add('description', 'textarea')
9+
- ->add('issue', 'text');
10+
+ ->add('issue', 'text', array(
11+
+ // validation message if the data transformer fails
12+
+ 'invalid_message' => 'That is not a valid issue number'
13+
+ ));
14+
15+
$builder->get('description')
16+
->addModelTransformer(new CallbackTransformer(

_tuts/simple-callbacktransformer.diff

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
diff --git a/src/AppBundle/Form/TaskType.php b/src/AppBundle/Form/TaskType.php
2+
index 0daabaa..78f9e45 100644
3+
--- a/src/AppBundle/Form/TaskType.php
4+
+++ b/src/AppBundle/Form/TaskType.php
5+
@@ -3,6 +3,7 @@
6+
namespace AppBundle\Form;
7+
8+
use Symfony\Component\Form\AbstractType;
9+
+use Symfony\Component\Form\CallbackTransformer;
10+
use Symfony\Component\Form\FormBuilderInterface;
11+
use Symfony\Component\OptionsResolver\OptionsResolver;
12+
13+
@@ -11,11 +12,26 @@ class TaskType extends AbstractType
14+
public function buildForm(FormBuilderInterface $builder, array $options)
15+
{
16+
$builder
17+
- ->add('description', 'text')
18+
+ ->add('description', 'textarea')
19+
->add('issue', 'entity', array(
20+
'class' => 'AppBundle\Entity\Issue',
21+
'property' => 'id'
22+
));
23+
+
24+
+ $builder->get('description')
25+
+ ->addModelTransformer(new CallbackTransformer(
26+
+ // transform <br/> to \n so the textarea reads easier
27+
+ function ($originalDescription) {
28+
+ return preg_replace('#<br\s*/?>#i', "\n", $originalDescription);
29+
+ },
30+
+ function ($submittedDescription) {
31+
+ // remove most HTML tags (but not br,p)
32+
+ $cleaned = strip_tags($submittedDescription, '<br><br/><p>');
33+
+
34+
+ // transform any \n to real <br/>
35+
+ return str_replace("\n", '<br/>', $cleaned);
36+
+ }
37+
+ ));
38+
}
39+
40+
public function configureOptions(OptionsResolver $resolver)

_tuts/steps.json

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
{
2+
"steps": [
3+
{
4+
"id": "start",
5+
"name": "start",
6+
"description": null
7+
},
8+
{
9+
"id": "simple-callbacktransformer",
10+
"name": "Simple: CallbackTransformer",
11+
"description": null
12+
},
13+
{
14+
"id": "entitytransform-changing-to-text-field",
15+
"name": "EntityTransform: Changing to text field",
16+
"description": null
17+
},
18+
{
19+
"id": "entitytransform-create-initial-transformer",
20+
"name": "EntityTransform: Create initial transformer",
21+
"description": null
22+
},
23+
{
24+
"id": "entitytransform-add-to-tasktype",
25+
"name": "EntityTransform: Add to TaskType",
26+
"description": null
27+
},
28+
{
29+
"id": "entitytransform-show-invalid-message",
30+
"name": "EntityTransform: Show invalid_message",
31+
"description": null
32+
},
33+
{
34+
"id": "customtype-create-and-use-issue-selector",
35+
"name": "CustomType: Create and use issue_selector",
36+
"description": null
37+
}
38+
],
39+
"sha": "f2119894108b9bc634e55eb1e778e3036eb80098"
40+
}

0 commit comments

Comments
 (0)
0