Владимир Бабусенко

Владимир Бабусенко

С нами с 11 ноября 2014; Место в рейтинге пользователей: #202
Владимир Бабусенко
29 января 2016, 12:56
0
Не пробовал, думаю не помогут никакие такие манипуляции и countChildren будет считать все вложения, независимо от того как мы будем ограничивать, соответственно выдавать не тот результат. Написал свой сниппет, но мое любопытсво взяло вверх, и попробовал все таки через pdoMenu.
Решил по другому с помощью idx и class=«last»
В обертеке (&tplInnerRow) подкатегории сделал на них проверки.
Перед оборачивание проверял если idx = 4 открывал <обертка>
после оборачивания проверял если класс last, то проверяем еще что idx >3(что бы не закрыть того чего не открывали) тогда закрываем </обертка>

Вроде красиво получилось…

[[+idx:is=`4`:then=`<div class="display-none">`]]

<div class="item">
    <a href="[[+link]]" class="solid">[[+menutitle]]</a>
</div>

[[+classes:is=`class="last"`:then=`
	[[+idx:gt=`3`:then=`
		</div>
		<a href="" class="dotted show-user" data-alt="Скрыть">Все подкатегории</a>
	`]]
`]]
Владимир Бабусенко
29 января 2016, 10:02
0
Эх… не долго счастье длилось. К сожалению данное решение не подойдет. А причина в countChildren. К сожалению он считает все вложеные ресурсы, а не те которые мы выбираем в pdoMenu. При наполнение подкатегорий товарами, children всегда будет возвращать большее значение, чем нам нужно.
Владимир Бабусенко
27 января 2016, 13:16
0
Павел, в общем предложенное решение работает. Причина почему у меня не срабатывало, была в том что я прописывал фильтры в @INLINE. После как вынес html в чанки фильтры сработают. Спасибо за помощь.
Владимир Бабусенко
26 января 2016, 14:59
0
В принципе если решения на pdoMenu не будет, то так и придется…
Владимир Бабусенко
26 января 2016, 14:55
0
Павел, вчера вначале именно так и пытался сам сделать, но у меня что не сработало. Попробую еще раз. Спасибо.
Владимир Бабусенко
07 декабря 2015, 15:51
+1
Блин, стоит написать вопрос, как вопрос разрешился… надо было раскомментировать строку в build.config.php define('BUILD_EVENT_UPDATE', true);

Извините за беспокойство…
Владимир Бабусенко
22 августа 2015, 11:38
0
Вы не совсем понимаете суть транзакций. Их, как правило, используют для одновременного изменения нескольких записей. И если одну из операций выполнить не удалось, то нужно откатить уже проведенные. В вашем примере они не причем.
Не я понимаю, что транзакция имеет 2 варианта, либо полностью выполняется, либо ничего не выполняет. Я думал что там есть какой то механизм блокировки для работы с одной записью.
1. Сначала получить количество голосов, увеличить на 1 и записать в переменную.
В том то и дело, что теоретически, между получением и записью, другой пользователь тоже получит старое значение и увеличит. Практически получится увеличение на единицу, а должно на две единицы. Это не вариант.
П.С. Кстати, можно упростить ваш пример. Вместо
Да, знаю...))) Просто привык так писать…
достаточно сделать так
$id = 10;
$item = $modx->getObject('VotesTable', $id);
Можно еще короче....)
$item = $modx->getObject('VotesTable', 10);
Владимир Бабусенко
22 августа 2015, 11:29
0
Спасибо, буду так использовать. На PDO я знал такой вариант записи, думал есть какой то хитрый вариант на xPDO.
Владимир Бабусенко
29 июня 2015, 13:59
0
Спасибо. В принципе когда я создал группу пользователей, то при создании ресурса указав доступ (во вкладке ресурса) только для группы пользователей, создалась группа ресурсов пользователей с ресурсом к которому есть доступ только у группы пользователей. Для админов надо как вы сказали, ручками создать группу ресурсов. Спасибо еще раз за помощь.
Владимир Бабусенко
18 июня 2015, 22:37
0
Спасибо огромное за наводку, изучу, подключу. Пусть будет и сторонний компонент, не принципиально.
Владимир Бабусенко
10 июня 2015, 18:25
0
CMPGenerator или даже UiCMPGenerator
Спасибо…
Владимир Бабусенко
10 июня 2015, 18:13
0
Дописал после $modx->addPackage('myextuser', $modelPath);
$modx->addExtensionPackage, срабатывает при второй сборке пакета. В общем пока так пойдет.

Возник вопрос. Есть какой нибудь инструмент переводящий структуру таблиц на mysql в xml schema xpdo modx.......?
Владимир Бабусенко
09 июня 2015, 23:00
0
Все отлично работает. Связь добавляется.

вопрос еще, скорей всего его уже обсуждали. Глядя на резольвер, на первые две строчки,
$modelPath = $modx->getOption('myextuser_core_path', null, $modx->getOption('core_path') . 'components/myextuser/') . 'model/';
			$modx->addPackage('myextuser', $modelPath);
логичней заменить?
$modx->addPackage
на
$modx->addExtensionPackage
?
Владимир Бабусенко
09 июня 2015, 22:24
0
Алексей, вы правы. Спасибо огромное вам и всем остальным за помощь. Я еще не пробовал ваш первый пост, с резольвером, если что не так будет получатся отпишу…
Владимир Бабусенко
09 июня 2015, 20:40
0
А вот вы, похоже, не совсем понимаете как работают табличные объекты и связи между ними.
Я конечно не гуру modx, но он меня не перестает удивлять.

$User = $modx->getObject('modUser', $modx->user->get('id'));
$Data = $modx->newObject('Userdata');
$Data->set('anyfield','any text'); 
$User->addOne($Data);
$User->save();
Так работает, я честно говоря думал, что объект уже создан… вернее создается экземпляр класса при обращении по алиасу т.е. в этой строке
$profile = $user->getOne('Services');
где то глубоко в недрах modx
Владимир Бабусенко
09 июня 2015, 20:09
0
Алексей, все таки если помочь захотите, то кодо-текст посмотреть надо будет. Он тем более создан самый простой, для проверки работы, смысловой нагрузки никакой не несет. Могу на словах описать что я хотел получить. Я хотел расширить атрибуты юзера, через свою таблицу Userdata. Что бы работа осуществлялась как встроенные объекты user и user_attributes.
Т.е. создать связь user и моя таблица. И записывать туда специфичные данные юзера. Т.е. с профайлом modx работает так (но меня таблица не устраивает):

$user = $modx->getObject('modUser', $modx->user->get('id'));
$profile = $user->getOne('Profile');
$profile->set('fullname', $_POST['fullname']);
$profile->save();
Поэтому я хотел создать свою таблицу, со своими полями и работать так (создать связь с базовым класом)
$user = $modx->getObject('modUser', $modx->user->get('id'));
$profile = $user->getOne('Services'); //алиас связи с моей таблицей
$profile->set('fullname', $_POST['fullname']);
$profile->save();
Владимир Бабусенко
09 июня 2015, 19:33
0
Выдает Fatal error: Call to a member function set() on a non-object in public_html/core/cache/includes/elements/modsnippet/45.include.cache.php on line 14
Не нравится ему метод set. Весь вопрос почему?
Владимир Бабусенко
09 июня 2015, 19:04
0
Алексей спасибо, ценная вещь, обязательно воспользуюсь, т.к у меня все пакетами идет. Но мне пока не запустить связанный объект, может вы подскажите. Выше я спросил Василия, но не соображу как дать ссылку на описание моих действий, поэтому, извините, продублирую......, по сравнению с 1 постом схема изменилась в резольвере, соответсвенно прописан только один объект
$objects = array(
				/*'MyExtUserItem',*/
                'Userdata'
			);
Создаю схему:
<?xml version="1.0" encoding="UTF-8"?>
<model package="myextuser" baseClass="xPDOObject" platform="mysql" defaultEngine="MyISAM" phpdoc-package="myextuser"
	   version="1.1">


    <object class="Userdata" table="data" extends="xPDOSimpleObject">
        <field key="userdata_id" dbtype="int" precision="11" phptype="integer" null="false" attributes="unsigned"/>
        <field key="anyfield" dbtype="varchar" precision="100" phptype="string" null="true" />

        <aggregate alias="extUser" class="modUser" local="userdata_id" foreign="id" cardinality="one" owner="foreign" />
    </object>

</model>
Генерирую модель как описано у вас bezumkin.ru/training/course1/2136/

Добавил системные настройки с ключем
extension_packages со значением
[{«myextuser»:{«path»:"[[++core_path]]components/myextuser/model/"}}]Ключ: myextuser_assets_url Значение: {assets_path}components/myextuser/
Ключ: myextuser_core_path Значение: {core_path}components/myextuser/

Собрал и установил пакет myextuser.

Добавил в файл /public_html/core/components/myextuser/model/myextuser/metadata.mysql.php
<?php

$xpdo_meta_map = array (
  'xPDOSimpleObject' => 
  array (
    0 => 'Userdata',
  ),
);

$this->map['modUser']['composites']['Services'] = array(
    'class' => 'Userdata',
    'local' => 'id',
    'foreign' => 'userdata_id',
    'cardinality' => 'one',
    'owner' => 'local',
);
Создал сниппет:
$modx->addPackage('myextuser', MODX_CORE_PATH . 'components/myextuser/model/');

if (!$MyExtUser = $modx->getService('myextuser', 'MyExtUser', $modx->getOption('myextuser_core_path', null, $modx->getOption('core_path') . 'components/myextuser/') . 'model/myextuser/', $scriptProperties)) {
	return 'Could not load MyExtUser class!';
}

$User = $modx->getObject('modUser', $modx->user->get('id'));
$Data = $User->getOne('Services');
$Data->set('anyfield','any text'); 
$Data->save();
500 ошибка
Владимир Бабусенко
09 июня 2015, 18:33
0
Василий, что не так в этот раз. Я немного пересмотрел связь объектов, и теперь делаю так.

Создаю схему:
<?xml version="1.0" encoding="UTF-8"?>
<model package="myextuser" baseClass="xPDOObject" platform="mysql" defaultEngine="MyISAM" phpdoc-package="myextuser"
	   version="1.1">


    <object class="Userdata" table="data" extends="xPDOSimpleObject">
        <field key="userdata_id" dbtype="int" precision="11" phptype="integer" null="false" attributes="unsigned"/>
        <field key="anyfield" dbtype="varchar" precision="100" phptype="string" null="true" />

        <aggregate alias="extUser" class="modUser" local="userdata_id" foreign="id" cardinality="one" owner="foreign" />
    </object>

</model>
Генерирую модель как описано у вас bezumkin.ru/training/course1/2136/

Добавил системные настройки с ключем
extension_packages
со значением
[{"myextuser":{"path":"[[++core_path]]components/myextuser/model/"}}]
Ключ: myextuser_assets_url Значение: {assets_path}components/myextuser/
Ключ: myextuser_core_path Значение: {core_path}components/myextuser/

Собрал и установил пакет myextuser.

Добавил в файл /public_html/core/components/myextuser/model/myextuser/metadata.mysql.php
<?php

$xpdo_meta_map = array (
  'xPDOSimpleObject' => 
  array (
    0 => 'Userdata',
  ),
);

$this->map['modUser']['composites']['Services'] = array(
    'class' => 'Userdata',
    'local' => 'id',
    'foreign' => 'userdata_id',
    'cardinality' => 'one',
    'owner' => 'local',
);
Создал сниппет:
$modx->addPackage('myextuser', MODX_CORE_PATH . 'components/myextuser/model/');

if (!$MyExtUser = $modx->getService('myextuser', 'MyExtUser', $modx->getOption('myextuser_core_path', null, $modx->getOption('core_path') . 'components/myextuser/') . 'model/myextuser/', $scriptProperties)) {
	return 'Could not load MyExtUser class!';
}

$User = $modx->getObject('modUser', $modx->user->get('id'));
$Data = $User->getOne('Services');
$Data->set('anyfield','any text'); 
$Data->save();
Выдает 500 ошибку… что я не так делаю?