-
Posts
42 -
Joined
-
Last visited
Content Type
Profiles
Forums
Marketplace
Articles
FAQ
Our New
Store
Blogs
module__dplus_manager
Everything posted by excalibur
-
[Поддержка] SEO мультимова / мультирегіон
excalibur replied to markimax's topic in SEO, карта сайта, оптимизация
Понял. Буду ждать тогда. В лс отправил. Спасибо Адаптацию делал но не помогло. Делал кликом кнопки "Адаптировать". Или нужно еще в ручном режиме какой-то код изменить? Инструкции изучал, сделал все что там было указано.- 1,839 replies
-
- мультиязык
- пагинация
-
(and 4 more)
Tagged with:
-
[Поддержка] SEO мультимова / мультирегіон
excalibur replied to markimax's topic in SEO, карта сайта, оптимизация
Странно, утром проверял не было) Может что-то напутал Отправил в личку доступы, у меня какая-то беда с работой вашего модуля, посмотрите, пожалуйста, хотя бы куда копать.. Вроде ничего не модифицировал, ocStore + moneymaker.... Язык меняется только если в строке адреса вписать нужный префикс. Пытался отследить через логи - почему то при перезагрузке страницы у меня три раза загружается startup.php, три раза обновляется переменная сессии кода языка... в логе отображется например gb-en ru-ru gb-en и все это при однократной загрузке страницы... Может я наломал дров в htaccess с переадресациями... Мне нужен https и убирать www.. Посмотрите, пожалуйста- 1,839 replies
-
- мультиязык
- пагинация
-
(and 4 more)
Tagged with:
-
[Поддержка] SEO мультимова / мультирегіон
excalibur replied to markimax's topic in SEO, карта сайта, оптимизация
У вас в демоверсии на главной и в информационных статьях тоже нет hreflang ссылок...- 1,839 replies
-
- мультиязык
- пагинация
-
(and 4 more)
Tagged with:
-
[Поддержка] SEO мультимова / мультирегіон
excalibur replied to markimax's topic in SEO, карта сайта, оптимизация
применил, но hreflang теги на главное этот модификатор не добавляет, так же как и на информационных страницах. <file path="catalog/controller/common/home.php" error="skip"> <operation error="skip"> <search position="replace"><![CDATA[$this->document->addLink(HTTP_SERVER]]></search> <add position="replace"><![CDATA[ $this->document->addLink($this->url->link('common/home') ]]></add> </operation> <operation error="skip"> <search position="replace"><![CDATA[$this->document->addLink($this->config->get('config_url')]]></search> <add position="replace"><![CDATA[ $this->document->addLink($this->url->link('common/home') ]]></add> </operation> </file> вот это и всё что должно быть? Этого ведь недостаточно. На главной и на информационных тоже нужны теги hreflang- 1,839 replies
-
- мультиязык
- пагинация
-
(and 4 more)
Tagged with:
-
[Поддержка] SEO мультимова / мультирегіон
excalibur replied to markimax's topic in SEO, карта сайта, оптимизация
Почему hreflang не применяется к главной и страницам-информационным?- 1,839 replies
-
- мультиязык
- пагинация
-
(and 4 more)
Tagged with:
-
[Поддержка] Политика конфиденциальности
excalibur replied to 23keks23's topic in Модули и дополнения
А как на счет мультиязычности?- 53 replies
-
Это хорошо, но напишите хоть в чем была проблема, какое решение нашли, какая версия опенкарта у вас, для других, у кого может возникнуть такая же проблема
- 15 replies
-
Сразу извиняюсь за некоторые неправильные умозаключения в посте Дело в том, что у меня на сервере в настройках PHP (версия 5.6) папка для сохранения временных файлов значилась tmp. Там действительно появлялись файлики вида sess_*************, НО, только сессий авторизации в cPanel. Как я не пытался где либо найти файлы сессий такого же вида самого Opencarta их нигде не было. Поэтому предположил, что сессии на сервере хранятся как-то в неявном виде, в кеше временном типа, без создания этих файлов сессий во временной папке. Но когда я уже в опенкарте задал другую папку для сохранения сессий, отличную от по-умолчанию, скажем tmp/opencart/ - там начали появлятся заветные файлики сессий sess_*********** каждого посетителя сайта. И эти файлики будут храниться установленное время gc.max_lifetime и очищаться сборщиком мусора, который запускается при каждом вызове сессии с вероятностью gc_probability/gc_divisor Относительно вопроса почему файлов сессий опенкарта не было до этого, хотя в настройках PHP значилась доступная мне папка, там создавались файлы сессий cPanel... Скорее всего эти файлы создавались в папке, к которой на хостинге доступа нет - где-то в /var/lib/php/session.... Если у вас не выделенный собственный сервер, а хостинг - не все доступно для просмотра и тем более редактирования.
- 15 replies
-
Всё. Теперь окончательно со всем разобрался. Стоило просто прописать в опенкарте отдельную папку для хранения файлов сессий. Теперь opencart туда скидывает файлы сессий которые в себе содержат идентификатор пользователя. Если этот пользователь - покупатель - в сессию записываются так же закладки. Если администратор - его айди и токен. Есть три параметра отвечающих за обработку файлов сессий. session.gc_probability integer session.gc_probability в сочетании с session.gc_divisor определяет вероятность запуска функции сборщика мусора (gc, garbage collection). По умолчанию равна 1. session.gc_divisor integer session.gc_divisor в сочетании с session.gc_probability вероятность запуска функции сборщика мусора (gc, garbage collection) при каждой инициализации сессии. Вероятность рассчитывается как gc_probability/gc_divisor, т.е. 1/100 означает, что функция gc запускается в одном случае из ста, или 1% при каждом запросе. session.gc_divisor по умолчанию имеет значение 100. session.gc_maxlifetime integer session.gc_maxlifetime задает отсрочку времени в секундах, после которой данные будут рассматриваться как "мусор" и потенциально будут удалены. Сбор мусора может произойти в течение старта сессии (в зависимости от значенийsession.gc_probability и session.gc_divisor). Таким образом, в файле system\library\session.php задаем нужные нам параметры, если хотим чтобы они отличались от тех, что по умолчанию на сервере. параметры по умолчанию хостера можно узнать выведя функцию phpinfo(); Я у себя создал в папке tmp дополнительную папку для хранения сессий посетитетелей сайта и указал ее в session.save_path и изменил session.gc_maxlifetime на нужное мне время. Теперь всё работает как часики.
- 15 replies
-
- 2
-
-
@lilianz В сети большинство пишет о том, что нужно в настройках хостинга увеличить время gc.max_lifetime с стандартных 1440 секунд (24 минуты) до требуемых и мол будет счастье. Нифига этот способ не работает, во всяком случае в 2.3 просто потому что обнаружил что не создаются файлы сессии, а сессия посетителя хранится в куки. Чтобы увеличить время жизни корзины - нужно в вышеупомянутом system\library\cart\cart.php поставить INTERVAL x HOURS. Закладки же хранятся в глобальной переменной $_SESSION с привязкой к значению куки default. Всего куки создается 4 - язык, валюта (срок действия - месяц), default и PHPSESSID. Лично у меня на сервере при попытке в файле system/library/session.php session_set_cookie_params(0, '/'); заменить ноль на, например, 7*24*3600 (7 суток) я не мог залогиниться в админку. При этом по сети опять же множество рекомендаций замените ноль на требуемое количество секунд и будет счастье, мол печенька будет жить не сессию, а сколько вам нужно. Проще говоря, и PHP и опенкарт создают по печеньке. Оба используют переменную времени жизни куки. Вот только PHP берет этот параметр и сам его плюсует к текущему времени чтобы установить Expires (действительна ДО), а Opencart создает куки используя тот же параметр сразу как "действительна ДО ...". Поэтому получается, устанавливая параметр в секундах на сервере вместо 0, на определенное значение в секундах - тогда создается корректное куки PHP с именем PHPSESSID, но не создается куки опенкарта так как время недействительное. Если устанавливаем time()+x, создается корректно куки опенкарта, а вот PHPSESSID создается до мая 2065 года (time()+time()+x) Решение нашел такое - в файле вместо нуля установить session_set_cookie_params(7*24*3600, '/'); а в строке где именно опенкарт создает куки if ($key != 'PHPSESSID') { setcookie($key, $this->session_id, ini_get('session.cookie_lifetime'), ini_get('session.cookie_path'), ini_get('session.cookie_domain'), ini_get('session.cookie_secure'), ini_get('session.cookie_httponly')); } заменить ini_get('session.cookie_lifetime') на time()+х секунд Тогда обе куки создаются с одинаковым временем жизни.. При этом куки PHPSESSID живет пока не умрет по сроку давности, а default куки обновляется при каждом запросе к серверу и умрет только если не заходить на сайт установленное количество секунд х.... Опытным путём вычислил сейчас, что те же закладки записываются на сайте в глобальную переменную $_SESSION с привязкой к куки. И очищается эта переменная каждые 1440 стандартных секунд. Поэтому спустя 24 минуты выбрасывает из админки и очищаются закладки. Корзина не очищается потому что есть запись в базе данных. То же самое эффективно и для установок языка, валюты в куки - пользователь заходит на сайт и опенкарт берет значения которые он ему присылает.. А вот с закладками и авторизацией... Идёт проверка в глобальном массиве сессий - если соответствия идентификатора не найдено - увы, от ворот - поворот. И у меня на хостинге мне вроде бы предоставили доступ к изменению параметра gc.max_lifetime но его изменение влияет только на чистку файлов сессий подключений к самой cPanel... но не влияет на время жизни сессий PHP. Либо перебивается каким-то глобальным параметром сервера, который не меняют... Я не специалист... В итоге сейчас возникла идея создавать еще куки закладок, которые будут хранится у пользователя установленное время и при его заходе на сайт подхватываться опенкартом так же, как подхватываются значения выбранного языка и валюты, хранящиеся месяц на стороне пользователя. Хранение в базе - преимуществ не вижу, а минус есть - нужно еще реализовать чистку, аналогичную чистке корзины с определенным интервалом... А вот что делать со временем авторизации админки в 24 минуты бездействия - вопрос. Использовать костыль с пингом сервера не хочется, ибо это актуально будет только для включенного компьютера с запущенным браузером... Надеюсь не запутал своими умозаключениями. У кого будут какие еще идеи или сведения?...
- 15 replies
-
- 2
-
-
Когда-то в версии 1.5 делал доступ к закладкам лишь удалив в контроллере первых несколько строк проверки логина пользователя, и всё работало. Сейчас проделал подобное, но обнаружил, что закладки каким-то образом общие для любых поситителей, любых IP, браузеров устройств. Реализовал работу с закладками исключительно правкой контроллера catalog\controller\account\wishlist.php Убрать строки if (!$this->customer->isLogged()) { $this->session->data['redirect'] = $this->url->link('account/wishlist', '', true); $this->response->redirect($this->url->link('account/login', '', true)); } После строки: $this->model_account_wishlist->deleteWishlist($this->request->get['remove']); Добавить: if (!$this->customer->isLogged()) { $this->session->data['wishlist'] = array_diff( $this->session->data['wishlist'], array($this->request->get['remove']) ); } После строки $results = $this->model_account_wishlist->getWishlist(); Добавить: if (empty($results)){ if (!empty($this->session->data['wishlist'])){ foreach ($this->session->data['wishlist'] as $wish){ $results[]['product_id'] = $wish; } } } Чтобы кнопка "Продолжить" со страницы закладок перенаправляла не в аккаунт а на предыдущую страницу Строку : $data['continue'] = $this->url->link('account/account', '', true); Заменить на: $data['continue'] = 'javascript:history.go(-1)'; И последнее, в конце строку: $json['success'] = sprintf($this->language->get('text_login'), $this->url->link('account/login', '', true), $this->url->link('account/register', '', true), $this->url->link('product/product', 'product_id=' . (int)$this->request->post['product_id']), $product_info['name'], $this->url->link('account/wishlist')); Заменить на: $json['success'] = sprintf($this->language->get('text_success'), $this->url->link('product/product', 'product_id=' . (int)$this->request->post['product_id']), $product_info['name'], $this->url->link('account/wishlist')); Протестировал, у меня все работает, закладки теперь привязаны к сессии, следственно каждый посетитель сайта может накидать закладок и потом из них выбрать и оформить заказ без регистрации (если это доступно), при закрытии браузера закладки не обнуляются, Не могу утверждать что решение идеальное, поэтому кто заинтересован - берите, тестируйте, оценивайте, предлагайте идеи, если можно что-то улучшить. У меня остался нерешенным вопрос - вычислить длительность пользовательской и админской сессии и как их продлить. Решения, найденные на форуме и в сети неоднозначные и описывают замену строк в файле session.php которые гораздо проще чем в версии 2.3.0.1
- 15 replies
-
- 1
-
-
[Поддержка] SEO CMS TOP - Блог | Новости | Отзывы | Галерея
excalibur replied to markimax's topic in Блоги, новости, статьи
Убедили :) Непривычно просто все-таки элементарно по причине частоты выхода обновлений - когда-то раньше главные версии программ обновлялись в течении месяцев... Или вовсе раз в год, как на примере многих продуктов типа Corel Draw 13, 14, 15 и т.д.) Поэтому возникает когнитивный диссонанс, когда несколько дней назад установил версию 9.0, а уже 10.0, а еще через неделю, глядишь, будет 12.0 .. :-) И собственно приставка .0 вроде как лишняя - возникает ощущение "перепрыгивания" чего-то необходимого... типа "как 10.0?! А где же 9.2, 9.3, где промежуточная работа?" :D -
[Поддержка] SEO CMS TOP - Блог | Новости | Отзывы | Галерея
excalibur replied to markimax's topic in Блоги, новости, статьи
У вас последнее время частота выхода мажорных версий модуля (8.0, 9.0, 10.0) напоминает тенденцию Firefox... :-D 8.1, 8.2 и т.д. не комильфо выпускать? :lol: "главное число (major) увеличивается, когда происходят значительные переходы в функциональности, второстепенное число (minor) прибавляется только тогда, когда были добавлены незначительные функции или внесены исправления. Номер версии изменяется, если исправлены все мелкие неполадки". Не то чтобы это на что-то влияло, просто ожидаешь мега-нововведений, когда видишь за несколько дней переход версии, а оказывается там пару функций добавлено и кое-что исправлено :-) -
Нашел ошибку из-за которой не работал фильтр по дате изменения в списке заказов. Файл admin/model/sale/order.php строка 595 o.date_modified нужно заменить на date_modified. Было: $sql .= " AND DATE(o.date_modified) = DATE('" . $this->db->escape($data['filter_date_modified']) . "')"; Правильно: $sql .= " AND DATE(date_modified) = DATE('" . $this->db->escape($data['filter_date_modified']) . "')";
-
Два разных файла лога ошибок?!
excalibur replied to excalibur's topic in Встановлення, оновлення, налаштування
Большое спасибо, всё получилось! P.S. Проголосовал бы в плюс репутации, но не вижу сейчас никаких кнопочек в сообщении для этого - на форуме отключили данную возможность?... -
Обратил внимание что ошибки пишутся в два разных файла - часть в системный, опенкартовский файл, указанный в настройках, error.txt, а некоторые ошибки - в файл error_log без расширения, который находится в корневой папке, т.е. public_html. Можно ли как нибудь их объединить или же хотя бы "подключить" содержимое error_log в системный лог ошибок, чтобы его можно было просматривать в админке через "система - журнал ошибок"? Дело в том, что в системном файле показываются далеко не все ошибки, большая часть ошибок возникающих в фронт-енде пишется в error_log. Например, такая ошибка через админку не отображается, поскольку в errors.txt ее нет: [29-May-2014 13:42:51 Europe/Helsinki] PHP Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING, expecting ')' in /home/.../public_html/catalog/model/shipping/pickup.php on line 24 В настройках магазина установлено Показывать ошибки: Да Записывать ошибки: Да * Файл журнала ошибок: error.txt
-
нужно в зайти в БД, например через phpMyAdmin и сделать SQL запрос: INSERT INTO `oc_url_alias`(`query`, `keyword`) VALUES ('checkout/simplecheckout','s-checkout'); В этой таблице и хранятся ЧПУ ссылки. "oc_" - префикс базы, замените на свой. 's-checkout' - значение, которое и будет ссылкой на страницу оформления simple вида yoursite.ru/s-checkout Аналогичными запросами можно добавить ЧПУ url для account/simpleaddress/insert - страницы добавления адреса account/simpleedit - страницы редактирования профиля
-
Полное описание синтаксиса масок в Simple http://digitalbush.com/projects/masked-input-plugin/ И отсюда же решение для моего вопроса о том, как задать в поле 9-ку не в виде маски, а скажем, как часть строки. Допустим, хотим чтобы в поле телефон выводилось код Болгарии +359 (___) ___-__-__ Если мы запишем условие как $mask = '+359 (999) 999-99-99'; то в поле телефон получим +35_ (___) ___-__-__ Решение следующее: $.mask.definitions['9'] = ''; $.mask.definitions['*'] = '[0-9]'; // где "*" - любой понравившийся вам символ
-
Помогите пожалуйста!!! Разбираюсь с Simple 2-й день, может еще не все нашел и понял, модуль крутой и навороченный 1. Не пойму где вообще задается обработка дополнительных, созданных мною полей? 2. Где они отображаются в оформленном заказе?? Нигде? Значения их просто теряются безвозвратно? Или где задавать функцию обработки этих полей? 3. Можно ли где-нибудь задать обработку доп. поля таким образом, чтобы его значение подставлялось в какое-нибудь из стандартных? Например, номер склада "Новой Почты" в стандартное поле "адрес". В целом, чтобы было понятнее - хочу реализовать выбор города и склада Новой Почты из БД (которая обновляется раз в день), в форме заказа Simple. Все немного усложняется еще тем, что доставка не только в Украину, но и в другие страны. Два поля города и номера склада типа select смог создать с взаимосвязью соотвественно с регионом и городом, выборка происходит из БД, выпадающие списки меняются, всё ок. Оформил тестовый заказ - и где значения этих полей? Перед этим был ocStore 1.5.4.1 без Simple со стандартным пошаговым оформлением, там я всё делал через ajax и jquery. При выборе страны "Украина", тип поля город менялся с text на select, выбирал город, появлялся список складов в нужном городе и т.д. Здесь попробовал тот же скрипт впихнуть через "интеграцию" - начало возникать либо зациклическивание reloadAll либо же нужные поля не менялись, значения в них не подставлялись.. в чем ошибка так и не понял.
-
Возник важный вопрос в процессе настройки. Написал функцию для задания маски телефона в зависимости от выбора поля страны, например, Украины или России. public function getTelephoneMask($country) { if ($country=='176'){ $mask = '+7 (999) 999-99-99'; } if ($country=='220'){ $mask = '+38 (999) 999-99-99'; } return $mask; Соответственно в настройках поля telephone указан вызов метода getTelephoneMask с передачей в него значения страны. Функция отрабатывает при загрузке формы и при каждом её обновлении. НО! Проблема в том, что при выборе другой страны значение переменной $country на странице не меняется! Т.е. если по умолчанию в адресе была указана Украина с кодом 220, то при выборе России функция getTelephoneMask всё равно получает значение 220 вместо 176. Как побороть? P.S. Еще вопрос на счет того - где можно прочитать синтаксис этих масок, кроме того, что цифры задаются 9-ками. Что делать если я хочу в поле задать статическую 9-ку? Например, код страны будет содержать 9-ку.
-
Очень порадовал шаблон! Планирую купить! Действительно выглядит удобно и функционально, заходишь и хочется что-то купить! :) Сравнивал с Ava store, вот там-то заходишь и как-то теряешься.. Не бросайте поддержку и разработку - тема актуальна, действительно сейчас очень нужны адаптивные шаблоны под мобильные устройства, а opencart - очень достойная CMS из бесплатных.
-
Скопируйте сюда код контроллера из (catalog/controller/payment/paypal.php), тогда можно будет попробовать найти проблему, что-то подсказать. Ошибка скорее всего в нем.
-
И еще одна вещь, которую победить не смог - это то, чтобы перед открытием диалогово окна проверялось заполнение обязательных для выбора опций, так же как при нажатии кнопки "купить". Точнее получалось это сделать, по аналогии, но в любом случае при нажатии на кнопку быстрого заказа сперва всплывало окно, а уже после его закрытия было видно, что отработал скрипт и выдал json сообщения об ошибке - не выбранных опциях. В принципе, не критично, но было бы здорово найти этому решение
-
И еще часть моей доработки в этот модуль, чтобы отправлялось и учитывалось указанное количество товара и опции. С одной стороны - да, лучше это уточнить по телефону, но с другой стороны - клиент может выбирает из множества вариантов и отправил заявку с расчетом на то, что вы знаете его выбор. А вы ему перезваниваете и начинаете - а какой вы цвет хотите, а какой размер, а с фичей "А", или с фичей "Б"... У меня инет-магазин виниловых наклеек, например, это актуально - цвет или даже два цвета наклейки, ее размер, направление - нормальное или зеркальное... Так вот, привожу пример, как сделал для указания модели, опций и количества в fast_order.xml: <add> <![CDATA[ <a id=fast_order" href="#fast_order_form" class="button" onclick="javascript: upd();" />Быстрый заказ</a> <div style="display:none"> <div id="fast_order_form"> <input id="product_name" type="hidden" value="<?php echo $heading_title; ?>"> <input id="product_model" type="hidden" value="<?php echo $model; ?>"> <input id="product_price" type="hidden" value=""> <input id="qty" type="hidden" value="1"> <input id="options" type="hidden" value=""> <div class="fast_order_center" id="order">Быстрый заказ только для Украины!<br><br>Товар: <?php echo $heading_title; ?></div> <div class="fast_order_left"> <p>Имя:</p> <p>Телефон:</p> <p>Комментарий:</p> </div> <div class="fast_order_right"> <p><input type="text" id="customer_name"/></p> <p>+38 <input type="text" id="customer_phone" style="width:196px"/></p> <p><input type="text" id="customer_message"/></p> </div> <div class="fast_order_center"> <p id="fast_order_result">Пожалуйста, укажите ваше имя и телефон, чтобы мы могли связаться с вами</p> <button class="fast_order_button"><span>Отправить</span></button> </div> </div> </div> <script type="text/javascript"> function upd() { $('#qty').val($('#quantity').val()); var tmp=''; $('div[id^="option-]').each(function(){ var scv = $(this).find('option:selected').html(); var rcv = $(this).find('input:radio:checked').next('label:first').html(); var ccv = $(this).find('input:checkbox:checked').next('label:first').html(); $.trim(scv); $.trim(rcv); $.trim(ccv); if (scv!==null){ tmp +=$(this).find('b').text()+" "+scv+"; "; } if (rcv!==null){ tmp +=$(this).find('b').text()+" "+rcv+"; "; } if (ccv!==null){ tmp +=$(this).find('b').text()+" "+ccv+"; "; } }); $('#options').val(tmp); var tovar = ''; if ($('#options').val()!=='') {tovar +="<br>Опции: " + $('#options').val();} tovar += "<br>Количество: " + $('#quantity').val(); tovar += "<br>Цена(за шт.): " + $('#product_price').val() + "; "; $('#tovar').remove(); $('#order').append('<span id="tovar"><br>'+tovar+'</span>'); } </script> ]]></add> Если код кому-то покажется кривым и навороченным - строго не судите, я не программист совсем :)