Владимир

Владимир

С нами с 28 декабря 2012; Место в рейтинге пользователей: #53
Василий Наумкин
18 марта 2015, 15:18
1
+1
Тот класс, который я приводил выше — отлично различает планшеты и телефоны. Причем, умеет определять и производителя, и версию, и еще много чего.

Можно демо погонять demo.mobiledetect.net/
Rootiys
16 марта 2015, 13:12
1
+1
На сколько знаю, если просто из репы поставить — то подглючивает.
Я ставил из репы, потом сверху залил эти файлы.

В итоге все работает отлично:
Володя
16 марта 2015, 09:56
1
+2
есть два обработчика:
ресурс — задействует метод sendForward
сниппет — обработает указанный сниппет и отдаст через exit

в первом случае это ресурс (указываете в настройках обработчика), в котором вы вызываете какой либо сниппет, и в зависимости от полученных параметров у вас выводит информацию.

во втором случае даже нет ресурса, просто отдача результата сниппета на страницу.
Василий Наумкин
11 февраля 2015, 09:41
2
+1
Если файлы уже на сервере, то можно использовать процессор загрузки через консольный скрипт:
<?php

define('MODX_API_MODE', true);
require 'index.php'; // Скрипт лежит в корне сайта

$file = MODX_BASE_PATH . 'test.jpg'; // Твоя картинка в корне сайта

$modx->getService('error','error.modError');
$modx->setLogLevel(modX::LOG_LEVEL_ERROR);
$modx->setLogTarget(XPDO_CLI_MODE ? 'ECHO' : 'HTML');
$modx->ms2Gallery = $modx->getService('ms2gallery', 'ms2Gallery', MODX_CORE_PATH . 'components/ms2gallery/model/ms2gallery/');

// Вызов процессора загрузки
$response = $modx->runProcessor('gallery/upload', array(
		'file' => $file, // Картинка
		'id' => 1 // id ресурса с галереей
	),
	array('processors_path' => MODX_CORE_PATH.'components/ms2gallery/processors/mgr/')
);

// Вывод результата работы процессора
if ($response->isError()) {
	print_r($response->getAllErrors());
}
else {
	print_r($response->response);
}
Думаю, будет совсем нетрудно доработать для твоей задачи.

Перед покупкой дополнения можно тестировать на modhost.pro
Василий Наумкин
06 февраля 2015, 19:22
1
+1
Не нужно делать имитацию клика. Каждый клик — это событие изменения формы, и, соотвественно, загрузка результатов с сервера. Пока кликов было мало, ты этого не замечал, а теперь ситуация изменилась.

Нужно пройти по чекбоксам и проставить (или снять) им атрибут checked, а потом отправить форму вручную.

Например, зайди сюда и набери в консоли браузера:
$('#mse2_msoption\\|tags input').each(function() {$(this).attr('checked', true)});
$('#mse2_filters').submit();
Василий Наумкин
05 февраля 2015, 22:08
1
0
Цикл не нужен:
$q = $modx->newQuery('msProductData', array('article' => $article ));
// Если это обновление ресурса - исключаем его из условия
if ($mode == 'upd') {
	$q->where(array('id:!=' => $resource->get('id')));
}
if ($modx->getCount('msProductData', q)) {
	// ... Возврат ошибки
}
Максим Кузнецов
31 января 2015, 21:35
5
+3
Помогу с решением.

Вызываем сниппет Login:
[[!Login? &loginTpl=`fastLoginTpl` &errTpl=`fastLoginError`]]

Чанк формы для авторизации fastLoginTpl:
<div style="display: none;" id="authErrors">[[+errors]]</div>
<form class="loginForm" id="iWannaLogin" action="[[~[[*id]]]]" method="post">
	<div class="login">
		<input id="loginForm" name="username" class="roundInput" type="text" placeholder="Логин" title="Ваш логин">
	</div>
	<div class="password">
		<input id="passwordForm" name="password" class="roundInput" type="password" placeholder="Пароль" title="Ваш пароль">
	</div>
	
	<input class="returnUrl" type="hidden" name="returnUrl" value="[[+request_uri]]" />
	<input class="loginLoginValue" type="hidden" name="service" value="login" />
	
	<div class="submit">
		<a rel="nofollow" href="[[~17]]">Я - тупой, забыл пароль..</a>
		<input id="ajaxLoginButton" type="submit" name="Login" value="Войти" />
	</div>
</form>

Чанк для вывода ошибки fastLoginError:
[[+msg]]

Скрипт js, обрабатывающий событие отправки формы (нужен подключенный jquery):
<script type="text/javascript">
	$(document).ready(function(){
		$("#iWannaLogin").bind("submit", function() {

			$("#authErrors").text("");
		
			//здесь можно допилить подсветку полей с ошибкой
			if ($("#loginForm").val().length < 1 && $("#passwordForm").val().length < 1) {
				$.jGrowl("Введите логин и пароль", {group: "m-Error"});
				return false;
			}
			if ($("#loginForm").val().length < 1) {
				$.jGrowl("Введите логин", {group: "m-Error"});
				return false;
			}
			if ($("#passwordForm").val().length < 1) {
				$.jGrowl("Введите пароль", {group: "m-Error"});
				return false;
			}

			$.ajax({
				type: "POST",
				cache: false,
					url: "[[~[[*id]]]]",
				data: $(this).serializeArray(),
				beforeSend: function(){
					$("#ajaxAuth .closeBlock").css("display", "none");
					$("#ajaxAuth .ajaxLoad").css("display", "block");
					
					$("#ajaxLoginButton").prop("disabled", true);
				},

				success: function(data) {
					$("#ajaxAuth .closeBlock").css("display", "block");
					$("#ajaxAuth .ajaxLoad").css("display", "none");
			
					var errMessage = $(data).find("#authErrors").text();
				
					if(errMessage == ""){
						window.location = "адрес для переадресации при успешной авторизации";
					}
					else{
						$("#authErrors").text(errMessage);
						$.jGrowl($("#authErrors").text(), {group: "m-Error"});
					}
				},
				
				complete: function(){
					$("#ajaxLoginButton").prop("disabled", false);
				}
			});
			return false;
	
		});
	});
</script>

— я еще подключил плагин jgrowl для отправления алертов. В его же вызове group: «m-Error» — класс для всплывающего бокса (красный, с ошибкой).
Если jgrowl не нужен — то вместо него вставляем в поле для ошибок желаемый ответ. Пример:
$("#authErrors").text("текст ошибки").css("display", "block");

#ajaxAuth .ajaxLoad — в моем примере форма с индикатором загрузки, которая появляется при обработке аякс-запроса.
Илья Уткин
28 января 2015, 13:53
1
0
Для истории, вот код плагина:
<?php
if ($modx->event->name != "OnHandleRequest"
    || $modx->context->key == 'mgr') {
       return;
    }

if ($_SERVER['REQUEST_URI'] != '/') {
    $uri = substr($_SERVER['REQUEST_URI'],1);
    if (substr($uri,-5) != '.html' && substr($uri,-1) != '/') {
      $uri .= '/';
    }
    $resource = $modx->getObject('modResource', array('uri' => $uri));
    $ctx = $resource->get('context_key');
} else {
    $ctx = 'web';
}

if ($ctx != $modx->context->key){
      $modx->switchContext($ctx);
}
Fi1osof
22 января 2015, 15:42
5
+3
Ставите Console.
Выполняете код:
ini_set('max_execution_time', 0);
ignore_user_abort(true);
$c = 'modResource';
$q = $modx->newQuery($c);
$q->sortby('id');
$q->select(array(
	"{$c}.*",
));
$s = $q->prepare();
$s->execute();
while($row = $s->fetch(2))
	$response = $modx->runProcessor('resource/update', $row);
	if($response->isError()){
		print_r($response->getResponse());
		return;
	}
	$modx->error->reset();
}
Так как у вас документов много, советую сначала прогнать только корневые документы (добавить в запрос $q->where(array('parent' => 0));), а потом по каждому разделу в отдельности, указывая соответствующий parent.
Саша Пекшев
16 января 2015, 15:49
2
+1
Это надо найти и заменить в снипите JSONDerulo

//-----------------------------------------------------------
//  YouTube API V2 uploads
//-----------------------------------------------------------
} elseif( $feed == 'youtubev2uploads' ) {
    $feedUrl = 'http://gdata.youtube.com/feeds/api/users/{username}/uploads?max-results={limit}&start-index={offset}&alt=json';
    
    
    $JSON = file_get_contents("https://gdata.youtube.com/feeds/api/users/".$users."/uploads?v=2&alt=jsonc&max-results=0");
    $JSON_Data = json_decode($JSON);
    $total = $JSON_Data->{'data'}->{'totalItems'};
    $totalVar = $modx->getOption('totalVar', $scriptProperties, 'total');
    $modx->setPlaceholder($totalVar,$total);
        if (empty($offset)) {$offset = '1';}
        else{$offset++;}
    $startIndex = $offset; //$modx->getOption('startIndex', $scriptProperties, 1);

    $videoParams = $modx->getOption('videoParams', $scriptProperties, '?fs=1');
    $excludeEmpty = explode(',', $modx->getOption('excludeEmpty', $scriptProperties, 'link'));
    $feeds = explode(',', $modx->getOption('users', $scriptProperties, ''));

    foreach ($feeds as $username) {
        $cacheId = 'jsonderulo-youtubeuploadsfeed-'.$cacheName.'-'.$username;

        if (($json = $modx->cacheManager->get($cacheId)) === null) {
            if ($ch === null) {
                $ch = curl_init();
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            }

            curl_setopt_array($ch, array(
              CURLOPT_URL => str_replace(array('{username}', '{limit}', '{offset}'), array($username, $limit, $startIndex), $feedUrl),
            ));


            $json = curl_exec($ch);
            if (empty($json)) {
                continue;
            }

            //$modx->cacheManager->set($cacheId, $json, $cacheTime);
        }

        $feed = json_decode($json);

        if ($feed === null) {
            continue;
        }

        $feeditems = $feed->feed;

        foreach ($feeditems->entry as $video) {

            foreach ($excludeEmpty as $k) {
                if ($video->$k == '') {
                    continue 2;
                }
            }

            $videoId = substr($video->id->{'$t'},42);
            $videoContent = $video->content->{'$t'};
            $videoContent = str_replace("\n","
",$videoContent);
            $rawFeedData[] = array(
                'published' => strtotime($video->published->{'$t'}),
                'picture' => $video->{'media$group'}->{'media$thumbnail'}[0]->url,
                'title' => $video->title->{'$t'},
                'ytlink' => $video->link[0]->href,
                'embedlink' => 'https://www.youtube.com/embed/' .$videoId. $videoParams,
                'videoId' => $videoId,
                'content' => $videoContent,
                'author' => $video->author[0]->name->{'$t'},
            );
        }
    }

    foreach ($rawFeedData as $image) {
        $output .= $modx->getChunk($tpl, $image);
    }

И вызов сниппета
[[!pdoPage?
   &elementClass=`modSnippet`
   &element=`JSONDerulo`
   &limit=`5`
   &feed=`youtubev2uploads`
   &tpl=`jd.youTube`
   &users=`YOUTUBE-CHANNEL`
   &cacheTime=`10`
   &cacheName=`youtube.cache`
   &pageLimit=`13`
]]
 
<div class="paging">
<ul class="pagination">
  [[!+page.nav]]
</ul>
</div>
и я кстати с youtube еще описание видео забираю в оригинале этого тоже нету