Александр Туниеков

Александр Туниеков

С нами с 19 декабря 2015; Место в рейтинге пользователей: #15
Александр Туниеков
08 июня 2023, 18:45
0
в migx при попытке содать таблицы в базе вылетает ошибка
Fatal error: Class 'xPDOGenerator_mysql' not found in C:\OSPanel\domains\modx3.loc\core\components\migx\model\migx\migxpackagemanager.class.php on line 3
Александр Туниеков
08 июня 2023, 18:38
0
Ага. А вот как мне быть? Мне нужно чтоб класс таблицы я мог указать прямо в параметрах сниппета. То есть имя класса в сниппете есть только в виде переменной строки.
$class = 'ModExtra\Model\ModExtraItem';
$class::class;
Так не работает. Конечно можно использовать eval
$class = 'ModExtra\Model\ModExtraItem';
eval('$class1 ='. $class.'::class;');
if($item = $modx->getObject($class1,1)){
    print_r($item->toArray());
}

Но eval как известно зло. Или Использовать $xpdo->loadClass Но его не изветно когда отрубят.
Так как быть?
Александр Туниеков
08 июня 2023, 18:02
0
Так а что ты проверял? (в обществе вроде по правилам использовать ты)
Я проверяю
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);

$class = 'ModExtra\Model\ModExtraItem';
$class::class;
ошибка: Fatal error: Dynamic class names are not allowed in compile-time ::class fetch in

Работает такой код:
{'!pdoResources' | snippet : [
   'class'=>'ModExtra\Model\ModExtraItem',
   'sortby'=>[
       'ModExtraItem.id'=>'ASC'
   ]
]}
Это работает только не понятно будет ли дальше работать.
\core\components\pdotools\src\Fetch.php вызывает
\core\vendor\xpdo\xpdo\src\xPDO\Om\xPDOQuery.php
public function __construct(& $xpdo, $class, $criteria= null) {
        parent :: __construct($xpdo);
        if ($class= $this->xpdo->loadClass($class)) {
            $this->_class= $class;
            $this->_alias= $this->xpdo->getAlias($this->_class);
            $this->_tableClass = $this->xpdo->getTableClass($this->_class);
            $this->query['from']['tables'][0]= array (
                'table' => $this->xpdo->getTableName($this->_class),
                'alias' => & $this->_alias
            );
            if ($criteria !== null) {
                if (is_object($criteria)) {
                    $this->wrap($criteria);
                }
                else {
                    $this->where($criteria);
                }
            }
        }
    }
\core\vendor\xpdo\xpdo\src\xPDO\xPDO.php
/**
     * Load a class by fully qualified name.
     *
     * The $fqn should in the format:
     *
     *    dir_a.dir_b.dir_c.classname
     *
     * which will translate to:
     *
     *    XPDO_CORE_PATH/om/dir_a/dir_b/dir_c/dbtype/classname.class.php
     *
     * As of xPDO 3.0, the use of loadClass is only necessary to support BC
     * with older xPDO models. Auto-loading in models built with xPDO 3.0 or
     * later makes the use of this method obsolete.
     *
     * @param string $fqn The fully-qualified name of the class to load.
     * @param string $path An optional path to start the search from.
     * @param bool $ignorePkg True if currently loaded packages should be ignored.
     * @param bool $transient True if the class is not a persistent table class.
     *
     * @return string|boolean The actual classname if successful, or false if
     * not.
     * @deprecated since 3.0
     */
    public function loadClass($fqn, $path= '', $ignorePkg= false, $transient= false) {
loadClass вроде deprecated а закомментировал весь блок с if ($class= $this->xpdo->loadClass($class)) { сайт ушел в аут. Чет похоже разработчики MODX3 недодумали :-)
Александр Туниеков
08 июня 2023, 16:37
0
Черт. Ввязался в обсуждение. Скорее всего не сработает. неймспейс это конструкция языка php а не текстовая переменная. Но чтоб точно сказать придется сейчас модекс 3 ставить пдотулс и модеекстра и пробовать :-(
Александр Туниеков
08 июня 2023, 15:38
0
Возможно. Но тут 1 вопрос имя класса текстовая переменная например
$class = 'MODX\Revolution\modResource'
Как текстовую переменную преобразовать в неймспайс? Просто не нашел этот момент в инете.
use $class
Насколько я понял точно нельзя. А
$class:class

можно?
Александр Туниеков
08 июня 2023, 15:05
0
Я сказал часть функционала не работает и не будет работать. Например попробуйте через новый migx создать пакет и таблицу в базе данных. Когда я тестировал не работало.
А в pdoTools код типа
{'!pdoResource' | snippet : [
   'loadModels'=>'modextra',
   'class'=>'modextraItem',
]}
Работать наверно не будет. У меня сейчас modx3 не установлен и точно сказать не могу работает или нет. Но скорей всего в modx 3.3 такой код не будет работать.
Александр Туниеков
08 июня 2023, 14:15
0
Скорей всего migxdb, pdotools и getTables никогда не смогут нормально работать в MODX3. В MODX3 внесли изменение Перед тем как работать с объектами их необходимо подключить в скрипте через use. Например
use MODX\Revolution\modResource;
Но в MODX REVO можно использовать конструкцию вида
{'!pdoResource' | snippet : [
   'loadModels'=>'modextra',
   'class'=>'modextraItem',
]}
И работать с любой таблицей базы данных. Просто указываешь класс таблицы в настройках сниппета.
Так вот, по идее, чтоб работать с какой-то таблицей в модекс 3 надо прописать вызов ее класса use в начале сниппета. Но это не возможно. Сниппеты и код pdoTools, migx и getTables при запуске кода не знают какой класс им надо подключать. Класс прописан в настройках в виде текста. А в php запустить use какая-то переменная нельзя. Сейсас в MODX 3.0.3 это еще работает, но в MODX 3.3 обещают отключить метод modx->loadClass через который сейчас вызов произвольного класса через текстовую переменную его названия еще работает.

Вообщем существенная для меня часть возможностей migx и pdoTools в MODX3 накроется. Я разбирался в этой теме полгода назад когда хотел перевести getTables на MODX3 и возможно еще что-то не понял. Не судите строго если ошибся. Но по моему для меня переход на MODX3 не имеет смысла. Вроде как часть нужного фуункционала в будущем просто не будет работать.
Александр Туниеков
08 июня 2023, 13:41
0
Есть те, кто делают сайты, а есть те, кто развивает бэк, и их осталось единицы…
Бек или админку? Было бы что в админке развивать… Ресурс, чанк, сниппет, пользователя и т.д. можно создать и отредактировать и что еще надо то?
Александр Туниеков
08 июня 2023, 12:32
0
MODX для тех, кто творит, WP для тех, кто просто делает, это отличие многого стоит
Модекс крут :-). Я только на модекс и работаю. Ни ларавел ничто другое мне ни зашло. Просто потому что от старта начала программирования до рабочего сайта в модекс минимум телодвижений. А на ларавел (Я могу ошибаться) на старте нет админки и пользователей.Смысл самому каждый раз писать админку и процедуры аутентификации??? Модекс крут потому что многое стандартно используемое уже есть и можешь сосредоточиться на конкретно логике своего приложения. В том числе круто что модекс почти не ограничевает в том какое приложение ты хочешь написать. Мы например пишем управление производством.
Аналогов по соотношению гибкость-скорость разработки я не знаю.
Александр Туниеков
11 мая 2023, 18:02
0
Можно getTables использовать. https://modstore.pro/packages/utilities/gettables
Сколько использовал тупняков при виборке из базы не замечал. В пределах секунды грузиться.
Если устроит, то напишу как использовать.
Александр Туниеков
05 мая 2023, 12:19
0
Странно. Вроде обновления в модсторе бесплатные. Было бы хорошо если была бы какая-то процедура разрешения конфликтов. Например написать тему с отзывом об авторе компонента. Только конечно пока заморачиваться никто не хочет.
Александр Туниеков
04 мая 2023, 20:36
0
офтоп. а за что от дмитрия минусы? мешают ориентироваться.

ИИ круто и в будущем поможет снять часть рутины, но уметь правильно ему вопросы задавать мешает. Вообще хотелось бы чтоб был в контексте твоих задач и понимал с полуслова :-)
Александр Туниеков
21 апреля 2023, 12:51
0
Поиск делает OpenSearch в своем индексе(базе) и соответственно сайт должен загрузить на него данные по которым поиск идет. На 40т товаров данные грузятся 5 минут. Если поменять хостинг, то соответственно минут 5-6 и не будет работать фильтр. Надо буде перезапусть создание индекса вручную
Александр Туниеков
21 апреля 2023, 12:39
0
нужно ли в будущем обновления
Ну думаю можно обновлять OpenSearch. Пока совместимость не сломают. Хотя врядли в ближайшем будущем сломают. Я не обновляю пока. Еще даже не разбирался как обновлять.
Александр Туниеков
21 апреля 2023, 12:32
0
OpenSearch бесплатный opensource.
Кроме единоразовой оплаты за модуль, еще будут оплаты?
Нет.
Хотелось бы еще увидеть интеграцию с SeoFilter.
Пока в планах. Но насколько я смотрел там ничего сложного нет. Просто немного переписать js SeoFillter.

Хотя есть одна мысль которая не дает покоя, если клиент на вашем хостинге, то вы подключаете ему этот модуль, а если он хочет уйти на свой хостинг, вы же не будете ему предоставлять место для хранения фильтров на vps.
Ну он не будет ничего загружать на мой хостинг и соответственно место не будет занимать. А к чему вопрос?
Александр Туниеков
07 апреля 2023, 06:11
0
Точки с запятой нет после инструкии $this->modx->log(1, print_r($success_page,1))
надо
$this->modx->log(1, print_r($success_page,1));
Александр Туниеков
07 апреля 2023, 06:01
0
А в MODX whereCondition вообще есть? я только xPDOQuery::where в гугле нахожу
Александр Туниеков
05 апреля 2023, 03:05
+1
Привет. Вопрос не до конца понял, но может так: вносятся данные в виде текста и селект нужен только в фильтре.
Тогда примерно так:
{'!getTable' | snippet : [
   'loadModels'=>'gtsShop',
   'showLog'=>1,
   'selects'=>[
      'test'=>[
         'type'=>'data',
         'rows'=>[
            ['test','test'],
            ['Oplata','Oplata']
         ]
      ]
   ],
   'table'=>[
        'class'=>'gsRaschet',
        'pdoTools'=>[
            'class'=>'gsRaschet',
        ],
        'autosave'=>1,
        'row'=>[
            'id'=>['filter'=>1],
            'name'=>[
                'edit'=>['type'=>'text'],
                'filter'=>[
                    'edit'=>['type'=>'select','select'=>'test']
                ]
            ],
        ]
    ]
]}
Александр Туниеков
29 марта 2023, 14:04
+2
Править исходники лучше только для теста. Если кто-то вздумает обновить mSearch2, то правка пропадет. Лучше расширить класс фильтрации
Расширяем класс фильтрации
Все стандартные фильтры mSearch2 находятся в файле /core/components/msearch2/model/msearch2/filters.class.php. Нам нужно унаследовать его, расширить и указать новый класс в системных настройках.

Создаём новый файл в /core/components/msearch2/custom/filters/custom.class.php и пишем в него:

<?php
class myCustomFilter extends mse2FiltersHandler {}

Указывем его в системной настройке mse2_filters_handler_class.

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

Для получения данных используются методы getИмяМетодаValues(), для подготовки фильтра — buildИмяМетодаFilter(), а для фильтрации filterИмяМетода. Можно посмотреть, как работают эти 3 типа методов в filters.class.php.
И прописать исправленный метод getTvValues в классе myCustomFilter.
<?php
class myCustomFilter extends mse2FiltersHandler {
/**
	 * Retrieves values from Template Variables table
	 *
	 * @param array $tvs Names of tvs
	 * @param array $ids Ids of needed resources
	 *
	 * @return array Array with tvs values as keys and resources ids as values
	 */
	public function getTvValues(array $tvs, array $ids) {
		$filters = array();
		$q = $this->modx->newQuery('modResource', array('modResource.id:IN' => $ids));
		$q->leftJoin('modTemplateVarTemplate', 'TemplateVarTemplate',
			'TemplateVarTemplate.tmplvarid IN (SELECT id FROM ' . $this->modx->getTableName('modTemplateVar') . ' WHERE name IN ("' . implode('","', $tvs) . '") )
			AND modResource.template = TemplateVarTemplate.templateid'
		);
		$q->leftJoin('modTemplateVar', 'TemplateVar', 'TemplateVarTemplate.tmplvarid = TemplateVar.id');
		$q->leftJoin('modTemplateVarResource', 'TemplateVarResource', 'TemplateVarResource.tmplvarid = TemplateVar.id AND TemplateVarResource.contentid = modResource.id');
		$q->select('TemplateVar.name, TemplateVarResource.contentid as id, TemplateVarResource.value, TemplateVar.type, TemplateVar.default_text');
		$tstart = microtime(true);
		if ($q->prepare() && $q->stmt->execute()) {
			$this->modx->queryTime += microtime(true) - $tstart;
			$this->modx->executedQueries++;
			while ($row = $q->stmt->fetch(PDO::FETCH_ASSOC)) {
				if (empty($row['id'])) {
					continue;
				}
				elseif (is_null($row['value']) || trim($row['value']) == '') {
					$row['value'] = $row['default_text'];
				}
				if ($row['type'] == 'tag' || $row['type'] == 'autotag') {
					$row['value'] = str_replace(',', '||', $row['value']);
				}
				$tmp = strpos($row['value'], '||') !== false
					? explode('||', $row['value'])
					: array($row['value']);
				foreach ($tmp as $v) {
					$v = str_replace('"', '"', trim($v));
					if ($v == '') {
						continue;
					}
					$name = strtolower($row['name']);
					if($name == 'ten-long') $v=(int)$v;
					if (isset($filters[$name][$v])) {
						$filters[$name][$v][$row['id']] = $row['id'];
					}
					else {
						$filters[$name][$v] = array($row['id'] => $row['id']);
					}
				}
			}
		}
		else {
			$this->modx->log(modX::LOG_LEVEL_ERROR, "[mSearch2] Error on get filter params.\nQuery: ".$q->toSQL()."\nResponse: ".print_r($q->stmt->errorInfo(),1));
		}

		return $filters;
	}
}