Вывод доп полей в сайдбаре

ЕСТЬ РЕШЕНИЕ ЗАКРЫТО
#1 17 декабря 2015 в 22:07
Ребят, задавал вопрос, но удалил нечаянно.
Итак, с задачей частично справился.

Создал виджет который показывает доп поля пользователя. Виджет работает, но не так как хотелось бы.
У виджета в админке есть опции, где я прописываю какие поля необходимо показывать (через запятую).

Проблема:
Но он выводит только данные из текстовых полей.
Не выводит данные из списков, местоположений и дат.
Не группирует поля как в профиле (напрример: общая информация, контакты и пр.)
Нет стилизации (верстки, классов как в профиле).

мойвиджет.php.tpl содержит такой вывод
  1.  
  2. <?php if($fields_names) { ?>
  3.  
  4. <div class="fields" style="padding-left:10px;">
  5.  
  6. <?php foreach($fields_names as $name) { ?>
  7.  
  8. <div><span class="dopoinf"><?php echo $fields[$name]['title'] ?>:</span> <?php echo $profile[$name] ?></div>
  9.  
  10. <?php } ?>
  11.  
  12. </div>
  13.  
  14. <?php } ?>

А widget.php это
  1.  
  2. <?php
  3.  
  4. class widgetUsersPcavatar extends cmsWidget {
  5.  
  6. public $is_cacheable = false;
  7.  
  8. public function run(){
  9.  
  10. $uri = cmsCore::getInstance()->uri;
  11.  
  12. preg_match('/users\/([0-9]+)(?!=\/.*)/i', $uri, $res);
  13.  
  14. $content_model = cmsCore::getModel('content');
  15.  
  16. if(!isset($res[1])) {
  17.  
  18. $res2 = explode("/", $uri);
  19.  
  20. if(!isset($res2[1])) return false;
  21.  
  22. if(stripos($res2[1], ".html") === false) return false;
  23.  
  24. $res2[1] = str_replace(".html", "", $res2[1]);
  25.  
  26. $item = $content_model->getContentItem($res2[0], $res2[1], 'slug');
  27.  
  28. if(!isset($item['user_id']) || !$item['user_id']) return false;
  29.  
  30. $id = $item['user_id'];
  31.  
  32. } else {
  33.  
  34. $id = $res[1];
  35.  
  36. }
  37.  
  38. $content_model->setTablePrefix('');
  39.  
  40. $content_model->orderBy('ordering');
  41.  
  42. if($this->options['fields_names']) {
  43.  
  44. $fields = $content_model->getContentFields('users');
  45.  
  46. }
  47.  
  48. $profile = cmsCore::getModel('users')->getUser($id);
  49.  
  50. return array(
  51. 'profile' => $profile,
  52. 'id' => $id,
  53. 'fields' => isset($fields) ? $fields : false,
  54. 'fields_names' => $this->options['fields_names'] ? explode(",", $this->options['fields_names']) : false,
  55. );
  56.  
  57. }
  58.  
  59. }
  60.  
  61.  

options.form.php содержит
  1.  
  2. <?php
  3.  
  4. class formWidgetUsersPcavatarOptions extends cmsForm {
  5.  
  6. public function init() {
  7.  
  8. return array(
  9.  
  10. 'type' => 'fieldset',
  11. 'title' => LANG_OPTIONS,
  12. 'childs' => array(
  13.  
  14. new fieldString('options:fields_names', array(
  15. 'title' => 'name полей для вывода',
  16. 'hint' => 'через запятую, в порядке вывода',
  17. 'default' => 0
  18. )),
  19.  
  20. )
  21. ),
  22.  
  23. );
  24.  
  25. }
  26.  
  27. }
  28.  
Помогите допилить. Спасибо
#2 18 декабря 2015 в 19:56

Появляется ошибка
Fatal error: Call to a member function parse() on a non-object in /home/zzz/мой-сайт.ru/docs/templates/default/controllers/users/widgets/мой виджет/мойвиджет.tpl.php on line 73

Azami
переменная $field не инициализирована?
#3 18 декабря 2015 в 20:11
по идее в мойвиджет.tpl.php вы должны или передать туда переменную или создать внутри, а потом обращаться к ней.
#4 18 декабря 2015 в 21:05
Можно конечно, в мойвиджет.php.tpl вставить кусок кода profile.tpl.php

  1. <div>
  2.  
  3. <div>
  4.  
  5. <?php
  6. $fieldsets = cmsForm::mapFieldsToFieldsets($fields, function($field, $user){
  7. if (in_array($field['name'], array('nickname', 'avatar'))){ return false; }
  8. return true;
  9. }, $profile);
  10. ?>
  11.  
  12. <?php foreach($fieldsets as $fieldset){ ?>
  13.  
  14. <?php if (!$fieldset['fields']) { continue; } ?>
  15.  
  16. <div class="fieldset">
  17.  
  18. <?php if ($fieldset['title']){ ?>
  19. <div class="fieldset_title">
  20. <h3><?php echo $fieldset['title']; ?></h3>
  21. </div>
  22. <?php } ?>
  23.  
  24. <?php foreach($fieldset['fields'] as $field){ ?>
  25.  
  26. <?php if (empty($profile[$field['name']])) { continue; } ?>
  27.  
  28.  
  29. <?php
  30. if (!isset($field['options']['label_in_item'])) {
  31. $label_pos = 'none';
  32. } else {
  33. $label_pos = $field['options']['label_in_item'];
  34. }
  35. ?>
  36.  
  37. <div class="field ft_<?php echo $field['type']; ?> f_<?php echo $field['name']; ?>">
  38.  
  39. <?php if ($label_pos != 'none'){ ?>
  40. <div class="title title_<?php echo $label_pos; ?>"><?php echo $field['title']; ?>: </div>
  41. <?php } ?>
  42.  
  43. <?php if ($field['name']=="city") {?>
  44. <div class="value">
  45. <?php
  46. $city_parents = cmsCore::getModel('geo')->getCityParents($profile['city']['id']);
  47. $region = cmsCore::getModel('geo')->filterEqual('i.id', $city_parents['region_id'])->getRegions($city_parents['country_id']);
  48. $country = cmsCore::getModel('geo')->filterEqual('i.id', $city_parents['country_id'])->getCountries();
  49. ?>
  50. <span><?php echo $field['handler']->parse( $profile[$field['name']] ); ?></span>
  51. (<span><?php foreach($country as $country_name) echo $country_name; ?></span>, <span><?php foreach($region as $region_name) echo $region_name; ?></span>)
  52. </div>
  53. </div>
  54. <?php continue; } ?>
  55.  
  56. <div class="value">
  57.  
  58. <?php
  59.  
  60. echo $field['handler']->parse( $profile[$field['name']] );
  61.  
  62. ?>
  63.  
  64. </div>
  65.  
  66. </div>
  67.  
  68. <?php } ?>
  69.  
  70. </div>
  71.  
  72. <?php } ?>
  73.  
  74. </div>
Но на выходе я получаю вывод всех без исключения полей в сайдбаре. и не могу контроллировать их вывод из админки.
В данном случае смог исключить из цикла (который под споллером) некоторые позиции с помощью конструкции

  1. <?php if ($field['name']=="hobby" || $field['name']=="about_company" || $field['name']=="birth_date")) {
  2. continue;
  3. } ?>
Но! текстовые поля (которые исключены этой конструкцией) не показываются (это хорошо), а те которые списками, датами, или чеками — у них остаются названия — значения не отображаются, а название — да.

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

Провел за этой затеей не меньше 20 часов. Марафон результатов не принес. Я не кодер, это мои первые шаги.
Ребят, как видите не жду тупо халявы, но реально не получается.
Пожалуйста уделите немного времени. Иначе истерика и разбитый лоб обеспечены ).

Я в замешательстве. Заранее спасибо.
#5 19 декабря 2015 в 10:30
Обновил первый пост, выложил содержимое трех файлов. Почистил тему.
#7 20 декабря 2015 в 17:36
.
#9 23 декабря 2015 в 06:57
.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.