Drupal и PHP/MySQL: как сравнить поля с полем текущего пользователя?

У меня проблема, связанная с синтаксисом php/mysql в drupal:

Предположим, что пользователь А создал тип контента под названием «тест», где он заполнил поле field_example значением «xxx». После этого другой пользователь, userB, создал другой контент и заполнил то же поле field_example тем же значением «xxx».

Я хотел бы знать, как можно отобразить представление только с созданным узлом, где поле field_example одинаково для текущего пользователя? У меня нет (и я не хочу) ссылки на пользователя в типе контента «тест», который я использую.

Я просмотрел View PHP Filter, но мне интересно, как сравнить значения поля? Вот моя попытка [я не эксперт в PHP, как вы могли заметить :)]:

<?php

$a="SELECT uid FROM users WHERE uid=%d";

/* ??? How to create $b which can get value of field_example from content_type_test from current user which is logged in ? */

$b="";

$c="SELECT field_example FROM content_type_test";

if ($b==$c){
echo "Ok, I've what I want :) ";
}

?>

Любая помощь будет принята с благодарностью, так как я давно ищу информацию об этом запросе...

Спасибо всем :)


person jozi    schedule 22.07.2011    source источник


Ответы (2)


У меня нет решения модуля Views.

Одна мысль, которая приходит на ум, заключается в том, что, если пользователь А отправит несколько узлов, какое примерное значение вы бы использовали тогда? Кроме того, с какой версией Drupal вы работаете?

Если предположить, что пользователь когда-либо отправит только одно содержимое этого типа, а вы используете Drupal 6 (мое предположение из примеров кода), тогда это может выглядеть примерно так:

<?php
// current user
global $user;
// select this user's node
$nid = db_result(db_query("SELECT nid FROM {node} WHERE type = 'my_content_type' AND status = 1 AND uid = %d", $user->uid));
// if this node loads fine, then proceed with the rest
if ($node = node_load($nid)) {
  // find nodes with the same example value, which do not belong to the current user
  $result = db_query("SELECT nid FROM {node}
                        INNER JOIN {content_type_test} ctt ON n.vid = ctt.vid
                        WHERE n.status = 1 AND ctt.field_example_value = '%s' AND uid <> %d
                        ORDER BY n.created DESC", $node->field_example[0]['value'], $user->uid);
  // loop through results
  while ($row = db_fetch_object($result)) {
    $node = node_load($node->nid);
    // append the teaser output (if this is what you want to do)
    $output .= node_view($node, TRUE);
  }
  // print the output
  print $output;
}
else {
  print t('No other content found.');
}
?>

Если пользователи отправят более одного из этих типов контента, то это должен быть другой ответ, чтобы не писать здесь роман. Есть несколько способов приблизиться к этому.

Кроме того, если бы это был Drupal 7, я бы также использовал другие функции.

person Coder1    schedule 23.07.2011
comment
Привет, Coder1, огромное спасибо за ваш ответ, я проверю, работает ли он :) я использую drupal 6. Что касается вашего вопроса, ваше предположение верно, я создал правило, которое запрещает пользователям создавать более 1 контента. . - person jozi; 23.07.2011
comment
Кроме того, не могли бы вы сказать мне, что такое ‹› между uid и %d ? - person jozi; 23.07.2011
comment
‹› не равно. Это делает так, что вы получаете узлы, которые не принадлежат текущему пользователю. то есть узел, который только что был создан. - person Coder1; 23.07.2011

Я предполагаю, что вы хотите что-то вроде этого:

function _get_list() {
global $user; // This is global variable, contains information for current logged in user.

$results = db_query("SELECT ctt.field_example FROM {node} n JOIN {content_type_test} ctt ON n.nid = ctt.nid AND n.vid = ctt.vid WHERE n.uid = %d", $user->uid);

while($row = db_fetch_object($results)){
   //$row->nid.. etc..
}

}
person minnur    schedule 22.07.2011
comment
Миннур спасибо за ответ! На самом деле проблема находится в ГДЕ, потому что я хочу выбрать поля из ctt.field_example, которые имеют то же значение, что и текущий пользователь в ctt.field_example. Теперь, если я наберу SELECT ctt.field_example FROM {node} n JOIN {content_type_test} ctt ON n.nid = ctt.nid AND n.vid = ctt.vid, у меня будет весь столбец. Итак, как я могу выбрать в этом столбце поля, которые равны полю вошедшего в систему пользователя? Большое Вам спасибо :) - person jozi; 23.07.2011