/** @since version 0.7.1.0 */ function _connections_list($atts, $content = null) { global $wpdb, $connections, $current_user; $form = new cnFormObjects(); $convert = new cnFormatting(); $format =& $convert; $template = new stdClass(); $atts = shortcode_atts(array('id' => NULL, 'category' => NULL, 'exclude_category' => NULL, 'category_name' => NULL, 'wp_current_category' => 'false', 'allow_public_override' => 'false', 'private_override' => 'false', 'show_alphaindex' => 'false', 'repeat_alphaindex' => 'false', 'show_alphahead' => 'false', 'list_type' => NULL, 'limit' => NULL, 'offset' => NULL, 'order_by' => NULL, 'group_name' => NULL, 'last_name' => NULL, 'title' => NULL, 'organization' => NULL, 'department' => NULL, 'city' => NULL, 'state' => NULL, 'zip_code' => NULL, 'country' => NULL, 'template' => NULL, 'template_name' => NULL), $atts); /* * Convert some of the $atts values in the array to boolean. */ $convert->toBoolean(&$atts['allow_public_override']); $convert->toBoolean(&$atts['private_override']); $convert->toBoolean(&$atts['show_alphaindex']); $convert->toBoolean(&$atts['repeat_alphaindex']); $convert->toBoolean(&$atts['show_alphahead']); $convert->toBoolean(&$atts['wp_current_category']); $permittedListTypes = array('individual', 'organization', 'family', 'connection_group'); // Convert the supplied entry types $atts['list_type'] to an array. if (!empty($atts['list_type'])) { // Trim the space characters if present. $atts['list_type'] = str_replace(' ', '', $atts['list_type']); // Convert to array. $atts['list_type'] = explode(',', $atts['list_type']); } // Set the template type to the first in the entry type from the supplied if multiple list types are provided. if (!empty($atts['list_type']) && (bool) array_intersect((array) $atts['list_type'], $permittedListTypes)) { $templateType = $atts['list_type'][0]; } /* * As of version 0.7.0.5 the $atts['template_name'] is deprecated. */ if (isset($atts['template_name'])) { // First check to see if the template is in the custom template folder. if (is_dir(CN_CUSTOM_TEMPLATE_PATH) && is_readable(CN_CUSTOM_TEMPLATE_PATH)) { if (file_exists(CN_CUSTOM_TEMPLATE_PATH . '/' . $atts['template_name'] . '.php')) { $template->file = CN_CUSTOM_TEMPLATE_PATH . '/' . $atts['template_name'] . '.php'; } } // If the template is not in the custom template folder, check for it in the default template folder. if (!isset($template->file)) { if (file_exists(CN_BASE_PATH . '/templates/' . $atts['template_name'] . '.php')) { $template->file = CN_BASE_PATH . '/templates/' . $atts['template_name'] . '.php'; } } } else { $template = new cnTemplate(); // Change the list type to family from connection_group to maintain compatibility with versions .0.7.0.4 and earlier. if ($atts['list_type'] === 'connection_group') { $atts['list_type'] = 'family'; } /* * $atts['template'] can be either a string or an object. It is a string when set * with the shortcode attribute. If it is a string, the template will be loaded * via the cnTemplate class. * * If the attribute is not set, it will be the object returned from the * cnOptions::getActiveTemplate() method which stores the default template * per list style. */ if (isset($atts['template']) && !is_object($atts['template'])) { $template->load($atts['template']); $template->includeFunctions(); } else { if (empty($templateType)) { $templateType = 'all'; } // If no list type was specified, set the default ALL template. $template->init($connections->options->getActiveTemplate($templateType)); $template->includeFunctions(); } } // If no template is found, return an error message. if (!isset($template->file)) { return '<p style="color:red; font-weight:bold; text-align:center;">ERROR: Template "' . $atts['template_name'] . $atts['template'] . '" not found.</p>'; } $atts = apply_filters('cn_list_atts', $atts); $results = $connections->retrieve->entries($atts); //print_r($connections->lastQuery); if (!empty($results)) { $results = apply_filters('cn_list_results', $results); } // Prints the template's CSS file. if (method_exists($template, 'printCSS')) { $out .= $template->printCSS(); } // Prints the javascript tag in the footer if $template->js path is set if (method_exists($template, 'printJS')) { $template->printJS(); } $out = apply_filters('cn_list_before', $out, $results); // If there are no results no need to proceed and output message. if (empty($results)) { $noResultMessage = 'No results'; $noResultMessage = apply_filters('cn_no_result_message', $noResultMessage); return $out . '<p class="cn-no-results">' . $noResultMessage . '</p>'; } $out .= '<a name="connections-list-head" style="float: left;"></a>' . "\n"; /* * The alpha index is only displayed if set set to true and not set to repeat using the shortcode attributes. * If a alpha index is set to repeat, that is handled down separately. */ if ($atts['show_alphaindex'] && !$atts['repeat_alphaindex']) { $index = "<div class='cn-alphaindex' style='text-align:right;font-size:larger;font-weight:bold'>" . $form->buildAlphaIndex() . "</div>"; $out .= apply_filters('cn_list_index', $index, $results); } $out .= '<div class="connections-list">' . "\n"; foreach ((array) $results as $row) { //$entry = new cnOutput($row); $entry = new cnvCard($row); //$vCard = new cnvCard($row); $vCard =& $entry; if (isset($continue)) { unset($continue); } if (isset($cities)) { unset($cities); } if (isset($states)) { unset($states); } if (isset($zipcodes)) { unset($zipcodes); } if (isset($countries)) { unset($countries); } if (isset($setAnchor)) { unset($setAnchor); } /* * Check to make sure there is data stored in the address array. * Cycle thru each address, building separate arrays for city, state, zip and country. */ if ($entry->getAddresses()) { foreach ($entry->getAddresses() as $address) { if ($address->city != NULL) { $cities[] = $address->city; } if ($address->state != NULL) { $states[] = $address->state; } if ($address->zipcode != NULL) { $zipcodes[] = $address->zipcode; } if ($address->country != NULL) { $countries[] = $address->country; } } } /* * Filter out the entries that are wanted based on the * filter attributes that may have been used in the shortcode. * * NOTE: The '@' operator is used to suppress PHP generated errors. This is done * because not every entry will have addresses to populate the arrays created above. * * NOTE: Since the entry class returns all fields escaped, the shortcode filter * attribute needs to be escaped as well so the comparason between the two functions * as expected. */ $atts['group_name'] = esc_attr($atts['group_name']); $atts['last_name'] = esc_attr($atts['last_name']); $atts['title'] = esc_attr($atts['title']); $atts['organization'] = esc_attr($atts['organization']); $atts['department'] = esc_attr($atts['department']); if ($entry->getFamilyName() != $atts['group_name'] && $atts['group_name'] != null) { $continue = true; } if ($entry->getLastName() != $atts['last_name'] && $atts['last_name'] != null) { $continue = true; } if ($entry->getTitle() != $atts['title'] && $atts['title'] != null) { $continue = true; } if ($entry->getOrganization() != $atts['organization'] && $atts['organization'] != null) { $continue = true; } if ($entry->getDepartment() != $atts['department'] && $atts['department'] != null) { $continue = true; } if (@(!in_array($atts['city'], $cities)) && $atts['city'] != null) { $continue = true; } if (@(!in_array($atts['state'], $states)) && $atts['state'] != null) { $continue = true; } if (@(!in_array($atts['zip_code'], $zipcodes)) && $atts['zip_code'] != null) { $continue = true; } if (@(!in_array($atts['country'], $countries)) && $atts['country'] != null) { $continue = true; } /* * If any of the above filters returned true, the script will continue to the next entry. */ if ($continue == true) { continue; } /* * Checks the first letter of the last name to see if it is the next * letter in the alpha array and sets the anchor. * * If the alpha index is set to repeat it will append to the anchor. * * If the alpha head set to true it will append the alpha head to the anchor. */ $currentLetter = strtoupper(mb_substr($entry->getSortColumn(), 0, 1)); if ($currentLetter != $previousLetter && $atts['id'] == null) { if ($atts['show_alphaindex']) { $setAnchor = '<a class="cn-index-head" name="' . $currentLetter . '"></a>'; } if ($atts['show_alphaindex'] && $atts['repeat_alphaindex']) { $setAnchor .= "<div class='cn-alphaindex' style='text-align:right;font-size:larger;font-weight:bold'>" . $form->buildAlphaIndex() . "</div>"; } if ($atts['show_alphahead']) { $setAnchor .= '<h4 class="cn-alphahead">' . $currentLetter . '</h4>'; } $previousLetter = $currentLetter; } else { $setAnchor = null; } /* * The anchor and/or the alpha head is displayed if set to true using the shortcode attributes. */ if ($atts['show_alphaindex'] || $atts['show_alphahead']) { $out .= $setAnchor; } $alternate == '' ? $alternate = '-alternate' : ($alternate = ''); $out .= '<div class="cn-list-row' . $alternate . ' vcard ' . $template->slug . ' ' . $entry->getCategoryClass(TRUE) . '">' . "\n"; $out = apply_filters('cn_entry_before', $out, $entry); ob_start(); include $template->file; $out .= ob_get_contents(); ob_end_clean(); $out = apply_filters('cn_entry_after', $out, $entry); $out .= '</div>' . "\n"; } $out .= '<div class="clear"></div>' . "\n"; $out .= '</div>' . "\n"; $out = apply_filters('cn_list_after', $out, $results); return $out; }