20 нояб. 2013 г., 11:59

Ввод информации в БД по правилам ShopModxBox

Добрый день, Коллеги. Мне очень понравился Ваш проект 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 с которым я не особо знаком.
Заранее благодарен, Евгений.
Добрый день.
На самом деле у вас очень объемный и общий вопрос. А ваш пример судя по всему — наследие от 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).
Спасибо, буду изучать.
Добрый день, коллеги. После топиков по 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 учитывает какие то параметры обращения к серверу, возможно это сделано для безопасности
Коллеги, в чем может быть дело? Заранее благодарен, Евгений.
Доброе Утро. Сегодня с утра заметил одну особенность. Если 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)"
Оказывается у меня и 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"
У кого какие соображения?
Ребят, еще кое что Выяснил. Сайт работает только на моем компьютере, т.е. на другом компе в хроме не работает. Помог мне разобраться FiddlerWebDebugger. Все дело в PHPSESSID=4b2b173v71idefqglmgl26asj6 если я меняю PHPSESSID и отправляю запрос через Composer получаю — 404 а возвращаю PHPSESSID то 200
?
Очевидно это какая-то защита в MODX, я вроде особо в настройках не лазил. Что это за PHPSESSID и как от нее избавиться?
Работает на другом компьютере если авторизоваться в панели управления.
Как мне сделать доступными другие страницы сайта? для анонимных пользователей?
Коллеги, разобрался))) Оказывается для ресурсов нужно ставить галочку «опубликовано» ))) А когда авторизован в админ панели то неопубликованные ресурсы доступны по своим ссылкам, даже если не установлена эта галочка. P.S. c MODx знаком всего лишь две недели, поэтому случился такой казус )))
Обращение без GET параметров соответствовало url главной страницы на которой галочка «опубликовано» установлена по умолчанию
По тому что я был авторизован в админ панели в Chrome. А страница с id=13 не была опубликована.
$resources = $modx->getCollection('modResource',$where); $countpagetitle = count($resources);
Упрощайте:
$count = $modx->getCount('modResource', $where);
Стало ясно что MODX учитывает какие то параметры обращения к серверу, возможно это сделано для безопасности Коллеги, в чем может быть дело?
Евгений, я боюсь, вы полезли сразу в слишком сложную задачу. Я готового рецепта не напишу (религия не позволяет). Здесь вам не только xPDO надо освоить, но и изучить политики безопасности MODX-а и много еще чего. Если запрос из фронта, то никаких дополнительных параметров в запросе передавать не надо. Но 99% политики безопасности MODX не позволят анониму создать документ. Надо явно задать права на это.
Это стандартный куки поддержки сессии. Избавляться от него не надо.
А когда авторизован в админ панели то неопубликованные ресурсы доступны по своим ссылкам, даже если не установлена эта галочка.
Да, потому что политики безопасности позволяют это админам.
Добрый день, коллеги. Продолжаю изучать 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);
Добрый!
Вы пусть не прочитайте, но хотя бы пробегитесь по топикам, о чем кто писал. На второй странице есть топик: modxclub.ru/blog/voprosy-spetsyalistov/256.html Там все описано.
sorry, не заметил. Большое спасибо.
Разобрался, спасибо)
$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);
$where->innerJoin('modTemplateVarResource','TemplateVarResources');
'TemplateVarResources.value:like' => '%valuetest%'
Это вам не надо добавлять. Это общее присоединение TV-полей, и оно итак прописано в getdata-процессоре, если вы его используете. Но это что касается getdata-процессора (рекомендую для выборок использовать именно его).
Но если вы чистый запрос пишите, то да, так и есть.
Спасибо, разбираюсь потихоньку с getdata-процессором, а что бы понять как он работает отдельные части отрабатываю на чистых запросах через консоль.
Николай, а как сделать NOT LIKE?
'TemplateVarResources.value:NOT LIKE' => '%valuetest%'
'TemplateVarResources.value:!=' => '%valuetest%'
'TemplateVarResources.value:NOT LIKE' => '%valuetest%'
Вообще в консоли играйтесь с запросами и все будет видно.
<?php $q = $modx->newQuery('modResource'); $q->where(array( "pagetitle:not like" => 'sdf', )); $q->prepare(); print $q->toSQL();

Добавить комментарий