1

私はsymfonyの要素を形成するためにクラスを割り当てるより良い方法を見つけようとしています。現在、私はそれぞれを手動で割り当てることから逃れることができないようです。すなわち:

$this->widgetSchema['title']->setAttribute("class","fieldInput");
$this->widgetSchema['tag_line']->setAttribute("class","fieldInput");
$this->widgetSchema['description']->setAttribute("class","fieldInput");
// etc

成功せずに試したこと

1)$ this-> widgetSchemaをループし、配列として扱い、各キーに属性を設定します

2)$ this-> widgetSchema-> setAttribute()ただし、これは生成されたラベルにのみクラスを適用し、フォーム要素には適用しませんでした

特に指示せずにすべてのフィールドをヒットする方法が必要ですか?

誰かが私を正しい方向に向けることができますか?

4

6 に答える 6

9

やり方がある:

sfWidgetFormSchemaFormatterたとえば、これを含む lib/widget にa を作成します( symfonians のコード):

class sfWidgetFormSchemaFormatterDiv extends sfWidgetFormSchemaFormatter
{
  protected
    $rowFormat       = "<div class=\"form-row%is_error%\">\n  %label%\n  %error%\n   %hel<div class='myfieldclass'%field%</div>\n p%\n%hidden_fields%</div>\n",
    $errorRowFormat  = "%errors%\n",
    $helpFormat      = '<div class="form-help">%help%</div>',
    $decoratorFormat = "\n  %content%";

  public function formatRow($label, $field, $errors = array(), $help = '', $hiddenFields = null)
  {
    return strtr(parent::formatRow($label, $field, $errors, $help, $hiddenFields), array(
      '%is_error%'    => (count($errors) > 0) ? ' field_error' : '',
      //'%is_required%' => $field,
    ));
  }
}

次に、フォームで次のようにします。

$oDecorator = new sfWidgetFormSchemaFormatterDiv($this->getWidgetSchema());
$this->getWidgetSchema()->addFormFormatter('div', $oDecorator);
$this->getWidgetSchema()->setFormFormatterName('div');

次に、セレクター.myfieldclass inputまたは必要なもので要素をスタイルできます。これは、フォームの構造/外観を変更する優れた方法です。

于 2010-05-27T16:34:00.513 に答える
7

フォーム クラス内から:

foreach ($this->getWidgetSchema()->getFields() as $field)
{
  $field->setAttribute('class', 'custom-class');
}

必要なフォーム クラスが多数ある場合は、カスタム sfWidgetFormSchemaFormatter クラスのコンストラクターからそのコードを呼び出すこともできます。

public function __construct(sfWidgetFormSchema $widgetSchema)
{
    parent::__construct($widgetSchema);

    foreach ($this->getWidgetSchema()->getFields() as $field)
    {
        $field->setAttribute('class', 'custom-class');
    }
}
于 2011-11-07T14:02:25.927 に答える
2

私は同じ問題を抱えています。

状況 CSS と symfony のウィジェット生成の間の分離は、インテグレーターにとって大きな学習曲線であり、インテグレーターを開発者からより独立させる方法が必要であると考えるようになりました。

クライアントは常にカスタム スタイルのフォームを望んでいますが、カスタムの手作りの !DRY コードが完成しました。私が言いたいのは、グラフィック デザイナーは入力テキストとラベルだけでフォームをデザインするのではなく、すべての創造的な方法を見つけ出し、私たちの現実は、デザインと同じように見えるようにフレームワークで機能させることです。

そのため、sfWidgetFormSchemaFormatter を使用することを考えましたが、フォーム コントローラーはすべて異なり、ビューからスタイリングを注入できるようにしたかったのです...なぜなら、それはアプリケーションの問題ではなく統合の問題だからです。それ自体。

ソリューション パス チーム リーダーと私は解決策にたどり着きました。主にパーシャルを使用し、それらをループします。フォーム ビューは次のようになります。

ビュー内の呼び出しによって、どのコントローラーがどのクラス名を取得できるかを伝えたいため、私たちのソリューションは完璧ではありません。<ただし、クライアントはまだIE8を使用しているため、CSS の input[type=text] を使用するよりも優れています。しかし、少なくとも、

そこで、フィールド ID を異なる動作を持つ可能性のある className にマッピングしない理由を考えました (ラベル + 入力 (および必要に応じてもちろん +ヘルパー + エラー) とは異なります)。

私たちがしていることは、これらの特別なコントローラー (例: ラベル + 選択 + 選択 + 選択 + ヘルパー + エラー) に制御スタイルを注入することです。このウィジェットに idsome_field_idがあり、それが親に必要であるとしましょう<li>

次のようにできます。

$node_classes_map => array('some_field_id'=>'date-selector')

だから...今度はいくつかのコードの時間です:

まず、「リスト」widgetFormatter を使用する必要があります。

<?php
// lib/form/SomeForm.php
class SomeForm extends BaseSomeForm
{
   public function configure()
   {
       $this->widgetSchema->setFormFormatterName('list');
   }
}

または、qais answerを使用して、すべてのフォームをリストとして持つこともできます (ついに!!今まで知りませんでした)。

景色:

<?php
// apps/appName/modules/moduleName/templates/someviewSuccess.php
$node_classes_map = array(
  'some_field_id'=>'date-selector'
   // .date-selector would have many select side by side. 
   // (no CSS for that in this example)
);
include_partial('global/patterns/formParent',
    array(
        'form'=>$form,
        'form_classes'=>'labels-on-left',
        'node_classes_map' => $node_classes_map
    )
);

formParentは次のようになります。

<?php
// apps/appName/templates/_patterns/formParent.php
$form_classes_attr = (isset($form_classes))?' class="'.$form_classes.'"':'';
$form_list_node_partial = 'global/patterns/listFormDefaultNode';
$model_name_lowercase = strtolower($form->getModelName());
$node_classes_map = (isset($node_classes_map))?$node_classes_map:array();
?>
<?php use_stylesheets_for_form($form) ?>
<?php use_javascripts_for_form($form); ?>
<form action="<?php 
    echo url_for($model_name_lowercase.'/'.($form->getObject()->isNew() ? 'create' : 'update').(!$form->getObject()->isNew() ? '?id='.$form->getObject()->getId() : ''))
?>"<?php echo $form_classes_attr;
?> method="post" <?php $form->isMultipart() and print 'enctype="multipart/form-data" '?>>
<h2><?php echo __(($form->getObject()->isNew()?'new.':'edit.').$model_name_lowercase.'.form.title'); ?></h2>
<fieldset>
    <ol>
<?php
    foreach($form as $item){
        $node_classes = (isset($node_classes_map[$item->renderId()]))?$node_classes_map[$item->renderId()]:'';
        include_partial($form_list_node_partial,
            array(
                'item'=>$item,
                'node_classes' => $node_classes
            )
        );
    }
?>
    <ol>
</fieldset>
<?php echo $form->renderHiddenFields() ?>
<?php echo $form->renderGlobalErrors() ?>
<?php echo (!$form->getObject()->isNew())? '<input type="hidden" name="sf_method" value="put" />':''; ?>
</form>

各フォーム要素は、カスタム要素またはlistFormDefaultNodeによってレンダリングされます。

そこから、主流のラベル + 入力 + ヘルパー + エラーから、ラベル + 選択 + 選択 + 選択 + ヘルパー + エラーのようなより複雑なものまで、コントローラーを異なる方法でレンダリングする別のパーシャルを考え出すことができます。

これは私のデフォルトのフォームです *ノード

<?php
// apps/appName/templates/_patterns/listFormDefaultNode.php
/**
 * Manual: http://www.symfony-project.org/forms/1_4/en/A-Widgets
 */
if(!$item->isHidden()){ ?>
<li class="<?php echo $item->renderId().((is_string($node_classes))?' '.$node_classes:''); ?>">
  <?php echo $item->renderLabel(); ?>
  <?php echo $item; ?>
  <?php echo (!!$item->renderHelp())?'<span class="helpers">'.$item->renderHelp().'</span>':''; // I did not find any hasHelper(), so switching to bool ?>
  <?php echo ($item->hasError())?'<span class="alertify error">'.$item->renderError().'</span>':''; ?>
</li>
<? }

最後に、これが私の CSS からのスタートです。

これはプロジェクト CSS の一部であり、これは私がSnippiesで開発している概念の一部を使用していることに注意してください。そこにアクセスして、CSS をどのように構成しているかについてのアイデアをさらに入手してください。

/* ****** Misc ****** */
/**
 * General form views settings
 **/
form ol, form ul {
  list-style-type: none;
  padding: 0;
  margin: 0;
}
form input.text, form select {
  display: block;
  border: 0;
  padding: 4px;
  line-height: 12px;
  font-size: 15px;
}
form select {
  background-color: #e3e8eb;
  color: #506775;
  margin: 0;
}
form label {
  color: #345569;
  display: block;
  font-weight: bold;
  margin-bottom: 5px;
}
form input.text {
  color: #345569;
  border: none;
  background-color: #e3e8eb;
  color: #738996;
  border: 0px solid #c3c987;
  padding: 4px;
  line-height: 12px;
  width: 100%;
}
form fieldset {
  padding: 0;
  margin: 0;
  border: none;
  padding-bottom: 10px;
  margin-bottom: 10px;
  border-bottom: 1px solid #98a7af;
  padding: 10px 0;
}
form li {
  margin-bottom: 10px;
}
form li .helpers {
  color: #98a7af;
}
/**
 * /General form views settings
 **/


/**
 * General error messages 
 **/
.alertify {
  padding: 0.8em;
  margin-bottom: 1em;
  border: 2px solid #ddd;
}
.alertify strong, .alertify p {
  padding: 0 0 10px 0;
  display: block;
}
.alertify ul {
  margin: 0;
  padding: 0 0 0 15px;
}
.alertify ul li {
  padding: 0 0 5px 0;
}
.error, .alert {
  background: #fbe3e4;
  color: #8a1f11;
  border-color: #fbc2c4;
}
/**
 * /General error messages 
 **/
/* ****** /Misc ****** */


/* ****** Specialization ****** */
/**
 * Form labels on the left
 */
form.labels-on-left fieldset {
  padding: 0;
  margin: 0;
  padding-bottom: 10px;
  margin-bottom: 10px;
}
form.labels-on-left li {
  clear: both;
  overflow: hidden;
}
form.labels-on-left li input.text, form.labels-on-left li select {
  border: 0;
  padding: 4px;
  line-height: 12px;
}
form.labels-on-left li input.text {
  width: 815px !important;
  float: left;
  padding: 6px;
  color: #506775;
}
form.labels-on-left li select {
  background-color: #e3e8eb;
  color: #506775;
  height: 26px;
  width: 400px;
  margin: 0;
  float: left;
}
form.labels-on-left li .beside {
  float: left;
}
form.labels-on-left li .beside a {
  font-weight: bold;
  padding: 5px 20px;
  font-size: 14px;
  display: block;
}
form.labels-on-left li label {
  color: #345569;
  width: 80px;
  font-size: 120%;
  text-align: right;
  font-weight: bold;
  float: left;
  display: block;
  padding: 5px 10px 0 0;
}
form.labels-on-left li .error span, form.labels-on-left li .helpers span {
  padding: 5px;
  display: block;
}
form.labels-on-left li .helpers {
  width: 100%;
}
/**
 * /Form labels on the left
 */
/* ****** /Specialization ****** */
于 2011-08-14T23:38:00.383 に答える
0

これは古いですが、これを見つけようとしている人は、/lib/filter/doctrine/ 内の xxxxxFormFilter.php に移動して、次のようにします。

$this->getWidget('inputname')->setAttribute('class_name','class_name/id_name');

このようにして、すべてを個別に指定および制御できます。

于 2014-02-27T23:30:55.387 に答える
0

拡張する基本フォームに応じて、構成メソッドに次を追加できます。

public function configure()
{
    foreach ($this->widgetSchema->getFields() as $field) {
        $field->setAttribute('class','my-custom-class');
    }
    parent::configure();
}

私はBaseFormDoctrineでやりました。同じアプローチを使用して、フィールド内の任意の属性を追加/オーバーライドしたり、フィールド タイプに基づいてカスタム ルールを追加したりすることもできます。

于 2014-08-10T13:56:38.920 に答える
-1

個々の要素ではなく、親要素にクラスを適用します。

テンプレート:

<form class="my-form" action="" method="">
 // put widgets here
</form>

CSS:

.my-form select {}
.my-form input[type=text] {}
.my-form textarea {}
.my-form input[type=submit] {}
etc...
于 2010-05-28T11:26:57.087 に答える