1

我为登录用户制作了两种表格。第一个用于旅行信息(名称、简短描述),第二个用于作为当前用户旅行一部分的不同地标(名称、描述)。是否可以通过填写旅行表格和将要多次用于不同地标的地标表格来“连接”用户。我有模型“trips”、“user”和“landmarks”,它们都有各自的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 保存到表中。剩下的任务是为当前行程添加不同的地标。

4

2 回答 2

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 中创建模型如下

地标.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);
    }
  } 
} 

地标旅行.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 中创建了两个页面,一个用于添加旅行,另一个用于行程,因为我不知道您使用的表单方法如何,您可以选择要查看的详细信息。

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'));

  }
}

行程.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 创建行程来添加、编辑和删除行。然后进入行程页面,从下拉列表中选择一个行程,或者默认为最早的行程,并且可以添加、删除或编辑行程中的地标。

于 2011-10-13T15:24:01.073 回答
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();
}

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

于 2011-10-13T15:16:20.780 回答