jo/entityformmanager

用于 nette 表单的实体表单管理器

dev-master 2022-11-24 19:32 UTC

This package is auto-updated.

Last update: 2024-09-24 23:17:02 UTC


README

在 nette kdyby doctrine 上测试

描述

功能

  • 将表单字段注册到 nette 表单中
  • 填充表单字段标签
  • 从表单数据创建实体
  • 通过表单数据修改实体
  • 创建与实体关联的字段表单
  • 从实体填充表单 - 用于编辑表单
  • 通过模板 "some str %caption% ... " 自动生成必填字段文本

字段注册

规则

  • @ORM\ManyToOne(targetEntity="Entity\Company\CompanyProduction") 用于注册关联实体字段的选择框。
  • @ORM\Column(type="date") - 注册日期列
  • @ORM\Column(type="text") - 注册文本区域
  • @ORM\Column(type="boolean") - 注册复选框
  • 其他 - 注册输入文本

通过 #formLabel="some label" 从标签自动生成

	**
	 * #formLabel="materiál" UI form label
	 *
	 * @ORM\ManyToOne(targetEntity="\Entity\Jobs\Material")
	 * @ORM\JoinColumn(name="material_id",referencedColumnName="id",nullable=false,onDelete="CASCADE")
	 *
	 */

接口描述

 /**
 * Creates entity and fill fomm values
 * @param array $excludeInputs
 * @param \Nette\Forms\Container $container
 * @return object Entity
 */
public function createEntityFromForm($excludeInputs = array(), \Nette\Forms\Container $container = null)

/**
 * Register form fields by entity.
 * For associed fileds creates input select
 * For boolean fields creates checkbox
 * For datetime fields try call addDatePicker for show date picker
 * For other columns creates input text
 *
 * @param array $exclude
 * @param bool $itemsIsWhitelist - determine wheter items are white list or blacklist
 * @param \Nette\Forms\Container $container If given, fields will be registered into container
 * @param bool $autoRequire  - allow automatically set required fields with message (EntityFormManager::setRequiredMsgTpl())
 */
public function createFields($items = array(), $itemsIsWhitelist = false, \Nette\Forms\Container $container = null,$autoRequire=false)

/**
 * Fill entity by form values
 * Attention - Fill only fields which has noassociation and scalar values
 *
 * @param object $entity
 * @param array $excludeInputs
 * @return object Entity
 */
public function fillEntityFromForm($entity, $excludeInputs = array(), \Nette\Forms\Container $container = null)

/**
 * Fill form values from given entity.
 *
 * Accept
 *  - scalar  values
 *  - \DateTime object
 * Other typs are skipped and form fileds not filled
 *
 * @param object $entity
 * @param \Nette\Forms\Container $container
 * @param bool $fillAssoc fill fields with association
 * @param string $locale - locale for \DateTime object. Example cs_CZ|en_US|sk_SK|hu_HU ...
 *
 */
public function fillFormFromEntity($entity, \Nette\Forms\Container $container = null, $fillAssoc = true, $locale = 'cs_CZ')

/**
 * Fill form field with association to other entity.
 * Usage for example on selectbox, id will filled form given entity.
 * Given entity class will be checked oposite to associated target entity.
 * On target entity is called method getId()
 *
 * @param string $elementName
 * @param object $entity - doctrine entity
 * @param \Nette\Forms\Container $container
 */
public function fillFormFromEntityAssoc($elementName,$entity, \Nette\Forms\Container $container = null)

/**
 *
 * @param string $elementName
 * @param \Nette\Forms\Container $container
 * @return type
 */
public function getElementValue($elementName,\Nette\Forms\Container $container=null)

/**
 * Return target entity instance of associated property.
 * Value of form (or Container) element is used as id of target entity.
 * Internaly use EntityManager::find(targetEnityClass,elemet::getValue())
 *
 * @param string $elementName
 * @param \Nette\Forms\Container $container
 * @return type
 */
public function getEntityFromAssoc($elementName, \Nette\Forms\Container $container = null)


/**
 *
 * @param string $prefix
 * @param array $exclude
 */
public function getFormCols($exclude = array())

/**
 * Return form or container element
 * @param string $elementName - element name without prefix
 * @param \Nette\Forms\Container $container
 * @return \Nette\Forms\Controls\BaseControl
 */
public function getFormElement($elementName,\Nette\Forms\Container $container=null)

/**
 * Set value of form element
 * @param string $elementName - element name without prefix
 * @param mixed $value
 * @param \Nette\Forms\Container $container
 * @return \JO\Nette\Doctrine\EntityFormManager
 */
public function setElementValue($elementName,$value,\Nette\Forms\Container $container=null)

/**
 * Template for reuired  fields
 *
 * @param string $requiredTpl - " some str %_caption_% ... "
 * @return \JO\Nette\Doctrine\EntityFormManager
 */
public function setRequiredMsgTpl($requiredTpl)

表单管理器和表单构建器示例

Doctrine 实体

/**
 * Surcharge fro material
 *
 * @ORM\Entity(repositoryClass="MaterialSurchargeRepository")
 * @ORM\Table(name="`jobsMaterialSurcharge`")
 *
 *
 * @author Jan Oliva
 */
class MaterialSurcharge extends \Entity\BaseEntity
{
	/**
	 * #formLabel="materiál"
	 * @ORM\ManyToOne(targetEntity="\Entity\Jobs\Material")
	 * @ORM\JoinColumn(name="material_id",referencedColumnName="id",nullable=false,onDelete="CASCADE")
	 *
	 */
	protected $material;

	/**
	 * #formLabel="přirážka %"
	 * @ORM\Column(type="float",nullable=false)
	 */
	protected $surcharge;

	/**
	 * #formLabel="firma"
	 * @ORM\ManyToOne(targetEntity="Entity\Company\CompanyProduction")
	 * @ORM\JoinColumn(name="companyProduction_id",referencedColumnName="id",nullable=false)
	 *
	 */
	protected $companyProduction;

	/**
	 * #formLabel="poznámka"
	 * @ORM\Column(type="text",nullable=true)
	 */
	protected $note;

}

表单构建器类

<?php
use JO\Nette\Application\UI\FormBootstrapRenderer;
use JO\Nette\Application\UI\FormFactory;
use JO\Nette\Doctrine\EntityFormManager;

/**
 * Description of FormBuilder
 *
 * @author Jan Oliva
 */
class FormBuilder extends FormFactory
{
	public function registerFields()
	{
		//instance of form manager
		$man = new EntityFormManager($this->form,'\Entity\Jobs\MaterialSurcharge, $this->context->EntityManager);

		//register fields of entity
		$man->createFields(array('surcharge','companyProduction','note'), $itemsIsWhitelist=true,$container=null,$autoRequire=true);

		$man->getFormElement('surcharge')
				->addRule(\Nette\Forms\Form::FLOAT,"Vyplňte pole přirážka % prosím");

		//get form element by form manager
		$companySelect = $man->getFormElement('companyProduction');
		/* @var $companySelect \Nette\Forms\Controls\SelectBox */

		$companySelect
				->setRequired("Vyber firmu");

		return $this->getForm();
	}

}

表示者

use JO\Nette\Application\UI\FormBootstrapRenderer;
use JO\Nette\Application\UI\FormFactory;
use JO\Nette\Doctrine\EntityFormManager;

	/**
	 *
	 * @var EntityFormManager
	 */
	protected $formManager;

	protected $entityName = '\Entity\Jobs\MaterialSurcharge';

protected function createComponentMaterialSurchargeForm($name)
{
		$builder = new FormBuilder($this->context, new Form($this, $name));
		$form = $builder->registerFields();
		return $form;
}

public function actionAdd($material_id=null)
{
		$form = $this->getComponent('materialSurchargeForm');
		/* @var $form Form */

		//create instance of entity form manager
		$this->formManager = new EntityFormManager($form, $this->entityName, $this->entityManager);

		$form->addSubmit(FormBuilder::SUBMIT_ADD, "add surcharge")
				->onClick[] = callback($this,'add');

		some other code
}

/**
 * Form callback
 * Create entity from form data and save entity
 */
public function add(SubmitButton $button)
{
		//create entity of asscociated field by association metadata of entity
		$company = $this->formManager->getEntityFromAssoc('companyProduction',$button->getForm());
		/* @var $company \Entity\Company\CompanyProduction */

		//create entity from submited form
		$surcharge = $this->formManager->createEntityFromForm();
		/* @var $surcharge MaterialSurcharge */

		$surcharge
				->setMaterial($material)
				->setCompanyProduction($company);

		//save entity now
}

```