我所工作的机构在Drupal CMS和LDAP服务器之间存在并且正在进行集成。该集成的一个特性是能够从LDAP中提取记录以填充Drupal中的字段。我们告诉Drupal使用自定义模块来填充哪些字段和内容类型,这些模块最初设计为仅适用于(1)内容类型的单个机器名称和(2)每个字段的单个机器名称。
我们现在尝试将这些配置项修改为以逗号描述的列表存在,因此我们可以将LDAP信息提供给可能不一定使用共享字段的任意数量的内容类型。 (2)的修改,即为一个字段输入多个机器名称并且仍然填充所需数据的能力已经在工作。但是,完成(1)所需的修改(允许记录输出到多种内容类型)取决于SQL查询,其语法我认为我一定是出错了。
存储内容类型的计算机名称的配置项由Drupal在内部调用dart_netid_content_type
。以下是旧代码,适用于标识单个内容类型的单个计算机名称:
// All nodes of type from dart_netid_content_type, with either no LDAP lookup time, or over 24 hours ago
$query = db_select('node');
$query->leftjoin('dart_ldap_update', 'ldap', 'node.nid = ldap.nid');
$query->fields('node', array('nid'))
->fields('ldap', array('nid', 'ldap_updated'))
->condition('type', variable_get('dart_netid_content_type', ''), '=')
->condition('status', '1', '=')
->condition(db_or()->condition('ldap_updated', NULL, 'IS')->condition('ldap_updated', $limit, '<'))
->orderby('ldap_updated', 'ASC');
这是新查询,应该适用于多种内容类型。有趣的是,查询不是完全打破;如果输入标识单个内容类型的单个计算机名称,则查询将继续有效。但是,如果在dart_netid_content_type
内部存储一个逗号描述的列表,该列表已经在处理其他配置项,例如应该用数据填充的字段的机器名,那么查询将失败并且模块不会识别任何节点或填充任何字段。
/*
* Break up dart_netid_content_type into an array
*/
$dart_netid_content_type_array = explode(",", variable_get('dart_netid_content_type', ''));
/*
* For each item in the array, create an 'or' conditional in a db_query that
* checks for all of those content types
*/
$content_type_or = db_or();
foreach($dart_netid_content_type_array as $content_type) {
$content_type_or->condition('type', $content_type, '=');
}
// All nodes of type from dart_netid_content_type, with either no LDAP lookup time, or over 24 hours ago
$query = db_select('node');
$query->leftjoin('dart_ldap_update', 'ldap', 'node.nid = ldap.nid');
$query->fields('node', array('nid'))
->fields('ldap', array('nid', 'ldap_updated'))
->condition($content_type_or)
->condition('status', '1', '=')
->condition(db_or()->condition('ldap_updated', NULL, 'IS')->condition('ldap_updated', $limit, '<'))
->orderby('ldap_updated', 'ASC');
以一种希望更直观的方式阐明这两个版本之间的预期差异:dart_netid_content_type
现在可能是一种内容类型,或多于一种。上一个查询正在搜索类似于WHERE type = dart_netid_content_type
的内容。我现在试图哄它做的是查看dart_netid_content_type_array
中的各个项目,并查询类似WHERE (type = dart_netid_content_type_array[0]) OR (type = dart_netid_content_type_array[1]) OR ... OR (type = dart_netid_content_type_array[sizeof(dart_netid_content_type_array)])
的内容。
在将此包装在Drupal的db_query和db_or语法中时,我的逻辑似乎有些错误。
如果需要,我可以通过共享更多驱动LDAP到节点功能的自定义模块来提供更多上下文。
提前感谢您的帮助。
答案 0 :(得分:0)
如何使用IN来确定内容类型是否在值数组中?像这样:
$dart_ct_array = explode(",", variable_get('dart_netid_content_type', ''));
$dart_netid_content_types = "('" . implode("','", $dart_ct_array) . "')";
$query = db_select('node');
$query->leftjoin('dart_ldap_update', 'ldap', 'node.nid = ldap.nid');
$query->fields('node', array('nid'))
->fields('ldap', array('nid', 'ldap_updated'))
->condition('type', $dart_netid_content_types, 'IN')
->condition('status', '1', '=')
->condition(db_or()->condition('ldap_updated', NULL, 'IS')->condition('ldap_updated', $limit, '<'))
->orderby('ldap_updated', 'ASC');