Marat_Kh

Рейтинг
126
Регистрация
18.08.2005
http://vseveliki.ru - что за движок?

netcat? 10 netcatov

data-href-delete='/netcat/modules/netshop/actions..
img src="/netcat_files/53...
/netcat/add.php.....
dotern:
Самое главное не сказали, что за движок?
самописном движке
Т.е. движок не проверяет полностью адрес страницы, он выискивает для страницы второго уровня только их номер, id, остальное ему совершенно безразлично и функций сопоставления номера страницы и правильной части адреса нет.

Например, такой адрес:

/mineralnye_veshhestva/page2/139-fosfor-v-organizme-cheloveka/

возвращяет 200. (урл получен добавлением ид 139 из скрина в 1 попавшийся адрес mineralnye_veshhestva/page2/67-fosfor-v-organizme-cheloveka/). Зачем page2😕

Изменив 1 сегмент УРЛа /vitaminy/page2/139-fosfor-v-organizme-cheloveka/ все равно 200, а если /vitarrrrrrminy/page2/139-fosfor-v-organizme-cheloveka/ (заведомо неверная категория) то 404. Т.е. наличие категории существующей в БД проверяется.

Из того, что у вас есть в таблице на скрине, не видно связи с категорией. А остальное для правильной генерации, например, каноникла или отдать 404 для невалидного УРЛА есть. Ид - 139, транслит поля title судя по всему. Осталось установить связь с категорией. Допускаю, что это невозможно.

в настройках же ставится количество выводимый цифр, в данном случае их 12
n=n.toFixed(12);

12 это количество цифр после десятичной точки

Костыль


if(!function_exists('mysql_connect')&&function_exists('mysqli_connect')) {
$link = null;
define(MY_DB,"my_db");
function mysql_connect($server,$login,$pass){
$GLOBALS['link'] = mysqli_connect($server,$login,$pass, MY_DB);
return $GLOBALS['link'];
}
function mysql_select_db(DBName) {return null;}
function mysql_query ( $query, $link=null ){
if(!$link) $link = $GLOBALS['link'];
return $link ? mysqli_query ( $link , $query , $resultmode = MYSQLI_STORE_RESULT ) : null;
}
/** И т.д. все используемые функции с префиксом mysql_ **/
}
но проще, в данном случае, уменьшить версию, раз это возможно
danforth:
Marat_Kh, ну и код)) 😕

sqlite, а что не так.

danforth:

Данная конструкция шаткая. Объясняю: если символов меньше или равно 32, то вы транслитеризируете текст, очевидно на английский. Я конечно не знаю что там у вас за транслитеризация, но если она какая-то более вменяемая, то подав на вход url текст "Жирный жираф бежит через поле" на выход вы получите "zhirnyiy_zhiraf_bezhit_cherez_pole", что уже не вмещается в 32 символа VARCHAR(32), потому что их тут 34.

Да и в целом, вы мне скинули не то о чем я вас просил. Я вас просил о том, чтобы вы мне скинули таблицы: товары на сайте, описания, и как вы свяжете описания с товаром на сайте, при этом товары импортируются из прайса поставщика. Пример прайса из одного товара я вам дал выше. После чего мы с вами воспроизведем ситуацию, как сказал человек выше: удалим все товары и зальем заново, и посмотрим на то, как описания останутся прикреплены к товарам.

То, что закомментировано только лишь для информации что чего. На практике логика немного другая, что не принципиально. Урл с кириллицей вообще не пройдет (см. str::testUrl). Надрал из исходника. Таблица обвеса - описаний в комментируемом вами посте. Ид в обоих таблицах одинаковый.

//Например такая таблица

CREATE TABLE [items](
[id] VARCHAR(32) PRIMARY KEY NOT NULL,
[visible] INTEGER(1) DEFAULT 0,
[name] VARCHAR(255),
[price] MONEY,
[hitprice] MONEY,
[hitdate] DATETIME,
[cat_id] VARCHAR(32),
[update] DATETIME,
[vendor] VARCHAR(127));

//загрузчик из xls
....
$name = str::sanitize($sheet->getCell($nf . $row)->getValue());
if($name) {
$a[$row][':name'] = $name;
$a[$row][':id'] = $cat_url . '/' . str::translit($a[$row][':name'], '_', str::URL );
if( strlen( $a[$row][':id']>32 ) ) {
$a[$row][':id'] = md5($a[$row][':id']);
}

....
$c=DB::I(_SQLITE_ . 'cat.db')->q('INSERT OR REPLACE INTO [items]
([id],[visible],[name],[price],[hitprice],[hitdate],[cat_id],[update],[vendor]) VALUES
(:id, :visible, :name, :price, :hitprice, :hitdate, :cat_id, :update, :vendor )',$a)->info();

//Class Request, url components
.....
if(!str::testUrl($components['path'])) aapp::error_out('wrongUrl', 'urlError in /' . $components['path']);;
......
//$this->URI['urls'] массив урлов /a/b/c/ => ['a','a/b','a/b/c']
$this->canUri = end($this->URI['urls']);
$this->canUriId = strlen($this->canUri) > 32 ? md5($this->canUri) : $this->canUri;
....

//Class str
.....
public static function testUrl($str) {
return preg_match("#^([a-zA-Z0-9\_\/\-\.])+$#", $str);
}
.....

Только не пойму смысл. Если вы хотите сказать, что поменяем название или рубрику и все, то на это.

мое:
Есть механизмы, которые, если меняется урл (перенос документа в другой раздел, прямое изменение урла), меняют ид в этой табличке (который и есть урл в сущности). Есть механизмы, которые удаляют данные несуществующих урл. Замена пары строк позволяет изменить логику того, что делать, если например товара по данному урлу нет - или 404 и die('content for 404') или 30х и location на предыдущий существующий документ в урле или 200 и показать то что нашлось в таблице обвеса для данного урл, добавив например в "related" ид существующих аналогов.

Плюс в админке можно для любого объекта будь то плайн страница, объект каталога и т.д. вручную можно перепривязать объект из [pages].

danforth:
Пусть я буду vendor = 1;
Покажите как вы его сохраните у себя, со всеми таблицами.

Под вашу табличку некогда :( Максимум, что могу ctrl-c , ctrl-v , prtsc и немного байт копирайта для пояснения..

А реализация может быть такой

табличка для обвеса 

CREATE TABLE [pages](
[id] VARCHAR(32) PRIMARY KEY ON CONFLICT ROLLBACK NOT NULL UNIQUE,
[data] text,
[uptime] DATETIME);
// id = strlen($url)>32 ? md5($url) : str::translit($url,'_', str::URL);
//$R = new Request sanitized url , post, get, headers, cook ....
//DB extends PDO , I() return $instanse[$key];
//$R->canUriId определяется по текущему урлу strlen($url)>32 ? md5($url) : str::translit($url,'_', str::URL); в зависимости от этого же ищутся данные из прайса...
//обвес

$c=DB::I(_SQLITE_ . 'p.db')->q('SELECT * FROM [pages] WHERE [id]=:id',[':id'=>$R->canUriId])->a();
print_r($c); die();
-----------
obves: Array
(
[id] => samosval/kamaz-65115
[data] => a:7:{s:5:"title";s:135:"SEO title, финальный, ручной работы, если нет, то используется сгенерированный";s:11:"description";s:141:"SEO description, финальный, ручной работы, если нет, то используется сгенерированный";s:7:"content";a:3:{i:1;a:2:{s:1:"c";s:50:"Lorem ipsum dolor sit amet, consectetur adipiscing";s:1:"t";s:16:"Описание";}i:2;a:2:{s:1:"c";s:51:"<h3>Второй контентный блок</h3>";s:1:"t";s:54:"Заголовок 2 контентного блока";}i:3;a:2:{s:1:"c";s:35:"<div class="owl-carousel">...</div>";s:1:"t";s:54:"Заголовок 3 контентного блока";}}s:4:"pics";a:4:{i:0;a:4:{s:5:"thumb";s:30:"/userdata/image/thumb_pic0.jpg";s:4:"path";s:24:"/userdata/image/pic0.jpg";s:3:"alt";s:22:"Alt картинки 0";s:11:"description";s:37:"Описание картинки {i}";}i:1;a:4:{s:5:"thumb";s:30:"/userdata/image/thumb_pic1.jpg";s:4:"path";s:24:"/userdata/image/pic1.jpg";s:3:"alt";s:22:"Alt картинки 1";s:11:"description";s:37:"Описание картинки {i}";}i:2;a:4:{s:5:"thumb";s:30:"/userdata/image/thumb_pic2.jpg";s:4:"path";s:24:"/userdata/image/pic2.jpg";s:3:"alt";s:22:"Alt картинки 2";s:11:"description";s:37:"Описание картинки {i}";}i:3;a:4:{s:5:"thumb";s:30:"/userdata/image/thumb_pic3.jpg";s:4:"path";s:24:"/userdata/image/pic3.jpg";s:3:"alt";s:22:"Alt картинки 3";s:11:"description";s:37:"Описание картинки {i}";}}s:6:"params";a:4:{s:24:"Мощность, л.с.";s:3:"300";s:33:"Вместимость т.б., л";s:3:"250";s:29:"Г/подъемность, т";s:2:"15";s:41:"Направление разгрузки";s:10:"назад";}s:7:"related";s:12:"231,21,16,34";s:4:"hits";s:12:"12,17,18,334";}
[uptime] => 2016-12-18 14:28:24
)

Проще на пальцах картинках: У пользователя, роль которого позволяет, несколько кнопок - галерея, контент, режим разметки прямо на фронте. Нажав на которые, можно привязать к урлу картинки, неограниченное кол-во текстовых блоков. Которые, потом можно перетащить куда угодно в рамках документа. Все это сохраняется в серилизованном массиве. Есть механизмы, которые, если меняется урл (перенос документа в другой раздел, прямое изменение урла), меняют ид в этой табличке (который и есть урл в сущности). Есть механизмы, которые удаляют данные несуществующих урл. Замена пары строк позволяет изменить логику того, что делать, если например товара по данному урлу нет - или 404 и die('content for 404') или 30х и location на предыдущий существующий документ в урле или 200 и показать то что нашлось в таблице обвеса для данного урл, добавив например в "related" ид существующих аналогов.

Пардон за картинки:)

jpg screen-1.jpg
jpg screen-2.jpg
jpg screen-3.jpg
jpg screen-4.jpg
danforth:
А связываете вы описания с товарами как? По SKU который дает поставщик? А если два поставщика дадут одинаковые SKU? А знаете как поставщики меняют SKU? А если привязываете к какому-то PRIMARY KEY AUTOINCREMENT, тогда не прокатит ваш трюк.

Варианты:

$vendorId . $itemId; $vendorId . $name; $vendorId . $sku; $vendorId . $catId . $sku | $name | $itemId;

--- или

url (md5|crc от url) - считаю самым простым и лучшим, но каждый урл реально д.б. уникальным на вашем сайте. В случае смены урл, в таблице обвеса тоже надо изменить. Уполномоченный юзер (role=manager например) зашел залогиненным на документ, ткнул капу, залил фото/отредактировал текст/(....). По крону, таблица обвеса, чистится от того, чего уже нет на сайте.

danforth:

Marat_Kh, с трудом понимаю ваши посты, манера речи у вас немного не ясная, но все же... Права доступа на что? Есть RBAC/ABAC, выдал контентщикам доступ на изменение фоток и описания, и все. Все остальное не видят. Для этого обязательно микросервис пилить? И то что вы мне скинули, в частности ItemSpecifics, это EAV, ясное дело что никто не будет хранить его в таблице рядом с товаром, хотя BJSON это позволяет и более того, решает некоторые вопросы проивзодительности.

Вы как то абстрактно. И так можно, и так.

Но, применительно к суровой реальности ВП vs криворукие самописатели, ваши буржуйские символы ни_о_чем. С какого бока к теме поста, доступ в зависимости от роли/аттрибута. Понятно что это будет так или иначе. Сомнительно, но можно и бинарный JSON, какая разница как хранить. Важно где хранить в ВП и как оттуда быстро добывать, при этом обезопасив себя от коллизий при обновлении прайса и от обновления ВП. И, вообще, есть ли тогда смысл в ВП, только для роутинга (гуру ВП помогите человеку), загрузки картинок, размещения десятка статичных страниц, отчетов вукомерса, м.б. платежей картой и еще там чего по мелочи. Коли мы все равно напишем 100500 строк кода и создадим x-таблиц/файлов для хранения данных (привет обновлениям ВП/плагинов).

Ну и куда мы положим ItemSpecifics и остальное из 1 и 2 пункта в wp_posts или в wp_postmeta?
danforth:
1) Зачем заводить отдельный каталог описаний?

Ну, например так:

Товар грузится на сайт как и было - ваша карточка на вашем сайте как есть сейчас

Разукрашиваем:

1) Кто то уполномоченный может добавить картинку, текстовый блок, изменить тайтл, дескрипшн и т.п. не трогая то что получено от поставщика ибо нет смысла - при следующем обновлении (загрузка csv,xls обмен 1с) все равно .... Банально и просто, но эффективно ибо ручная работа, если кто то не лентяй.

2) С этим товаром можно связать (установщик плагинов точно скажет как😂) и дополнительно показать в карточке (или еще что то сделать) например это

{{GalleryURL}}<br>{{Title}}

BELIF Rose Gemma Concentrate Oil 30ml Rose concentrate face oil


[GalleryURL] => *****thumbs3.ebaystatic.com/pict/2628576500228080_1.jpg
[Title] => BELIF Rose Gemma Concentrate Oil 30ml Rose concentrate face oil
....
[ItemSpecifics] => stdClass Object
(
[NameValueList] => Array
(
[0] => stdClass Object
(
[Name] => Brand
[Value] => Array
(
[0] => Belif
)
)
[1] => stdClass Object
(
[Name] => Formulation
[Value] => Array
(
[0] => Oil
)
)
[2] => stdClass Object
(
[Name] => Target Area
[Value] => Array
(
[0] => Face
)
)
[3] => stdClass Object
(
[Name] => Skin Type
[Value] => Array
(
[0] => All Skin Types
)
)
[4] => stdClass Object
(
[Name] => Gender
[Value] => Array
(
[0] => Women
)
)
.....
)

Все это берется тут, ну или тут а может вообще везде где дадут. Обратите внимание на ItemSpecifics , да и вообще вкусного в мире очень много☝

3) Фантазия, выбор ВП как лучшего мотора для вашего сайта способного воплотить любую фантазию😂 и пара десятков символов отправленных в гугл добавляют еще много способов сделать не "у всех все как у всех"

Ну и куда мы положим ItemSpecifics и остальное из 1 и 2 пункта в wp_posts или в wp_postmeta?

melkozaur:
Узкое место сторонников самописов - это одностраничники.
Т.е. люди в целом агитируют за индивидуальный подход, но когда им говоришь, что лендинг лучше вообще делать в виде 1 хтмл файла - у них начинается пена изо рта и предложения, резко переходящие грани разумного. Не всегда, но ОЧЕНЬ часто. Странно.

Вы видимо много сайтов заказываете. Я нет, но что другие предлагают иногда в курсе. Я таких, как вам попадаются, не видел. Что же, в каждой секте по паршивой овце, если все обстоит так, как у вас:(


Еще раз повторю
. Если ТЗ на сайт можно выполнить установкой фри кмс + установка темы, плагина, то это лучшее решение. Даже посоветую такому заказчику, например визитки или "корпоративного". Ну такой, сайтец о компании и чтобы карта проезда была, новости и такой раздел куда зайдешь и ссылка скачать прайс 😎. Кстати именно ВП и посоветую: Находишь установщика темы, плагина (3-5т.р). Покупаешь подходящую платную тему 10-70$. Неделя и сайт готов☝ До свидания и не надо благодарить, рано😂

По поводу 1-страничника согласен, край SSI. С небольшими оговорками.

melkozaur:

---------- Добавлено 14.06.2017 в 20:12 ----------
А в чем проявляется уникальность? Вы что-то делаете уникальное для каждого заказчика? Зачем? Если вас об этом не просят.

Только если просят. Но, в итоге да, именно уникальное для каждого. Одному надо чтобы для каждого раздела каталога можно было установить свой формат урл, свой шаблон для тайтла и др. мета-тегов, описания, шаблон вывода листинга категории, минимум 5 контентных блоков для вывода в разных частях страницы и чтобы для одной категории слайдер был вверху, а для другой после списка вариантов. И чтобы сам мог выбрать 4 варианта похожих товаров и сделать для них заголовки. А 5-й вариант чтобы автоматом подбирался для разных категорий по разным правилам. И плюс, эта, сделай чтобы мы какой то код ввели и сразу в этом месте кнопка нажав на которую форма возникала с разными вариантами обратной связи. Другой говорит, запарился менеджеров учить править в 1С и в админке сайта, а они меняются заразы раз в полгода, давай будет все из 1С. На каждый товар 3 набора картинок, чтобы 1-й справа сверху, а 2 и 3-й после таблицы характеристик, а еще рядом с каждым набором картинок соответствующий текст. Все приходит из 1С. Общая информация, установка, обслуживание. Нет 4, еще схемы надо при-ть. А давай неограниченно. Ну мало ли что мы потом придумаем. В итоге xpath и текстареа в админке для сохранения правил = {{supefoto}} в шаблоне карточки (тоже правится в админке). Что то типа цукцук-цукцукц-цукцукцук.jpg#supefoto , цукцук-33кцукц-цукцукцук.jpg#supefoto в import.xml, ну и ?mode=file&filename=цукцук-цукцукц-цукцукцук.jpg и т.д. естественно. Слайдер суперфото после обновления в указанном администратором месте карточки товара. Как то так.

И да, на серче нет моих заказчиков на разработку, если намек на то что я хочу кому то что то впарить. Тут больше статейник под адсенс, где, конечно, ВП вне конкуренции. Что не мое. Да и вообще, для незнакомых только as-is.

melkozaur:

Все эти жалкие попытки сравнять собственную кривую цмску с уже известными и оттестированными - жалкие и смешные. Человек стоит без трусов и уверяет, что он одет.

А вы видели мою кривую? Иначе зачем обобщать. Для тех кто в трусах повторю

Marat_Kh:

Почему? GET https://newsroom.fb.com/news....................../ HTTP/2.0 200 OK 466мс
ВП ведь КМС из "коробки"? Или там контроль урла страницы созданной стандартными средствами ВП на установщике тем и плагинов лежит?
Мне еще нравится этот подход самопис-лохотронщиков.
Дается задача: сделать сайт с двумя постами.

См. выше.

SeVlad:
:) То о чем я и говорил:

Я, правда, не знаю насколько это нужно в данном классе, но в общем как-то так.

А жестко заданные темплейты (tpl) .. хорошее "наследование".
В том же ВП, если что замена темплейта tpl (в ВП это называете "шаблон") происходит вообще БЕЗ кодинга - просто добавлением ....

Это пример, набросанный за 5 мин для иллюстрации. Функций которые надо было проверять не помню, нет смысла повторно код смотреть. Помню, что проверок того, что возвращает БД нет, как нет и проверки шаблона перед использованием. Но, не было такой задачи:). Кстати, неужто все разработчики под ВП без function_exists() не вызывают функции 🙄

Что касается.

жестко заданные темплейты (tpl)

То это, вполне норм. решение при определенных условиях. Где то - так, а где то например так:

CREATE TABLE [map](

[id] INTEGER PRIMARY KEY,
VARCHAR(255) NOT NULL UNIQUE,
[sort_order] INTEGER DEFAULT 99999999,
[parent] INTEGER DEFAULT 0,
[is_view] INTEGER(1) DEFAULT 0,
[name] VARCHAR(127),
[page_type] VARCHAR(32) DEFAULT 'plain',
[type_id] VARCHAR(65),
[add_time] DATETIME,
[up_time] DATETIME DEFAULT CURRENT_TIMESTAMP,
[tpl] VARCHAR(64));

Это вариант sqlite структуры сайта, где tpl может быть выбран для каждой страницы из доступных в системе шаблонов, а отображение осуществляется - если определен для любой ссылки в breadcrumb шаблон, то последний в ветке, а если нет - базовый

т.е., например определены для

/about/filials/ , /about/filials/usa/ , /about/filials/usa/la/

/about/mission/ будет показан в дефолтном шаблоне

/about/filials/eu/paris/ будет показан в шаблоне определенном для /about/filials/
/about/filials/eu/berlin/ будет показан в шаблоне /about/filials/
/about/filials/usa/ny/ будет показан в шаблоне /about/filials/usa/
/about/filials/usa/bos/ будет показан в шаблоне /about/filials/usa/
/about/filials/usa/la/ будет показан в шаблоне /about/filials/usa/la/
SeVlad:

А воще умиляет ЧСВ некоторых самиписателей. Они отчего-то уверены, то они в одиночку за пару-тройку недель могут сворагинить нечто суперское, а всё то что разрабатывалось/проверялось годами и десятками-сотнями таких же разработчиков - это всё плохо :)

Я вообще не против ВП, сайт визитка - однозначно ВП, магазин требуемый функционал которого укладывается в то, что дает Вукомерс - ради бога. Если, для того чтобы сделать сайт, есть инструмент, который позволяет практически все сделать используя только мышь и не выходя из админки, то глупо им не пользоваться. Но и делать из этого вывод, что все сайты надо на ВП, а то кругом криворукие самописатели, а для ВП 100500 млн квалифицированных установщиков плагинов и тем, я тоже бы не стал.

Мой пост всего лишь следствие того, что тоже умиляет уничижительное отношение поклонников ВП к самИписателям

SeVlad:

В ВП, конечно, есть недостатки и проблемы, но то, что по ссылкам - тут не вина ВП :)

Почему?

GET

https://newsroom.fb.com/news....................../ HTTP/2.0 200 OK 466мс

ВП ведь КМС из "коробки"? Или там контроль урла страницы созданной стандартными средствами ВП на установщике тем и плагинов лежит?

Весь смех в том, что в 99% большего и не нужно. Бизнес умирает раньше, много раньше, чем живет движок вордпресса.

Может и так, а может умирает потому что "у всех все как у всех". Элементарный пример, каталог. Дай возможность для каждой категории свои шаблоны мета, описаний и т.д. Как правило что есть? Наименование, вендор, модель, параметры.

Тогда (примеры от балды, только для иллюстрации):

автокраны

урл /avtokran/{translit_model}_{translit_shassi}_{gruzopodemnost}_t /avtokran/ks45171_maz-55232_25_t

тайтл Продада автокранов {model} на шасси {shassi} производства {vendor} (Купить автокран КС45717 на шасси МАЗ-55232 производства Ивановский крановый завод)

и т.п. description, og, описание если пока нет рукотворного.

автомобили-манипуляторы

урл /kmu/{translit_vendor}-{translit_model}_s_manipulyatorom_{translit_model_kran} /kmu/kamaz-43118_s_manipulyatorom_inmam-im-150

тайтл Купить автомобиль {model}-{vendor} с манипулятором {model_kran} {kolesnaya_formula}, Г/п {gruzopodemnost} т, на вылете {min_vulet} м. (Купить автомобиль КАМАЗ-43118 с манипулятором ИНМАН ИМ-150 6х6, Г/п 8 т, на вылете 3 м.)

Всего: 298