tzx1z 20 ноября 2013 0 27
Добрый день, Коллеги. Мне очень понравился Ваш проект ShopModxBox. Большое Вам спасибо! Сижу разбираюсь по чуть-чуть.
Подскажите пожалуйста, а то сам я что то запутался.
У меня VBScript будет в базу отправлять информацию думаю это будет через GET или POST (может JSON). С выводом вроде все понятно. А вот с вводом информации в БД не все ясно.
Как мне организовать, API ?, это будет процессор или сниппет …, создать отдельную таблицу или использовать таблицы товаров.
Если будет время и настроение) пожалуйста подкиньте примерчик как писать в таблицу базы данных.

Я это вижу так. Отдельная таблица в базе. Ввод на основе этого примера:

function insert_my_rows( $data = array() ) {
global $modx;
$table_name = $modx->getFullTableName( 'cars' );
$fields = array('name' => $data['name'],
'color' => $data['color'],
'make' => $data['make'],
'model' => $data['model'],
);

$modx->db->insert( $fields, $table_name);
}

Хотелось бы это реализовать по правилам ShopModxBox, ведь там используется smarty с которым я не особо знаком.

Заранее благодарен, Евгений.
27 комментариев
Fi1osof1
Fi1osof 20 ноября 2013г в 17:23 #
Добрый день.

На самом деле у вас очень объемный и общий вопрос. А ваш пример судя по всему — наследие от MODX Evolution. В Revolution все по-другому, и объекта $modx->db нет в принципе. Вам предстоит изучить хоть как-то xPDO, что является основой MODX Revolution и основным средством взаимодействия с базами данных, а так же пакеты, xPDO-классы (через которые происходит взаимодействие с БД) и т.п. Вот один из топиков, который чуть-чуть прольет свет на этот вопрос: modxclub.ru/blog/dokumentatsiya-dlya-spetsialistov/34.html
Так же ознакомьтесь с серией топиков по xPDO здесь. Только тогда у вас появится понимание как и что правильней делать в вопросах с БД.
Плюс к этому найдите информацию и почитайте про CMPgenerator. Этот пакет позволит из таблиц в БД генерировать модели xPDO-объектов.

А в плане сохранения/удаления и прочих операций с записями, работать можно как через сами объекты (например $modx->newObject('MyObjectClass', $data)->save()), так и через процессоры (к примеру xPDOObjectCreateProcessor).
t
tzx1z 20 ноября 2013г в 18:58 #
Спасибо, буду изучать.
Fi1osof1
Fi1osof 20 ноября 2013г в 19:03 #
Пожалуйста.
t
tzx1z 21 ноября 2013г в 21:43 #
Добрый день, коллеги. После топиков по xPDO мне много стало ясно и уже появилась простейшая реализация задачи:

<code>
if (isset($_GET['bobo'])) {$bobo = $_GET['bobo'];}else{$bobo = '0';}
...
        $where = array(
            'parent' => 2,
            'pagetitle' => $bobo
            );
        $resources = $modx->getCollection('modResource',$where);
        $countpagetitle = count($resources);

if ($bobo <> '0' && $countpagetitle == 0){
        $newpc = $modx->newObject('modResource');
        $newpc->set('pagetitle',$bobo);
        $newpc->set('parent',2);
        $newpc->set('template',1);
        $newpc->save();
        $newpc->setTVValue('bobo',$bobo);
        ...
        $newpc->save();
    }

</code>

Но я столкнулся с проблемой и не могу понять в чем дело.
172.16.25.10/index.php?id=13&bobo=hello&...&...&...
При открытии браузером страницы с этим сниппетом все работает, создает новый ресурс и заполняются его TV поля.
А при открытии этой же ссылки в VBScript сообщается ошибка 404.

Из браузера:
<code>
172.16.11.71 - - [21/Nov/2013:21:29:34 +0400] "GET /index.php?id=13&bobo=444 HTTP/1.1" 200 584 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36"
</code>
Из VBScript:
<code>
172.16.11.71 - - [21/Nov/2013:21:30:03 +0400] "GET /index.php?id=13&bobo=444 HTTP/1.1" 404 2896 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media
</code>

VBScript:
<code>
Wscript.echo WebResponse("http://172.16.25.10/index.php?id=13&bobo=444")

Function WebResponse(sURL)
    Dim XmlHttpRequest
    Set XmlHttpRequest = CreateObject("MSXML2.XMLHTTP")
    XmlHttpRequest.Open "GET", sURL, False
    XmlHttpRequest.setRequestHeader "If-Modified-Since", "Thu, 1 Jan 1970 00:00:00 UTC"
    XmlHttpRequest.setRequestHeader "Cache-Control", "no-store, no-cache"
    XmlHttpRequest.setRequestHeader "Pragma", "no-cache"
    XmlHttpRequest.send
    WebResponse = XmlHttpRequest.responseText
End Function
</code>

Сервер: Виртуальная машина XenSrv в локальной сети ubuntu-13.10-server-amd64 LAMP

Провел эксперимент в корневой директории создал файл test.php
<code>
<?php
$bobo = $_GET['bobo'];
echo $bobo;
?>
</code>

172.16.25.10/test.php?bobo=444
И VBScript стал получать ответ 200

Стало ясно что MODX учитывает какие то параметры обращения к серверу, возможно это сделано для безопасности

Коллеги, в чем может быть дело?
Заранее благодарен, Евгений.
Fi1osof1
Fi1osof 23 ноября 2013г в 20:23 #
$resources = $modx->getCollection('modResource',$where);
$countpagetitle = count($resources);

Упрощайте:
$count = $modx->getCount('modResource', $where);


Стало ясно что MODX учитывает какие то параметры обращения к серверу, возможно это сделано для безопасности
Коллеги, в чем может быть дело?

Евгений, я боюсь, вы полезли сразу в слишком сложную задачу. Я готового рецепта не напишу (религия не позволяет). Здесь вам не только xPDO надо освоить, но и изучить политики безопасности MODX-а и много еще чего.
Если запрос из фронта, то никаких дополнительных параметров в запросе передавать не надо. Но 99% политики безопасности MODX не позволят анониму создать документ. Надо явно задать права на это.
t
tzx1z 22 ноября 2013г в 08:38 #
Доброе Утро. Сегодня с утра заметил одну особенность. Если VBScript обращается на url без GET параметров то сервер отвечает 200. А если присутствует хоть один GET параметр то — 404



172.16.11.71 - - [22/Nov/2013:08:32:57 +0400] "GET /index.php HTTP/1.1" 200 797 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; I
nfoPath.2; Tablet PC 2.0; .NET4.0C; .NET4.0E; BOIE9;ENUSMSE; Avant Browser)"


172.16.11.71 - - [22/Nov/2013:08:34:15 +0400] "GET /index.php?id=13 HTTP/1.1" 404 2896 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC
 6.0; InfoPath.2; Tablet PC 2.0; .NET4.0C; .NET4.0E; BOIE9;ENUSMSE; Avant Browser)"

t
tzx1z 23 ноября 2013г в 09:45 #
Обращение без GET параметров соответствовало url главной страницы на которой галочка «опубликовано» установлена по умолчанию
t
tzx1z 22 ноября 2013г в 08:59 #
Оказывается у меня и EnternetExplorer получает от сервера 404:

172.16.11.71 - - [22/Nov/2013:08:55:13 +0400] "GET /index.php?id=13&bobo=444 HTTP/1.1" 404 2896 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; BOIE9;ENUSMSE; Avant Browser)"

А для Chrome — 200:

172.16.11.71 - - [22/Nov/2013:08:58:55 +0400] "GET /index.php?id=13&bobo=444 HTTP/1.1" 200 583 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36"

У кого какие соображения?
t
tzx1z 23 ноября 2013г в 09:47 #
По тому что я был авторизован в админ панели в Chrome. А страница с id=13 не была опубликована.
Fi1osof1
Fi1osof 23 ноября 2013г в 20:24 #
верно
t
tzx1z 22 ноября 2013г в 09:45 #
Ребят, еще кое что Выяснил. Сайт работает только на моем компьютере, т.е. на другом компе в хроме не работает.
Помог мне разобраться FiddlerWebDebugger. Все дело в PHPSESSID=4b2b173v71idefqglmgl26asj6
если я меняю PHPSESSID и отправляю запрос через Composer получаю — 404
а возвращаю PHPSESSID то 200



Очевидно это какая-то защита в MODX, я вроде особо в настройках не лазил.
Что это за PHPSESSID и как от нее избавиться?
Fi1osof1
Fi1osof 23 ноября 2013г в 20:25 #
Это стандартный куки поддержки сессии. Избавляться от него не надо.
t
tzx1z 22 ноября 2013г в 09:53 #
Работает на другом компьютере если авторизоваться в панели управления.
t
tzx1z 22 ноября 2013г в 10:11 #
Как мне сделать доступными другие страницы сайта? для анонимных пользователей?
Fi1osof1
Fi1osof 23 ноября 2013г в 20:25 #
опубликовать их
t
tzx1z 22 ноября 2013г в 19:50 #
Коллеги, разобрался))) Оказывается для ресурсов нужно ставить галочку «опубликовано» )))
А когда авторизован в админ панели то неопубликованные ресурсы доступны по своим ссылкам, даже если не установлена эта галочка.
P.S. c MODx знаком всего лишь две недели, поэтому случился такой казус )))
Fi1osof1
Fi1osof 23 ноября 2013г в 20:26 #
А когда авторизован в админ панели то неопубликованные ресурсы доступны по своим ссылкам, даже если не установлена эта галочка.
Да, потому что политики безопасности позволяют это админам.
t
tzx1z 26 ноября 2013г в 10:55 #
Добрый день, коллеги. Продолжаю изучать modx. Если Вас не затруднит подскажите в следующем вопросе. Как добавить в array where условие для TVполя. Например, как получить все ресурсы у которых TV поле «tvtest» содержит «valuetest»?

В голове крутится такая конструкция:



$where = $modx->newQuery('modResource');
$where->where(array(
    'parent' => 2,
    'deletedby' => 0,
    $modx->getObject('modTemplateVar',array('name'=>'tvtest')) => 'valuetest'
    ));
$where->sortby('id','ASC');
$resources = $modx->getCollection('modResource',$where);

Fi1osof1
Fi1osof 26 ноября 2013г в 16:10 #
Добрый!

Вы пусть не прочитайте, но хотя бы пробегитесь по топикам, о чем кто писал. На второй странице есть топик: modxclub.ru/blog/voprosy-spetsyalistov/256.html
Там все описано.
t
tzx1z 26 ноября 2013г в 21:21 #
sorry, не заметил.
Большое спасибо.
Fi1osof1
Fi1osof 26 ноября 2013г в 22:30 #
пожалуйста
t
tzx1z 27 ноября 2013г в 13:06 #
Разобрался, спасибо)



$where = $modx->newQuery('modResource');
$where->innerJoin('modTemplateVarResource','TemplateVarResources');
$where->innerJoin('modTemplateVar','TemplateVar','`TemplateVar`.`id` = `TemplateVarResources`.`tmplvarid`');
$where->where(array(
    'parent' => 2,
    'deletedby' => 0,
    'TemplateVar.name' => 'tvtest',
    'TemplateVarResources.value:like' => '%valuetest%'
));
$resources = $modx->getCollection('modResource',$where);

Fi1osof1
Fi1osof 27 ноября 2013г в 16:56 #
$where->innerJoin('modTemplateVarResource','TemplateVarResources');
'TemplateVarResources.value:like' => '%valuetest%'
Это вам не надо добавлять. Это общее присоединение TV-полей, и оно итак прописано в getdata-процессоре, если вы его используете.
Но это что касается getdata-процессора (рекомендую для выборок использовать именно его).

Но если вы чистый запрос пишите, то да, так и есть.
t
tzx1z 27 ноября 2013г в 19:18 #
Спасибо,
разбираюсь потихоньку с getdata-процессором,
а что бы понять как он работает отдельные части отрабатываю на чистых запросах через консоль.
Fi1osof1
Fi1osof 27 ноября 2013г в 19:23 #
Тоже правильно.
t
tzx1z 28 ноября 2013г в 14:17 #
Николай, а как сделать NOT LIKE?

'TemplateVarResources.value:NOT LIKE' => '%valuetest%'

'TemplateVarResources.value:!=' => '%valuetest%'
Fi1osof1
Fi1osof 28 ноября 2013г в 16:45 #
'TemplateVarResources.value:NOT LIKE' => '%valuetest%'
Вообще в консоли играйтесь с запросами и все будет видно.
<?php

$q = $modx->newQuery('modResource');
$q->where(array(
    "pagetitle:not like"    => 'sdf',
));

$q->prepare();
print $q->toSQL();
Авторизуйтесь или зарегистрируйтесь (можно через соцсети ), чтобы оставлять комментарии.