return array('view', 'add', 'change', 'delete');
}
- protected function setInlines(&$instance=null){
+ protected function setInlines($model, &$data){
$il = $this->inlines();
if (is_array($il)){
foreach($il as $inlineName=>$inlineClassName){
- $this->inlineInstances[] = new $inlineClassName($this->model,$instance);
+ $this->inlineInstances[] = new $inlineClassName($model,$data);
}
}
}
protected function _setupEditForm($form){
$this->_setupForm($form);
- $this->setInlines($this->instance);
}
protected function _setupAddForm($form){
$this->_setupForm($form);
- $this->setInlines();
}
protected function _setupForm($form){
public function isValidInlines(){
foreach($this->inlineInstances as &$il){
if ($il->isValid()===false){
- //return false;
+ return false;
}
}
return true;
}
}
- protected function UrlForResult(&$o){
+ protected function UrlForResult($o){
return $o->__get($this->qe->getTable()->getIdentifier()).'/';
}
// Views Function
public function AddItem($request, $lapp, $lmodel){
if ($request->method == 'POST'){
- $form = $this->_getAddForm($this->model,$request->POST+$request->FILES,array('user_fields'=>$this->fields()));
+ $data = $request->POST+$request->FILES;
+ $form = $this->_getAddForm($this->model, &$data, array('user_fields'=>$this->fields()));
$this->_setupAddForm($form);
+ $this->setInlines($this->model, &$data);
if ($form->isValid()) {
$item = $form->save();
AdminLog::logAction($request, $item, AdminLog::ADDITION);
else{
$form = $this->_getAddForm($this->model,null,array('user_fields'=>$this->fields()));
$this->_setupAddForm($form);
+ $this->setInlines($this->model, null);
}
$context = array(
'page_title'=>'Add '.$this->modelName,
public function EditItem($request, $lapp, $lmodel, $o){
if ($request->method == 'POST'){
- $form = $this->_getEditForm($o,$request->POST+$request->FILES,array('user_fields'=>$this->fields()));
+ $data = $request->POST+$request->FILES;
+ $form = $this->_getEditForm($o,&$data,array('user_fields'=>$this->fields()));
$this->_setupEditForm($form);
+ $this->setInlines($o, &$data);
+
if ( ($form->isValid()) && ($this->isValidInlines()) ) {
+ //print_r($form->cleaned_data);
$item = $form->save();
$this->saveInlines($item);
AdminLog::logAction($request, $item, AdminLog::CHANGE);
}
}
else{
- $form = $this->_getEditForm($o,$o->getData(),array('user_fields'=>$this->fields()));
+ $data = $o->getData();
+ $form = $this->_getEditForm($o,&$data,array('user_fields'=>$this->fields()));
$this->_setupEditForm($form);
+ $this->setInlines($o, &$data);
}
$context = array(
abstract function getModelName();
- function getAddNum(){ return 2; }
+ function getAddNum(){ return 4; }
function getLegend(){
return get_class($this->model);
}
+
function isValid(){
foreach($this->formset as &$form){
- if ($form->isValid()==false){
- return false;
+ if (!$form->isValid()){
+ if (!$form->isAdd){
+ return false;
+ }
}
}
return true;
if ($rel->getClass()==get_class($this->parentModel))
return $rel->getAlias();
}
- throw new IPF_Exception('Cannot get fkName for '.$this->getModelName());
+ throw new IPF_Exception(__('Cannot get fkName for '.$this->getModelName()));
}
function getFkLocal(){
if ($rel->getClass()==get_class($this->parentModel))
return $rel->getLocal();
}
- throw new IPF_Exception('Cannot get fkLocal for '.$this->getModelName());
+ throw new IPF_Exception(__('Cannot get fkLocal for '.$this->getModelName()));
}
function createFormSet(&$data){
+
$this->formset = array();
+
+ $first = true;
+
+ if ($this->parentModel->exists()){
+
+ $objects = IPF_ORM_Query::create()
+ ->from(get_class($this->model))
+ ->orderby('id')
+ ->where($this->getFkLocal().'='.$this->parentModel->id)
+ ->execute();
+
+ foreach ($objects as $obj){
+ $prefix = 'edit_'.get_class($this->model).'_'.$obj->id.'_';
+ $d = array();
+ foreach ($obj->getData() as $k=>$v)
+ $d[$prefix.$k] = $v;
+ foreach ($data as $k=>$v){
+ if (strpos($k,$prefix)==0)
+ $d[$k] = $v;
+ }
+ $form = IPF_Shortcuts::GetFormForModel($obj, $d,
+ array('exclude'=>array($this->getFkName(),$this->getFkLocal()))
+ );
+ $form->prefix = $prefix;
+ $form->fields = array_merge(array(
+ new IPF_Form_Field_Boolean(array('label'=>'Del','name'=>'is_remove')),
+ ),$form->fields);
+
+ $form->isAdd = false;
+ if ($first){
+ $form->isFirst = true;
+ $first = false;
+ }
+ else
+ $form->isFirst = false;
+ $this->formset[] = $form;
+ }
+ }
+
for($i=0; $i<$this->getAddNum(); $i++ ){
- $form = IPF_Shortcuts::GetFormForModel($this->model, null, array('exclude'=>array($this->getFkName(),$this->getFkLocal())));
+ $form = IPF_Shortcuts::GetFormForModel($this->model->copy(), null, array('exclude'=>array($this->getFkName(),$this->getFkLocal())));
$form->fields = array_merge(array(new IPF_Form_Field_Boolean(array('label'=>'Del','name'=>'delete_', 'widget_attrs'=>array('disabled'=>'disabled')))),$form->fields);
- $form->prefix = 'add_'.get_class($this->model).'_'.$i;
+ $form->prefix = 'add_'.get_class($this->model).'_'.$i.'_';
$form->data = $data;
- if ($i==0)
+ $form->isAdd = true;
+ if ($first){
$form->isFirst = true;
+ $first = false;
+ }
else
$form->isFirst = false;
- //print_r($form->fields);
$this->formset[] = $form;
}
}
function save(){
-
+ $fk_name = $this->getFkName();
+
+ if ($this->parentModel->exists()){
+ $objects = IPF_ORM_Query::create()
+ ->from(get_class($this->model))
+ ->orderby('id')
+ ->where($this->getFkLocal().'='.$this->parentModel->id)
+ ->execute();
+ foreach ($objects as $obj){
+ foreach($this->formset as $form){
+ if ($form->isAdd)
+ continue;
+ @list($x1,$x2,$id,$x3) = @split('_',$form->prefix);
+ if ($id==$obj->id){
+ if ($form->cleaned_data[0]==true)
+ $obj->delete();
+ else{
+ unset($form->cleaned_data[0]);
+ foreach($form->fields as $fname=>$f){
+ if (is_a($f,'IPF_Form_Field_File')){
+ if($form->cleaned_data[$fname]===null)
+ continue;
+ if($form->cleaned_data[$fname]=='')
+ unset($form->cleaned_data[$fname]);
+ }
+ }
+ $obj->synchronizeWithArray($form->cleaned_data);
+ $obj->save();
+ }
+ break;
+ }
+ }
+ }
+ }
+
+ foreach($this->formset as $form){
+ unset($form->cleaned_data[0]);
+ if ($form->isValid()){
+ if ($form->isAdd){
+ $form->cleaned_data[$fk_name] = $this->parentModel;
+ $form->save();
+ }
+ }
+ }
}
}
\ No newline at end of file
</table>
</fieldset>
{foreach $inlineInstances as $inline}
- <fieldset class="inlineTabular">
+ <fieldset class="inlineTabular" style="border:none; width:auto; float:left; padding:0; margin:10px 10px 10px 0;">
<legend>{$inline->getLegend()}</legend>
<table>
{foreach $inline.formset as $formset}
{/if}
<tr>
{foreach $formset.fields as $fieldname=>$field}
- <td>{$formset.field($fieldname)|safe}</td>
+ <td>{$formset.field($fieldname).fieldErrors()}{$formset.field($fieldname)|safe}</td>
{/foreach}
</tr>
{/foreach}
</table>
</fieldset>
{/foreach}
+ <div style="clear:both;"></div>
<div class="submit-row">
{if array_search('delete',$perms)!==false}<p class="float-left"><a href="{url 'IPF_Admin_Views_DeleteItem', array($lapp, $lmodel, $object.id)}" class="deletelink">Delete</a></p>{/if}
// Inspect user errors
foreach($userErrors as $fieldName => $errorCodes) {
echo "Error:".$fieldName;
- print_r($errorCodes);
+ //print_r($errorCodes);
}
}
return $user;
function addPrefix($field_name)
{
if ('' !== $this->prefix) {
- return $this->prefix.'-'.$field_name;
+ return $this->prefix.$field_name;
}
return $field_name;
}
IPF::loadFunction($this->remove_function);
return call_user_func($this->remove_function, $value['data']);
}
-
$value = $value['data'];
if ($value['name']=='')
parent::clean($value);
if (in_array($value, $this->empty_values)) {
- $value = '';
+ return null;
}
- $_value = $value;
- $value = (float) $value;
if (!is_numeric($value)) {
throw new IPF_Exception_Form(__('Enter a number.'));