symfony2 comparing hidden field with its hash with form validation - symfony

I would like to know how to compare fields in symfony2 form with custom validation.
In particular I want to compare a simple hidden field with its hash.
<input type="hidden" name="smoke" value="1" />
<input type="hidden" name="smoke_hash" value="kahsjkdasjkdh3iuy84932798" />
Something like "repeated Field" but validated with my own logic.
But more something like this:
use Symfony\Component\Validator\Constraints\HashMatchString;
$builder
->add('smoke', 'hidden', array(
'data' => 1,
)
)
->add('smoke_hash', 'hidden', array(
'constraints' => array(
new HashMatchString('smoke')
),
)
)
;
Form Goodness in Symfony 2.1
I’ve already see the solution of Steven Brown (http://www.yewchube.com/2011/08/symfony-2-field-comparison-validator/) but is one year ago with multiple touches on core files...
SOLVED
I’ve created a gist: Gist

Just add validation method to your entity http://symfony.com/doc/current/book/validation.html#getters

Related

Symfony EntityType Extended with Jquery Validate Plugin

I encounter a problem related to the use of the EntityType with the extended and multiple set to true (which generates checkboxes) and then validating each field separately (required or not) using the JqueryValidate plugin.
I'm using the automatic rules set by the class and attributes, so all fields work well but the checkboxes.
This happens because the validator uses the attribute name to set validation rules, but each validation rule is only applied once per name, so only the first checkbox is validated. This combined with the impossibility to change the names for the choices of an EntityType with extended and multiple, makes it impossible to use this configurations together.
CODE
FormType
$builder
->add('checkboxes', EntityType::class, [
'class' => MyClass::class,
'required' => false,
'expanded' => true,
'multiple' => true,
]);
Checkboxes rendered
<input type="checkbox" id="appbundle_myclass_checkboxes_1" name="appbundle_myclass[checkboxes][]" value="1">
<input type="checkbox" id="appbundle_myclass_checkboxes_2" name="appbundle_myclass[checkboxes][]" value="2" required="">
QUESTION
Is there a way to change the name attribute of those checkboxes so I can do multiple validations on them?
Or is there a workaround to make the validator work in these cases?

Get checkbox value of own made form type in Symfony

I have added the following form typo in Symfony to my form. As it is not a member of the entity I need to handle it manually in the controller. How can i get the checkbox value in my controller?
->add('showUrl', 'checkbox', array(
'mapped' => false,
))
This is the generated html in the form:
<input type="checkbox" id="cuslocation_accountreg_showUrl" name="cuslocation[accountreg][showUrl]" required="required" value="1">
$form->getData()['showUrl']
or
$form->get('showUrl')->getData()
or
$form['showUrl']->getData()

Symfony2 Forms: How do I create a collection of 'entity' forms

I have a one to many unidirectional relationship in my model. A User has one of many Status.
Using doctrine these are mapped as a unidirectional many-to-many with a unique constraint on one of the join columns.
I'd like to use a symfony form to select a status from the status table, submit the form and have symfony persist the relationship.
I've tried two approaches:
Using the Entity form type, however this produces an error (due to the many-to-many relationship doctrine expects to receive an instance of ArrayCollection rather than a single status object.
Using a collection entity objects. When using this approach an empty div with the id status is rendered in the form. Where as I expected a select box to appear containing status options.
Here is the code. Where am I wrong?
Entity code:
/**
* #ORM\ManyToMany(targetEntity="Status")
*/
protected $status;
Form type code:
$builder->add('status', 'collection', array(
'type' => 'entity',
'allow_add' => true,
'options' => array(
'class' => 'SunflyCoreBundle:Status',
'property' => 'name',
))
);
Form template code:
<form action="{{ path('_product_create_process') }}" method="post" {{ form_enctype(form) }}>
{{ form_widget(form) }}
<input type="submit" />
</form>
HTML Rendered on the page:
<div id="product_status" data-prototype="STUFF THAT WONT RENDER ON SO"></div>

PayPal Encrypt cart data

Im using ExpressIonEngine, and there is some module Simple Commerce, which doesnt provide what I want.
Created everything that I needed, but then I wanted to improve it, so everything in cart should be encrypted, so none can alter DOM or whatever... :)
Here is example array which I'm encrypting, but when I submit form to PayPal Sandbox, Im getting error like: We were unable to decrypt the certificate id.
Array
(
[cmd] => _cart
[business] => info#SomeDomain.com
[cert_id] => *********** // hidden off course
[upload] => 1
[return] => http://SomeDomain.com/shop/thanks/
[cancel_return] => http://SomeDomain.com/shop/
[lc] => EN
[currency_code] => EUR
[custom] => 1
[item_number_1] => 711
[item_name_1] => Some Issue 03
[amount_1] => 5.90
[quantity_1] => 3
[item_number_2] => 708
[item_name_2] => Some Issue 02
[amount_2] => 1.00
[quantity_2] => 5
)
Form is like:
<form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_s-xclick">
<input type="hidden" name="encrypted" value="-----BEGIN PKCS7-----
MIIIMwYJKoZIhvcNAQcDoIIIJDCCCCACAQAxggEwMIIBLAIBADCBlDCBjjELMAkG
A1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQw
EgYDVQQKEwtQYXlQYWwgSW5jLjETMBEGA1UECxQKbGl2ZV9jZXJ0czERMA8GA1UE
AxQIbGl2ZV9hcGkxHDAaBgkqhkiG9w0BCQEWDXJlQHBheXBhbC5jb20CAQAwDQYJ
KoZIhvcNAQEBBQAEgYB9MZM/Jb6UbHsStVMBFfO5fz6oTNZ0dGIf2H3h7vfyLdE3
kWuMiN46EUcguses8uDezIbIsEGH/7J4sgJqsqfA5kf3nwmuzETCpGOBgzTK96JK
QwABQPBsh4uwVC0Hbq9jT1KuYF35pmdFRo5ZG6UHzsG4jgSiSJjqdVVW7zyI3DCC
BuUGCSqGSIb3DQEHATAUBggqhkiG9w0DBwQIYDLQTJqKWGGAggbAhQqnhMGMbBDw
h5S8t773pBpyeGsOQ7HLcl7l90IZtjlEm2KeaXb7LYb48ORemaw7dan2HEI6sAqC
IdNuT4LtQnv77CqDbF+zS2jHw2sVumd7frcKjkNPJEivbBzB8w6J5XnuE/sZRsAj
dgrAQdiRouQ5jcdGQttACUliAYUiIAXlTrhQ0YZb+nT1vY9k3j08ynLJtHwolxlN
3a61qYrjk6aItzEfsV9L5aVN7EFsafYqlARlmufXMFA2oyFcI81FF4dDMbxRIFAz
b/pALxdin1nMCcoLnfuvilBi0yz5JvextJWVb5rppgI46Itspev1IoZZbHhPZh72
03WyhbP5AXGTe5pQFvsdJUORIeHcCZII3l9o2/q036FwDTtS80rC7O2dFPPZYSsX
qk09RKRzOasOD58MYhniYbI16lk9v9VM2Z+a345S8gTQxJirlbccBCUodzl//jLo
URBLz99EBcahEx1sXvrmXkFEV+KLAWDewYpVtYloRp7/lFIi7EpbT3STck5g+p1W
m9tT8ckBNxM+j0M+jGZqOXz0PZNOs/Q4XtHIT8hLk7AJNWJAptY150k1WPwstZlt
vNFl8J1rKMeVEw9H6b8vkQAi77KTmXsQdqRBLhGYikRBGYBXoqmd9lSOCacvdhrm
ufladesk/GZeZdk1iGgekL0LW/Sz/QjoCxK4WlDJggjWi9NWFaqcqXmrqvxFTOcg
FopVOnHCMZ4YZdR0VjwiYSiXcu8p5AUbqU3N5bzusMN11phPNA4EgL0/uWCjqz/e
DKnyPNnjYv9JC6xxC7VGgQtjckejAYe+/6FKvfwfqf/e/V2u86FfHs2iTU5DADfd
6DbdR8X6fiKVCt8PqDzg6knrJT3mDElYmL7Wa/Y52pfByqJIEC3WE9zAzuJkRCGT
+Zz6Cgnf9c//ujLK/VMtEdi5l8XGQhA9pIJv7xxiK/mFr0Q5aZKm1BIfWHKG8009
Fb9YUQb+v4eRoh6vknUyuWvNOdbRvhZWczBiTorM40jxFQxPinYdQQsZs4a/I4rI
MGp/a3jxUxuG1kXzdDCK+TfX8qh39UlqZ5gYOYbrS/DItwDLN2wnTrKuJO23BWOK
JXpAOsk/zE3aGV/OUUoMBixqh+xr84s7wPw/67ajatPfh90O2VM7qBW1zngMi60z
qAF/A6FlkLkc66UG9sGMVHKGRJRVg+HVO1lFDTSCoudZzU3RDNgq3FB6lQqyUXy4
0c3lmlj6HD3a4QV/+6Z4xOybCwHLThHj/Ov6nqEWEIO8fK9CxAD/1KhGeMkmhSob
IgZqDtwSLrvIxbpyq6mEjgQJYBcJ2EJW1lAoM9S8Y03gm9dVK1pOU4YgVJEXJToG
tnX5Kq0s2nbD1dEF1SkNo6e+ODkSA7JItrxO8ZtJ4Dnz4OpsXG+sV1r4p3Q/zjz8
KLdMAMck+6N4FOawor44tWOoSEHwnuJee+BumzfnrdsuawbBl7F+O07/f0oRweA8
om80O2HImB7pOKFudWYFO64LQMB+EkFuRHBWb6ESmyc22BvMV3dRHxYK4GyC4Nas
6cVQbK2Eo9/Ip1Ld3CQBb/alYIBE0wNSrjVhiE6C4ssu+EZpvwPgb2nx/UHUN3xf
kwr0ZJibFoPRgvsNg14/GJI1HEsko5yM2h3c7Zd0KZyH4NCxFYvNk1dlvl7jPjj7
93hYf4JqbgajzhlltWBJTBiq3i4Kgzm9MBJrl2m1KvhCovWLohz9IjqDUvQ3FWts
GinU4R8Tkd2NNsQ3rgMqtfcl5C3vpTRLlQFO9Ffd5CqCZVD9CmkvYTSLZjvZBEcU
X6+kYo1nYsbEdInH9HoNAXhg1YvuG9jRMlO1e84ut5WKxEluZUVFReID9opovHOU
7ZZv8hT7GJu5frqD8mxEfsRj4B5KOhhyaLJOWEvi0S6NuaZDhAG0GuLbGJkPn4v4
d3aUZjf8ZBotdTCDY14ALMNkv6ri7+75DaFhvkOkHBS/ELsnfDK5d9+uCE9/XQRn
OLSh12a5QE43v0tj8FIDpdqGS9EWJ1c+ob3dG7HeCc8QcVlmDM9NHrQ7PxrFYgvH
ppqRkETXI7bbWkQzXw5OYcL4twF9wRLFwb8MMfGBRwRBS39ScYgfa29xdRahkvNu
HWmAPb03M46bkAWM/PY6XJdJIAuX3qAgrftIEO9D4hDZlxyxs0OVy/ARrKwpPpMK
8/WV9Lf52fz/Kk657eQe5N5+W00Wqpor3bFzP4z6XazxP7bSpNhhOudQx3cKEBlK
LlWYRd867FHu0+vcHr3jri1+VeoUX1f2XxmYNjKHxsDWYBdFbEWN
-----END PKCS7-----">
<input type="submit" value="Checkout With PayPal" />
</form>
Tried 2 way of encrypt.
ExpressionEngine function encrypt_data(). This works well but only for one product and adding directly to PayPal shopping cart. When I pass data from above array to the same encrypt function, PayPal cant decrypt certificate id?!
Tried also function from here but same problem... PayPal cant decrypt certificate_id.
I know that everything works, because native EE function works.
Could any one help me and suggest what to do?
Thanks in advance
http://blog.scrobbld.com/paypal/protecting-your-payments-with-ewp/
Works, just exchange the certificater params.

Drupal Custom Module / Form Question: Adding an array of fields

I'm creating a custom module where I'd like to have the "add another item" functionality for a particular field, but I can't seem to figure out what I need to do in order to accomplish this... I've been going through Drupal forums and their Forms API Reference, but I must not be getting something.... I'm using Drupal 6.20, and in my module, I tried:
$form['options'] = array(
'#title' => t('Options'),
'#type' => 'fieldset',
);
$form['options']['address'] = array(
'#type'=>'textfield',
'#title'=>t('Address'),
'#tree' => 1,
);
Thinking I would get an text input that looked like this:
<input type="text" class="form-text text" value="" size="60" id="edit-address-0-value" name="address[0][value]">
But, I just get an input that looks like this:
<input type="text" class="form-text" value="" size="60" id="edit-address" name="address" maxlength="128">
You need to set #tree on the element above the one you want to duplicate. FAPI will store values in a tree structure from that element on downwards.
To get a name like address[0][value] you will need something like
$form['options']['address'] = array(
'#tree' => TRUE,
);
$form['options']['address'][0] = array(
'#tree' => TRUE,
);
$form['options']['address'][0]['value'] = array(
'#type'=>'textfield',
'#title'=>t('Address'),
);
But you don't need the [value] part unless you are actually trying to achieve multi-valued grouped fields or if your field has a complex (custom) data type implemented with multiple PHP values (ie. latitude/longitude, start/stop dates, etc.).
You will also probably need to store the number of values in something like $form['options']['#nb_values'] or in an hidden field (if you plan to add the additional fields to the form using JavaScript).

Resources