cvs: pear /DB_DataObject_FormBuilder FormBuilder.php /DB_DataObject_FormBuilder/FormBuilder QuickForm.php
| From: | Justin Patrin | Date: | Sat, 25 Feb 2006 05:30:02 +0000 |
| Subject: | cvs: pear /DB_DataObject_FormBuilder FormBuilder.php /DB_DataObject_FormBuilder/FormBuilder QuickForm.php | ||
| Groups: | php.pear.cvs | ||
| Request: | Send a blank email to pear-cvs+get-38582@lists.php.net to get a copy of this message | ||
justinpatrin Sat Feb 25 05:30:02 2006 UTC
Modified files:
/pear/DB_DataObject_FormBuilder FormBuilder.php
/pear/DB_DataObject_FormBuilder/FormBuilder QuickForm.php
Log:
Thanks to Brett Beiber for this patch
Allow setting of reverseLinkNewValue for reverseLinks individually (old true/false also works)
Fix linkElementTypes for reverseLinks
Implement and use _createSubForm in QuickForm renderer
Allow multiple SubForms for each reverseLink
http://cvs.php.net/viewcvs.cgi/pear/DB_DataObject_FormBuilder/FormBuilder.php?r1=1.216&r2=1.217&diff_format=u Index: pear/DB_DataObject_FormBuilder/FormBuilder.php diff -u pear/DB_DataObject_FormBuilder/FormBuilder.php:1.216 pear/DB_DataObject_FormBuilder/FormBuilder.php:1.217 --- pear/DB_DataObject_FormBuilder/FormBuilder.php:1.216 Wed Feb 22 19:13:55 2006 +++ pear/DB_DataObject_FormBuilder/FormBuilder.php Sat Feb 25 05:30:02 2006 @@ -89,7 +89,7 @@ * @author Justin Patrin <papercrane@reversefold.com> * @copyright 1997-2005 The PHP Group * @license http://www.php.net/license/3_0.txt PHP License 3.0 - * @version $Id: FormBuilder.php,v 1.216 2006/02/22 19:13:55 justinpatrin Exp $ + * @version $Id: FormBuilder.php,v 1.217 2006/02/25 05:30:02 justinpatrin Exp $ * @link http://pear.php.net/package/DB_DataObject_FormBuilder * @see DB_DataObject, HTML_QuickForm */ @@ -379,6 +379,18 @@ */ var $linkNewValue = array(); + /** + * If set to true, all reverseLinks will have a SubForm to create a new linked record. + * Upon submit the sub-form will be checked for validity as normal and, if valid, will + * create a new record in the reverseLink table. + * + * If set to false all reverseLinks will only display existing reverseLink records. + * + * You may also set this to be an array with the names of the reverseLink elements to + * create new linked record sub-forms for. + * You can simply use '__reverseLink_table_field'=>true, or set to an integer to + * display a number of sub-forms. + */ var $reverseLinkNewValue = array(); /** @@ -1443,10 +1455,8 @@ if ($this->reverseLinks[$key]['collapse']) { $table = $rowNames = array(); } - if (isset($this->linkElementTypes[$this->reverseLinks[$key]['table']]) - && $this->linkElementTypes[$this->reverseLinks[$key]['table']] == 'subForm') { - // Make sure the subform element is in there. - require_once('HTML/QuickForm/SubForm.php'); + if (isset($this->linkElementTypes[$elName]) + && $this->linkElementTypes[$elName] == 'subForm') { // Do this to find only reverseLinks with the correct foreign key. $do->{$this->reverseLinks[$key]['field']} = $this->_do->{$this->_getPrimaryKey($this->_do)}; } @@ -1458,20 +1468,19 @@ } elseif ($rLinked =& $do->getLink($this->reverseLinks[$key]['field'])) { $label .= '<b>'.$this->reverseLinks[$key]['linkText'].$this->getDataObjectString($rLinked).'</b>'; } - if (isset($this->linkElementTypes[$this->reverseLinks[$key]['table']]) - && $this->linkElementTypes[$this->reverseLinks[$key]['table']] == 'subForm') { + if (isset($this->linkElementTypes[$elName]) + && $this->linkElementTypes[$elName] == 'subForm') { unset($subFB, $subForm, $subFormEl); $subFB =& DB_DataObject_FormBuilder::create($do); $this->reverseLinks[$key]['FBs'][] =& $subFB; - $subFB->elementNamePostfix = $elName; + $subFB->elementNamePrefix = $elName; + $subFB->elementNamePostfix = '_'.count($this->reverseLinks[$key]['FBs']); $subFB->createSubmit = false; $subFB->formHeaderText = $this->getDataObjectString($do);//$this->getFieldLabel($elName).' '.count($this->reverseLinks[$key]['FBs']); $do->fb_linkNewValue = false; $subForm =& $subFB->getForm(); $this->reverseLinks[$key]['SFs'][] = $subForm; - - //TODO: This should not be here, it breaks the driver idea - $subFormEl =& HTML_QuickForm::createElement('subForm', $elName.count($this->reverseLinks[$key]['FBs']), null, $subForm); + $subFormEl =& $this->_form->_createSubForm($elName.count($this->reverseLinks[$key]['FBs']), null, $subForm); $element[] =& $subFormEl; } else { if ($this->reverseLinks[$key]['collapse']) { @@ -1483,25 +1492,31 @@ } } } - if ($this->reverseLinkNewValue == true) { - unset($subFB, $subForm, $subFormEl); - // Add another subform to add a new reverseLink record. - $do = DB_DataObject::factory($this->reverseLinks[$key]['table']); - $do->{$lField} = $this->_do->{$this->_getPrimaryKey($this->_do)}; - $subFB =& DB_DataObject_FormBuilder::create($do); - $this->reverseLinks[$key]['FBs'][] =& $subFB; - $subFB->elementNamePostfix = $elName; - $subFB->createSubmit = false; - $subFB->formHeaderText = 'New '.(isset($do->fb_formHeaderText) - ? $do->fb_formHeaderText - : $this->prettyName($do->__table)); - $do->fb_linkNewValue = false; - $subForm =& $subFB->getForm(); - $this->reverseLinks[$key]['SFs'][] =& $subForm; - - //TODO: This should not be here, it should be calling a driver function - $subFormEl =& HTML_QuickForm::createElement('subForm', $elName.count($this->reverseLinks[$key]['FBs']), null, $subForm); - $element[] =& $subFormEl; + if (isset($this->reverseLinkNewValue[$elName]) && $this->reverseLinkNewValue[$elName] !== false) { + if (is_int($this->reverseLinkNewValue[$elName])) { + $totalSubforms = $this->reverseLinkNewValue[$elName]; + } else { + $totalSubforms = 1; + } + for ($i = 0; $i < $totalSubforms; $i++) { + unset($subFB, $subForm, $subFormEl); + // Add a subform to add a new reverseLink record. + $do = DB_DataObject::factory($this->reverseLinks[$key]['table']); + $do->{$lField} = $this->_do->{$this->_getPrimaryKey($this->_do)}; + $subFB =& DB_DataObject_FormBuilder::create($do); + $this->reverseLinks[$key]['FBs'][] =& $subFB; + $subFB->elementNamePrefix = $elName; + $subFB->elementNamePostfix = '_'.count($this->reverseLinks[$key]['FBs']); + $subFB->createSubmit = false; + $subFB->formHeaderText = 'New '.(isset($do->fb_formHeaderText) + ? $do->fb_formHeaderText + : $this->prettyName($do->__table)); + $do->fb_linkNewValue = false; + $subForm =& $subFB->getForm(); + $this->reverseLinks[$key]['SFs'][] =& $subForm; + $subFormEl =& $this->_form->_createSubForm($elName.count($this->reverseLinks[$key]['FBs']), null, $subForm); + $element[] =& $subFormEl; + } } if ($this->reverseLinks[$key]['collapse']) { $this->_form->_addElementTable($elName, array(), $rowNames, $table); @@ -2153,7 +2168,7 @@ } } } - foreach (array('preDefElements', 'fieldLabels', 'fieldAttributes') as $arrName) { + foreach (array('preDefElements', 'fieldLabels', 'fieldAttributes', 'reverseLinkNewValue') as $arrName) { if (isset($this->{$arrName}['__reverseLink_'.$reverseLink['table']])) { if (!isset($this->{$arrName}[$elName])) { $this->{$arrName}[$elName] =& $this->{$arrName}['__reverseLink_'.$reverseLink['table']]; @@ -2180,6 +2195,18 @@ $this->linkNewValue = array(); } } + if (!is_array($this->reverseLinkNewValue)) { + if ($new = $this->reverseLinkNewValue) { + $this->reverseLinkNewValue = array(); + if (is_array($this->reverseLinks)) { + foreach ($this->reverseLinks as $key => $reverseLink) { + $this->reverseLinkNewValue['__reverseLink_'.$reverseLink['table'].'_'.$reverseLink['field']] = $new; + } + } + } else { + $this->reverseLinkNewValue = array(); + } + } if (is_array($this->excludeFromAutoRules) && in_array('__ALL__', $this->excludeFromAutoRules) || '__ALL__' == $this->excludeFromAutoRules) { @@ -2841,8 +2868,8 @@ if (in_array($elName, $editableFields)) { // Check for subforms - if (isset($this->linkElementTypes[$reverseLink['table']]) - && $this->linkElementTypes[$reverseLink['table']] == 'subForm') { + if (isset($this->linkElementTypes[$elName]) + && $this->linkElementTypes[$elName] == 'subForm') { foreach($reverseLink['SFs'] as $sfkey => $subform) { // Process each subform that was rendered. if ($subform->validate()) { @@ -3125,4 +3152,4 @@ } } -?> \ No newline at end of file +?> http://cvs.php.net/viewcvs.cgi/pear/DB_DataObject_FormBuilder/FormBuilder/QuickForm.php?r1=1.64&r2=1.65&diff_format=u Index: pear/DB_DataObject_FormBuilder/FormBuilder/QuickForm.php diff -u pear/DB_DataObject_FormBuilder/FormBuilder/QuickForm.php:1.64 pear/DB_DataObject_FormBuilder/FormBuilder/QuickForm.php:1.65 --- pear/DB_DataObject_FormBuilder/FormBuilder/QuickForm.php:1.64 Thu Oct 20 17:17:10 2005 +++ pear/DB_DataObject_FormBuilder/FormBuilder/QuickForm.php Sat Feb 25 05:30:02 2006 @@ -11,7 +11,7 @@ * @license http://www.php.net/license/3_0.txt PHP License 3.0 * @author Markus Wolff <mw21st@php.net> * @author Justin Patrin <papercrane@reversefold.com> - * @version $Id: QuickForm.php,v 1.64 2005/10/20 17:17:10 justinpatrin Exp $ + * @version $Id: QuickForm.php,v 1.65 2006/02/25 05:30:02 justinpatrin Exp $ */ require_once ('HTML/QuickForm.php'); @@ -441,6 +441,7 @@ $subFormElement->selectName = $this->_fb->getFieldName($fieldName); $el =& $this->_form->addElement('hidden', $this->_fb->getFieldName($fieldName).'__subForm__displayed'); $el->updateAttributes(array('id' => $el->getName())); + //echo $this->_fb->getFieldName($fieldName).'<br/>'; $element =& HTML_QuickForm::createElement('group', $this->_fb->getFieldName($fieldName), $this->_fb->getFieldLabel($fieldName), @@ -452,6 +453,28 @@ } return $element; } + + /** + * DB_DataObject_FormBuilder_QuickForm::_createSubForm() + * + * Returns a QuickForm element for a SubForm. + * Used in _generateForm(). + * + * @param string $fieldName The field name to use for the QuickForm element + * @param string $label The label to use for the QuickForm element + * @param $subForm HTML_QuickForm element + * @return object The HTML_QuickForm_element object. + * @see DB_DataObject_FormBuilder::_generateForm() + */ + function &_createSubForm($fieldName, $label, &$subForm) + { + require_once('DB/DataObject/FormBuilder/QuickForm/SubForm.php'); + $element =& HTML_QuickForm::createElement('subForm', + $fieldName, + $label, + $subForm); + return $element; + } /** * Adds a form rule for linkNew entries
http://cvs.php.net/viewcvs.cgi/pear/DB_DataObject_FormBuilder/FormBuilder.php?r1=1.216&r2=1.217&diff_format=u Index: pear/DB_DataObject_FormBuilder/FormBuilder.php diff -u pear/DB_DataObject_FormBuilder/FormBuilder.php:1.216 pear/DB_DataObject_FormBuilder/FormBuilder.php:1.217 --- pear/DB_DataObject_FormBuilder/FormBuilder.php:1.216 Wed Feb 22 19:13:55 2006 +++ pear/DB_DataObject_FormBuilder/FormBuilder.php Sat Feb 25 05:30:02 2006 @@ -89,7 +89,7 @@ * @author Justin Patrin <papercrane@reversefold.com> * @copyright 1997-2005 The PHP Group * @license http://www.php.net/license/3_0.txt PHP License 3.0 - * @version $Id: FormBuilder.php,v 1.216 2006/02/22 19:13:55 justinpatrin Exp $ + * @version $Id: FormBuilder.php,v 1.217 2006/02/25 05:30:02 justinpatrin Exp $ * @link http://pear.php.net/package/DB_DataObject_FormBuilder * @see DB_DataObject, HTML_QuickForm */ @@ -379,6 +379,18 @@ */ var $linkNewValue = array(); + /** + * If set to true, all reverseLinks will have a SubForm to create a new linked record. + * Upon submit the sub-form will be checked for validity as normal and, if valid, will + * create a new record in the reverseLink table. + * + * If set to false all reverseLinks will only display existing reverseLink records. + * + * You may also set this to be an array with the names of the reverseLink elements to + * create new linked record sub-forms for. + * You can simply use '__reverseLink_table_field'=>true, or set to an integer to + * display a number of sub-forms. + */ var $reverseLinkNewValue = array(); /** @@ -1443,10 +1455,8 @@ if ($this->reverseLinks[$key]['collapse']) { $table = $rowNames = array(); } - if (isset($this->linkElementTypes[$this->reverseLinks[$key]['table']]) - && $this->linkElementTypes[$this->reverseLinks[$key]['table']] == 'subForm') { - // Make sure the subform element is in there. - require_once('HTML/QuickForm/SubForm.php'); + if (isset($this->linkElementTypes[$elName]) + && $this->linkElementTypes[$elName] == 'subForm') { // Do this to find only reverseLinks with the correct foreign key. $do->{$this->reverseLinks[$key]['field']} = $this->_do->{$this->_getPrimaryKey($this->_do)}; } @@ -1458,20 +1468,19 @@ } elseif ($rLinked =& $do->getLink($this->reverseLinks[$key]['field'])) { $label .= '<b>'.$this->reverseLinks[$key]['linkText'].$this->getDataObjectString($rLinked).'</b>'; } - if (isset($this->linkElementTypes[$this->reverseLinks[$key]['table']]) - && $this->linkElementTypes[$this->reverseLinks[$key]['table']] == 'subForm') { + if (isset($this->linkElementTypes[$elName]) + && $this->linkElementTypes[$elName] == 'subForm') { unset($subFB, $subForm, $subFormEl); $subFB =& DB_DataObject_FormBuilder::create($do); $this->reverseLinks[$key]['FBs'][] =& $subFB; - $subFB->elementNamePostfix = $elName; + $subFB->elementNamePrefix = $elName; + $subFB->elementNamePostfix = '_'.count($this->reverseLinks[$key]['FBs']); $subFB->createSubmit = false; $subFB->formHeaderText = $this->getDataObjectString($do);//$this->getFieldLabel($elName).' '.count($this->reverseLinks[$key]['FBs']); $do->fb_linkNewValue = false; $subForm =& $subFB->getForm(); $this->reverseLinks[$key]['SFs'][] = $subForm; - - //TODO: This should not be here, it breaks the driver idea - $subFormEl =& HTML_QuickForm::createElement('subForm', $elName.count($this->reverseLinks[$key]['FBs']), null, $subForm); + $subFormEl =& $this->_form->_createSubForm($elName.count($this->reverseLinks[$key]['FBs']), null, $subForm); $element[] =& $subFormEl; } else { if ($this->reverseLinks[$key]['collapse']) { @@ -1483,25 +1492,31 @@ } } } - if ($this->reverseLinkNewValue == true) { - unset($subFB, $subForm, $subFormEl); - // Add another subform to add a new reverseLink record. - $do = DB_DataObject::factory($this->reverseLinks[$key]['table']); - $do->{$lField} = $this->_do->{$this->_getPrimaryKey($this->_do)}; - $subFB =& DB_DataObject_FormBuilder::create($do); - $this->reverseLinks[$key]['FBs'][] =& $subFB; - $subFB->elementNamePostfix = $elName; - $subFB->createSubmit = false; - $subFB->formHeaderText = 'New '.(isset($do->fb_formHeaderText) - ? $do->fb_formHeaderText - : $this->prettyName($do->__table)); - $do->fb_linkNewValue = false; - $subForm =& $subFB->getForm(); - $this->reverseLinks[$key]['SFs'][] =& $subForm; - - //TODO: This should not be here, it should be calling a driver function - $subFormEl =& HTML_QuickForm::createElement('subForm', $elName.count($this->reverseLinks[$key]['FBs']), null, $subForm); - $element[] =& $subFormEl; + if (isset($this->reverseLinkNewValue[$elName]) && $this->reverseLinkNewValue[$elName] !== false) { + if (is_int($this->reverseLinkNewValue[$elName])) { + $totalSubforms = $this->reverseLinkNewValue[$elName]; + } else { + $totalSubforms = 1; + } + for ($i = 0; $i < $totalSubforms; $i++) { + unset($subFB, $subForm, $subFormEl); + // Add a subform to add a new reverseLink record. + $do = DB_DataObject::factory($this->reverseLinks[$key]['table']); + $do->{$lField} = $this->_do->{$this->_getPrimaryKey($this->_do)}; + $subFB =& DB_DataObject_FormBuilder::create($do); + $this->reverseLinks[$key]['FBs'][] =& $subFB; + $subFB->elementNamePrefix = $elName; + $subFB->elementNamePostfix = '_'.count($this->reverseLinks[$key]['FBs']); + $subFB->createSubmit = false; + $subFB->formHeaderText = 'New '.(isset($do->fb_formHeaderText) + ? $do->fb_formHeaderText + : $this->prettyName($do->__table)); + $do->fb_linkNewValue = false; + $subForm =& $subFB->getForm(); + $this->reverseLinks[$key]['SFs'][] =& $subForm; + $subFormEl =& $this->_form->_createSubForm($elName.count($this->reverseLinks[$key]['FBs']), null, $subForm); + $element[] =& $subFormEl; + } } if ($this->reverseLinks[$key]['collapse']) { $this->_form->_addElementTable($elName, array(), $rowNames, $table); @@ -2153,7 +2168,7 @@ } } } - foreach (array('preDefElements', 'fieldLabels', 'fieldAttributes') as $arrName) { + foreach (array('preDefElements', 'fieldLabels', 'fieldAttributes', 'reverseLinkNewValue') as $arrName) { if (isset($this->{$arrName}['__reverseLink_'.$reverseLink['table']])) { if (!isset($this->{$arrName}[$elName])) { $this->{$arrName}[$elName] =& $this->{$arrName}['__reverseLink_'.$reverseLink['table']]; @@ -2180,6 +2195,18 @@ $this->linkNewValue = array(); } } + if (!is_array($this->reverseLinkNewValue)) { + if ($new = $this->reverseLinkNewValue) { + $this->reverseLinkNewValue = array(); + if (is_array($this->reverseLinks)) { + foreach ($this->reverseLinks as $key => $reverseLink) { + $this->reverseLinkNewValue['__reverseLink_'.$reverseLink['table'].'_'.$reverseLink['field']] = $new; + } + } + } else { + $this->reverseLinkNewValue = array(); + } + } if (is_array($this->excludeFromAutoRules) && in_array('__ALL__', $this->excludeFromAutoRules) || '__ALL__' == $this->excludeFromAutoRules) { @@ -2841,8 +2868,8 @@ if (in_array($elName, $editableFields)) { // Check for subforms - if (isset($this->linkElementTypes[$reverseLink['table']]) - && $this->linkElementTypes[$reverseLink['table']] == 'subForm') { + if (isset($this->linkElementTypes[$elName]) + && $this->linkElementTypes[$elName] == 'subForm') { foreach($reverseLink['SFs'] as $sfkey => $subform) { // Process each subform that was rendered. if ($subform->validate()) { @@ -3125,4 +3152,4 @@ } } -?> \ No newline at end of file +?> http://cvs.php.net/viewcvs.cgi/pear/DB_DataObject_FormBuilder/FormBuilder/QuickForm.php?r1=1.64&r2=1.65&diff_format=u Index: pear/DB_DataObject_FormBuilder/FormBuilder/QuickForm.php diff -u pear/DB_DataObject_FormBuilder/FormBuilder/QuickForm.php:1.64 pear/DB_DataObject_FormBuilder/FormBuilder/QuickForm.php:1.65 --- pear/DB_DataObject_FormBuilder/FormBuilder/QuickForm.php:1.64 Thu Oct 20 17:17:10 2005 +++ pear/DB_DataObject_FormBuilder/FormBuilder/QuickForm.php Sat Feb 25 05:30:02 2006 @@ -11,7 +11,7 @@ * @license http://www.php.net/license/3_0.txt PHP License 3.0 * @author Markus Wolff <mw21st@php.net> * @author Justin Patrin <papercrane@reversefold.com> - * @version $Id: QuickForm.php,v 1.64 2005/10/20 17:17:10 justinpatrin Exp $ + * @version $Id: QuickForm.php,v 1.65 2006/02/25 05:30:02 justinpatrin Exp $ */ require_once ('HTML/QuickForm.php'); @@ -441,6 +441,7 @@ $subFormElement->selectName = $this->_fb->getFieldName($fieldName); $el =& $this->_form->addElement('hidden', $this->_fb->getFieldName($fieldName).'__subForm__displayed'); $el->updateAttributes(array('id' => $el->getName())); + //echo $this->_fb->getFieldName($fieldName).'<br/>'; $element =& HTML_QuickForm::createElement('group', $this->_fb->getFieldName($fieldName), $this->_fb->getFieldLabel($fieldName), @@ -452,6 +453,28 @@ } return $element; } + + /** + * DB_DataObject_FormBuilder_QuickForm::_createSubForm() + * + * Returns a QuickForm element for a SubForm. + * Used in _generateForm(). + * + * @param string $fieldName The field name to use for the QuickForm element + * @param string $label The label to use for the QuickForm element + * @param $subForm HTML_QuickForm element + * @return object The HTML_QuickForm_element object. + * @see DB_DataObject_FormBuilder::_generateForm() + */ + function &_createSubForm($fieldName, $label, &$subForm) + { + require_once('DB/DataObject/FormBuilder/QuickForm/SubForm.php'); + $element =& HTML_QuickForm::createElement('subForm', + $fieldName, + $label, + $subForm); + return $element; + } /** * Adds a form rule for linkNew entries