Dans le module Tag tu te hook sur l'onglet général. Je me hook sur product.tab-content je ne peux donc pas utiliser l'event ProductEvent, j'utilise un que j'ai crée et que j'instancie dans mon controller en lui passant les data souhaité.
Mais même pour l'initialisation du formulaire ça ne fonctionne pas car dans ton module (de ce que j'ai vu) tu te hook sur un formulaire existant, moi c'est un formulaire qui n'existe pas et je dois l'instancier dans mon hook.
public function onProductTabContent(HookRenderEvent $event)
{
$productId = $this->getRequest()->getProductId();
$product = \Thelia\Model\ProductQuery::create()->findPk($productId);
if ($product->getTemplateId() === (int) MyModule::getConfigValue(MyModule::CONFIG_TEMPLATE_ID)) {
$event->add($this->render('product-edit-svg.html'));
}
else {
$colors = [
'colors_collection' => [
['color' => '#FFFFFF'],
['color' => '#FFFFFF'],
['color' => '#FFFFFF'],
],
];
$form = new ProductColorForm($this->getRequest(), 'form', $colors);
$event->add($this->render('product-edit-colors.html', ['form' => $form]));
}
}
Dans mon formulaire par contre je peux faire ceci et j'ai données par défaut, mais j'aimerais le faire dans le hook pour récupérer les valeurs depuis la base de donnée si il y en a, sinon j'afficherai des valeurs par défaut.
$this->formBuilder->setData([
'colors_collection' => [
['color' => '#FFFFFF'],
['color' => '#FFFFFF'],
['color' => '#FFFFFF'],
],
]);
La vue
<div class="general-block-decorator">
<div class="row">
<div class="col-md-12">
<p class="title title-without-tabs">{intl d="mymodule.bo.default" l="Associated product"}</p>
{form name="mymodule.product.color.form"}
<form action="{url path="/admin/product/$product_id"}/mymodulecolor" method="POST">
{include
file = "includes/inner-form-toolbar.html"
hide_submit_buttons = false
hide_flags = true
page_url = "{url path='/admin/products/update' product_id=$ID}"
close_url = "{url path='/admin/categories' category_id=$DEFAULT_CATEGORY}"
}
{if $form_error}<div class="alert alert-danger">{$form_error_message}</div>{/if}
{form_hidden_fields form=$form}
<input type="hidden" name="product_id" value="{$product_id}">
{form_field field='success_url'}
<input type="hidden" name="{$name}" value="{url path='/admin/categories' category_id=$DEFAULT_CATEGORY}">
{/form_field}
{form_field form=$form field="product_svg_id"}
<div class="form-group {if $error}has-error{/if}">
<label for="{$label_attr.for}" class="control-label">{$label}</label>
<select name="{$name}" id="{$label_attr.for}" class="form-control">
<option value="0">{intl l="Choose a custom product" d="mymodule.bo.default"}</option>
{loop type="product" name="mymodule-product"}
<option value="{$ID}">{$TITLE}</option>
{/loop}
</select>
</div>
{/form_field}
{form_collection form=$form collection="colors_collection"}
<div class="form-group {if $error}has-error{/if}">
{form_collection_field form=$form row=$row field="color"}
<label class="control-label">{$label}</label>
<input type="text" name="{$name}" id="{$label_attr.for}" class="form-control" value="{$value}" />
{/form_collection_field}
</div>
{/form_collection}
</form>
{/form}
</div>
</div>
</div>
Dans mon controller je fais ceci :
public function addColorAction($product_id)
{
$form = $this->createForm('mymodule.product.color.form');
$error_message = null;
try {
$validateForm = $this->validateForm($form);
$data = $validateForm->getData();
// ProductColorEvent est un event que j'ai crée pour ce besoin
$event = new ProductColorEvent(
$this->getRequest()->getProductId(),
$data['product_svg_id'],
$data['colors_collection']
);
$this->dispatch('mymodule.product.color.create', $event); // Je sauvegarde dans mon Listener
if ($this->getRequest()->get('save_mode') == 'stay') {
return $this->generateRedirectFromRoute('admin.products.update', ['product_id' => $product_id]);
} else {
return $this->generateSuccessRedirect($form);
}
} catch (\Exception $e) {
$error_message = $e->getMessage();
Tlog::getInstance()->error("Failed to validate mymodule.product.color.form: $error_message");
}
$this->setupFormErrorContext(
'Fail to process Product Color form data',
$error_message,
$form
);
return $this->render("product-edit");
}
Mais pour le coup ça ne fonctionne pas