I'm attempting to set the class on a class on a form label using php templates.
Here's my code:
<?php echo $view['form']->label($form['first_name'], 'First Name', array(
'attr' => array('class' => 'control-label')
)) ?>
But here's my output:
<label class="required" for="form_first_name">First name</label>
I can find how to do it using twig, but not an example with PHP.
I've got it...
<?php
echo $view['form']->label($form['first_name'], 'First Name', array(
'label_attr' => array('class' => 'control-label'),
))
?>
Apparently "attr" is "label_attr" for labels fields.
P.S. Corresponding twig code
{{ form_label(form.first_name, 'First Name', { 'label_attr': {'class': 'control-label'} }) }}
Related
I have a form in Symfony.
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('volume', IntegerType::class, array())
;
$builder->add('product', ChoiceType::class, array(
'data' => '1',
'mapped' => false,
'choices' => array(
'1' => 'One',
'2' => 'Two',
),
)
);
$builder->add('deliveryType', ChoiceType::class, array(
'expanded' => true,
'data' => 1,
'choices' => array(
Command::STANDARD_DELIVERY => 'Standard',
Command::EXPRESS_DELIVERY => 'Express',
),
));
}
But the field deliveryType is loaded in another template called with an ajax request.
But of corse I have this error:
Variable "form" does not exist in ... at line 26
How can I put a part of a form in another template?
Here is my main template:
<div class="panel-body">
{{ form_start(form)}}
{{ form_errors(form) }}
<div class="row">
<div class="col-sm-12">
{{ form_row(form.product) }}
{{ form_row(form.volume, {'attr': {'class': 'form-control'}}) }}
{{ form_row(form.town) }}
</div>
</div>
<div id="content-delivery-range"><!-- Block loaded by ajax --></div>
<br>
<button type="submit" class="btn btn-primary btn-block">Continuer </button>
{{ form_end(form) }}
</div>
And now my template called with an Ajax request:
{{ deliveryRange|first|date('d M') }}
{{ deliveryRange|last|date('d M') }}
{% for d in deliveryRange %}
{{ d|date('l') }} <br>
<small>{{ d|intl_date('d') }} {{ d|date('M') }}</small>
{% endfor %}
{{ form_row(form.deliveryType) }}
It might be easier to include the "deliveryType" form element as part of the initial form render.
Then, your ajax call could just return the necessary values which you insert using jquery/javascript/etc.
Found it:
I have used an event listener with PRE_SUBMIT:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('volume', IntegerType::class, array())
;
$builder->add('product', ChoiceType::class, array(
'data' => '1',
'mapped' => false,
'choices' => array(
'1' => 'One',
'2' => 'Two',
),
)
);
$builder->addEventListener(FormEvents::PRE_SUBMIT, array($this, 'onPreSubmit'));
}
public function onPreSubmit(FormEvent $event)
{
$form = $event->getForm();
$form->add('deliveryType', ChoiceType::class, array(
'expanded' => true,
'data' => Command::STANDARD_DELIVERY,
'choices' => array(
Command::STANDARD_DELIVERY => 'Standard',
Command::EXPRESS_DELIVERY => 'Express',
),
));
}
I am starting to use the Yii2 Kartik helpers.
The issue i am having is the CSS of the datepicker
As you can see the Date of Birth field has no padding at the bottom.
The code for the fields around it
<?= $form->field($model, 'mobile')->textInput(['maxlength' => true]) ?>
<?= $form->field($model, 'telephone')->textInput(['maxlength' => true]) ?>
<?= Html::activeLabel($model, 'date_of_birth') ?>
<?= DatePicker::widget([
'model' => $model,
'attribute' => 'date_of_birth',
'options' => ['placeholder' => 'Enter birth date ...'],
'pluginOptions' => [
'autoclose'=>true,
'format' => 'dd-mm-yyyy',
]
]); ?>
<?= $form->field($model, 'email')->textInput(['maxlength' => true]) ?>
<?= $form->field($model, 'user_id')->textInput() ?>
From the CSS i can see that the Kartik creates a div with the class input-group
<div id="staff-date_of_birth-kvdate" class="input-group date">
Where as the standard form element have a div with the class form-group
<div class="form-group field-staff-telephone">
Any ideas?
Regards
Liam
You should simply try :
<?= $form->field($model, 'date_of_birth')->widget(DatePicker::className(), [
'options' => ['placeholder' => 'Enter birth date ...'],
'pluginOptions' => [
'autoclose'=>true,
'format' => 'dd-mm-yyyy',
],
]) ?>
Read more : http://demos.krajee.com/widget-details/datepicker#usage
I'm (obviously) new to Symfony/Sonata, I have a problem where Sonata admin is wrapping my date choice onto 3 lines.
php:
$form = $this->createFormBuilder($statsForm)
->add('startDate', 'date', array('years' => range(2015, date('Y')), 'format' => 'y-M-d', 'widget' => 'choice'))
->add('endDate', 'date', array('years' => range(2015, date('Y')), 'format' => 'y-M-d', 'widget' => 'choice'))
->getForm();
twig:
{{ form_start(form) }}
<div class="col-md-3">
{{ form_widget(form) }}
</div>
{{ form_end(form) }}
screen:
In your case you have to choose the sonata_type_date_picker type in your form:
$datagridMapper
->add('startDate', 'sonata_type_date_picker')
->add('endDate', 'sonata_type_date_picker')
;
The documentation reference:
https://sonata-project.org/bundles/core/master/doc/reference/form_types.html
This is my form code
$this->add(array(
'name' => 'abc',
'type' => 'TextArea',
'options' => array(
'label' => _('Enter description'),
),
'attributes' => array(
'rows' => '1',
'cols' =>'75',
)
));
This is my view code
<?php echo $this->formLabel($form->get('abc'))."<br>"; ?>
<?php echo $this->formInput($form->get('abc'))."<br>"; ?>
The problem here is that I don't get a TextArea and instead get a normal textbox. It was working when I used the code
<?php echo $this->formRow($form->get('abc'))."<br>"; ?>
When I try to print label and input separately, It is not using its type and attributes. How can I correct this for my case.
use in your view the zend view helper formText to print a textarea
echo $this->formText($form->get('abc'))
in your form class use as type => Zend\Form\Element\Text
http://framework.zend.com/manual/2.0/en/modules/zend.form.view.helpers.html
I'm using FOSUserBundle, and I want to add a few HTML elements to the registration form. Actually, I did and I can see the added properties to the User class in my form. The issue is that I want those fields (first name, last name, date of birth, etc..) to get the look and feel of my CSS template (bootstrap).
I succeeded to do that for the login page by overriding it, since the HTML are explicitly declared. I want to do the same for the register page, however it seems confused to me, because here's the content of :
register.html.twig
{% extends "FOSUserBundle::layout.html.twig" %}
{% block fos_user_content %}
{% include "FOSUserBundle:Registration:register_content.html.twig" %}
{% endblock fos_user_content %}
register_content.html.twig
{% trans_default_domain 'FOSUserBundle' %}
{{ form_widget(form) }}
How can I access to the elements that I see in the page from this code ?
Try this
<div class="form-group {% if form.plainPassword.first.vars.errors %}has-error{% endif %}">
<label class="col-lg-2 control-label">Password:</label>
<div class="col-lg-5">
{{ form_widget(form.plainPassword.first, {'attr': {'class': 'form-control input-lg', 'placeholder': 'Enter password', 'required': 'required'}}) }}
{% for errorItem in form.plainPassword.first.vars.errors %}
<label class="control-label has-error" for="{{ form.plainPassword.vars.id }}">{{ errorItem.message }}</label>
{% endfor %}
</div>
<div class="col-lg-5">
{{ form_widget(form.plainPassword.second, {'attr': {'class': 'form-control input-lg', 'placeholder': 'Enter password again', 'required': 'required'}}) }}
</div>
</div>
It works for me.
Please see the official documentation here: "Overriding Forms". You will need to create a custom registration form type class, declare it as a service, and tell FOSUserBundle to use it.
To customize the template, see "Overriding Templates". In your case, you could create app/Resources/FOSUserBundle/views/Registration/register.html.twig.
replace form_widget(form) with something like:
form_widget(form.username)
form_widget(form.email)
form_widget(form.plainPassword)
form_widget(form.myField)
form_rest(form)
in your custom RegistrationFormType class, you could add a class to the username field with:
$builder
->add('username', null, array('label' => 'form.username', 'translation_domain' => 'FOSUserBundle', 'attr' => array('class'=>'myClass')))
also see form docs on rendering fields by hand: http://symfony.com/doc/current/book/forms.html#rendering-a-form-in-a-template
Here is how I addressed this problem using FOSUserBundle, PUGXMultiUserBundle & BraincraftedBoostrapBundle:
Per FOSUserBundle documentation, add a UserBundle as a child of FOSUser. Create a custom RegistrationFormType that includes the following, where only the attr and label_attr arrays are added:
$builder
->add('email', 'email', array(
'label' => 'form.email',
'translation_domain' => 'FOSUserBundle',
'attr' => array(
'placeholder' => 'E-mail',
),
'label_attr' => array(
'class' => 'sr-only',
)))
->add('username', null, array(
'label' => 'form.username',
'translation_domain' => 'FOSUserBundle',
'attr' => array(
'placeholder' => 'Username',
),
'label_attr' => array(
'class' => 'sr-only',
)))
->add('plainPassword', 'repeated', array(
'type' => 'password',
'options' => array('translation_domain' => 'FOSUserBundle'),
'first_options' => array('label' => 'form.password',
'attr' => array(
'placeholder' => 'Password',
),
'label_attr' => array(
'class' => 'sr-only',
)),
'second_options' => array('label' => 'form.password_confirmation',
'attr' => array(
'placeholder' => 'Confirm password',
),
'label_attr' => array(
'class' => 'sr-only',
)),
'invalid_message' => 'fos_user.password.mismatch',
))
;
The registration form template then looks like this:
<form action="{{ path('volunteer_registration') }}" method="POST" class="form-inline">
{{ bootstrap_set_style('form-inline') }}
{{ form_row(form.firstName) }}
{{ form_row(form.lastName) }}
{{ form_row(form.username) }}
{{ form_row(form.email) }}
<br/>
{{ form_row(form.plainPassword) }}
{{ form_row(form.plainPassword.second) }}
{{ bootstrap_set_style('') }}