Не зарегистрирован
Вход
Забыли пароль?
Регистрация
Подписаться
Сэкономьте время — перед вопросом на форуме узнайте, как найти ответ быстрее
По техническим проблемам необходимо обращаться в Консультационный центр

Поиск по форуму: 

Приглашаем в блог Amiro.CMS. Регулярные обзоры, опыт, решения, практикумы.

Форум  ->   Разработка плагинов, вопросы по API  ->  Условие в шаблон

Раздел для разработчиков. Обсуждение создания плагинов, вопросы и пожелания по API Amiro.CMS

Добавлено: 25.08.12 20:04:35 #1




Регистрация: 22.08.12
Сообщений: 7


Обратиться по имени

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

Общее видение есть:
1. В админке пользователей добавить поле "Доступ к скрытому" (которое может редактировать только админ) или отдельностоящий скрипт, который в базе правит cms_members (куда добавить новое поле `secret_access` некий)
2. В шаблонах вставить новый блок в стиле:
##secret_start##
секретная инфа
##secret_end##

Вот основной вопрос как раз за №2.
Т.е. ведь надо как-то получить из базы значение этого поля и сделать IF (`secret_`access` == true).

У кого есть мысли или (мне повезет!) опыт похожий?



Добавлено: 27.08.12 18:22:31 #2

Амиро



Регистрация: 13.11.05
Сообщений: 1065


Обратиться по имени

Как ограничить просмотр для неавторизованных пользователей в общем случае написано в FAQ.

Для полной реализации вашего случая необходимо описать пользовательскую функцию для определения группы пользователей с разрешенным доступом. Инструкцию по реализации можно запросить в службе поддержки (потребуются навыки программирования). Сошлитесь на эту тему.



Сервис голосования idea.amiro.ru для Ваших пожеланий по развитию Amiro.CMS
Добавлено: 27.08.12 21:03:57 #3




Регистрация: 22.08.12
Сообщений: 7


Обратиться по имени

Спасибо, сделал.
Даже расскажу как .

1. Добавил дополнительное поле к Пользователям через Сервис -> Набор полей -> Доп.поля.
При этом галочка "не показывать в общем списке" или как-то так, чтобы было видно только в админке, а не пользователю.

Т.к. нельзя было добавить сразу Select box, а только input type=text (строка/число), добавил числом, а в шаблоне (/_admin/templates/member.tpl) JS'ом подменяю его на select:
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script type="text/javascript">
<!--
    $(function(){
    var x = '<select name="cf_secret_access"><option value="0">Нет</option><option value=1';
    var secret_f = $('input[name="cf_secret_access"]');

    if (secret_f.val() == 1) x += ' selected';
    x += '>Да</option></select>';

    secret_f.replaceWith(x);
    });
//-->
</script>


2. В /_local/front_functions.php написал функцию получению статуса, вот код:
	function __secret_allowed() {
		global $frn, $secret_allowed;
		if(isset($secret_allowed) && $secret_allowed) {
			$res = $secret_allowed;
		} else {
			$res = 0;
			if(is_object($frn->Member) && $frn->Member->isLoggedIn()) {
				$x = @mysql_fetch_row(mysql_query('select `cf_secret_access` from `cms_members` where `id`="'.$frn->Member->User['id'].'"'));
				if ($x && !empty($x) && $x[0]) {
					$res = $secret_allowed = 1;
				} else {
					$res = $secret_allowed = 0;
				}
			}
		}
		return $res;
	}


В описаниях и везде используется тег <secret>секретные данные</secret>.
И для его обработки в той же front_functions.php в функцию CustomApplyVars ввёл следующее:
	function CustomApplyVars(&$vObject, $cThread, &$aVars, $pageId = 0){
		if ($cThread == 'page_finalize') {
			$i = strpos($aVars,'<secret>');
			if ($i === false) {
				return true; // not found
			} else {
				$aVars = __parseDesc($aVars);
			}
		}
		return true;
	}

В том же файле, соответственно, функция __parseDesc проверяет весь текст на <secret></secret> и меняет их в зависимости от результата __secret_allowed() или на <div class=secret></div>; или вырезает.

Авось кому поможет .

зы. Алекс, спасибо за вклад!



Добавлено: 28.08.12 10:15:47 #4



Регистрация: 17.07.08
Сообщений: 84


Обратиться по имени

Это решение не учитывает кеш, так как кеш работает только с группами пользователей.
Вам необходимо добавить в _local/common_functions.php функцию:

function customGetUserGroupMask($groupMask, $aParams){
    global $secret_allowed;

    $res = $groupMask;
    /**
     * @var AMI_Session
     */
    $oSession = AMI::getSingleton('env/session');
    $secret_allowed = 0;
    if($oSession->isLoggedIn()){
        /**
         * @var Users_TableItem
         */
        $oUser = $oSession->getUserData();
        if($oUser->cf_secret_access){
            $secret_allowed = (int)$oUser->cf_secret_access;
            if($secret_allowed > 0) {
                $res = $secret_allowed + 1000;
            }
        }
    }
    return $res;
}


Также, вместо конструкций:

$x = @mysql_fetch_row(mysql_query('select `cf_secret_access` from `cms_members` where `id`="'.$frn->Member->User['id'].'"'));


нужно использовать класс DB_Query:
http://manual.amiro.ru/docs/api6/DB/DB_Query.html



Служба поддержки
Добавлено: 28.08.12 17:10:02 #5




Регистрация: 22.08.12
Сообщений: 7


Обратиться по имени

Спасибо!
Так эта функция вызывается сама? Когда?

ps. А когда будет происходить присвоение $oUser->cf_secret_access?
Ведь если его не будет, то и толку от этого кеша нет).

pps. Сроки, не было времени изучать DB класс, но в целом да, конечно. Спасибо!





Создать новую тему

Всего тем: 6619
Всего сообщений: 27759
Всего зарегистрированных пользователей: 48242
Последний зарегистрированный пользователь: user10020052