【问题标题】:Symfony2 - Pulling data from database and show in formsSymfony2 - 从数据库中提取数据并显示在表单中
【发布时间】:2014-01-07 23:08:33
【问题描述】:

我想在我的表单上显示数据,但我不能这样做。

这是我在 userbundle 下的 profile.php:

 <?php

namespace project\UserBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Profile
 *
 * @ORM\Table(name="project_profiles")
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks
 */
class Profile
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var \project\UserBundle\Entity\User
     *
     * @ORM\OneToOne(targetEntity="\project\UserBundle\Entity\User", inversedBy="profile")
     */
    private $user;

    /**
     * @var string
     *
     * @ORM\Column(name="first_name", type="string")
     */
    private $firstName;

    /**
     * @var string
     *
     * @ORM\Column(name="last_name", type="string")
     */
    private $lastName;

    /**
     * @var string
     *
     * @ORM\Column(name="address1", type="string")
     */
    private $address1;

    /**
     * @var string
     *
     * @ORM\Column(name="address2", type="string")
     */
    private $address2;

    /**
     * @var string
     *
     * @ORM\Column(name="city", type="string")
     */
    private $city;

    /**
     * @var string
     *
     * @ORM\Column(name="state", type="string")
     */
    private $state;

    /**
     * @var string
     *
     * @ORM\Column(name="zipcode", type="string")
     */
    private $zipcode;

    /**
     * @var string
     *
     * @ORM\Column(name="country", type="string")
     */
    private $country;

    /**
     * @var integer
     *
     * @ORM\Column(name="client_api_delay", type="integer")
     */
    private $clientApiDelay;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="created_at", type="datetime")
     */
    private $createdAt;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="updated_at", type="datetime", nullable=true)
     */
    private $updatedAt;

    /**
     * Get id
     *
     * @return integer
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set firstName
     *
     * @param string $firstName
     * @return Profile
     */
    public function setFirstName($firstName)
    {
        $this->firstName = $firstName;

        return $this;
    }

    /**
     * Get firstName
     *
     * @return string
     */
    public function getFirstName()
    {
        return $this->firstName;
    }

    /**
     * Set lastName
     *
     * @param string $lastName
     * @return Profile
     */
    public function setLastName($lastName)
    {
        $this->lastName = $lastName;

        return $this;
    }

    /**
     * Get lastName
     *
     * @return string
     */
    public function getLastName()
    {
        return $this->lastName;
    }

    /**
     * Set address1
     *
     * @param string $address1
     * @return Profile
     */
    public function setAddress1($address1)
    {
        $this->address1 = $address1;

        return $this;
    }

    /**
     * Get address1
     *
     * @return string
     */
    public function getAddress1()
    {
        return $this->address1;
    }

    /**
     * Set address2
     *
     * @param string $address2
     * @return Profile
     */
    public function setAddress2($address2)
    {
        $this->address2 = $address2;

        return $this;
    }

    /**
     * Get address2
     *
     * @return string
     */
    public function getAddress2()
    {
        return $this->address2;
    }

    /**
     * Set city
     *
     * @param string $city
     * @return Profile
     */
    public function setCity($city)
    {
        $this->city = $city;

        return $this;
    }

    /**
     * Get city
     *
     * @return string
     */
    public function getCity()
    {
        return $this->city;
    }

    /**
     * Set state
     *
     * @param string $state
     * @return Profile
     */
    public function setState($state)
    {
        $this->state = $state;

        return $this;
    }

    /**
     * Get state
     *
     * @return string
     */
    public function getState()
    {
        return $this->state;
    }

    /**
     * Set zipcode
     *
     * @param string $zipcode
     * @return Profile
     */
    public function setZipcode($zipcode)
    {
        $this->zipcode = $zipcode;

        return $this;
    }

    /**
     * Get zipcode
     *
     * @return string
     */
    public function getZipcode()
    {
        return $this->zipcode;
    }

    /**
     * Set country
     *
     * @param string $country
     * @return Profile
     */
    public function setCountry($country)
    {
        $this->country = $country;

        return $this;
    }

    /**
     * Get country
     *
     * @return string
     */
    public function getCountry()
    {
        return $this->country;
    }

    /**
     * Set clientApiDelay
     *
     * @param integer $clientApiDelay
     * @return Profile
     */
    public function setClientApiDelay($clientApiDelay)
    {
        $this->clientApiDelay = $clientApiDelay;

        return $this;
    }

    /**
     * Get clientApiDelay
     *
     * @return integer
     */
    public function getClientApiDelay()
    {
        return $this->clientApiDelay;
    }

    /**
     * Set createdAt
     *
     * @param \DateTime $createdAt
     * @return Profile
     */
    public function setCreatedAt($createdAt)
    {
        $this->createdAt = $createdAt;

        return $this;
    }

    /**
     * Get createdAt
     *
     * @return \DateTime
     */
    public function getCreatedAt()
    {
        return $this->createdAt;
    }

    /**
     * Set createdAt to NOW
     *
     * @return Profile
     * @ORM\PrePersist
     */
    public function setCreatedAtNow()
    {
        $this->createdAt = new \DateTime();

        return $this;
    }

    /**
     * Set updatedAt
     *
     * @param \DateTime $updatedAt
     * @return Profile
     */
    public function setUpdatedAt($updatedAt)
    {
        $this->updatedAt = $updatedAt;

        return $this;
    }

    /**
     * Get updatedAt
     *
     * @return \DateTime
     */
    public function getUpdatedAt()
    {
        return $this->updatedAt;
    }

    /**
     * Set updatedAt to NOW
     *
     * @return Profile
     * @ORM\PreUpdate
     */
    public function setUpdatedAtNow()
    {
        $this->updatedAt = new \DateTime();

        return $this;
    }

    /**
     * Set user
     *
     * @param \project\UserBundle\Entity\User $user
     * @return Profile
     */
    public function setUser(\project\UserBundle\Entity\User $user = null)
    {
        $this->user = $user;

        return $this;
    }

    /**
     * Get user
     *
     * @return \project\UserBundle\Entity\User
     */
    public function getUser()
    {
        return $this->user;
    }
}

我的 ProfileController.php 文件:

<?php

namespace project\UserBundle\Controller;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use project\UserBundle\Entity\Profile;
use project\UserBundle\Form\ProfileType;

/**
 * Profile controller.
 *
 * @Route("/admin/profile")
 */
class ProfileController extends Controller
{
    /**
     * Lists all Profile entities.
     *
     * @Route("/", name="admin_profile")
     * @Method("GET")
     * @Template()
     */
    public function indexAction()
    {
        $em = $this->getDoctrine()->getManager();

        $entities = $em->getRepository('projectUserBundle:Profile')->findAll();

        return array(
            'entities' => $entities,
        );
    }

    /**
     * Creates a new Profile entity.
     *
     * @Route("/", name="admin_profile_create")
     * @Method("POST")
     * @Template("projectUserBundle:Profile:new.html.twig")
     */
    public function createAction(Request $request)
    {
        $entity  = new Profile();
        $form = $this->createForm(new ProfileType(), $entity);
        $form->bind($request);

        if ($form->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $em->persist($entity);
            $em->flush();

            return $this->redirect($this->generateUrl('admin_profile_show', array('id' => $entity->getId())));
        }

        return array(
            'entity' => $entity,
            'form'   => $form->createView(),
        );
    }

    /**
     * Displays a form to create a new Profile entity.
     *
     * @Route("/new", name="admin_profile_new")
     * @Method("GET")
     * @Template()
     */
    public function newAction()
    {
        $entity = new Profile();
        $form   = $this->createForm(new ProfileType(), $entity);

        return array(
            'entity' => $entity,
            'form'   => $form->createView(),
        );
    }

    /**
     * Finds and displays a Profile entity.
     *
     * @Route("/{id}", name="admin_profile_show")
     * @Method("GET")
     * @Template()
     */
    public function showAction($id)
    {
        $em = $this->getDoctrine()->getManager();

        $entity = $em->getRepository('projectUserBundle:Profile')->find($id);

        if (!$entity) {
            throw $this->createNotFoundException('Unable to find Profile entity.');
        }

        $deleteForm = $this->createDeleteForm($id);

        return array(
            'entity'      => $entity,
            'delete_form' => $deleteForm->createView(),
        );
    }

    /**
     * Displays a form to edit an existing Profile entity.
     *
     * @Route("/{id}/edit", name="admin_profile_edit")
     * @Method("GET")
     * @Template()
     */
    public function editAction($id)
    {
        $em = $this->getDoctrine()->getManager();

        $entity = $em->getRepository('projectUserBundle:Profile')->find($id);

        if (!$entity) {
            throw $this->createNotFoundException('Unable to find Profile entity.');
        }

        $editForm = $this->createForm(new ProfileType(), $entity);
        $deleteForm = $this->createDeleteForm($id);

        return array(
            'entity'      => $entity,
            'edit_form'   => $editForm->createView(),
            'delete_form' => $deleteForm->createView(),
        );
    }

    /**
     * Edits an existing Profile entity.
     *
     * @Route("/{id}", name="admin_profile_update")
     * @Method("PUT")
     * @Template("projectUserBundle:Profile:edit.html.twig")
     */
    public function updateAction(Request $request, $id)
    {
        $em = $this->getDoctrine()->getManager();

        $entity = $em->getRepository('projectUserBundle:Profile')->find($id);

        if (!$entity) {
            throw $this->createNotFoundException('Unable to find Profile entity.');
        }

        $deleteForm = $this->createDeleteForm($id);
        $editForm = $this->createForm(new ProfileType(), $entity);
        $editForm->bind($request);

        if ($editForm->isValid()) {
            $em->persist($entity);
            $em->flush();

            return $this->redirect($this->generateUrl('admin_profile_edit', array('id' => $id)));
        }

        return array(
            'entity'      => $entity,
            'edit_form'   => $editForm->createView(),
            'delete_form' => $deleteForm->createView(),
        );
    }

    /**
     * Deletes a Profile entity.
     *
     * @Route("/{id}", name="admin_profile_delete")
     * @Method("DELETE")
     */
    public function deleteAction(Request $request, $id)
    {
        $form = $this->createDeleteForm($id);
        $form->bind($request);

        if ($form->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $entity = $em->getRepository('projectUserBundle:Profile')->find($id);

            if (!$entity) {
                throw $this->createNotFoundException('Unable to find Profile entity.');
            }

            $em->remove($entity);
            $em->flush();
        }

        return $this->redirect($this->generateUrl('admin_profile'));
    }

    /**
     * Creates a form to delete a Profile entity by id.
     *
     * @param mixed $id The entity id
     *
     * @return Symfony\Component\Form\Form The form
     */
    private function createDeleteForm($id)
    {
        return $this->createFormBuilder(array('id' => $id))
            ->add('id', 'hidden')
            ->getForm()
        ;
    }
}

我已经在 Resources/Profile/show.html 下声明了我的实体,并且一切正常: 例如我的地址:

<th>Address2</th>
<td>{{ entity.address2 }}</td>

我的问题是我有另一个名为 ShowBundle 的包,我想在该包上显示这些实体。例如,当我在该捆绑包上调用 {{ entity.address2 }} 以显示我的地址时,它向我显示:(变量“实体”不存在)

我如何在另一个包中的树枝表单上显示这些配置文件实体,在我的例子中是 ShowBundle?

非常感谢

【问题讨论】:

  • 对于用户,即使我在另一个包中使用,我也可以使用 {{ app.user.variablename }} 来展示。我怎样才能显示我上面列出的在我的个人资料下的实体?
  • 我建议您遵循ProfileController 中showAction 下的代码。这应该有效。
  • 谢谢安东尼。我尝试按照您的建议进行操作,但现在出现另一个错误。

标签: php mysql symfony twig


【解决方案1】:

当然你可以使用{{ app.user.variablename }},它是一个全局变量。但是对于其他变量,视图只能显示控制器发送给它的数据。这就是 MVC(模型-视图-控制器)架构。

变量entity 仅在您的控制器将其发送到视图时才存在于 Twig 视图中。这就是 return array( 'entities' =&gt; $entities ); 在 ProfileController.php 上所做的,这就是为什么你可以在 Resources/Profile/show.html 中使用它。

如果您想在另一个包中显示一个实体,只需将其从数据库中拉出并将其发送到视图,就像您在 ProfileController.php 中所做的那样。如果您自己编写发布的代码,那应该是一件容易的事。

如果你不明白你贴的代码,我建议你学习使用 Symfony。您可以阅读the Book,这是非常好的分步文档。

提示:

将此代码复制到您的其他捆绑控制器中(以Action() 结尾的方法):

$em = $this->getDoctrine()->getManager(); //get the database manager

$profiles = $em->getRepository('projectUserBundle:Profile')->findAll(); // get the profiles

return array(
        'profiles' => $profiles,
    ); // send data to the view

您将通过模板中的{{ profiles }} 访问您的个人资料。

【讨论】:

  • 谢谢。我现在有另一个错误:/var/www/project-symfony/projectSymfony/src/project/FrontendBundle/Resources/views/Frontend/myproject.html 中不存在键为“0, 1”的数组的键“address1”。第 158 行的树枝
  • 你应该学习使用 Symfony 并真正学习 PHP。您使用findAll(); 方法,这意味着您将获得一组配置文件,而不是一个配置文件。 (这就是为什么我用复数 =P 写它的原因)所以你必须在 profileS 上 foreach 逐个获取配置文件,或者指定你想要的数组的哪个配置文件:profiles[0].address1 获取第一个配置文件的地址和@987654331 @ 获取第二个配置文件的地址。
  • 你必须学习。阅读 Symfony 的书。尝试理解几乎所有编程语言都存在的array 的一般概念,您将理解您的错误消息,这对于知道如何编程的人来说是非常清楚的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多