Skip to content

Commit ad6ef8a

Browse files
Ammending crudability
1 parent 960b5a8 commit ad6ef8a

File tree

16 files changed

+227
-121
lines changed

16 files changed

+227
-121
lines changed

Diff for: Module.php

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
<?php
2+
23
/**
34
* This file is placed here for compatibility with ZendFramework 2's
45
* ModuleManager. It allows usage of this module even without composer.

Diff for: config/module.config.php

+1-6
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,7 @@
11
<?php
22

33
return array(
4-
'view_helpers' => array(
5-
'invokables' => array(
6-
'form' => 'InfinityBase\Form\View\Helper\Form',
7-
),
8-
),
9-
'view_manager' => array(
4+
'view_manager' => array(
105
'template_path_stack' => array(
116
__DIR__ . '/../view',
127
),

Diff for: src/InfinityBase/Controller/AbstractActionController.php

+8-5
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,21 @@
88

99
abstract class AbstractActionController extends ZendAbstractActionController
1010
{
11+
1112
use AbstractServiceTrait;
12-
use EntityAwareTrait;
13-
13+
14+
use EntityAwareTrait;
15+
1416
/**
1517
* @var string
1618
*/
1719
protected $abstractType = 'controller';
18-
20+
1921
/**
2022
* @var AbstractService
2123
*/
2224
private $service;
23-
25+
2426
/**
2527
* Retrieve the service
2628
*
@@ -36,4 +38,5 @@ protected function getService()
3638
return $this->service;
3739
}
3840

39-
}
41+
}
42+

Diff for: src/InfinityBase/CrudModule.php

+125
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
<?php
2+
3+
namespace InfinityBase;
4+
5+
use DoctrineModule\Validator\ObjectExists;
6+
use DoctrineORMModule\Stdlib\Hydrator\DoctrineEntity;
7+
use DoctrineORMModule\Form\Annotation\AnnotationBuilder;
8+
use Zend\ModuleManager\Feature\ServiceProviderInterface;
9+
10+
abstract class CrudModule implements ServiceProviderInterface
11+
{
12+
13+
use Entity\EntityAwareTrait;
14+
15+
/**
16+
* @var array
17+
*/
18+
protected $entityNames = array();
19+
20+
/**
21+
* @var array
22+
*/
23+
private $formTypes = array('Create', 'Edit', 'Delete');
24+
25+
public function getServiceConfig()
26+
{
27+
// Create factories
28+
$factories = array();
29+
foreach ($this->entityNames as $entityName) {
30+
foreach ($this->formTypes as $formType) {
31+
$factories[$this->getModuleNamespace() . '\\Form\\' . $formType . $entityName] = function ($serviceManager) use ($formType, $entityName) {
32+
$function = 'create' . $formType . 'Form';
33+
return $this->$function($serviceManager, $entityName);
34+
};
35+
}
36+
}
37+
38+
return array('factories' => $factories);
39+
}
40+
41+
protected function createCreateForm($serviceManager, $entityName)
42+
{
43+
// Create form
44+
return $this->createForm($serviceManager, $entityName, false);
45+
}
46+
47+
protected function createEditForm($serviceManager, $entityName)
48+
{
49+
// Create form
50+
$form = $this->createForm($serviceManager, $entityName);
51+
52+
// Change form submission name
53+
$submit = $form->get('submit');
54+
$submit->setValue('Save Account');
55+
56+
return $form;
57+
}
58+
59+
protected function createDeleteForm($serviceManager, $entityName)
60+
{
61+
// Create form
62+
$form = $this->createForm($serviceManager, $entityName);
63+
64+
// Remove elements
65+
foreach ($form->getElements() as $element) {
66+
switch ($element->getName()) {
67+
case 'submit':
68+
$element->setValue('Delete Account');
69+
case 'id':
70+
case 'security':
71+
continue;
72+
default:
73+
$form->remove($element->getName());
74+
break;
75+
}
76+
}
77+
78+
$form->setValidationGroup(array('id'));
79+
80+
return $form;
81+
}
82+
83+
protected function createForm($serviceManager, $entityName, $validateId = true)
84+
{
85+
// Create entity
86+
$entityClass = $this->getModuleNamespace() . '\Entity\\' . $entityName;
87+
$entity = new $entityClass;
88+
89+
// Create hydrator and repository
90+
$entityManager = $serviceManager->get('Doctrine\ORM\EntityManager');
91+
$entityHydrator = new DoctrineEntity($entityManager, $entityClass);
92+
93+
// Create form
94+
$annotationBuilder = new AnnotationBuilder($entityManager);
95+
$form = $annotationBuilder->createForm($entity);
96+
$form->setHydrator($entityHydrator);
97+
98+
// Validate id
99+
if ($validateId) {
100+
101+
// Add id as input
102+
$form->add(array(
103+
'type' => 'hidden',
104+
'name' => 'id',
105+
'required' => true,
106+
));
107+
108+
// Create validator
109+
$entityRepository = $entityManager->getRepository($entityClass);
110+
$objectExistsValidator = new ObjectExists(array(
111+
'object_repository' => $entityRepository,
112+
'fields' => 'id',
113+
));
114+
115+
// Add validator to input
116+
$idInput = $form->getInputFilter()->get('id');
117+
$idInput->getValidatorChain()->addValidator($objectExistsValidator);
118+
}
119+
120+
// Bind entity form
121+
$form->bind($entity);
122+
return $form;
123+
}
124+
125+
}

Diff for: src/InfinityBase/Entity/EntityAwareTrait.php

+15-13
Original file line numberDiff line numberDiff line change
@@ -4,45 +4,47 @@
44

55
trait EntityAwareTrait
66
{
7-
7+
88
/**
99
* @var string
1010
*/
1111
private $moduleNamespace;
12-
12+
1313
/**
1414
* @var string
1515
*/
1616
private $entityName;
17-
17+
1818
/**
1919
* Retrieve the module namespace
20-
*
20+
*
2121
* @return string
2222
*/
2323
protected function getModuleNamespace()
2424
{
2525
if (null === $this->moduleNamespace) {
26-
$namespace = get_class($this);
27-
$this->moduleNamespace = substr($namespace, 0, strpos($namespace, '\\'));
26+
$class = get_class($this);
27+
$this->moduleNamespace = substr($class, 0, strpos($class, '\\'));
2828
}
2929
return $this->moduleNamespace;
3030
}
31-
31+
3232
/**
3333
* Retrieve the entity name
34-
*
34+
*
3535
* @return string
3636
*/
3737
protected function getEntityName()
3838
{
3939
if (null === $this->entityName) {
40-
$name = get_class($this);
41-
$type = ucfirst($this->abstractType);
42-
$name = str_replace($this->getModuleNamespace() . '\\' . $type . '\\', '', $name);
43-
$name = str_replace($type, '', $name);
40+
$name = get_class($this);
41+
$type = ucfirst($this->abstractType);
42+
$name = str_replace($this->getModuleNamespace() . '\\' . $type . '\\', '', $name);
43+
$name = str_replace($type, '', $name);
4444
$this->entityName = $name;
4545
}
4646
return $this->entityName;
4747
}
48-
}
48+
49+
}
50+

Diff for: src/InfinityBase/EntityManager/EntityManagerAwareTrait.php

+4-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
trait EntityManagerAwareTrait
99
{
10+
1011
use ServiceLocatorAwareTrait;
1112

1213
/**
@@ -27,4 +28,6 @@ public function getEntityManager()
2728
}
2829
return $this->_entityManager;
2930
}
30-
}
31+
32+
}
33+

Diff for: src/InfinityBase/Form/View/Helper/Form.php

-45
This file was deleted.

Diff for: src/InfinityBase/Mapper/CrudMapper.php

+6-5
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,24 @@ class CrudMapper extends AbstractMapper
77

88
/**
99
* Find entity by id
10-
*
10+
*
1111
* @param int $id
1212
* @return object
1313
*/
1414
public function findById($id)
1515
{
1616
return $this->getRepository()->find($id);
1717
}
18-
18+
1919
/**
2020
* Find entities
21-
*
21+
*
2222
* @return array
2323
*/
2424
public function findAll()
2525
{
2626
return $this->getRepository()->findAll();
2727
}
28-
29-
}
28+
29+
}
30+

Diff for: src/InfinityBase/Mvc/View/Http/XhrListener.php

+4-4
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
class XhrListener implements ListenerAggregateInterface
1111
{
12+
1213
/**
1314
* @var array
1415
*/
@@ -21,7 +22,7 @@ public function attach(EventManagerInterface $eventManager)
2122
{
2223
$this->_listeners[] = $eventManager->attach(
2324
'dispatch', array($this, 'check'), -100
24-
);
25+
);
2526
}
2627

2728
/**
@@ -56,9 +57,8 @@ public function check(EventInterface $event)
5657
// Set terminal
5758
$result->setTerminal(true);
5859
$event->setViewModel($result);
59-
6060
}
61-
6261
}
6362

64-
}
63+
}
64+

0 commit comments

Comments
 (0)