我为已登录用户制作了两种表单。第一个用于旅行信息(名称,简短描述),第二个用于作为当前用户旅行的一部分的不同地标(名称,描述)。是否可以“填充”用户填写旅行表格以及将要为不同地标多次使用的地标表格。我有模型“旅行”,“用户”和“地标”与各自的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的表格。剩下的任务是为当前旅行添加不同的地标。
答案 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();
}
这样,您可以在保存表单时创建多个模型。