Powered by CodeIgniter

Советы и решения

(55)
10
10 голосов
Решаем проблемы вместе и передаем друг другу полезные знания.
Внимание! Этот пост описывает действительно грязный хак.
Лучше так не делать. Впрочем, на безрыбье и рак — рыба.

Добавление этой фишки произойдет в 3 этапа:
  1. Меняем таблицу
  2. Меняем форму форму настроек профиля
  3. Меняем страницу профиля

Дополнительные плюшки:
  • Реальное имя с индексом в виде ника в списке пользователей вместо «простого» ника
  • Выделение цветом пользователей, у которых сегодня Д.Р.


Итак, первым делом модифицируем таблицу с пользователями.
Для этого надо выполнить следующий sql-запрос (в пространстве бд движка):
ALTER TABLE `users` ADD `about` text AFTER `name`, ADD `site` varchar(255) AFTER `name`, ADD `birth_date` DATE AFTER `name`, ADD `real_name` varchar(255) AFTER `name`;
Теперь можно менять форму настроек профиля.
Для этого:
1. редактируем файл gears/user/index.php следующим образом:
Находим строки
$this->form->input('password', array('label'=>t('new_password'),'description'=>t('new_password_description'), 'validation'=>'min_length[5]','js_validation'=>'length[5,-1]','md5'=>TRUE,'via_cookies'=>TRUE,'ajax'=>array('name'=>t('!edit g enerate'),'url'=>'/user/passgen/','where'=>'password.after','update'=>'password'))) ->fieldset() /* Добавлять сюда (в исходном коде ЭТОЙ строчки нету) */ ->br();
И в указанное место добавляем код:
/* Start Field Section */ ->title(t('!user_profile profile')) /* Добавляем новую вкладку */ ->fieldset('profile') /* Открываем набор полей */ ->input('real_name') ->input('site') ->calendar('birth_date') ->fieldset() /* Закрываем набор полей, не? */ ->title(t('!user_profile about')) ->fieldset('about') ->editor('about') ->fieldset() /* End Field Section */
2. редактируем файл gears/user/lang/ru.lng
В секцию [user] добавляем строки:
; Для дополнительных полей профиля real_name = "Реальное имя" real_name_description = "А как Вас по паспорту?" site = "Личный сайт" site_description = "Бложек, днявка или корпоративный портал..." birth_date = "Дата рождения" birth_date_description = "А Вам уже исполнилось 18?" about = "Личная характеристика" about_description = "Напишите немного о том, кто Вы такой" В секцию [user_profile] добавляем строки:
; Для дополнительных полей профиля profile = "Профиль" real_name = "Реальное имя" site = "Личный сайт" birth_date = "Дата рождения" about = "О себе"
Хозяйке на заметку: Локализация и настройка календарика для элемента формы.
Открываем gears/form/js/calendar.js и редактируем следующим образом:
Было:
days: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], // days of the week starting at sunday direction: 0, // -1 past, 0 past + future, 1 future draggable: true, months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], navigation: 1, // 0 = no nav; 1 = single nav for month; 2 = dual nav for month and year offset: 0, // first day of the week: 0 = sunday, 1 = monday, etc..
Стало:
days: ['Воскресенье', 'Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота'], // days of the week starting at sunday direction: 0, // -1 past, 0 past + future, 1 future draggable: true, months: ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'], navigation: 2, // 0 = no nav; 1 = single nav for month; 2 = dual nav for month and year offset: 1, // first day of the week: 0 = sunday, 1 = monday, etc..

И, наконец, изменяем саму страницу профиля:
Снова файл gears/user/index.php.
Находим строчки
d('user_profile'); /* Добавлять сюда (в исходном коде ЭТОЙ строчки нету) */ $item['type'] = 'line'; $item['left'] = t('register_date'); $item['right'] = df($user->reg_date); И, соответственно добавляем:
/* Start Field Section */ if (!is_null($user->real_name)){ $item['type'] = 'title'; $item['text'] ='<H1>'.$user->real_name.'</H1>'; $this->profile->add($item,-1); } if (!is_null($user->birth_date)){ $item['type'] = 'line'; $item['left'] = t('birth_date'); $item['right'] = df($user->birth_date,'%d %B %Y'); $this->profile->add($item); } if (!is_null($user->site)){ $item['type'] = 'line'; $item['left'] = t('site'); $item['right'] = $this->builder->a($user->site,l($user->site)); $this->profile->add($item); } if (!is_null($user->about)){ $item['type'] = 'line'; $item['left'] = t('about'); $item['right'] = $user->about; $this->profile->add($item,99); } /* End Field Section */
А теперь — обещанные плюшки (-:
(ник в виде индекса рядом с полным именем и выделение цветом именинников)
Редактируем файл gears/users/index.php
После строчек
foreach($users as &$user){ $user['avatar'] = reset(make_icons($user['avatar'])); добавляем
if (!is_null($user['real_name'])){ $user['name'] = $user['real_name'].'<sup>'.$user['name'].'</sup>'; } для первой плюшки, и
if (!is_null($user['birth_date']) && (date('m-d',strtotime($user['birth_date'])) == date('m-d'))) { $user['name'] = '<font color=green>'.$user['name'].'</font>'; } для второй.

Пока все. С нетерпением жду комментариев.
18:35 ← 09 января 2010 Отправить в Твиттер sudersuder  RSS comments 35

Комментарии (35) ↓

inetlover inetlover time 23:58 ← 09 января 2010 #
Спасибо большое! Мне очень пригодиться. Буду разбираться.
dqpb dqpb time 07:51 ← 10 января 2010 #
Штука с ДР — хорошая мысль! Тоже является грязным хаком? Нада подумать как её развить визуально так как выделение цветом не совсем уместно, может торт? :)

suder, а может вы полигончик организуете демо-тестовый?
Автор
suder suder time 12:51 ← 10 января 2010 #
Она не менее грязный, чем все остальное. В идеале дополнительные поля должны были организовываться отдельной шестеренкой, со своей таблицей, хуками и проч.
suder, а может вы полигончик организуете демо-тестовый?
Это легко, но все равно надо бы обсудить как и что.

P.S.
Сейчас пытаюсь реализовать фишку, чтобы админ сообщества мог назначать других админов и модеров. По этому поводу статья нужна?
dqpb dqpb time 14:13 ← 10 января 2010 #
В идеале это универсальная шестеренка должна быть по созданию форм где либо.

По этому поводу статья нужна?
Любые материалы в рамках движка интересны будут всем.
Автор
suder suder time 14:15 ← 10 января 2010 #
Я напишу тебе в личку, как только будет готова.
А это будет достаточно скоро. ;-)
shm-valeriy shm-valeriy time 22:33 ← 10 января 2010 #
Спасибо за статью!
ОЧень будет полезна )))
Любые материалы в рамках движка интересны будут всем.
Полностью потдерживаю!
inetlover inetlover time 11:41 ← 11 мая 2010 #
При попытке удалить данные из поля О себе: ->editor('about') данные не удаляются, единственная возможность удалить их — это написать NULL в поле и сохранить.

Вот только не пойму, как можно доработать код, что бы при сохранении пустого поля ->editor('about') в базу записывался NULL автоматически?
Автор
suder suder time 13:39 ← 13 мая 2010 #
if (!is_null($user->about)){
можно заменить на что-то вроде

if (!(is_null($user->about) && $user->about=='' )){
Это уточнение проверки (сохранить is_null требуется, поскольку если значение будет NULL, то php выведет ошибку о сравнение неприводимых типов, не?). Вообще, эта конструкция определяет, в каком случае выводить информацию. Еще можно проверять длину текста, etc.
inetlover inetlover time 14:00 ← 13 мая 2010 #
Спасибо!
Varhal Varhal time 22:47 ← 04 июня 2010 #
Все было ок, но теперь при нажатии на юзера, выдает ошибку:

A PHP Error was encountered

Severity: Notice

Message: Undefined property: stdClass::$real_name

Filename: user/index.php

Line Number: 154
admin admin time 17:08 ← 05 июня 2010 #
Логичным было бы посмотреть на 154 строку этого файла и найти ошибку :-)
Автор
suder suder time 13:13 ← 06 июня 2010 #
А патч на базу ты наложил?
Varhal Varhal time 17:07 ← 07 июня 2010 #
да конечно)) ладно буду разбираться)
Автор
suder suder time 01:54 ← 08 июня 2010 #
Кстати, если не сложно, приведи строчки 150-160 из файла user/index.php
Varhal Varhal time 16:35 ← 08 июня 2010 #
Кстати на счет плюшек, этой строчки нет в файле gears/users/index.php:

code class=foreach($users as &$user){
$user['avatar'] = reset(make_icons($user['avatar']));>
Автор
suder suder time 19:58 ← 08 июня 2010 #
Строка 66 в оригинальном файле.
Если точнее, там строчки:
$this->db->select('(SELECT COUNT(id) FROM nodes WHERE aid = users.id) as nodes_num, (SELECT COUNT(id) FROM comments WHERE aid = users.id) as comm_num, users.*'); $users = $this->db->order_by('id','asc')->get('users')->result_array(); foreach($users as &$user){ $user['avatar'] = reset(make_icons($user['avatar'])); } $header = array(
Varhal Varhal time 17:00 ← 08 июня 2010 #
Еще не хочет отображаться информация с языкового файла:
SVN
Автор
suder suder time 19:55 ← 08 июня 2010 #
Удали все из папки /engine/cache (но не саму папку!).
После этого должно заработать.
Varhal Varhal time 20:05 ← 08 июня 2010 #
спасибо, буду знать)))
Автор
suder suder time 20:08 ← 08 июня 2010 #
Заработало?
Varhal Varhal time 20:11 ← 08 июня 2010 #
ДА. Только вот строка 66 у меня совсем другая. Движок обновляю с помощью SVN)
Автор
suder suder time 20:17 ← 08 июня 2010 #
Не удивительно, что другая — ты ведь дописывал кое-какие вещи до этого.
Varhal Varhal time 20:21 ← 08 июня 2010 #
дак вообще нет таких строчек, по поиску не находит в измененном файле и в оригинальном нет))
Автор
suder suder time 20:28 ← 08 июня 2010 #
А ты точно открываешь gears/users/index.php
а не gears/user/index.php?
Varhal Varhal time 20:34 ← 08 июня 2010 #
Извиняюсь за невнимательность!!!
Varhal Varhal time 22:01 ← 08 июня 2010 #
Все получилось, создал поля для своего сайта. Спасибо suder !
satagik satagik time 20:54 ← 11 июня 2010 #
нашел небольшую кляксу.
Пишем свой сайт вот так

сохраняем… заходим в профиль, переходим на сайт.


Анн нет. Мы переходим не по этой ссылке

а по этой

cuder как это исправить?
Автор
suder suder time 00:05 ← 12 июня 2010 #
Ну, во-первых, мой ник — suder, а во-вторых:

можно заменить
$this->builder->a($user->site,l($user->site)); на
$this->builder->a($user->site,$user->site);
но это не очень хорошая идея. приду домой, придумаю чего по-лучше. ;-)
satagik satagik time 00:42 ← 12 июня 2010 #
За ник извини suder, спешил.
Автор
suder suder time 01:19 ← 12 июня 2010 #
$item['right'] = $this->builder->a($user->site,l($user->site)); заменить на

%s_trim=expand(':',$user->site);
if ($s_trim[0]='http'||$s_trim[0]='https'){ $item['right'] = $this->builder->a($user->site,l($user->site)); }else{ $item['right'] = $this->builder->a($user->site,l('http://'.$user->site)); }
З.Ы. Код не проверял, но должно работать.
satagik satagik time 00:44 ← 12 июня 2010 #
Кстати такая же фигня при создании меню(в модуле «Меню») на сторонний сайт.
Автор
suder suder time 01:09 ← 12 июня 2010 #
Не заработало, как я заметил… Жаль.
Сча придумаю что-нибудь по-лучше…
Varhal Varhal time 20:21 ← 08 июля 2010 #
А как повесить в профиле юзера большую фотографию??? Все остальное получилось!
dignityinside dignityinside time 04:04 ← 02 июля 2011 #
А почему бы не сделать из всего этого всего одну нормальную шестерёнку? Которую без проблем можно было бы установить и включить?!
AracooL AracooL time 12:09 ← 22 июля 2011 #
Было бы супер. Поддерживаю!