Павел

Павел

Был в сети 22 июля 2020, 13:56
Заказы принимаю
Сколько пробовал, не получается. Пробовал новый резолвер создать, в него всё это дело записал.
Установка пакета
не завершается, хотя скрипт всё выполняет, что от него требуется, Илья, не подскажешь, почему так, как более опытный)

<?php

/** @var $modx modX */
if (!$modx = $object->xpdo AND !$object->xpdo instanceof modX) {
    return true;
}

/** @var $options */
switch ($options[xPDOTransport::PACKAGE_ACTION]) {
    case xPDOTransport::ACTION_INSTALL:
    case xPDOTransport::ACTION_UPGRADE:
	// Скрипт вставлял здесь
        break;
    case xPDOTransport::ACTION_UNINSTALL:
        break;
}

return true;
Сам спросил, сам и отвечаю)) Может кому пригодится.

В общем правим резолвер tvs. Он находится здесь: siteExtra-master/_build/resolvers/resolve.tvs.php

В общем меняем вызовы тивишек:

$name = 'address';
        if (!$tv = $modx->getObject('modTemplateVar', array('name' => $name))) {
            $tv = $modx->newObject('modTemplateVar');
        }
        $tv->fromArray(array(
            'name'         => $name,
            'type'         => 'text',
            'caption'      => 'Адрес',
            'category'     => $cat_id
        ));
        $tv->save();
        $tvs[] = $tv->get('id');
        
        $name = 'phone';
        if (!$tv = $modx->getObject('modTemplateVar', array('name' => $name))) {
            $tv = $modx->newObject('modTemplateVar');
        }
        $tv->fromArray(array(
            'name'         => $name,
            'type'         => 'text',
            'caption'      => 'Телефон',
            'category'     => $cat_id
        ));
        $tv->save();
        $tvs[] = $tv->get('id');

На:

$name = 'address';
        $tempID = '1,2'; // Пишем id наших шаблонов
        if (!$tv = $modx->getObject('modTemplateVar', array('name' => $name))) {
            $tv = $modx->newObject('modTemplateVar');
        }
        $tv->fromArray(array(
            'name'         => $name,
            'type'         => 'text',
            'caption'      => 'Адрес',
            'category'     => $cat_id
        ));
        $tv->save();
        $tvs[] = $tv->get('id').'-'.$tempID;
        
        $name = 'phone';
        $tempID = '2';  // Пишем id наших шаблонов
        if (!$tv = $modx->getObject('modTemplateVar', array('name' => $name))) {
            $tv = $modx->newObject('modTemplateVar');
        }
        $tv->fromArray(array(
            'name'         => $name,
            'type'         => 'text',
            'caption'      => 'Телефон',
            'category'     => $cat_id
        ));
        $tv->save();
        $tvs[] = $tv->get('id').'-'.$tempID;

Можно указать один шаблон, а можно несколько через запятую.

А также заменяем скрипт который записывает id этих шаблонов для тивишек.

Меняем:

foreach ($modx->getCollection('modTemplate') as $template) {
            $templateId = $template->id;
            foreach ($tvs as $k => $tvid) {
                if (!$tvt = $modx->getObject('modTemplateVarTemplate', array('tmplvarid' => $tvid, 'templateid' => $templateId))) {
                    $record = array('tmplvarid' => $tvid, 'templateid' => $templateId);
                    $keys = array_keys($record);
                    $fields = '`' . implode('`,`', $keys) . '`';
                    $placeholders = substr(str_repeat('?,', count($keys)), 0, -1);
                    $sql = "INSERT INTO {$modx->getTableName('modTemplateVarTemplate')} ({$fields}) VALUES ({$placeholders});";
                    $modx->prepare($sql)->execute(array_values($record));
                }
            }
        }

На:

foreach ($modx->getCollection('modTemplate') as $template) {
            $templateId = $template->id;
            foreach ($tvs as $k => $tv) {
                $tvOpt = explode("-", $tv);
                $tvid = $tvOpt[0];
                $tvTemps = explode(",",$tvOpt[1]);
                
                foreach ($tvTemps as $tvTemp){
                    if($templateId == $tvTemp){
                        if (!$tvt = $modx->getObject('modTemplateVarTemplate', array('tmplvarid' => $tvid, 'templateid' => $templateId))) {
                            $record = array('tmplvarid' => $tvid, 'templateid' => $templateId);
                            $keys = array_keys($record);
                            $fields = '`' . implode('`,`', $keys) . '`';
                            $placeholders = substr(str_repeat('?,', count($keys)), 0, -1);
                            $sql = "INSERT INTO {$modx->getTableName('modTemplateVarTemplate')} ({$fields}) VALUES ({$placeholders});";
                            $modx->prepare($sql)->execute(array_values($record));
                        }
                    }
                }
            }
        }

Скажу, что этого очень не хватало. Думаю, что Илья может доработать это дело получше)). А вообще хотелось бы увидеть подобный функционал в этом пакете.
Недавно прикручивал себе слайдер от бутстрапа к migx… В общем смотри

<div id="carousel_top" class="carousel slide border_box" data-ride="carousel">
	<!-- Indicators -->

	<ol class="carousel-indicators">
	  [[!getImageList?
		&tvname=`slider_main`
		&tpl=`slider_main_indicators`
		&docid=`[[*id]]`
	  ]]
	</ol>

	<!-- Wrapper for slides -->
	<div class="carousel-inner">

	[[!getImageList?
		&tvname=`slider_main`
		&tpl=`slider_main`
		&docid=`[[*id]]`
	]]

	</div>

	<!-- Controls -->
	<a class="left carousel-control" href="#carousel_top" data-slide="prev"></a>
	<a class="right carousel-control" href="#carousel_top" data-slide="next"></a>
</div>

Чанк: slider_main
<div class="item [[+idx:is=`1`:then=`active`]]"  >
    <img src="[[+image]]">
</div>

Чанк: slider_main_indicators
<li data-target="#carousel_top" data-slide-to="[[!defone? &input=`[[+idx]]`]]" [[+idx:is=`1`:then=`class="active"`]]></li>

И сниппет defone (который как раз и вычитает от idx единичку)
<?php
return $input = $input-1;

Да всё также, как и на простом php. Вызываешь сниппет с этим скриптом на той же странице, где и форма. Саму форму отправляешь постом на текущею страницу.
<form action="" method="POST">
Страница после чего перезагружается и сниппет отрабатывает.