Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何映射产品实体,以便按照条令进行管理?_Php_Symfony_Doctrine_Prestashop_Prestashop 1.7 - Fatal编程技术网

Php 如何映射产品实体,以便按照条令进行管理?

Php 如何映射产品实体,以便按照条令进行管理?,php,symfony,doctrine,prestashop,prestashop-1.7,Php,Symfony,Doctrine,Prestashop,Prestashop 1.7,我试图在PS 1.7.6.1下构建一个模块 在设计中,我在一个产品和一个预订单(多个预订单可以关联到一个产品)之间有一个多单关系 预订单对象是ORM实体: //mymodule/src/Entity class Preorder { /** * @var int * * @ORM\Id * @ORM\Column(name="id_preorder", type="integer") * @ORM\GeneratedValue(strat

我试图在PS 1.7.6.1下构建一个模块

在设计中,我在一个产品和一个预订单(多个预订单可以关联到一个产品)之间有一个多单关系

预订单对象是ORM实体:

//mymodule/src/Entity
class Preorder
{
    /**
     * @var int
     *
     * @ORM\Id
     * @ORM\Column(name="id_preorder", type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var int
     *
     * @ORM\Column(name="id_product", type="integer")
     */
    private $productId;

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

    setter and getter
}
在控制器中:

//src/mymodule/src/Controller


use Doctrine\DBAL\Types\TextType;
use PrestaShopBundle\Controller\Admin\FrameworkBundleAdminController;
use Doctrine\ORM\EntityManagerInterface;
use MyModule\Entity\Preoder;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\HttpFoundation\Request;
use Product;

class PreorderController extends FrameworkBundleAdminController
{
public function createAction(Request $request){

        $preorder = new Preorder();
        $preorderForm = $this->createFormBuilder($preorder)
                ->add('email', EmailType::class)
                ->add('productId', EntityType::class, [
                    'class' => Product::class,
                ])
                ->getForm();

        $bookingForm->handleRequest($request);

// validate and persist
}}
问题是表单生成器无法识别产品实体。它会引发运行时异常:

“产品”类似乎不是一个管理主义实体。是吗 忘了画地图了吗


我在核心文件中找不到处理此类场景的示例。非常感谢您提前指导/帮助我解决此问题。

主要问题是
产品id
不是一个实体,因此
formbuilder
使用
EntityType::class
处理此问题的可能性为零。您需要正确定义(如中所述)与对象的manytone关系

在产品方面:

/**
*@ORM\Entity(repositoryClass=“App\Repository\ProductRepository”)
*/
类产品
{
//平常的东西
/**
*@ORM\manytone(targetEntity=“App\Entity\User”,inversedBy=“product”,cascade={“persist”})
*/
私人$preorder;
}
在预订方面:

/**
*@ORM\Entity(repositoryClass=“App\Repository\ProductRepository”)
*/
类产品
{
//平常的东西
/**
*@ORM\OneToMany(targetEntity=“App\Entity\Product”,mappedBy=“preorders”)
*/
私人产品;
}
在formBuilder中,
产品
将是一个
实体
,并通过
EntityType::class

编辑 如果您的
产品
是ORM未映射的遗留类,则可以使用帮助formBuilder识别遗留实体

namespace-App\DataTransformer;
类ProductToIdTransformer实现DataTransformerInterface
{
公共职能转变($产品)
{
如果(null==$product){
返回“”;
}
返回$product->getId();
}
公共函数反向转换($product\U id)
{
如果(!$product\U id){
回来
} 
//用于检索产品的数据库逻辑
如果(空==$字段){
抛出新的TransformationFailedException(sprintf(“产品'%s'不存在!”,$product_id));
}
退回$product;
}
}
然后在formbuilder中,您将使用:

$preorderForm=$this->createFormBuilder($preorder)
->添加('email',EmailType::class)
->添加('product',CollectionType::class[
'class'=>Product::class,
//根据您的需要调整不同选择的一些逻辑
])
;
$preorderForm
->获取('产品')
->addModelTransformer(ProductToIdTransformer::类)
;
$preorderForm=$preorderForm->getForm();

我们能看到这种关系的产品方面吗?我完全同意你的看法。您提供的两个代码片段中的问题是:它们假定产品是ORM实体,而产品是遗留代码()中的一个简单类。这个类还没有迁移到一个条令实体(以我拙劣的理解)。我可以在迁移的代码中看到,他们设法使用适配器实例化一个产品对象,并在控制器中使用它,但这种情况又如何呢?srroy,我没有将其作为遗留代码。看一看,它可能会使技巧和使用
collectionType
代替谢谢你的信息链接。使用数据转换器听起来是个好主意。我会试着回来了解细节。您可以编辑您的答案吗?我添加了一种处理未映射类的方法,请注意这是一个更复杂的过程,您需要实现自己的逻辑来检索
CollectionType
的选项,以便对未来的读者最诚实,我最终没有使用数据转换器,因为我发现我的OP没有正确描述我的问题。在阅读文档和您提供的编辑后,我确信OP需要这个答案,所以我将其标记为正确。非常感谢你,皮尔里克