Сергей

Сергей

С нами с 11 мая 2015; Место в рейтинге пользователей: #354
Василий Столейков
15 декабря 2016, 09:37
2
+1
Если ты осилил этот PHP код, то и отдельные таблицы осилишь.
У меня на 200 000+ ресурсах такая же проблема была. Пришлось разбить на несколько (у меня 7) таблиц по разделам. По сути поля могут в точности повторять поле из таблицы modx_site_content.

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

Дальше можешь воспользоваться компонентом VirtualPage, чтобы создать в этих разделах отдельные адреса страниц. Выборку можешь сделать по конкретно взятой таблице категории через простой PHP, например:
$q = $modx->prepare("SELECT * FROM ".$modx->config['table_prefix']."site_content_1 LIMIT 50");
$q->execute();
$r = $q->fetchAll(PDO::FETCH_ASSOC);
foreach($r as $row){
    $id = $row['id'];
    print_r($row);
}
Если же нужна пагинация и все дела, то сделай на основе этих таблиц с помощью UICMPGenerator модели и подключай свой класс таблицы в pdoPage.

И при таком раскладе Василий правду сказал — у тебя в админке останутся только ресурсы категорий (по ним сможешь делать менюшки на pdoMenu и т.д.

Также скорее всего прийдётся создать несколько отдельных страниц с XML-картами этих разделов и скормить их robots.txt и Яндексу.
but1head
12 декабря 2016, 19:36
3
0
Для pdoPage
<?php
$pdoFetch = $modx->getService('pdoFetch');
$pdoFetch->setConfig($scriptProperties);

$outputSeparator = isset($outputSeparator) ? $outputSeparator : PHP_EOL;
$totalVar = isset($totalVar) ? $totalVar : 'page.total';
$offset = isset($offset) ? $offset : 0;
$limit = isset($limit) ? $limit : 8;

$sql = "SELECT * FROM %tablename%";

$q = $modx->prepare($sql);
$q->execute();
$rows = $q->fetchAll(PDO::FETCH_ASSOC); 

// Кол-во записей для пагинации
$_count = $modx->prepare("SELECT COUNT(*) AS count FROM %tablename%");
$_count->execute();
$count = $_count->fetch(PDO::FETCH_ASSOC);
$modx->setPlaceholder($totalVar, $count['count']);

$output = array();
foreach($rows as $row) {
  $output[] = $pdoFetch->getChunk($tpl, $row);   
}
return implode($outputSeparator, $output);

Вызов
[[!pdoPage?
    &element=`&snippetname%`
]]
Володя
14 ноября 2016, 23:10
4
+3
так я не предлагаю вам делать выборки по 5 ресурсов. Подберите то кол-во который ваш хостинг нормально обработает, например по 5000 шт. Указываете в роботс главный файл который выглядит примерно так

<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap>
<loc>http://site.ru/sitemap1</loc>
</sitemap>
<sitemap>
<loc>http://site.ru/sitemap2</loc>
</sitemap>
<sitemap>
<loc>http://site.ru/sitemap3</loc>
</sitemap>
</sitemapindex>
в каждом из них вызов pdoSitemap.
вроде ничего сложного?
Роман Садоян
19 октября 2016, 21:15
4
0
Ага, понял, в общем вот такой код у меня работает:

switch ($modx->event->name) {

  case 'msOnSubmitOrder':
    $orderData = $order->get();
    $status = $order->ms2->cart->status();
// Здесь я получаю минимальную стоимость из системной настройки
    $mincost = $modx->getOption('ms2_payment_rsb_mincost');
    if(!$mincost){
      $mincost = 3000;
    }
    if($status['total_cost'] < $mincost)
    {
      $message = "Минимальная сумма для подачи заявки равна: ".$mincost;
      $data = array('success' => false, 'message' => $message);
      return $modx->event->output($message);
    }
}
Сейчас уже не вспомню зачем я записываю в $data такой массив.
Но minishop подхватывает это уведомление и выводит ошибку, при этом форма не отправляется.
Володя
05 августа 2016, 22:35
21
+5
можно добавить так
создать плагин на pdoToolsOnFenomInit, в нем добавить модификатор detector
<?php
switch ($modx->event->name) {
    case 'pdoToolsOnFenomInit':
    if (!$fenom = $modx->getOption('fenom', $scriptProperties)) {
        return;
    }
    if (!$MobileDetect = $modx->getService('mobiledetect', 'MobileDetect', MODX_CORE_PATH . 'components/mobiledetect/')) {
	    return;
    }
    
    $key = $MobileDetect->config['force_browser_variable'];
    $device = !empty($_GET) && array_key_exists($key, $_GET)
		? $modx->stripTags($_GET[$key])
		: '';
	if (empty($device)) {
	    $device = $MobileDetect->getSettings();
    }
    if (empty($device)) {
        $detector = $MobileDetect->getDetector();
        $device = ($detector->isMobile() ? ($detector->isTablet() ? 'tablet' : 'mobile') : 'standard');
        $MobileDetect->saveSettings($device);
    }

    $fenom->addModifier("detector", function ($value) use ($device) {
        return $value == $device;
    });

    break;
}

и теперь в любом месте можно делать так
{if 'mobile'|detector}
mobile
{/if}

{if 'tablet'|detector}
tablet
{/if}

{if 'standard'|detector}
standard
{/if}
Володя
17 мая 2016, 19:34
1
+2
попробуйте так
$miniShop2->changeOrderStatus($order->get('id'), 2);
echo $modx->toJSON(array(
    'success' => true
    'message' => '',
    'data'    => array(),
));
exit;
Сергей Шлоков
23 апреля 2016, 11:10
5
+3
Я для себя сделал такой плагин. Сильно не заморачивался. Просто скопировал код из Ace.
<?php
switch ($modx->event->name) {
    case 'OnDocFormPrerender':
        if (!$modx->controller->resourceArray) {
            return;
        }
        $field = 'modx-resource-introtext';
        $mimeType = $modx->getObject('modContentType', $modx->controller->resourceArray['content_type'])->get('mime_type');
        if ($mimeType == 'text/html' && $modx->getOption('pdotools_fenom_parser')) {
            $mimeType = 'text/x-smarty';
        }
		$modxTags = 1;
		$script = "MODx.ux.Ace.replaceComponent('$field', '$mimeType', $modxTags);";
		$script .= "MODx.ux.Ace.replaceTextAreas(Ext.query('.modx-richtext'));";
		$modx->controller->addHtml('<script>Ext.onReady(function() {' . $script . '});</script>');
        break;
    default:
        return;
}
Сергей
26 сентября 2015, 09:50
1
+1
Скоро уже год будет после последнего релиза
Наумов Алексей
15 сентября 2015, 16:31
1
+1
Обычно или галку «Скрывать в меню» ставлю или как выше предложили

&where=`{"parent:!=":15}`

&where=`{"template:!=":2}`