[英]How to concat inputs in symfony twig
目前正在开发一个使用 symfony 的框架。 我试图实现连接 2 种输入类型(输入日期和时间),将其放入变量中并将其存储并存储到数据库中。 有什么文件需要我检查吗? 我只是找不到在哪里检查。
提前感谢您的帮助!
以下是文件及其代码
表格/产品类型文件
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('product_release_date', DateType::class, [
'widget' => 'single_text',
'required' => false,
])
->add('product_release_time', TimeType::class, [
'placeholder' => [
'hour' => 'Hour', 'minute' => 'Minute', 'second' => 'Second',
],
]);
$builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
/** @var FormInterface $form */
$form = $event->getForm();
});
}
产品 Controller
public function edit(Request $request, $id = null, RouterInterface $router, CacheUtil $cacheUtil)
{
$has_class = false;
if (is_null($id)) {
$Product = new Product();
$ProductClass = new ProductClass();
$ProductStatus = $this->productStatusRepository->find(ProductStatus::DISPLAY_HIDE);
$Product
->addProductClass($ProductClass)
->setStatus($ProductStatus);
$ProductClass
->setVisible(true)
->setStockUnlimited(true)
->setProduct($Product);
$ProductStock = new ProductStock();
$ProductClass->setProductStock($ProductStock);
$ProductStock->setProductClass($ProductClass);
} else {
$Product = $this->productRepository->find($id);
$ProductClass = null;
$ProductStock = null;
if (!$Product) {
throw new NotFoundHttpException();
}
$has_class = $Product->hasProductClass();
if (!$has_class) {
$ProductClasses = $Product->getProductClasses();
foreach ($ProductClasses as $pc) {
if (!is_null($pc->getClassCategory1())) {
continue;
}
if ($pc->isVisible()) {
$ProductClass = $pc;
break;
}
}
if ($this->BaseInfo->isOptionProductTaxRule() && $ProductClass->getTaxRule()) {
$ProductClass->setTaxRate($ProductClass->getTaxRule()->getTaxRate());
}
$ProductStock = $ProductClass->getProductStock();
}
}
$builder = $this->formFactory
->createBuilder(ProductType::class, $Product);
if ($has_class) {
$builder->remove('class');
}
$event = new EventArgs(
[
'builder' => $builder,
'Product' => $Product,
],
$request
);
$this->eventDispatcher->dispatch(EccubeEvents::ADMIN_PRODUCT_EDIT_INITIALIZE, $event);
$form = $builder->getForm();
if (!$has_class) {
$ProductClass->setStockUnlimited($ProductClass->isStockUnlimited());
$form['class']->setData($ProductClass);
}
// ファイルの登録
$images = [];
$ProductImages = $Product->getProductImage();
foreach ($ProductImages as $ProductImage) {
$images[] = $ProductImage->getFileName();
}
$form['images']->setData($images);
$categories = [];
$ProductCategories = $Product->getProductCategories();
foreach ($ProductCategories as $ProductCategory) {
/* @var $ProductCategory \Eccube\Entity\ProductCategory */
$categories[] = $ProductCategory->getCategory();
}
$form['Category']->setData($categories);
$Tags = $Product->getTags();
$form['Tag']->setData($Tags);
if ('POST' === $request->getMethod()) {
$form->handleRequest($request);
if ($form->isValid()) {
log_info('商品登録開始', [$id]);
$Product = $form->getData();
if (!$has_class) {
$ProductClass = $form['class']->getData();
if ($this->BaseInfo->isOptionProductTaxRule()) {
if ($ProductClass->getTaxRate() !== null) {
if ($ProductClass->getTaxRule()) {
$ProductClass->getTaxRule()->setTaxRate($ProductClass->getTaxRate());
} else {
$taxrule = $this->taxRuleRepository->newTaxRule();
$taxrule->setTaxRate($ProductClass->getTaxRate());
$taxrule->setApplyDate(new \DateTime());
$taxrule->setProduct($Product);
$taxrule->setProductClass($ProductClass);
$ProductClass->setTaxRule($taxrule);
}
$ProductClass->getTaxRule()->setTaxRate($ProductClass->getTaxRate());
} else {
if ($ProductClass->getTaxRule()) {
$this->taxRuleRepository->delete($ProductClass->getTaxRule());
$ProductClass->setTaxRule(null);
}
}
}
$this->entityManager->persist($ProductClass);
// 在庫情報を作成
if (!$ProductClass->isStockUnlimited()) {
$ProductStock->setStock($ProductClass->getStock());
} else {
// 在庫無制限時はnullを設定
$ProductStock->setStock(null);
}
$this->entityManager->persist($ProductStock);
}
/* @var $Product \Eccube\Entity\Product */
foreach ($Product->getProductCategories() as $ProductCategory) {
$Product->removeProductCategory($ProductCategory);
$this->entityManager->remove($ProductCategory);
}
$this->entityManager->persist($Product);
$this->entityManager->flush();
$count = 1;
$Categories = $form->get('Category')->getData();
$categoriesIdList = [];
foreach ($Categories as $Category) {
foreach ($Category->getPath() as $ParentCategory) {
if (!isset($categoriesIdList[$ParentCategory->getId()])) {
$ProductCategory = $this->createProductCategory($Product, $ParentCategory, $count);
$this->entityManager->persist($ProductCategory);
$count++;
/* @var $Product \Eccube\Entity\Product */
$Product->addProductCategory($ProductCategory);
$categoriesIdList[$ParentCategory->getId()] = true;
}
}
if (!isset($categoriesIdList[$Category->getId()])) {
$ProductCategory = $this->createProductCategory($Product, $Category, $count);
$this->entityManager->persist($ProductCategory);
$count++;
/* @var $Product \Eccube\Entity\Product */
$Product->addProductCategory($ProductCategory);
$categoriesIdList[$Category->getId()] = true;
}
}
$add_images = $form->get('add_images')->getData();
foreach ($add_images as $add_image) {
$ProductImage = new \Eccube\Entity\ProductImage();
$ProductImage
->setFileName($add_image)
->setProduct($Product)
->setSortNo(1);
$Product->addProductImage($ProductImage);
$this->entityManager->persist($ProductImage);
// 移動
$file = new File($this->eccubeConfig['eccube_temp_image_dir'].'/'.$add_image);
$file->move($this->eccubeConfig['eccube_save_image_dir']);
}
$delete_images = $form->get('delete_images')->getData();
$fs = new Filesystem();
foreach ($delete_images as $delete_image) {
$ProductImage = $this->productImageRepository->findOneBy([
'Product' => $Product,
'file_name' => $delete_image,
]);
if ($ProductImage instanceof ProductImage) {
$Product->removeProductImage($ProductImage);
$this->entityManager->remove($ProductImage);
$this->entityManager->flush();
if (!$this->productImageRepository->findOneBy(['file_name' => $delete_image])) {
$fs->remove($this->eccubeConfig['eccube_save_image_dir'].'/'.$delete_image);
}
} else {
$fs->remove($this->eccubeConfig['eccube_temp_image_dir'].'/'.$delete_image);
}
}
$this->entityManager->flush();
$sortNos = $request->get('sort_no_images');
if ($sortNos) {
foreach ($sortNos as $sortNo) {
list($filename, $sortNo_val) = explode('//', $sortNo);
$ProductImage = $this->productImageRepository
->findOneBy([
'file_name' => $filename,
'Product' => $Product,
]);
$ProductImage->setSortNo($sortNo_val);
$this->entityManager->persist($ProductImage);
}
}
$this->entityManager->flush();
$ProductTags = $Product->getProductTag();
foreach ($ProductTags as $ProductTag) {
$Product->removeProductTag($ProductTag);
$this->entityManager->remove($ProductTag);
}
$Tags = $form->get('Tag')->getData();
foreach ($Tags as $Tag) {
$ProductTag = new ProductTag();
$ProductTag
->setProduct($Product)
->setTag($Tag);
$Product->addProductTag($ProductTag);
$this->entityManager->persist($ProductTag);
}
$Product->setUpdateDate(new \DateTime());
$this->entityManager->flush();
log_info('商品登録完了', [$id]);
$event = new EventArgs(
[
'form' => $form,
'Product' => $Product,
],
$request
);
$this->eventDispatcher->dispatch(EccubeEvents::ADMIN_PRODUCT_EDIT_COMPLETE, $event);
$this->addSuccess('admin.common.save_complete', 'admin');
if ($returnLink = $form->get('return_link')->getData()) {
try {
$pattern = '/^'.preg_quote($request->getBasePath(), '/').'/';
$returnLink = preg_replace($pattern, '', $returnLink);
$result = $router->match($returnLink);
$params = array_filter($result, function ($key) {
return 0 !== \strpos($key, '_');
}, ARRAY_FILTER_USE_KEY);
// pathからurlを再構築してリダイレクト.
return $this->redirectToRoute($result['_route'], $params);
} catch (\Exception $e) {
// マッチしない場合はログ出力してスキップ.
log_warning('URLの形式が不正です。');
}
}
$cacheUtil->clearDoctrineCache();
return $this->redirectToRoute('admin_product_product_edit', ['id' => $Product->getId()]);
}
}
$builder = $this->formFactory
->createBuilder(SearchProductType::class);
$event = new EventArgs(
[
'builder' => $builder,
'Product' => $Product,
],
$request
);
$this->eventDispatcher->dispatch(EccubeEvents::ADMIN_PRODUCT_EDIT_SEARCH, $event);
$searchForm = $builder->getForm();
if ('POST' === $request->getMethod()) {
$searchForm->handleRequest($request);
}
// Get Tags
$TagsList = $this->tagRepository->getList();
$TopCategories = $this->categoryRepository->getList(null);
$ChoicedCategoryIds = array_map(function ($Category) {
return $Category->getId();
}, $form->get('Category')->getData());
return [
'Product' => $Product,
'Tags' => $Tags,
'TagsList' => $TagsList,
'form' => $form->createView(),
'searchForm' => $searchForm->createView(),
'has_class' => $has_class,
'id' => $id,
'TopCategories' => $TopCategories,
'ChoicedCategoryIds' => $ChoicedCategoryIds,
];
}
Twig文件
<div class="row">
<div class="col-3">
<div class="d-inline-block">
<span>{{ 'admin.product.release'|trans }}</span>
</div>
</div>
<div class="col mb-2">
{{ form_widget(form.product_release_date) }}
{{ form_errors(form.product_release_date) }}
</div>
</div>
<div class="row">
<div class="col-3">
<div class="d-inline-block">
<span>{{ 'admin.product.releasetime'|trans }}</span>
</div>
</div>
<div class="col mb-2">
{{ form_widget(form.product_release_time) }}
{{ form_errors(form.product_release_time) }}
</div>
</div>
DateTimeType 在 Symfony 中可用。
$builder->add('product_release_date', DateTimeType::class, [
'widget' => 'choice', // or single_text
'required' => false
]);
有关更多详细信息https://symfony.com/doc/current/reference/forms/types/datetime.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.