Drupal php в полях

[Частично решено] PHP переменные во Views

Добавил екстра поле во вьюшку (программно), типа php поля.
Вьюшка находится на странице юзера с соответствующим контекстным фильтром.

Чего надо добиться:
Чтобы в поле было что-то типа: echo 111+$поле_сумма;

Как я делал (не пока не то вышло). Тут принцип поля:
гружу массив вьюхи через views_get_view_result
Нахожу там поля, и свершаю с ними математику)
Но дело в том что, в массиве вьюхе, строки идут в отдельным массивах, типа: $массив[‘0’], где 0 — это порядковый номер строки.
В итоге у меня все екстраполя, получают данные только с первой строки. Я не могу привязать это поле к той строке, в которой оно находится. То, есть не могу получить значения строки, в которой находиться это поле.
Это грубый пример, и на самом деле там всё сложнее, идет генерация формы с данными из полей строки.

Может как-то по другому можно?
Очень нужна помощь!

Комментарии

Но дело в том что, в массиве вьюхе, строки идут в отдельным массивах, типа: $массив[‘0’], где 0 — это порядковый номер строки.

Я проанализировал, номер строки не подхватить, наверное правильнее будет каким-то кодом перехватить данные этой строки, или сопоставлять номера массивов и поля id в них (хз как делать второе).

Я сейчас выдергиваю данные так: $views_array[‘0’]->_field_data[‘nid’][‘entity’]->field_summ[‘und’][‘0’][‘value’];
Где $views_array[‘Порядковый номер строк во вьюшке’] — кстати не знаю чем этот номер обусловлен, не понятно порядковый в выводе или проcто id.
Мне бы сразу из строки работать, не подгружая отдельно данные этой же вьюхи через views_get_view_result.

Сейчас пробую с модулем Views PHP, там есть переменные id ноды строки, от неё плясать уже проще. Но не очень хотелось бы через этого модуль.

В модуле Views PHP (Предоставляет PHP вставку кода в поле вьюхи), есть переменная $data, в которой есть все значения полей это строки (то есть нужный фрагмент массива).
Если программно (самописным модулем) пихать код в поле, то эти переменные не работают.

Вроде всё работает таким макаром, но php код будет тянуться из БД. Что сильно затормозит загрузку страницы с это вьюхой. Так что хотелось бы программно.

Лучше показывай код. Из твоего рассказа понятно лишь, что не удаётся провернуть какой-то финт на php.

Лучше показывай код. Из твоего рассказа понятно лишь, что не удаётся провернуть какой-то финт на php.

Читайте также:  Seatracker ru ais php

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

// Вариант 1 (без Views PHP)
$views_array = views_get_view_result ( ‘check’ , ‘page’ , $userid );
$value = $views_array [ ‘0’ ]-> _field_data [ ‘nid’ ][ ‘entity’ ]-> field_check_summ [ ‘und’ ][ ‘0’ ][ ‘value’ ];
// Тут и понятно что дернули первую строку $views_array[‘0’] и для всех остальных полей все значения будут от первой строки.

// Через модуль Views PHP работает вот так. Без необходимости views_get_view_result

$value = $data -> _field_data [ ‘nid’ ][ ‘entity’ ]-> field_check_summ [ ‘und’ ][ ‘0’ ][ ‘value’ ];
// В $data и лежит этот массив от нужной строки. Но если делать не через модуль, то так не выйдет.
?>

Вот таким макаром я добавлял код в поле (вариант первый, без Views PHP): http://sanchiz.net/blog/extra-fields-views

Ссылка ваше не работает.
Может обычного foreach нехватает?

// Вариант 1 (без Views PHP)
$views_array = views_get_view_result ( ‘check’ , ‘page’ , $userid ) ;
foreach ( $views_array as $val ) <
$value = $val — > _field_data [ ‘nid’ ] [ ‘entity’ ] — > field_check_summ [ ‘und’ ] [ ‘0’ ] [ ‘value’ ] ;
dpm ( $value ) ;
>

Не прокатит. Так как этот код отрабатывается сразу на все поля.
Код который Вы привели, отдаст мне значения последней строки, так как foreach прогонит массив до конца, он не знает какой именно фрагмент мне нужен.

Я сначала думал разобрать на запчасти модуль Views PHP, и посмотреть как он этот $data формирует. Но потом забил, так как сильно много бы провозился скорее всего.

Источник

12.11.1. Обращение к полям в Entity.

Получать значения полей в сущностях довольно просто, но есть несколько способов для этого. Давайте посмотрим как лучше всего работать со значениями полей в кастомном коде.

Вы всегда можете посмотреть актуальную информацию по работе с полями на официальном сайте:

В этой статье мы рассмотрим примеры работы со значениями.

Вам не обязательно запоминать как работают те или иные поля, вы всегда можете вернуться на эту страницу и вспомнить. Со временем вы будете все реже и реже обращаться к документации и осознаете как легко работаь с полями в Drupal. А пока можете добавить эту страницу в закладки, чтобы всегда иметь под рукой шпаргалку.

Работа с нодами

$node_storage = \Drupal::entityTypeManager()->getStorage(‘node’);
$node = $node_storage->load($nid);?>

Получение бандла (типа материала) ноды:

bundle(); // Работает для нод и многих типов сущностей, но не для всех
$entity->getType(); // Работает для всех типов сущностей?>

get(‘title’)->value; // Заголовок ноды
$node->get(‘created’)->value; // Timestamp создания ноды
$node->get(‘body’)->value; // Поле Содержимое
$node->get(‘body’)->summary; // Тизер поля Содержимое
$node->get(‘field_foo’)->value; // Обычные текстовые или числовые поля
$node->get(‘field_image’)->target_id; // Reference поля на другие сущности, например файл, изображения, термины таксономии, поля entity reference.
?>

Читайте также:  Заголовок страницы

Также можно использовать короткую запись для получения значений:

Загрузка определенных нод по значению поля:

foreach ($nodes as $node) print $node->title->value;
// Ваш кастомный код для изменения ноды
$node->set(‘title’, «Новый тайтл для ноды»);
$node->save();
>?>

Изменение значений в полях:

set(‘title’, «Новый тайтл»);
$node->set(‘body’, array(
‘summary’ => «Короткий текст»,
‘value’ => «Длинный текст»,
‘format’ => ‘basic_html’,
));
$node->save();?>

Также для полей с одним значением можно использовать короткую запись:

Получение значений множественных полей:

$data = array();
foreach($nodes as $node) $photo = array();
foreach($node->get(‘field_image’)->getValue() as $file) $fid = $file[‘target_id’]; // get file fid;
$photo[] = \Drupal\file\Entity\File::load($fid)->getFileUri();
>

$data[] = array(
‘rocnik’ => $node->get(‘field_rok’)->getValue(),
‘miesto’ => $node->get(‘field_miesto_konania’)->getValue(),
‘fotografie’ => $node->get(‘field_zbornik’)->getValue(),
‘foto’ => $photo,
);
>?>

Работа с файловыми полями

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

$file_storage = \Drupal::entityTypeManager()->getStorage(‘file’);
$file = $file_storage->load($fid);?>

Получение объекта файла из поля ноды:

Получение некоторых полей объекта файла:

getFileUri(); // «public://file123.jpg»
// Вы можете перевести URL файла в обычный вид из URI:
file_url_transform_relative(file_create_url($file->getFileUri())); // «/sites/default/files/public/file123.jpg»
$file->filename->value; // «file123.jpg»
$file->filemime->value; // «image/jpeg»
$file->filesize->value; // 63518 (размер в байтах)
$file->created->value; // 1511206249 (Unix timestamp)
$file->changed->value; // 1511234256 (Unix timestamp)
$file->id(); // 432?>

Посмотреть значения свойств файла доступных из таблицы file_managed можно следующих образом:

uid->target_id; // 1
echo $file->uid->value; // Это не будет работать. Используйте target_id.
echo $file->uid->entity->name->value;
echo $file->uid->entity->timezone->value; // «Asia/Omsk»?>

Работа с Entity Reference полями

Вы можете получать из reference полей множественные значения и обрабатывать их через foreach:

// Если вы выбрали «Entity ID» как display mode для entity reference поля,
// Только target_id будет иметь значение к которому вы имеете доступ
print $reference->target_id; // 1 (nid ноды)

// Если вы выбрали «Rendered Entity» как display mode, ты вы будете
// доступ ко всему объекту ноды.
print $reference->entity->title->value;

Изменение множественного поля entity reference:

Добавление новых значений к полю enitty reference к уже существующим значениям:

Работа с paragraphs

foreach ($node->get(‘field_paragraph_reference’) as $paragraph) if ($paragraph->entity->getType() == ‘your_paragraph_type’) <
$my_paragraph = $paragraph->entity;
>
>

if (!empty($my_paragraph)) // Параграфы это обычные Entity и к их полям можно обращаться как обычно:
print $my_paragraph->field_somefield->value;

// Параграфы не имеют Title как ноды
print $my_paragraph->title->value; // Это не будет работать
>
else print «The node doesn’t have this paragraph type.»;
>?>

Мы будем использовать эти примеры в будущем для написания кастомных модулей работающих с хуками и объектами сущностей.

Источник

[ Решено ] Как создать CCK поле материала с возможностью вставки PHP кода

Здравствуйте друзья! Собственно говоря вопрос вы уже скорее всего поняли. Переношу свой блог на систему под управлением Drupal 7. Сейчас возникла необходимость создания CCK поля, с возможностью вставки туда своего PHP кода. Есть ли какое либо решение моему вопросу кроме модуля computed field (с этим проблема). Заранее благодарен за помощь!

Читайте также:  Кнопка ссылка

Комментарии

Добавить к типу материала поле типа «длинный текст», сохраняете, потом в настройках «Обработка текста» выбираете «С применением фильтров (формат ввода выбирается пользователем)».

Спасибо за рекомендацию. Но это немного не то. Мне необходимо создать cck поле в которое я (например) помещаю php код, который вылавливает дату создания материала, автора публикации, количество просмотров и т.д и т.п. и все это дело отображается на конкретных нодах. У computed field такой функционал вроде как анонсирован, но модуль проблемный.

Открою страшный секрет. Это можно сделать добавив пхп в блок и привязав его к конкретным нодам. Или панелями тоже самое. И без всяких полей.

Открою страшный секрет. Это можно сделать добавив пхп в блок и привязав его к конкретным нодам. Или панелями тоже самое. И без всяких полей.

ну тогда уже проще в шаблоне вывести — здесь зависит от задачи , смотря что надо ТС — может ему надо в каждой ноде вставлять разный код

Открою страшный секрет. Это можно сделать добавив пхп в блок и привязав его к конкретным нодам. Или панелями тоже самое. И без всяких полей.

Открою и я вам секрет ваш способ не позволяет вставлять блок между CCK полей, гибко отображая заданную выборку. и как подмечено выше, мне необходимы различные выборки на различных материалах, страницах. Так что не стоит быть таким уверенным, описывая свой взгляд на задачу! То что вы предлагаете знает любой школьник в Drupal. Вопрос задан, и на него получен отличный ответ от Sebastian-Old. Человек понял что мне нужно и предложил вариант. Спасибо! Сейчас буду ковырять.

Друзья, столкнулся с трудностью в модуле ds. В управлении отображением нет ссылки add custom fields для создания своего поля. Кто знает в чем может быть косяк?

а кто сказал что он там будет в управление да еще отображении. настройки модуля смотрите и включайте все субмодули.

Вкладка «manage display» в видео по ссылке http://www.youtube.com/watch?v=mvFP16PJt4c содержит «add custom fields». У меня все опции и доп модули включены — ссылки нет! Если ее там не должно быть, подскажите тогда где?

У меня есть (под админом) там 4 ссылки разных во вкладке поля

Большое спасибо за поддержку и дельные советы! Вопрос решен, тема закрыта.

Источник

Оцените статью