Степан Прищепенко

Степан Прищепенко

С нами с 09 апреля 2013; Место в рейтинге пользователей: #66
Степан Прищепенко
17 июня 2015, 19:04
0
Установлен MS2 2.1.9 beta, MODX Revolution 2.3.3-pl (traditional) стоял Tickets 1.5.1 — работало. Обновил — тикеты открываются, а вот категории и товары магазина выдают в консоль
Uncaught TypeError: b[(d.xtype || e)] is not a function
. Вернул назад — все в норме. Видать трабл есть при вызове старым MS2 комментов, а на новый пока не хочется переезжать.
Степан Прищепенко
02 июня 2015, 11:51
0
«И снова здравствуйте!» Короче пока разбирался с проблемой удаления исправил XPDO и вроде как все удаляет нормально. Т.е. все удаляется с учетом наследования. Решил поглядеть исходник… мля оказалось что Оpengeek исправил этот косяк 18 апреля, не знаю выложили еще или нет это, но он исправил с учетом множественных PK, проверил, все также работает.

И еще, не проверял в новых версиях XPDO, но в текущей такое есть (xPDO 2.3.0-pl (July 15, 2014)):
если мы пропишем несколько полей с primary key в одном объекте (тип объекта не важен), то AUTO INCREMENT параметр не добавляется ни в одно поле, какой бы вы generator не прописывали. В результате будем всегда получать error.
Степан Прищепенко
29 мая 2015, 17:45
0
Добавлю свои пять копеек, пусть я буду не прав, но может эта проблема разрешиться иным путем. В общем делаю плагин для MS2, сделал такую же схему указал несколько праймари ключей index=«pk» generated=«native и указал в объекте extends=»xPDOObject". Прописал агрегатные и композиционные связи. Объекты получаем (общим списком), изменяем, НО удалить или получать объект вот так: $modx->getObject('msSfiltersProduct', 123); уже нельзя, точнее мы получаем объект, но он совсем не тот что мы запрашивали,. Сработает только через $modx->getObject('msSfiltersProduct', array('id'=>27));
Что собственно и происходит при удалении через remove() или если мы используем процессор от modObjectRemoveProcessor. А проблема в следующем: так как во всех случаях прежде чем удалить объект, его нужно получить через getObject('msSfiltersProduct', $criteria) Где $criteria либо массив данных, если обратились через процессор, либо строка или целое. При этом вызове у нас вызывается $this->parseConditions($conditions, $conjunction); Вот этот метод и гадит нам. Дело в том что условие строиться на основе primary key и его типа, приведу вырезанный кусок данного метода:
public function parseConditions($conditions, $conjunction = xPDOQuery::SQL_AND) {

        $result= array ();
        $pk= $this->xpdo->getPK($this->_class);
        $pktype= $this->xpdo->getPKType($this->_class); // если у нас несколько primary key, то == Array

	... 
	if (is_array($conditions)) {
		// при remove и getObject - $conditions всегда integer или string
		...
		if (isset($conditions[0]) && is_scalar($conditions[0]) && !$this->isConditionalClause($conditions[0]) && is_array($pk) && count($conditions) == count($pk)) {
                $iteration= 0;
		// во прикол, кто так решил, что если у нас $conditions массив, то $pk обязательно массив,
		// а что по другому быть не может? (дебильно конечно но все же)
                foreach ($pk as $k) {...}
		...

	}
        elseif ($this->isConditionalClause($conditions)) {
            $result= new xPDOQueryCondition(array(
                'sql' => $conditions
                ,'binding' => null
                ,'conjunction' => $conjunction
            ));
        }
        elseif (($pktype == 'integer' && is_numeric($conditions)) || ($pktype == 'string' && is_string($conditions) && $this->isValidClause($conditions))) {
            if ($pktype == 'integer') {
                $param_type= PDO::PARAM_INT;
            } else {
                $param_type= PDO::PARAM_STR;
            }
            $field['sql']= $this->xpdo->escape($alias) . '.' . $this->xpdo->escape($pk) . ' = ?';
            $field['binding']= array ('value' => $conditions, 'type' => $param_type, 'length' => 0);
            $field['conjunction']= $conjunction;
            $result = new xPDOQueryCondition($field);
        }
        return $result;
Видно, что проверки на тип ключа как массива нет и $result будет всегда == NULL, и getObject вернет нам первый объект. Что же делать… как вариант не указывать несколько primary key, у всех кроме одного нужно указывать index=«index». В самом объекте указать индекс может выглядеть так:
<index alias="PRIMARY" name="PRIMARY" primary="true" unique="true" type="BTREE">
		<column key="id" length="" collation="A" null="false" />
		<column key="res_id" length="" collation="A" null="false" />
	</index>
Возможно я и ошибся где-то хз, пусть найдет добрый человек и поправит меня если я не прав.
Степан Прищепенко
13 января 2015, 09:35
0
вообще то это для изменения позиции на экране, а не для обрезки.
Степан Прищепенко
12 января 2015, 17:29
0
а для того чтобы путь к водяному знаку шел от корня сайта укажите слеш в самом начале, например:
{"w":120,"h":90,"q":90,"zc":"1","bg":"000000","fltr":"wmi|/assets/img/wm.png|BR|80"}