非常详细的,很不错
1. 有办法实现选CEO的 写入数据库是001 选COO 的写入数据库是002, 选CTO 的写入数据库003,然后有个关联的表,外键 003 是CTO, 002是COO, 001 是CEO 么?
'#options' => drupal_map_assoc(array('CEO', t('COO'), t('CTO'),t('CFO'), t('CCO'))),
这段中,有发现drupal_map_assoc()方法吗? 这个方法是为了实现label 跟 value 一样,如果你想这两个值显示不一样,那就取消drupal_map_assoc():
$form['job_title'] = array(
'#type' => 'select',
'#title' => 'Job Title:',
'#options' => array(001 => ('CEO'), 002 => t('COO'), 003 => t('CTO'), 004=> t('CFO'), 005 => t('CCO')),
'#required' => TRUE,
);
2. 然后就是国家的话,那个下拉框选项我不是要copy到手残废。把200多个国家写在option 里面么?
请看看 Chosen 模块,对于下拉列表,非常方便。用户体验非常好。
3. 然后我让没登陆者不能到subscribe这个页面,就重写了subscribe这一页page--subscribe.tpl.php 扔 主题模板里面了。
在那里做了个判断:没登陆者直接跳到登陆界面。有什么友好点的措施么,或弹出javascript窗口温馨提示一下:请登陆啊亲~
还有这个判断可以写到subscribe module 里面么?
有很多种方法
方法1:直接修改page--subscribe.tpl.php
<?php if ($user->uid) : ?>
$block = block_load('user', 'login');
$signup = drupal_render(_block_get_renderable_array(_block_render_blocks(array($block))));
print $signup;
?>
或者:
<?php if ($user->uid) : ?>
方法2:在subscribe模块中写权限
hook_menu 中有一项权限选择可以在这里通过权限控制。如果没有权限,就drupal_set_message, 或者跳转到xxx.com/user
4. 要实现填过详细信息的人,就不需要填第二次了?
你的方法,也是我的方法,这个也有一个例子,就是drupal commerce 组件系列中有一个 commerce addressbook。它是为了让用户能重用结账地址。基本也是用这个方式实现,如果你有想参考下,可以安装这个模块试一下。
5. 如何做关联表?
这个其实看drupal core 的表就能看出,举例,content type 新建了一个字段假使叫image,它其实在数据库中,这个image并非以字段保存,而是直接生成一个表 field_data_field_image,当你添加数据的时候,他会直接在这个表存资料。如:
上图是field_data_field_image表,有看到框框俩个字段吗?第一个字段 entity_id,就是关联 node表的 nid的,而第二个field_image_fid, 就是关联file_managed 中的fid的,这三个表,组成了一条完整的node记录
node表:实现记录的基本资料
file_managed表:保存图片存放地址
field_data_field_image表:将node表跟file_managed表通过entiey_id 跟 field_image_fid 关联起来。