0

用例:

用户对专业记录进行公开和/或私人记录。这些注释显示在显示专业知识记录的页面的侧栏中。笔记分为两组:当前用户的笔记(公共和私人)和其他用户的公共笔记。当前用户的所有笔记都是可编辑和可删除的。每个删除图标都是指向路线的链接。每个编辑图标都是一个 javascript 切换,用于显示特定注释的表单(编辑表单看起来像添加表单,只是它被填充了)。每个提交操作只能添加/编辑或删除一个注释。提交不是通过ajax。该页面如下所示:

带有注释侧边栏的专业知识页面

问题

如何为“新笔记”和“我的笔记”部分中的每个笔记显示和处理独立的表格?

如果我在 ExpertiseType 表单中嵌入了一组 NoteType 表单,则处理是正确的,但我似乎无法将表单分组为“添加注释”、“我的笔记”和“公共笔记”部分。更糟糕的是,公共笔记是可编辑的。我已经放弃了这种方法,因为没有简单的方法来过滤哪些笔记有表格。

如果我在控制器中对笔记进行子集化并为每个笔记创建一个表单,那么除非我使用命名表单,否则每个笔记都会被当作新笔记来处理。使用命名表单,可以正确创建新注释。但是所有编辑都应用于最近的笔记,并且所有其他笔记都将其隐私和文本字段设置为列默认值。我怎样才能解决这个问题?

侧边栏的 Twig 模板:

{% block sidebar %}
    <div id='sidebar'><h2>Profile Notes</h2>
        {% for flashMessage in app.session.flashbag.get('note_success') %}
            <div class="flash-success">
                {{ flashMessage }}
            </div>
        {% endfor %}
        <fieldset class='wrapper'><legend>Add a note</legend>
            {{ form(form) }}
        </fieldset>
        {% if usernotes|length > 0 %}
            <fieldset><legend>My notes</legend>
            <dl>
            {% for  note in usernotes%}
                <dt>{{ note.moddate|date("Y-m-d H:i") }}
                    <a class='actionlink' href='{{ path('exp_delnote', {'id':note.id}) }}' title="delete"><img src="{{ asset('images/silk_icons/delete.png') }}" alt="delete note"></a>
                    <a class='actionlink inlineedit' href='#' data-editform="{{ form(note.myform)|e }}" title="edit note"><img src="{{ asset('images/silk_icons/pencil.png') }}" alt="edit note"></a>
                </dt>
                <dd class='note_{{ note.private ? 'priv' : 'pub' }}' title='{{ note.private ? 'Private Note' : 'Public Note'}}'>{{ note.note }}</dd>
            {% endfor %}
            </dl>
            </fieldset>
        {% endif %}
        {% if publicnotes|length > 0 %}
            <fieldset><legend>Public notes</legend>
            <dl>
            {% for  note in publicnotes%}
                <dt>{{ note.moddate|date("Y-m-d H:i") }}, {{ note.person|expadinfo("fullname") }}</dt>
                <dd>{{ note.note }}</dd>
            {% endfor %}
            </dl>
            </fieldset>
        {% endif %}
    </div>
{% endblock %}

实体

有 3 个实体类在起作用ExpertiseNotePerson。该Expertise实体有一个集合Notes。每个Note都与一个Person(它的“所有者”)和一个Expertise记录相关联。实体由 Doctrine 管理。

我当前的控制器方法

这成功地创建了新笔记。但无论我编辑哪个笔记,更改都会应用于最近的笔记,而其他可编辑笔记的文本和隐私字段设置为列默认值。

public function profileAction($uname){
    $request = $this->get('request');
    $adsearcher = $this->get('exp_adsearcher');

    $userrecord = $adsearcher->getRecordByUserName($uname);
    if(!$userrecord) throw $this->createNotFoundException('No such person exists.');
    $userrecord->setLocale($request->get('_locale'));
    $person = $adsearcher->getPersonByRecord($userrecord);
    $expertise = $this->getExpertiseEntity($person);
    $curuser = $adsearcher->getPersonByUserName($this->getUser()->getUsername());


    //add a new note, and trying to use a named form
    $newnote = $this->getNewNote($expertise, $curuser);
    $addnoteform = $this->get('form.factory')->createNamedBuilder('newnote', new NoteType(), $newnote)->getForm();

    $addnoteform->handleRequest($request);
    if($addnoteform->isValid()){
        $em = $this->getDoctrine()->getManager();
        $em->persist($newnote);
        $em->flush();

        $this->get('session')->getFlashBag()->add(
                'note_success',
                $this->get('translator')->trans('message.note.add.success')
        );
        $addnoteform = $this->createForm(new NoteType, $this->getNewNote($expertise, $curuser)); //so that add form is always empty
    }

    //get all the editable notes
    $usernotes = $expertise->getUserNotes($curuser);
    foreach($usernotes as $note){
        $form = $this->get('form.factory')->createNamedBuilder('note'.$note->getID(), new NoteType(), $note)->getForm();
        $form->handleRequest($request);
        if($form->isValid()){
            $msg = 'message.note.edit.success';
            $em = $this->getDoctrine()->getManager();
            $em->persist($expertise);
            $em->flush();

            $this->get('session')->getFlashBag()->add(
                    'note_success',
                    $this->get('translator')->trans('message.note.edit.success')
            );
            return $this->redirect($this->generateUrl('exp_profile', array('uname'=>$uname)));
        }
        $note->myform = $form->createView();
    }

    //get all the public notes, not editable
    $publicnotes = $expertise->getPublicNotes($curuser, $adsearcher);

    return array('userrecord'=> $userrecord, 'expertise'=>$expertise,'usernotes'=>$usernotes, 'publicnotes'=>$publicnotes, 'form'=>$addnoteform->createView());

}
4

1 回答 1

1

让我们看看这次我是否可以提供更多帮助。

让自己成为一个 NotesType,它可以容纳零个或多个笔记。

class NotesType extends AbstractType    

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
       $builder->add('notes', 'collection', array('type' => new NoteType());

您的控制器需要制作两种形式,一种用于新笔记,另一种用于现有笔记

    public function profileAction($uname)
    {
        // One form for a new note
        $newNote = $this->getNewNote($expertise, $curuser);
        $newNoteForm = $this->createForm(new NoteType(), $newNote);

        // One form for existing notes
        $userNotes = $expertise->getUserNotes($curuser);
        $userNotesData = array('notes' => $userNotes);
        $userNotesForm = $this->createForm(new NotesType(), $userNotesData);

        // Do NOT attempt to process the forms here

        // Just pass onto the template
        $tplData = array();
        $tplData['newNoteForm']   = $newNoteForm->createView();
        $tplData['userNotesForm'] = $userNotesForm->createView();

        return $tplData;

所以现在我们有两种独立的形式,一种用于新笔记,另一种用于现有笔记列表。相应地调整您的模板。您将希望 newNoteForm 发布到与 userNotesForm 不同的操作。这将允许您独立处理每个表单。处理完表单后,您将重定向回 profileAction。

    public function postUserNotesAction()
    {
        // One form for existing notes
        $userNotes = $expertise->getUserNotes($curuser);
        $userNotesData = array('notes' => $userNotes);
        $userNotesForm = $this->createForm(new NotesType(), $userNotesData);

        $userNotesForm->handleRequest($request);
        if($userNotesForm->isValid())
        {
            $userNotesData = $userNotesForm->getData();
            $userNotes = $userNotesData['notes'];

            $em->flush();

            // Redirect
于 2013-08-07T20:29:33.557 回答