如何在Atk4中填写其他表格填写其他表格

时间:2011-10-12 13:57:33

标签: atk4

我为已登录用户制作了两种表单。第一个用于旅行信息(名称,简短描述),第二个用于作为当前用户旅行的一部分的不同地标(名称,描述)。是否可以“填充”用户填写旅行表格以及将要为不同地标多次使用的地标表格。我有模型“旅行”,“用户”和“地标”与各自的ID,但我不能单独解决问题。

........................

我试过这个并且它发生了(感谢Romaninsh):

function page_trips(){
$this->api->stickyGET('id');
$id=$this->api->auth->get('id');
$f=$this->add('Form');
$f->addField('line','name')->setNotNULL();
$f->addField('Text','short_desc')->setNotNULL();
$f->setSource('trips');
$f->setConditionFromGET();
$f->dq
     ->set('user_id',$id);
$f->addSubmit('Next');
if($f->isSubmitted())
{
    $f->update();

    $f->js()->univ()->location($this->api->getDestinationUrl('../targets')
    )

    ->execute();
}
}

现在我可以输入有关新旅行的信息并保存到具有相应用户ID的表格。剩下的任务是为当前旅行添加不同的地标。

2 个答案:

答案 0 :(得分:2)

不确定这是不是你看的,因为我使用了两页设计,你可能会用另一个来添加/编辑/删除地标,但也许这会给你一些想法。

我在数据库中创建了三个表 - trip,landmark和landmarktrip,其定义如下。

CREATE TABLE IF NOT EXISTS `landmark` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET latin1 NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=6 ;

INSERT INTO `landmark` (`id`, `name`) VALUES
(1, 'Xintiandi'),
(2, 'Pearl TV Tower'),
(3, 'YuYuan Gardens'),
(4, 'Shanghai Botanical Gardens'),
(5, 'Shanghai World Financial Centre');

CREATE TABLE IF NOT EXISTS `landmarktrip` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `trip_id` int(10) NOT NULL,
  `landmark_id` int(10) NOT NULL,
  PRIMARY KEY (`id`) 
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=7 ;

INSERT INTO `landmarktrip` (`id`, `trip_id`, `landmark_id`) VALUES
(1, 1, 1),
(2, 1, 2),
(3, 1, 3),
(4, 2, 3),
(5, 2, 4),
(6, 1, 5);

CREATE TABLE IF NOT EXISTS `trip` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(10) NOT NULL,
  `name` varchar(255) COLLATE utf8_bin NOT NULL,
  `short_desc` varchar(255) COLLATE utf8_bin NOT NULL,
  `start_date` date NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='7741244' AUTO_INCREMENT=3 ;

INSERT INTO `trip` (`id`, `user_id`, `name`, `short_desc`, `start_date`) VALUES
(1, 1, 'Shanghai 1', 'First Trip To China', '2011-10-13'),
(2, 1, 'Shanghai 2', 'Return Visit', '2011-10-21');

然后在wwwroot / website / lib / Model中创建模型如下

<强> Landmark.php

class Model_Landmark extends Model_Table {
   public $entity_code='landmark';
   public $table_alias='l';

   function init(){ 
     parent::init();
     $this->addField('id')->mandatory(true)->system(true)->visible(false);
     $this->addField('name')->mandatory(true);
   }
}

<强> Trip.php

class Model_Trip extends Model_Table {
    public $entity_code='trip';
    public $table_alias='t';

    function init(){
        parent::init();
        $this->addField('id')->mandatory(true)->system(true)->visible(false);


 $this->addField('user_id')->defaultValue($this->api->auth->get('id'))->visible(false);
        $this->addField('name')->mandatory(true);
        $this->addField('short_desc')->mandatory(true);
        $this->addField('start_date')->dataType('date')->mandatory(true);
    }
  } 
} 

<强> LandmarkTrip.php

class Model_LandmarkTrip extends Model_Table {
    public $entity_code='landmarktrip';
    public $table_alias='lt';

  function init(){
       parent::init();
       $this->addField('id')->system(true)->visible(false);  
           $this->addField('trip_id')->refModel('Model_Trip')->mandatory(true);
       $this->addField('landmark_id')->refModel('Model_Landmark')->mandatory(true);
  }
}

在wwwroot / website / page中创建了两个页面,一个用于添加行程,另一个用于行程,因为我没有看到您使用的表单方法,您可以选择要查看详细信息的行程。< / p>

<强> trips.php

class page_trips extends page {
 function init() {
   parent::init();
   $p=$this;

   $c=$p->add('CRUD')->setModel('Trip');
   $c->setMasterField('user_id', $this->api->auth->get('id'));

  }
}

<强> itinerary.php

class page_itinerary extends page {

  function init() {
    parent::init();
    $p=$this;

    $this->js()->_load('trip_univ');

    $triplist=$this->api->db->dsql()->table('trip t')
              ->field('t.id')
              ->field('t.name')
              ->where('t.user_id', $p->api->auth->get('id'))
              ->order('t.start_date')
              ->do_getAssoc();


    if ($_GET['trip']){
          $curr_trip=$_GET['trip'];
    } else {
          $earliest=$this->api->db->dsql()->table('trip')
                   ->field('min(start_date)')
                   ->where('user_id',$this->api->auth->get('id'))
                   ->do_getOne();

          $curr_trip=$this->api->db->dsql()->table('trip')
                   ->field('id')
                   ->where('user_id',$this->api->auth->get('id'))
                   ->where('start_date',$earliest)
                   ->do_getOne();
    }

    $f=$p->add('Form')->setFormClass('horizontal');
    $list=$f->addField('dropdown','trip')->setValueList($triplist)->set($curr_trip);
    $list->js('change')->univ()->viewTrip($p->api->getDestinationURL(null), $list);


    $lt=$p->add('CRUD')->setModel('LandmarkTrip');
    $lt->setMasterField('trip_id', $curr_trip);

  }
}

和最后一个允许列表更改网格的文件 在wwwroot / website / templates / js

中创建一个名为trips_univ.js的文件

<强> trip_univ.js

$.each({
    viewTrip: function(url, name){
              document.location.href=url+'&trip='+$(name).val();
    }
},$.univ._import);

现在,您可以使用CRUD创建行程以添加,编辑和删除行。 然后转到行程页面从下拉列表中选择行程或默认为最早的行程,并可以从行程中添加,删除或编辑地标。

答案 1 :(得分:0)

由于您已部分解决了问题,我只需要添加一些关于如何将多个操作合并到表单中的说明。

$form->setModel('Trip');
$form->addField('line','extrainfo'):

if($form->isSubmitted()){
    $form->update();

    $it=$this->add('Model_Itinerary');
    $it->set('trip_id', $form->getModel()->get('id'));
    $it->set('extrainfo', $form->get('extrainfo'));
    $it->update();
}

这样,您可以在保存表单时创建多个模型。