Форма доктрины Symfony 1.4 - введение поля с фиксированным значением - PullRequest
1 голос
/ 04 апреля 2011

EDIT. Подводить итоги: я просто хочу SomeForm, который расширяет мои DoctrineForms, чтобы НЕ ВКЛЮЧИТЬ определенные поля. Они НЕ доступны для редактирования. Фиксированное значение, которое я хочу установить в коде где-то. Надеюсь, этого будет достаточно, чтобы вам не нужно было читать оставшуюся часть этого поста ...

Привет. Вот моя ситуация:

  • У меня есть SomeModel, созданный доктриной
  • У меня есть экраны CRUD для этой модели как в моем приложении, так и в бэкэнде
  • Единственное различие между этими двумя экранами CRUD (кроме эстетических различий) заключается в интерфейсе, одно конкретное поле - ИСПРАВЛЕНО. т.е. администраторы могут изменить это значение, если хотят, но обычные пользователи не могут. Значение будет просто константой, которую я определю в коде. Это поле не должно отображаться на экранах добавления / редактирования внешнего интерфейса.

Что я хочу знать, так это каков «правильный» способ сделать это? Я могу придумать несколько способов просто взломать его, но все, что я делаю, кажется неуклюжим обходным путем.

Есть ли какой-нибудь правильный способ сделать это, расширяя мои классы Form (какой BaseFormDoctrine) или где-то еще подходящее?

РЕДАКТИРОВАТЬ: Как указано в комментариях ниже, я на самом деле использую доктрину: генерировать-модуль, который, очевидно, отличается от "CRUD".

ТАКЖЕ: Хотя я до сих пор не решил это в идеале, я думаю, что знаю, где находится решение, мне просто нужно углубиться в формы symfony: http://www.symfony -project.org / форма / 1_4 / а / 02-Form-Validation

1 Ответ

3 голосов
/ 05 апреля 2011

Создайте еще одну форму в папке / lib / form, которая расширяет вашу обычную форму, а затем переопределите соответствующее поле. Следующее удалит поле из формы, чтобы оно вообще не отображалось.

<?php

class FrontendSomeModelForm extends SomeModelForm {

  public function configure()
  {
    unset($this["some_field"]);
  }

}

Или, если вы хотите отобразить значение, но не разрешить его редактирование, вы можете сделать следующее:

<?php

class FrontendSomeModelForm extends SomeModelForm {

  public function configure()
  {
    $this->setWidget("some_field", new sfWidgetFormPlain());
  }

}

А затем создайте sfWidgetFormPlain виджет, который просто выводит значение и прикрепляет его куда-нибудь, чтобы Symfony смог его найти (lib / form / widget или что-то еще).

<?php

class sfWidgetFormPlain extends sfWidgetForm
{
  /**
   * Constructor.
   *
   * @param array $options     An array of options
   * @param array $attributes  An array of default HTML attributes
   *
   * @see sfWidgetForm
   */
  protected function configure($options = array(), $attributes = array())
  {
      $this->addOption('value');
  }

  /**
   * @param  string $name        The element name
   * @param  string $value       The value displayed in this widget
   * @param  array  $attributes  An array of HTML attributes to be merged with the default HTML attributes
   * @param  array  $errors      An array of errors for the field
   *
   * @return string An HTML tag string
   *
   * @see sfWidgetForm
   */
  public function render($name, $value = null, $attributes = array(), $errors = array())
  {
    //optional - for easy css styling
    $attributes['class'] = 'plain';

    return $this->renderContentTag('div', $value, $attributes);
  }
}

Затем вы используете эту форму, а не обычную для той, которую вы не хотите редактировать. Обратитесь к документации Symfony, чтобы узнать, как это сделать, в зависимости от того, отображаете ли вы его в модуле или через генератор admin.

...