dtl4521 2013-04-13 19:31
浏览 55

AbstractType代理\ __ CG __ \ Far \ MT \ AccountBundle \ Entity \ Account无法转换为int in

class Accounts extends AbstractType
{
    private $em;

    private $accountrepo = null;

    private $choices = array();

    public function __construct()
    {
    }

    public function setAccountRepository($repo)
    {
        $this->accountrepo = $repo;
        return $this;
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults([
        'choices' => $this->getChoices(),
        'attr' => [
                    'data-dojo-type' => 'dijit/form/FilteringSelect',
                    ],
            'data_class' => 'Far\MT\AccountBundle\Entity\Account'
        ]);
    }

    public function getParent()
    {
        return 'choice';
    }

    public function getName()
    {
        return 'Accounts';
    }

    public function getChoices()
    {
        if ( count($this->choices) > 0 ) {
            return $this->choices;
        }
        $this->choices[0] = "";
        foreach ($this->accountrepo->findAll() as $account) {
            $this->choices[$account->getId()] = $account->getName() . " (" .
            $account->getCurrency().") ";
        }
        return $this->choices;
    }

}

Using the code above I get the error:

Notice: Object of class Proxies__CG__\Far\MT\AccountBundle\Entity\Account could not be converted to int in /workspace/tools/vendorsymfony2/symfony/symfony/src/Symfony/Component/Form/Extension/Core/ChoiceList/ChoiceList.php line 457

This only happens when I edit the record, I'm using this Type has a ChoiceList type in order to have the db values filtered and placed on the "combobox".

Any sugestions on what I can be doing wrong?

EDIT

use Doctrine\ORM\Mapping as ORM;

/**
 * Movement
 *
 * @ORM\Entity(repositoryClass="Far\MT\AccountBundle\Entity\MovementRepository")
 * @ORM\Table(name="movement")
 */
class Movement
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

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

    /**
     * @var string
     *
     * @ORM\ManyToOne(targetEntity="MovementType")
     * @ORM\JoinColumn(name="movementtype", referencedColumnName="id", unique=false)
     */
    private $Type;

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

    /**
     * @var Account
     *
     * @ORM\ManyToOne(targetEntity="Account", cascade={"persist"})
     * @ORM\JoinColumn(name="fromaccount", referencedColumnName="id", unique=false)
     */
    private $fromAccount;

    /**
     * @var Account
     *
     * @ORM\ManyToOne(targetEntity="Account", cascade={"persist"})
     * @ORM\JoinColumn(name="toaccount", referencedColumnName="id", unique=false)
     */
    private $toAccount;

    /**
     * @var string
     *
     * @ORM\ManyToOne(targetEntity="ExpenseType", cascade={"persist"})
     * @ORM\JoinColumn(name="expensetype", referencedColumnName="id",
     * nullable=true, unique=false)
     */
    private $ExpenseType;

    /**
     * @var string
     *
     * @ORM\ManyToOne(targetEntity="Holder",  cascade={"persist"})
     * @ORM\JoinColumn(name="holder", referencedColumnName="id", unique=false)
     */
    private $orderHolder;

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

    /**
     * @var float
     *
     * @ORM\Column(name="xrate", type="float", nullable=true)
     */
    private $xrate = null;

    public function getDescription()
    {
        return $this->description;
    }

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

    /**
     * Set Account
     *
     * @param string $account
     * @return Movement
     */
    public function setAccount($account)
    {
        $this->Account = $account;

        return $this;
    }

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

    /**
     * Set date
     *
     * @param \DateTime $date
     * @return Movement
     */
    public function setDate($date)
    {
        $this->date = $date;

        return $this;
    }

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

    /**
     * Set Type
     *
     * @param string $type
     * @return Movement
     */
    public function setType($type)
    {
        $this->Type = $type;

        return $this;
    }

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

    /**
     * Set value
     *
     * @param float $value
     * @return Movement
     */
    public function setValue($value)
    {
        $this->value = $value;

        return $this;
    }

    /**
     * Get value
     *
     * @return float
     */
    public function getValue()
    {
        return $this->value;
    }

    /**
     * Set fromAccount
     *
     * @param string $fromAccount
     * @return Movement
     */
    public function setFromAccount($fromAccount)
    {
        $this->fromAccount = $fromAccount;

        return $this;
    }

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

    /**
     * Set toAccount
     *
     * @param string $toAccount
     * @return Movement
     */
    public function setToAccount($toAccount)
    {
        $this->toAccount = $toAccount;

        return $this;
    }

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

    /**
     * Set ExpenseType
     *
     * @param string $expenseType
     * @return Movement
     */
    public function setExpenseType($expenseType)
    {
        $this->ExpenseType = $expenseType;

        return $this;
    }

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

    /**
     * Set orderHolder
     *
     * @param string $orderHolder
     * @return Movement
     */
    public function setOrderHolder($orderHolder)
    {
        $this->orderHolder = $orderHolder;

        return $this;
    }

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

    /**
     * Set exchange rate for movement
     *
     * @param float $xrate
     */
    public function setXrate($xrate)
    {
        $this->xrate = (double)$xrate;
        return $this;
    }

    /**
     * Return movement exchange rate
     *
     * @return float
     */
    public function getXrate()
    {
        return $this->xrate;
    }
}

Entity Account

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * Account
 *
 * @ORM\Table(name="account")
 *
 * @ORM\Entity(repositoryClass="Far\MT\AccountBundle\Entity\AccountRepository")
 */
class Account
{

    public function __construct()
    {
        $this->holders          = new ArrayCollection();
        $this->pocketAccounts   = new ArrayCollection();
    }

    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

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

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

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

    /**
     * @var Far\MT\AccountBundle\Entity\Holder
     *
     * @ORM\ManyToMany(targetEntity="Holder", inversedBy="Accounts")
     * @ORM\JoinTable(name="account_holder",
     * joinColumns={@ORM\JoinColumn(name="account_id", referencedColumnName="id")},
     * inverseJoinColumns={@ORM\JoinColumn(name="holder_id",
     * referencedColumnName="id")}
     * )
     *
     */
    private $holders;

    /**
     * @var Far\MT\AccountBundle\Entity\Account
     *
     * @ORM\OneToMany(targetEntity="Account", mappedBy="parentAccount")
     */
    private $pocketAccounts;
    /**
     *
     * @ORM\ManyToOne(targetEntity="Account", inversedBy="pocketAccounts", cascade={"persist"})
     * @ORM\JoinColumn(name="parent_id", referencedColumnName="id")
     */
    private $parentAccount;

    /**
     * Specifies the account type has string
     *
     * @var String
     *
     * @ORM\Column(name="accounttype", type="string", length=40)
     */
    private $accountType;

    /**
     * Total value of available money this should not account money that is
     * pending transaction
     *
     * @var double
     *
     * @ORM\Column(name="totalavailable", type="float")
     */
    private $totalAvailable = 0;

    /**
     * Total value of accounted money this takes into account money that has
     * pending transaction
     *
     * @var double
     *
     * @ORM\Column(name="totalaccounted", type="float")
     */
    private $totalAccounted = 0;

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

    /**
     * Set code
     *
     * @param string $code
     * @return Account
     */
    public function setCode($code)
    {
        $this->code = str_replace(" ", "", strtoupper(trim($code)));

        return $this;
    }

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

    /**
     * Set name
     *
     * @param string $name
     * @return Account
     */
    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

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

    /**
     * Set currency
     *
     * @param string $currency
     * @return Account
     */
    public function setCurrency($currency)
    {
        $this->currency = $currency;

        return $this;
    }

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

    /**
     * Set holders
     *
     * @param null|Doctrine\Common\Collections\ArrayCollection $holders
     * @return Account
     */
    public function setHolders($holders)
    {
        if ($holders === null) {
            $this->holders = new ArrayCollection();
        } else {
            $this->holders = $holders;
        }

        return $this;
    }

    /**
     * Get holders
     *
     * @return string
     */
    public function getHolders()
    {
        return $this->holders;
    }
    /**
     *
     * Get Pocket accounts
     *
     * @return \Doctrine\Common\Collections\ArrayCollection()
     */
    public function getPocketAccounts()
    {
        return $this->pocketAccounts;
    }

    public function setPocketAccounts($PocketAccounts)
    {
        $this->pocketAccounts = $PocketAccounts;
        return $this;
    }

    /**
     * Get Parent Account
     *
     * @return \Far\MT\AccountBundle\Entity\Account
     *
     */
    public function getParentAccount()
    {
        return $this->parentAccount;
    }

    public function setParentAccount($ParentAccount)
    {
        $this->parentAccount = ($ParentAccount);
        return $this;
    }
    /**
     * does this account has a parent
     *
     * @return boolean
     */
    public function hasParentAccount()
    {
        return ($this->parentAccount !== null);
    }

    public function setAccountType($accountType)
    {
        $this->accountType = $accountType;
        return $this;
    }

    public function getAccountType()
    {
        return $this->accountType;
    }

    public function getTotalAccounted()
    {
        return $this->totalAccounted;
    }

    public function setTotalAccounted($total)
    {
        $this->totalAccounted = $total;
        return $this;
    }

    public function getTotalAvailable()
    {
        return $this->totalAvailable;
    }

    public function setTotalAvailable($total)
    {
        $this->totalAvailable = $total;
        return $this;
    }

    public function __toString()
    {

        return 'Account';
    }
}

Please note that what is updated is the Movement entity witch contains the Account in fromAccount and toAccount.

  • 写回答

1条回答 默认 最新

  • douyong1850 2013-04-13 23:18
    关注

    Not knowing the answer he pointed out to me that I did not understand the data_class parameter.

        'data_class' => 'Far\MT\AccountBundle\Entity\Account'
    

    18:37 < ocramius> netcrash: no, sorry, can't help since I don't know what data_class does (not a sf2 form user)

    I was missing a Data Transformer, data_class (specifying the Entity was working not sure the reason why...), I placed a DataTransformer and it solved the issue. See bellow.

    use Far\MT\AccountBundle\Form\DataTransformer\AccountToIdTransformer;
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Doctrine\Common\Persistence\ObjectManager;
    use Symfony\Component\OptionsResolver\OptionsResolverInterface;
    
    class Accounts extends AbstractType
    {
        /**
         *
         * @var EntityManager
         */
        private $em;
    
        private $accountrepo = null;
    
        private $choices = array();
    
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            parent::buildForm($builder, $options);
            $transformer = new AccountToIdTransformer($this->em);
            $builder->addModelTransformer($transformer);
        }
    
        public function setAccountRepository($repo)
        {
            $this->accountrepo = $repo;
            return $this;
        }
    
        public function setDefaultOptions(OptionsResolverInterface $resolver)
        {
            $resolver->setDefaults([
            'choices' => $this->getChoices(),
            'attr' => [
                        'data-dojo-type' => 'dijit/form/FilteringSelect',
                        ]
            ]);
        }
    
        public function getParent()
        {
            return 'choice';
        }
    
        public function getName()
        {
            return 'Accounts';
        }
    
        public function getChoices()
        {
            if ( count($this->choices) > 0 ) {
                return $this->choices;
            }
            $this->choices[0] = "";
            foreach ($this->accountrepo->findAll() as $account) {
                $this->choices[$account->getId()] = $account->getName() . " (" .
                $account->getCurrency().") ";
            }
            return $this->choices;
        }
    
    }
    

    And the data transformer:

    /**
     * This is a transformer for the Account AbstractType
     *
     * @link http://symfony.com/doc/master/cookbook/form/data_transformers.html
     *
     * @author andref
     */
    class AccountToIdTransformer implements DataTransformerInterface
    {
        /**
         * @var ObjectManager
         */
        private $om;
    
        /**
         *
         * @param ObjectManager $om
         */
        public function __construct($om)
        {
            $this->om = $om;
        }
        /**
         * Transforms an object (issue) to a int (Id).
         *
         * @param  Account|null $account
         * @return string
         */
        public function transform($account)
        {
            if (null === $account) {
                return "";
            }
    
            return $account->getId();
        }
    
        /**
         * Transforms a int (Id) to an object (Account).
         *
         * @param  int $Id
         *
         * @return Account|null
         *
         * @throws TransformationFailedException if object (Account) is not found.
         */
        public function reverseTransform($id)
        {
            if (!$id) {
                return null;
            }
    
            $Account = $this->om
                ->getRepository('FarMTAccountBundle:Account')
                ->findOneBy(array('id' => $id))
            ;
    
            if (null === $Account) {
                throw new TransformationFailedException(sprintf(
                    'An Account with Id "%s" does not exist!',
                    $id
                ));
            }
    
            return $Account;
        }
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。