Вы здесь

1

В настоящее время товары продавцов (многих пользователей сайта с правом добавлять товары) отображаются подряд по дате добавления на страница продавца. Мне нужно, чтобы продавец мог создать свою категорию для товаров например "Мебель Яна" и отображать картинками несколько таких категорий у себя, например
Мебель Яня, Глазов, Уфа мебель.
или даже с превью категории 10 случайных товаров - на выбор либо просто картинка категории ибо стандартная картинка с именем папки, либо картинка и превью товаров.
Есть ли рекомендации и готовые уроки как так делать?

Версия Drupal: 
7.x
Категория: 
Form APITaxonomy API
Связанные проекты: 
Drupal Commerce
Вопрос задан 16.04.2015 - 19:20

есть страница продавца (пользователя), например Мебельный салон Патриарх. Этот продавец добавил много товаров разных фирм, которые он продает, то есть фирм Яна мебель, Уфа мебель, Глазов.
на странице продавца, допустим мирпокупок.рф/мебельный-салон-патриарх
отображаются все добавленные этим пользователем товары подряд по дате добавления то есть:

  1. Горки из дуба, Яна мебель
  2. Спальня Византия, Яна мебель
  3. Мебель прихожей Каскад, Уфа мебель
  4. Спальня Фиалка, Глазов
  5. Спальня Орион, Глазов

Это все названия товаров с фотками они отображаются. Мне надо чтобы вместо товаров отображались категории:

  1. Мебель Глазов
  2. Яна мебель
  3. Уфа мебель

Эти категории я не буду делать. Это должен делать сам пользователь. То есть пользователь (продавец) которого зовут Мебельный Салон Патриарх должен организовать свои товары в папки или в рубрики свои собственные и тогда на его странице будут отображаться эти рубрики. Как всё это программировать?

Комментарий оставлен 16.04.2015 - 19:52

Для категоризации существует таксономия. Что вы конкретно не можете сделать?

Комментарий оставлен 16.04.2015 - 19:59

разделять выбор терминов таксономии на те, к которым есть доступ конкретному пользователю, и те, к которым у него такой возможности нет.
допустим я сделаю таксономию Каталоги Продавцов.
допустим продавец добавит термин свой например Мебель Глазов. Как отделить его термин от других терминов других продавцов, которые могут называться точно так же? то есть пользователь 1 может создать термин Мебель Глазов чтобы собрать в нем свои товары, и другой пользователь 2 может создать термин Мебель Глазов, чтобы собрать в нем свои товары. Как мне предоставлять им обоим доступ к этому термину?
Допустим в случае присутствия такого термина, когда пользователь 2 будет пытаться добавить термин Мебель Глазов, произойдёт просто предоставление ему такого права его использовать.
Тогда, я так понимаю, нужно создать поле в профиле пользователя Каталог Пользователя - ссылки на термины из словаря Каталоги Продавцов.
Как тогда во время создания нового термина отмечать у в профиле пользователя доступный ему новый термин? И при попытке другим пользователем создать термин с тем же именем - не добавлять а только отметить в его профиле ссылку на этот термин?
Я в рулес не знаю как это сделать.
Это первая часть вопроса.
А вторая часть:
Как теперь, когда пользователь создал или получил доступ к термину, отображать для него на странице добавления товара эти термины? Мне уже где-то подсказали что надо сделать хукалтерФорм_ИД и сравнить два массива - отмеченные термины в поле профиля пользователя Каталог пользователя и вычесть из массива Каталоги Пользователей все остальное. Я не знаю как это делать. И отобразить на выбор только оставшиеся - это тоже не знаю как.

Комментарий оставлен 16.04.2015 - 20:49

В принципе, можно еще отделить все термины пользователей такой хитростью:
В словаре Каталоги Продавцов будут добавляться первым уровнем ID пользователей. И дочерними будут добавляться все созданные ими термины.
Получается так проще, чем делать в профиле пользователя новое поле с ссылками на термины, созданные им или к которым ему доступ предоставлен.
Тогда подскажите как такое правило сделать? Чтобы при добавлении термина вначале родительским добавлялся id пользвоателя а дочерним - собственно его термин.

Повлияет ли это на удобство работы с таким словарем в дальнейшем?

И все-таки главный вопрос - как сделать правильный хук формы добавления ноды типа Товар с отображением таких терминов которые находятся в Каталоге Продавцов внутри ID текущего пользователя?

Комментарий оставлен 16.04.2015 - 20:59

Как отделить его термин от других терминов других продавцов

добавьте терминам поле Владелец типа entity reference, перед/после создания термина обновляйте значение поля.

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

http://serho.ru/notes/raznoe/hook-form-alter-v-drupal-7

Комментарий оставлен 16.04.2015 - 20:59

Спасибо! пару проб прояснили как правильно назвать свою функцию и как добавить новое поле, как это написано тут https://api.drupal.org/api/drupal/modules!system!system.api.php/function...
Но мне не понятно как изменить элементы массива в поле field_firm и оставить только те, у которых в словаре Firms в поле типа Entity Reference "field_seller" присутствует ссылка на текущего пользователя ?
То есть словарь таксономии Firms имеет поля: field_name, field_seller.
А нода типа Товар имеет поле field_firm которое ссылается на словарь Firms.
я не знаю как обратиться к массиву элементов field_firms, как оставить в нем только те элементы к которым у пользователя есть доступ то есть имя пользователя обозначено в поле field_seller в словаре Firms.
помогите дописать модуль, который в настоящее время выглядит так:

/* Displays only terms that have Entity Reference field with current user reference */
function user_referenced_taxonomy_terms_form_node_form_alter(&$form, &$form_state, $form_id) {
  //$form ['field_firm']
}
Комментарий оставлен 18.04.2015 - 19:18

неправильно, словарь Firms имеет поля: name, field_seller

Комментарий оставлен 18.04.2015 - 19:20

благодаря экспериментам над полем field_firm и информации из Field API https://api.drupal.org/api/drupal/developer!topics!forms_api_reference.h...
я написал такую строку:
$form['field_firm']['und']['#options'] = drupal_map_assoc(array(t(Firm1'), t('Firm2')));

и теперь на странице добавление ноды показываются две эти фирмы вместо моих. Как мне теперь суметь из модуля прочитать поле field_seller в словаре Firms и как правильно сделать массив терминов?

Комментарий оставлен 18.04.2015 - 20:20

и еще не непонятно почему und - если это поле имеет переводы и я добавляю с русского языка админки. и словарь переведен

Комментарий оставлен 18.04.2015 - 20:22

я прочитал строку как извлечь uid текущего пользователя тут: https://api.drupal.org/api/drupal/developer!globals.php/global/user/7
Это так: global $user; echo "vash id: ".$user->uid;
Также я попробовал почитать How to use EntityFieldQuery https://www.drupal.org/node/1343708
и написал такой нерабочий код:

function user_referenced_taxonomy_terms_form_node_form_alter(&$form, &$form_state, $form_id) {

  global $user; echo $user->uid;
  $query = new EntityFieldQuery();
  $term_entities = $query
    ->entityCondition('entity_type', 'user', '=')
    ->fieldCondition('field_seller','value',$user->uid, 'like') // esli uid v spiske
    ->execute();
  if ($term_entities) {
    $form['field_firm']['und']['#options'] = drupal_map_assoc( $term_entities );
  }


  //$form['field_firm']['und']['#options'] = drupal_map_assoc(array(t('firma1'), t('Firma2')));

}

мне непонятно, как сделать условие проверки ->fieldCondition если пользователь в списке в поле field_seller у термина таксономии Firms.
и конечно непонятно что такое переменная $term_entities и как из неё сделать массив $form['field_firm']['und']['#options'] .
Помогите дописать модуль, пожалуйста. я его понимаю где-то на 5%. непонятно ни название модуля, которое получено методом тыка, ни все остальные функции.

Комментарий оставлен 18.04.2015 - 20:40

В таблице field_data_field_seller есть поля:
entity_type - везде написано taxonomy_term
field_seller_target_id - тут id пользователя, которого я добавил в поле field_seller
как написано тут https://api.drupal.org/comment/12284#comment-12284 надо в fieldCondition писать колонку просто target_id, поэтому моя строка условия выглядит так:
->fieldCondition('field_seller','target_id',$user->uid, '=') // if user has access
и так работает мой уже кажется скоро рабочий модуль. пока что он не вызывает ошибок но не работает, показываются по-прежнему все фирмы:

function user_referenced_taxonomy_terms_form_node_form_alter(&$form, &$form_state, $form_id) {

  global $user;
  //if current user has roles administrator or editor return
  foreach ($user->roles as $role) {
      if (($role == 'administrator') || ($role == 'editor')) return;
  }

  $query = new EntityFieldQuery();
  $term_entities = $query
    ->entityCondition('bundle', 'firms')
    ->entityCondition('entity_type', 'taxonomy_term', '=')
    ->fieldCondition('field_seller','target_id',$user->uid) // if user has access
    ->execute();
  if ($term_entities) {
      //forming array of firms using $term_entities array

      //$form['field_firm']['und'] = drupal_map_assoc( $term_entities );
      print_r($term_entities['taxonomy_term']);
  }else {
      //hide field firm if user has no access to any term
      $form['field_firm']['#access'] = FALSE;
  }

  echo "<br>form field_firm:<br>";
  print_r($form['field_firm']['und']['#options']);

}

как мне, используя массив разрешенных фирм изменить массив поля field_firm? вывод эта функция дает примерно такой (переработано для конфиденциальности):

Array ( [18] => stdClass Object ( [tid] => 18 [vocabulary_machine_name] => firms ) [25] => stdClass Object ( [tid] => 25 [vocabulary_machine_name] => firms ) )
form field_firm:
Array ( [_none] => н/д [25] => Amani [18] => Yana Mebel [20] => ZARA [10] => Zee )

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

Комментарий оставлен 18.04.2015 - 22:20

я решил проблему так: ЭТО РАБОЧИЙ КОД МОДУЛЯ user_referenced_taxonomy_terms
который убирает все термины таксономии, к которым у пользователя нет доступа, со страницы добавления НОДЫ, кроме если пользователь имеет роль administrator или editor, или скрывает полностью поле field_firms, если ни к одному термину словаря Firms доступа нет.
листинг файла user_referenced_taxonomy_terms.module

/* BASE_FORM_ID : node_form */
/* Displays only terms that have Entity Reference field with current user reference */
//$form['field_firm']['und'][1551]= array('#access' => FALSE); //hides taxonomy term 1551

function user_referenced_taxonomy_terms_form_node_form_alter(&$form, &$form_state, $form_id) {

  global $user;
  //if current user has roles administrator or editor return
  foreach ($user->roles as $role) {
      if (($role == 'administrator') || ($role == 'editor')) return;
  }

  $query = new EntityFieldQuery();
  $term_entities = $query
    ->entityCondition('bundle', 'firms')
    ->entityCondition('entity_type', 'taxonomy_term', '=')
    ->fieldCondition('field_seller','target_id',$user->uid) // if user has access
    ->execute();
  if ($term_entities) {
      //forming array of firms using $term_entities array
       $items = array_keys($term_entities['taxonomy_term']);
       print_r($items);
       foreach ($form['field_firm']['und']['#options'] as $key=>$value) {
           if ($key == '_none') continue;
           $delete=true;
           for ($i=0;$i<count($items);$i++) {
               if ($key == $items[$i])  $delete = FALSE;
           }
           if ($delete) $form['field_firm']['und'][$key]= array('#access' => FALSE);
       }
  }else {
      //hide field firm if user has no access to any term
      $form['field_firm']['#access'] = FALSE;
  } 

}

я думаю что сам процесс отбора элементов и сокрытия - слишком много строк, наверное есть функции для работы с массивами а не так как у меня построчное сравнение

Комментарий оставлен 18.04.2015 - 23:57

Ответы