+0.48
Рейтинг
5.81
Сила

Illarion

Очередное анти-спам решение.

Благодаря этому и этому спам-боты на моем сайте себя не проявляют — они регистрируются, пытаются что-то постить, но реального вреда от них нет. Разве что они засоряют список пользователей, в особенности «Онлайн».
Это не сильно мешает, но иногда раздражает. Идея доотсеивать пользователей на основе их поведения зрела уже давно, но сесть и реализовать (хотя бы прототип) получилось только сейчас.

Подробности и инструкции под катом.

Читать дальше →

CAS-сервер - единая авторизация для LiveStreet сайтов


CAS-сервер позволяет организовать единую точку авторизации (паспорт) ваших проектов на LiveStreet CMS. Ранее функционал обсуждался в топиках livestreet.ru/blog/16980.html и livestreet.ru/blog/17422.html
В комплекте идет плагин и полностью готовый к установке сайт CAS-сервера, шаблон которого реализован на Bootstrap. Подробнее от настройке будет ниже.

Как это работает
1. При попытке авторизации/регистрации пользователя на одном из ваших сайтов, он перенаправляется на сайт CAS-сервера.
2. После успешной авторизации/регистрации пользователь автоматически перенаправляется обратно на ваш сайт
3. Регистрация пользователя происходит только в БД того сайта, от куда он пришел и дополнительно в БД CAS-сервера
4. Если пользователь авторизовывается на сайте, где у него еще нет аккаунта, но есть аккаунт на другом вашем сайте, то будет произведена автоматическая регистрация на сайте с последующей авторизацией

Логика работы единой авторизации похожа на авторизацию на этом сайте, где весь процесс проходит через сайт passport.livestreetcms.com (происходит автоматическая регистрация/авторизация на 3-х сайтах).

Читать дальше →

Дополнительные поля - использование в плагинах

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

Сейчас поддерживаются следующие типы полей:
  • Целое число
  • Дробное число
  • Строка
  • Текст
  • Чекбокс
  • Дата
  • Выпадающий список
  • Теги
  • Ссылка на видео
  • Файл
  • Изображение

Постепенно мы наращиваем функционал и количество типов.
За весь функционал по полям отвечает модуль Property. Рассмотрим пример подключения функционала дополнительных полей к плагину «Статьи» на базе ORM.

Читать дальше →

Как получить строку локализации по динамически формируемому ключу?

Например, хочу сделать так:
{$aLang.region_$oLangAlias}

Но нельзя. Вставить еще одни скобки тоже нельзя, само собой. Возможно ли как-нибудь обойти это ограничение?

Новое в разрабатываемой версии LiveStreet CMS


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

Читать дальше →

Новое в LiveStreet Framework: хранилище "ключ => значение" - модуль Storage

Сегодня я расскажу вам о ещё одном хорошем пополнении возможностей для разработчиков — в фреймворке LiveStreet, на котором построена LiveStreet CMS добавлен новый модуль — Storage (написан мной по заказу ООО «ЛС СОФТ»), который является хранилищем типа «ключ => значение». Данное хранилище позволяет легко и быстро работать с небольшими объемами данных, CRUD операции (создание, чтение, обновление и удаление) с которыми теперь занимают всего одну строку кода.

Хранилище является аналогом плагина «Хранилище настроек (Config Engine)», с небольшими отличиями в АПИ, но тем не менее имеет общие элементы и поэтому разработчикам, уже знакомым с указанным плагином будет легче разобраться с хранилищем лс.

Читать дальше →

Мультизагрузка изображений

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

В шаблоне правим window_load_img.tpl, делаем массив img_file[] и дописываем multiple
<input type="file" name="img_file[]" id="img_file" value="" class="input-text input-width-full" multiple />


И ActionAjax.class.php, вот функция EventUploadImage() целиком
	/**
	 * Загрузка изображения
	 *
	 */
	protected function EventUploadImage() {
		/**
		 * Т.к. используется обработка отправки формы, то устанавливаем тип ответа 'jsonIframe' (тот же JSON только обернутый в textarea)
		 * Это позволяет избежать ошибок в некоторых браузерах, например, Opera
		 */
		$this->Viewer_SetResponseAjax('jsonIframe',false);
		/**
		 * Пользователь авторизован?
		 */
		if (!$this->oUserCurrent) {
			$this->Message_AddErrorSingle($this->Lang_Get('need_authorization'),$this->Lang_Get('error'));
			return;
		}
		$sFile=null;
                
                
                if (isPost('img_url') && $_REQUEST['img_url']!='' && $_REQUEST['img_url']!='http://') {
                        /**
                         * Загрузка файла по URl
                         */
                        $sFile=$this->Topic_UploadTopicImageUrl($_REQUEST['img_url'],$this->oUserCurrent);
                        switch (true) {
                                case is_string($sFile):

                                        break;

                                case ($sFile==ModuleImage::UPLOAD_IMAGE_ERROR_READ):
                                        $this->Message_AddErrorSingle($this->Lang_Get('uploadimg_url_error_read'),$this->Lang_Get('error'));
                                        return;

                                case ($sFile==ModuleImage::UPLOAD_IMAGE_ERROR_SIZE):
                                        $this->Message_AddErrorSingle($this->Lang_Get('uploadimg_url_error_size'),$this->Lang_Get('error'));
                                        return;

                                case ($sFile==ModuleImage::UPLOAD_IMAGE_ERROR_TYPE):
                                        $this->Message_AddErrorSingle($this->Lang_Get('uploadimg_url_error_type'),$this->Lang_Get('error'));
                                        return;

                                default:
                                case ($sFile==ModuleImage::UPLOAD_IMAGE_ERROR):
                                        $this->Message_AddErrorSingle($this->Lang_Get('uploadimg_url_error'),$this->Lang_Get('error'));
                                        return;
                        }

                        if ($sFile) {                        
                                $sText=$this->Image_BuildHTML($sFile, $_REQUEST);
                        }

                } else {

                        foreach ($_FILES['img_file'] as $k=>$v){
                           if(is_array($v)){
                               foreach ($v as $sk=>$sv){ 
                                        $arr[$sk][$k]=$sv;
                                }
                               }
                            }

                        $sText = "";

                        foreach ($arr as $_FILES['img_file']) {

                                /**
                                 * Был выбран файл с компьютера и он успешно зугрузился?
                                 */
                                if (is_uploaded_file($_FILES['img_file']['tmp_name'])) {

                                        if(!$sFile=$this->Topic_UploadTopicImageFile($_FILES['img_file'],$this->oUserCurrent)) {
                                                $this->Message_AddErrorSingle($this->Lang_Get('uploadimg_file_error'),$this->Lang_Get('error'));
                                                return;
                                        }
                                        /**
                                         * Если файл успешно загружен, формируем HTML вставки и возвращаем в ajax ответе
                                         */
                                        if ($sFile) {
                                                $sText.=$this->Image_BuildHTML($sFile, $_REQUEST);
                                        }

                                }	

                        } //foreach

                }

		$this->Viewer_AssignAjax('sText',$sText);		
		
	}


такие дела

Плагин ReCapcha

ReCapcha
Плагин ReCapcha, проверка capcha при добавлении топика, позволяет защитить сайт от спам атак.



Все последние изменения и доработки по плагину доступны на GitHub.

Появилась возможность включать капчу в топиках — ссылок / опросов / фотосетов.

Читать дальше →

Выносим обработку евентов в отдельный файл

В транковой версии на github.com появилась возможность выносить объемную обработку евентов из экшена в отдельные файлы.

Эти файлы размещаются в каталоге /classes/actions/[action]/Event[Name].class.php, где [action] — это название экшена, которому принадлежит евент, [Name] — название внешнего обработчика евента.

Рассмотрим более подробно.
Пусть у нас будет экшен ActionBlog.class.php:
<?php

class ActionBlog extends Action {

	public $oUserCurrent=null;

	public function Init() {
		$this->oUserCurrent=$this->User_GetUserCurrent();

		$this->SetDefaultEvent('index');
	}

	/**
	 * Регистрируем евенты
	 *
	 */
	protected function RegisterEvent() {
		/**
		 * Регистрируем внешние обработчики евентов
		 */
		$this->RegisterEventExternal('Topic','ActionBlog_EventTopic');

		$this->AddEvent('index','EventIndex');
		$this->AddEventPreg('/^topic$/i','/^(\d+)\.html$/i','/^$/i','Topic::EventShowTopic');
		$this->AddEventPreg('/^topic$/i','/^list$/i','/^$/i','Topic::EventList');
	}


	protected function EventIndex() {
		/**
		 * Устанавливаем шаблон для вывода
		 */
		$this->SetTemplateAction('index');
	}
}
?>

Читать дальше →

Livestreet 1.0 не отправляется почта.

Сразу скажу, перепробовал много всего, обшарил весь портал Livestreet на предмет решения, и не нашел.

Есть следующий конфиг:

$config['sys']['mail']['from_email'] = 'postman@gmail.com';
$config['sys']['mail']['from_name'] = 'postman';
$config['sys']['mail']['type']             = 'sendmail';                 // Какой тип отправки использовать
$config['sys']['mail']['charset']          = 'UTF-8';                // Какую кодировку использовать в письмах
$config['sys']['mail']['smtp']['host']     = 'smtp.gmail.com';            // Настройки SMTP - хост
$config['sys']['mail']['smtp']['port']     = 465;                     // Настройки SMTP - порт
$config['sys']['mail']['smtp']['user']     = 'postman@gmail.com';                     // Настройки SMTP - пользователь
$config['sys']['mail']['smtp']['password'] = 'password';                     // Настройки SMTP - пароль
$config['sys']['mail']['smtp']['secure']   = 'ssl';                     // Настройки SMTP - протокол шифрования: tls, ssl
$config['sys']['mail']['smtp']['auth']     = true;                   // Использовать авторизацию при отправке
$config['sys']['mail']['include_comment']  = true;                   // Включает в уведомление о новых комментах текст коммента
$config['sys']['mail']['include_talk']     = true;                   // Включает в уведомление о новых личных сообщениях текст сообщения


Благодаря одному из комментариев ort в дебрях портала, обнаружил способ проверить настройку и отправку почты (http://livestreet.ru/blog/8353.html#comment123734). С теми же настройками что и вверху, при помощи примера, я удостоверился что почта с сервера при помощи php все же отправляется. Тогда в чем кроется проблема?