0.00
97 читателей, 75 топиков

[EVO] Исправление некорректной работы modxloginza с yandex.ru

Добрый день. Мне необходимо было сделать возможность входа на сайт через соцсети. Для этого я взял сниппет modxloginza v.0.4 отсюда.

Однако, на сайте предусмотрена возможность заказа. Пользователи должны получать информацию на реальный email, а некоторые службы не возвращают информацию о пользователе, в том числе, тот самый email.

Я решил, что в том случае, если у пользователя нет реального ящика, мы будем помещать его в специальную группу email_req. На основании этого сразу после входа, а также, если он все же этого не сделает, в других местах, мы будем запрашивать у него email. Например, при заказе. Но это так, замечание.

Главное, что я заметил — modxloginza крайне некорректно работает со службой Яндекса. В двух местах в сниппете modxloginza есть устаревшие или неправильные условия. Конкретнее, в файле loginza.class.php начало функции Login выглядит так:

global $modx;

        $json = new Services_JSON();    // получаем и декодируем данные от Логинзы
        $loginza_data = file_get_contents('http://loginza.ru/api/authinfo?token='.$loginza_token);
        $ldata = $json->decode($loginza_data);
        if(isset($ldata->error_type)) return ENTER_ERROR.$ldata->error_message.RETRY_ENTER;

        // определяем имя провайдера, логин и никнейм пользователя
        $ltype = parse_url($ldata->provider);
        $ltype = $ltype['host'];
        if(!isset($ldata->uid)) {
            $luid = parse_url($ldata->identity);
            $luid = explode('.',$luid['host']);
            $luid = $luid[0];

        } else $luid =  $ldata->uid;

        if(empty($ldata->nickname)) $lnick = $luid; else $lnick = $ldata->nickname;
        // здесь нужно помещать обработку для отдельных провайдеров:
        if($ltype=='openid.yandex.ru') $ltype = 'yandex.ru';

        $this->User = array();
        $this->User['username'] = $lnick.'@'.$ltype;
        $this->User['password'] = substr(md5($this->User['username'].$this->mysecret), 0, 12);

        //отдача email разными сервисами
        // vkontakte -
        // facebook +
        // yandex -/+ (если пользователь разрешил, по умолчанию нету)
        // google +
        // .....
        //____!!! В Н И М А Н И Е !!!____
        //на данный момент если сервис не отдал емайл
        //то устанавливается "левый-подставной"
        //_НЕ ОТСЫЛАЙТЕ НА НЕГО ПОЧТУ!_


Осуществляется неправильная проверка данных Яндекса. Я исправил код:

global $modx;

        $json = new Services_JSON();    // получаем и декодируем данные от Логинзы
        $loginza_data = file_get_contents('http://loginza.ru/api/authinfo?token='.$loginza_token);
        $ldata = $json->decode($loginza_data);
        if(isset($ldata->error_type)) return ENTER_ERROR.$ldata->error_message.RETRY_ENTER;

        // определяем имя провайдера, логин и никнейм пользователя
        $ltype = parse_url($ldata->provider);
        $ltype = $ltype['host'];
        if(!isset($ldata->uid)) {
            $luid = parse_url($ldata->identity);
            $luid = explode('.',$luid['host']);
            $luid = $luid[0];

        } else $luid =  $ldata->uid;

        if(empty($ldata->nickname)) $lnick = $luid; else $lnick = $ldata->nickname;
        // здесь нужно помещать обработку для отдельных провайдеров:
		
		// [lambrusco] 29.05.2013
        if (strpos($ltype, 'openid.yandex.ru') !== false) {
			$ltype = 'yandex.ru';
			$identityArr = explode('/', $ldata->identity);
			$lnick =  $identityArr[count($identityArr)-2];
		}	

        $this->User = array();
		
        $this->User['username'] = $lnick.'@'.$ltype;
		
        $this->User['password'] = substr(md5($this->User['username'].$this->mysecret), 0, 12);

        //отдача email разными сервисами
        // vkontakte -
        // facebook +
        // yandex -/+ (если пользователь разрешил, по умолчанию нету)
        // google +
        // .....
        //____!!! В Н И М А Н И Е !!!____
        //на данный момент если сервис не отдал емайл
        //то устанавливается "левый-подставной"
        //_НЕ ОТСЫЛАЙТЕ НА НЕГО ПОЧТУ!_
        if(isset($ldata->email)) $this->User['email'] = $ldata->email;
        else  {
			// [lambrusco] 29.05.2013
			// обтабатываем различные исключительные ситуации
			// вконтакте не возвращает адрес электронной почты, и т.д.
			$preg_template_vk = '/([0-9]*@vk.com)/';
			if (preg_match($preg_template_vk, $this->User['username'])) {
				// опа, нет мыла, тогда запихаем пользователя в группу email_request
				if (trim($groups) !== '') 
				{
					$groups .= ",email_request";
				} 
				else 
				{
					$groups = "email_request";				
				}
				// адрес уникальный, значит, нам подходит
				$this->User['email'] = $this->User['username'];
			} 
			elseif ($ltype == 'yandex.ru')
			{
				// ранее мы получили корректный email для yandex
				$this->User['email'] = $this->User['username'];				
			}	
			else
			{
				// обрабатываем подобные варианты развития событий для других провайдеров
				// z-z-z...
				// а пока что
				$this->User['email'] = $this->User['username'];
			}
		}	


Кроме этого, есть еще вопросы:

Кто-нибудь вообще пользуется modxloginza?

Какие есть альтернативы для нее? Я не смог найти в интернете решения для MODx EVO.

П.С. Забыл добавить, в чем, собственно, была некорректность работы. Для всех аккаунтов через Яндекс генерировалось имя пользователя openid@yandex.ru, соответственно, и этот же электронный адрес. Ошибка — в неправильной обработке identity.

[REVO] Массовое редактирование ТВ (пока в виде сниппета)

Добрый день,
Не нашел компонента, который позволял бы удобно корректировать ТВшки. Пришлось дорабатывать код TvTagsEdit для Эво. Правда в итоге он превратился в снипет)).

Кросс-пост отсюда

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

Проблемы при выборе "разрешить повторяющиеся псевдонимы"

Обнаружил одну неприятную особенность при формировании дружественных url. Если выбрать «разрешить повторяющиеся псевдонимы», то они могут дублироваться даже в пределах одного родителя — т.е. получим два абсолютно одинаковых url. Конечно, это решается путем запрета такого повтора — но хотелось бы иметь в итоге url вида tv/samsung/product.html и photo/samsung/product.html, а не tv/samsung/product.html и photo/samsung1/product1.html.

Для этого не так уж много нужно. Проблема в файле save_content.processor.php. Итак
Читать дальше →

Сниппет микрогалереи

Иногда бывает нужно сделать галлерею на странице, собрав изображения из конкретной папки, ну или например организовать заготовку для слайдера, при этом не заморачиваясь c множеством TV или разметкой.
Этот сниппет прекрасно справится.

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

[EVO] Двойные кавычки в introtext

Поймал такую фичу.
Если в introtext есть двойные кавычки и в шаблоне выводим tv desc
<meta name="description" content="[*desc*]" />
верстка разваливается потому что получаем
<meta name="description" content="интр"от"екст" />


Пробовал применить виджет(HTML Entities) но там обработка происходит до того как тег [*introtext*] преобразован в значение.
Пока остановился на таком решении

Параметры TV desc
Значение по умолчанию оставляю [*introtext*]
Визуальный компонент: «Custom Widget»
Свойства компонента (widget):
@EVAL: 
if ($value == "[*introtext*]"){
$doc = $modx->getPageInfo($modx->documentIdentifier,'1','introtext');
$value = htmlentities($doc['introtext'], ENT_QUOTES, $modx->config['modx_charset']);
}
return $value;


P.S. Забыл уточнить, еще в интротекст должны быть теги
Например
dfhdhdhd"fjftjftjtf"<p>tfhjfjftjt</p>

[EVO] Переместим админку? Легко

Давно хотел иметь возможность изменять адрес админки и причин тому несколько.
  • Конфликт адреса с ispmanager
  • Безопасность сайта через скрытие инфомрации
  • Руки чесались
И когда я созрел до этого выяснилось, что переместить админку evolution не так уж и сложно. Более того, даже в ядре MODX уже заложена функция MODX::getManagerPath()

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

[EVO] Превью новости из контента статьи

Приветствую новое сообщество Modx. Наконец-то свершилась моя давняя мечта. удобный сайт по Modx с разделением на ветки!
В первые пишу в сообществе не вопрос. Поэтому если что, то уж сильно не пинайте.

На днях на одном сайте понадобилась возможность автоматической подстановки картинки из контента статьи в превью. Так уж получилось что клиенту лень подставлять картинку в тв-параметр.
Тут я вспомнил что что-то подобное было под wordpress, начал искать решения под Modx. но ничего не нашел (может плохо искал, не знаю). И вот вчера вечерком написал небольшой сниппет для этих целей. Код сниппета ниже:


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