23 private $independents = array();
35 private $metastringsTable;
63 $this->cache = $cache;
65 $this->entityTable = $entityTable;
67 $this->metastringsTable = $metastringsTable;
68 $this->session = $session;
69 $this->
table = $this->db->getTablePrefix() .
"metadata";
91 function delete(
$id) {
121 $allow_multiple = (boolean)$allow_multiple;
128 $owner_guid = $this->session->getLoggedInUserGuid();
131 $access_id = (int)$access_id;
133 $query =
"SELECT * from {$this->table}" 134 .
" WHERE entity_guid = $entity_guid and name_id=" . $this->metastringsTable->getId(
$name) .
" limit 1";
136 $existing = $this->db->getDataRow($query);
137 if ($existing && !$allow_multiple) {
138 $id = (int)$existing->id;
151 $value_id = $this->metastringsTable->getId(
$value);
156 $name_id = $this->metastringsTable->getId(
$name);
162 $query =
"INSERT into {$this->table}" 163 .
" (entity_guid, name_id, value_id, value_type, owner_guid, time_created, access_id)" 164 .
" VALUES ($entity_guid, '$name_id','$value_id','$value_type', $owner_guid, $time, $access_id)";
166 $id = $this->db->insertData($query);
169 $obj = $this->
get(
$id);
170 if ($this->
events->trigger(
'create',
'metadata', $obj)) {
199 if (!$md = $this->
get(
$id)) {
202 if (!$md->canEdit()) {
207 static $metabyname_memcache;
209 $metabyname_memcache = new \ElggMemcache(
'metabyname_memcache');
212 if ($metabyname_memcache) {
214 $metabyname_memcache->delete(
"{$md->entity_guid}:{$md->name_id}");
220 if ($owner_guid == 0) {
221 $owner_guid = $this->session->getLoggedInUserGuid();
224 $access_id = (int)$access_id;
231 $value_id = $this->metastringsTable->getId(
$value);
236 $name_id = $this->metastringsTable->getId(
$name);
242 $query =
"UPDATE {$this->table}" 243 .
" set name_id='$name_id', value_id='$value_id', value_type='$value_type', access_id=$access_id," 244 .
" owner_guid=$owner_guid where id=$id";
246 $result = $this->db->updateData($query);
249 $this->cache->clear($md->entity_guid);
254 $obj = $this->
get(
$id);
255 $this->
events->trigger(
'update',
'metadata', $obj);
280 foreach ($name_and_values as $k => $v) {
282 $access_id, $allow_multiple);
324 $options[
'metadata_calculation'] =
'count';
328 $options[
'metastring_type'] =
'metadata';
346 $options[
'metastring_type'] =
'metadata';
351 $this->cache->invalidateByOptions($options);
369 $this->cache->invalidateByOptions($options);
375 $options[
'metastring_type'] =
'metadata';
391 if (!$options || !is_array($options)) {
395 $this->cache->invalidateByOptions($options);
397 $options[
'metastring_type'] =
'metadata';
466 'metadata_name_value_pairs_operator' =>
'AND',
467 'metadata_case_sensitive' =>
true,
468 'order_by_metadata' => array(),
475 $singulars = array(
'metadata_name',
'metadata_value',
476 'metadata_name_value_pair',
'metadata_owner_guid');
484 return $this->entityTable->getEntities(
$options);
510 $pairs = null, $pair_operator =
'AND', $case_sensitive =
true, $order_by_metadata = null,
511 $owner_guids = null) {
516 if ((!$names && $names !== 0)
517 && (!$values && $values !== 0)
518 && (!$pairs && $pairs !== 0)
519 && (!$owner_guids && $owner_guids !== 0)
520 && !$order_by_metadata) {
530 $binary = ($case_sensitive) ?
' BINARY ' :
'';
533 'table_alias' =>
'n_table',
534 'guid_column' =>
'entity_guid',
544 $return[
'joins'][] =
"JOIN {$this->db->getTablePrefix()}{$n_table} n_table on 545 {$e_table}.guid = n_table.entity_guid";
551 if ($names !== null) {
552 if (!is_array($names)) {
553 $names = array($names);
556 $sanitised_names = array();
557 foreach ($names as
$name) {
562 $sanitised_names[] =
'\'' . $this->db->sanitizeString($name) .
'\'';
565 if ($names_str = implode(
',', $sanitised_names)) {
566 $return[
'joins'][] =
"JOIN {$this->metastringsTable->getTableName()} msn on n_table.name_id = msn.id";
567 $names_where =
"(msn.string IN ($names_str))";
573 if ($values !== null) {
574 if (!is_array($values)) {
575 $values = array($values);
578 $sanitised_values = array();
579 foreach ($values as
$value) {
584 $sanitised_values[] =
'\'' . $this->db->sanitizeString($value) .
'\'';
587 if ($values_str = implode(
',', $sanitised_values)) {
588 $return[
'joins'][] =
"JOIN {$this->metastringsTable->getTableName()} msv on n_table.value_id = msv.id";
589 $values_where =
"({$binary}msv.string IN ($values_str))";
593 if ($names_where && $values_where) {
594 $wheres[] =
"($names_where AND $values_where AND $access)";
595 } elseif ($names_where) {
596 $wheres[] =
"($names_where AND $access)";
597 } elseif ($values_where) {
598 $wheres[] =
"($values_where AND $access)";
603 if (is_array($pairs)) {
605 if (isset($pairs[
'name']) || isset($pairs[
'value'])) {
606 $pairs = array($pairs);
609 $pair_wheres = array();
614 foreach ($pairs as $index => $pair) {
617 if (!is_array($pair)) {
625 if (!isset($pair[
'name']) || !isset($pair[
'value'])) {
632 if (isset($pair[
'case_sensitive'])) {
633 $pair_binary = ($pair[
'case_sensitive']) ?
' BINARY ' :
'';
635 $pair_binary = $binary;
638 if (isset($pair[
'operand'])) {
639 $operand = $this->db->sanitizeString($pair[
'operand']);
645 $trimmed_operand = trim(strtolower($operand));
648 'table_alias' =>
"n_table{$i}",
649 'guid_column' =>
'entity_guid',
656 $num_safe_operands = array(
'>',
'<',
'>=',
'<=');
657 $num_test_operand = trim(strtoupper($operand));
659 if (is_numeric($pair[
'value']) && in_array($num_test_operand, $num_safe_operands)) {
660 $value = $this->db->sanitizeString($pair[
'value']);
661 }
else if (is_bool($pair[
'value'])) {
662 $value = (int)$pair[
'value'];
663 }
else if (is_array($pair[
'value'])) {
664 $values_array = array();
666 foreach ($pair[
'value'] as $pair_value) {
667 if (is_numeric($pair_value) && !in_array($num_test_operand, $num_safe_operands)) {
668 $values_array[] = $this->db->sanitizeString($pair_value);
670 $values_array[] =
"'" . $this->db->sanitizeString($pair_value) .
"'";
675 $value =
'(' . implode(
', ', $values_array) .
')';
681 }
else if ($trimmed_operand ==
'in') {
682 $value =
"({$pair['value']})";
684 $value =
"'" . $this->db->sanitizeString($pair[
'value']) .
"'";
687 $name = $this->db->sanitizeString($pair[
'name']);
690 $return[
'joins'][] =
"JOIN {$this->db->getTablePrefix()}{$n_table} n_table{$i} 691 on {$e_table}.guid = n_table{$i}.entity_guid";
692 $return[
'joins'][] =
"JOIN {$this->metastringsTable->getTableName()} msn{$i} 693 on n_table{$i}.name_id = msn{$i}.id";
694 $return[
'joins'][] =
"JOIN {$this->metastringsTable->getTableName()} msv{$i} 695 on n_table{$i}.value_id = msv{$i}.id";
697 $pair_wheres[] =
"(msn{$i}.string = '$name' AND {$pair_binary}msv{$i}.string 698 $operand $value AND $access)";
703 if ($where = implode(
" $pair_operator ", $pair_wheres)) {
704 $wheres[] =
"($where)";
710 if (is_array($owner_guids)) {
711 $sanitised = array_map(
'sanitise_int', $owner_guids);
712 $owner_str = implode(
',', $sanitised);
714 $owner_str = (int)$owner_guids;
717 $wheres[] =
"(n_table.owner_guid IN ($owner_str))";
720 if ($where = implode(
' AND ', $wheres)) {
721 $return[
'wheres'][] =
"($where)";
724 if (is_array($order_by_metadata)) {
725 if ((count($order_by_metadata) > 0) && !isset($order_by_metadata[0])) {
727 $order_by_metadata = array($order_by_metadata);
729 foreach ($order_by_metadata as $order_by) {
730 if (is_array($order_by) && isset($order_by[
'name'])) {
731 $name = $this->db->sanitizeString($order_by[
'name']);
732 if (isset($order_by[
'direction'])) {
733 $direction = $this->db->sanitizeString($order_by[
'direction']);
737 $return[
'joins'][] =
"JOIN {$this->db->getTablePrefix()}{$n_table} n_table{$i} 738 on {$e_table}.guid = n_table{$i}.entity_guid";
739 $return[
'joins'][] =
"JOIN {$this->metastringsTable->getTableName()} msn{$i} 740 on n_table{$i}.name_id = msn{$i}.id";
741 $return[
'joins'][] =
"JOIN {$this->metastringsTable->getTableName()} msv{$i} 742 on n_table{$i}.value_id = msv{$i}.id";
745 'table_alias' =>
"n_table{$i}",
746 'guid_column' =>
'entity_guid',
749 $return[
'wheres'][] =
"(msn{$i}.string = '$name' AND $access)";
750 if (isset($order_by[
'as']) && $order_by[
'as'] ==
'integer') {
751 $return[
'orders'][] =
"CAST(msv{$i}.string AS SIGNED) $direction";
753 $return[
'orders'][] =
"msv{$i}.string $direction";
773 $extender = $this->
get(
$id);
775 return $extender ? $extender->getURL() :
false;
826 $access_id = (int)
$object->access_id;
828 $query =
"update {$this->table} set access_id = {$access_id} where entity_guid = {$guid}";
829 $this->db->updateData($query);
$CONFIG independents
A list of entity types and subtypes that have metadata whose access permission can be changed indepen...
_elgg_is_valid_options_for_batch_operation($options, $type)
Checks if there are some constraints on the options array for potentially dangerous operations...
if($guid==elgg_get_logged_in_user_guid()) $name
$guid
Removes an admin notice.
events($event="", $object_type="", $function="", $priority=500, $call=false, $object=null)
Deprecated events core function.
detect_extender_valuetype($value, $value_type="")
Detect the value_type for a given value.
const ELGG_ENTITIES_ANY_VALUE
access_get_show_hidden_status()
Return current status of showing disabled entities.
is_memcache_available()
Return true if memcache is available and configured.
_elgg_normalize_plural_options_array($options, $singulars)
Normalise the singular keys in an options array to plural keys.
_elgg_get_access_where_sql(array $options=array())
Returns the SQL where clause for enforcing read access to data.
if(!$collection_name) $id