[РЕШЕНО] Создать всего лишь 1 view, универсальный.

Главные вкладки

Аватар пользователя kissfm kissfm 26 сентября 2009 в 14:46

Здравствуйте.
Всё тот же вопрос у меня не решен. Пишу уже кажись третий раз. Кто-то может внятно подсказать решение???
К примеру: поле cck выпадающий список, в нем ну штук 100 стран например. Для вывода материалов с выбранной страной надо сделать блоки (только блоки, помещенные в правый регион). Тупо делать 100 блоков на каждую страну в фильтре.
Возможно ли сделать 1 блок универсальный, чтобы он знал на какой странице выводить какие материалы с определенной страной?

Меня могут тут конечно отправить на таксономию. Хорошо. Но это сути дела не меняет. Давайте расскажите мне о таксономии в этом же плане. URL на эти страницы с блоками не содержат терминов, не к чему привязаться. И как я понимаю аргументы не помогут. Так или не так???
Спасибо заранее, если будет кому. Я считаю это важными знаниями, хочу их обрести.

Комментарии

Аватар пользователя GROL GROL 26 сентября 2009 в 20:41

у меня через аргумент блок "понимает" какой продукт сейчас смотрят, и использует его для фильтрации новостей только по этому продукту. Для этого в качестве Provide default argument используется PHP code что-то вроде такого:

<?php 
  
if ( arg(0) == 'node' && is_numeric(arg(1)) && ! arg(2) ) {
  
$node node_load(arg(1));
  
$terms taxonomy_node_get_terms_by_vocabulary($node4); // 4 - ID нужного мне словаря
   
return key($terms);
}
?>

Тебе нужно делать по той же схеме т.е. смотреть у текущего нода свое поле и возвращыть ID термина, по которому фильтруется инфа.

Аватар пользователя kissfm kissfm 26 сентября 2009 в 18:31

Охх..так оно все по-дремучему.
GROL, я не могу вкурить в синтаксис друпала. Мне кидают уже не в первой куски кода, а я не понимаю что за что там отвечает. Это не тот php, которым я ранее занимался(((
Мне интересно как с этого кода блок знает на какой странице его используют и что он именно должен показывать пользователям.
Можно пояснить? Спасибо.

Аватар пользователя IrinaStasuk IrinaStasuk 26 сентября 2009 в 19:35

Читаю... и ничего не понимаю. Друпал все равно не залезет вам в голову, чтобы знать по какому признаку показывать материал. Значит, должно быть какое-то идентификационное поле. Далее - проще. Создаете вьюс с аргументом, по которому происходит индентификация. Если блок под материалом, то поможно не блок, а поле сск с вьюсом. И создавая материал, указывать аргумент. Если сбоку, то можно тоже самое + блок-сск, который выводит любое поле документа в блок.

Аватар пользователя GROL GROL 26 сентября 2009 в 21:00

"kissfm" wrote:
Это не тот php, которым я ранее занимался(((

ну и что в моем коде такого, которое не использовалось ранее? Smile
"kissfm" wrote:
Мне интересно как с этого кода блок знает на какой странице его используют и что он именно должен показывать пользователям.

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

Еще раз:
1. Создаешь views с аргументом. Это тот аргумент, из-за которого содержимое блока будет меняться. Наверное, в твоем случае это должен быть Term ID по словарю "Страна", если он у тебя такой есть Wink
2. В параметрах аргумента Provide default argument выбираешь PHP code
3. В поле для PHP вводишь свой код, подобный которому привел я,. Возможно, он будет выглядеть так

<?php
if ( arg(0) == 'node' && is_numeric(arg(1)) && ! arg(2) ) {
  
$node node_load(arg(1));
   return 
$node->field_country;
}
?>
Аватар пользователя kissfm kissfm 27 сентября 2009 в 1:10

Ок, сделаю, посмотрим. Но я не получил ответа на вопрос. Каким образом блок будет реагировать на страницу, где он выводится?
Если есть те же пусть 100 страниц текста, каждая из которых посвящена отдельной стране.
Вот смотрим страницу с инфой о стране Россия. Как блок это узнает и покажет только то, что касается России?

И что содержится в arg(0), arg(1), arg(2)?

Аватар пользователя kyky kyky 27 сентября 2009 в 5:54

Ключевой момент -- это функция arg(x).
Автор, тебе нужно сперва уяснить, что блок никак не связан с содержимым сайта, он не знает, что сейчас показано в основном контенте. Один из способов узнать это -- проанализировать адресную строку с помощью функции arg(x).

"kissfm" wrote:
И что содержится в arg(0), arg(1), arg(2)?

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

Аватар пользователя kissfm kissfm 27 сентября 2009 в 12:59

"kyky" wrote:
Один из способов узнать это -- проанализировать адресную строку с помощью функции arg(x)

А еще какие есть способы?

Аватар пользователя kissfm kissfm 1 октября 2009 в 23:07

Вот давайте решим конкретную задачу.
Сделал я словарь Страна, там 2 термина:
Украина (category/strana/ukraina),
Россия (category/strana/rossiya).
Этот словарь прикрепил к типу Page и Story. Создал по 3 материала Page с названиями городов для каждой страны.
Создал 2 материла типа Story - Украина (content/ukraina) и Россия (content/rossiya).
Когда захожу на Россия (Story), то хочу увидеть в блоке список заголовков городов России. Все по соответствии выбранным терминам словаря. И такое же для Украины и ее городов.
Дальше создал view:block с фильтрами
Материал:Тип - Page,
Материал:Опубликовано - Да.
Поле Матераил:Заголовок.
Аргумент Таксономия:Term ID
и наэкспериментировался я с ним по самое не могу. А толку нету.
Интуитивно я понимаю, что наверное есть где-то параметр в аргументе, который отвечает за соответствие терминов материала, на котором выводятся заголовки иных постов и терминов этих самих же постов.

А еще хотелось уточнить на счет arg. Написано:
Когда открыта страница с путем "admin/content/types", arg(0) будет возвращать "admin", arg(1) будет возвращать "content", и arg(2) возвратит "types".

Функция работает с внутренним путем друпала, а не с конечным адресом, поэтому если вы находитесь на странице "blog/some-post", а ее настоящим адресом является "node/123", то arg(1) будет равен "123", а не "some-post".

Вот мне не ясно - если arg(1) будет равен "123", то где будет node, если arg(0)==blog? А arg(2) остается пустым? И arg начинает наполнятся сразу после хоста в url от (0) до (2)? Их всего 3 элемента есть (arg(0), arg(1), arg(2))? А если путь "admin/content/node-type/page" или более длинный?

Аватар пользователя kissfm kissfm 19 ноября 2009 в 17:19

"GROL" wrote:
<?php
if ( arg(0) == 'node' && is_numeric(arg(1)) && ! arg(2) ) {
$node = node_load(arg(1));
$terms = taxonomy_node_get_terms_by_vocabulary($node, 4); // 4 - ID нужного мне словаря
return key($terms);
}
?>

Тут возник вопрос. В словаре я выбираю для материала Православие 2 термина (так надо для иной задачи).
-Христианство
--Православие
Но вывод идет по верхнему только. Выводятся в Православии только материалы, касающиеся Христианства и ни одного по Православию. А это совсем не правильно. Как указать в этом коде обращать внимание только на термин словаря нижнего уровня, и игнорировать все верхние?
Спасибо.

Аватар пользователя webandr84 webandr84 23 декабря 2009 в 14:27

Я выставляю такой аргумент но ничего не получается, Есть "Товар" и есть "Статьи" привязаные к товару есть два views и при выборе товара в одном виде во втором надо вывести статьи которые связаны с товаром через поле выбора field_tov_select. Как сделать?

Аватар пользователя kissfm kissfm 23 декабря 2009 в 22:42

Может проблема такая, как и у меня была. Возвращать поле в таком виде нужно было:

return $node->field_brend[0]['nid'];

так как просто $node->field_brend не работал.
Проверив на одной из страниц его через:

print_r($node->field_brend);

получил:

Array([0]=>Array([nid]=>2))
Аватар пользователя webandr84 webandr84 23 декабря 2009 в 23:31

Получается мы прописываем аргумент и все а фильтр не трогаем? Просто с друпалом я знаком ток 2 недели, а оформить вывод нужно срочно.

Аватар пользователя kissfm kissfm 24 декабря 2009 в 1:30

В фильтре ставить надо какой тип материала выводить именно, у тебя Статьи видимо (а то вдруг несколько типов материалов связаны со словарем), ну еще "Материал: Опубликовано - Да" можно поставить.

Аватар пользователя webandr84 webandr84 24 декабря 2009 в 1:50

И у меня получается не товар привязывается к статье, а статья к товару. А при выборе товара загружается node товара, и поэтому мне кажется этот код не подойдет. Так как в ноде товара нет полей про статью. А вот при выборе статьи получается загрузить все товары привязаные к ней. А наоборот нет. Возможно как то это решить?

Аватар пользователя S_F S_F 10 июня 2010 в 19:55

прочитал, но так и не понял. какой кусок кода и куда воткнуть что бы фильтровалось по термину?
Поясните пожалуйста.

Аватар пользователя kissfm kissfm 14 июня 2010 в 13:36

Ну то, что писал GROL - там и ответ. Понятная инструкция.
Кусок кода и у него есть и у меня.

P.S. писать код в параметрах аргумента Provide default argument нужно без <?php ?>