Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...

Raino

Пользователи
  
  • Публикаций

    102
  • Зарегистрирован

  • Посещение

Все публикации пользователя Raino

  1. Когда эти функции отключены остается только кеш браузера, который сбрасывается через ctrl f5. Если мешает файловый кеш, то можете временно в библиотеке кеша оставить только return false для функции get
  2. В этом и есть смысл нормального чпу формирователя (SeoPro) например. Единый путь для товара на сайте позволяет избежать дублей (когда один и тот же контент доступен по разным ссылкам), поэтому Вы описываете штатное и правильно работающее поведение SeoPro. Если это вызывает некие проблемы, можете просто отключить отображение категорий в чпу товара в настройках, товарные чпу тогда будут иметь вид сайт/товар, а не сайт/категория/товар.
  3. Raino

    Враги PageSpeed

    Еще есть вариант для видео с ютуба и аналогичных сервисов подгружать айфрем "полуавтоматически" не сразу при загрузке страницы, а например после скролла на х пикселей вниз. Боты не выполняют действия, фрейм не подгружают, оценку не снижает, а человек, получит нужный контент. Аналогично можно и с картами делать или любыми тяжелыми вещами, которые нужны не сразу, на первом экране, но на странице гарантированно нужны. Так можно мобильные пузомерки до 95-97 выгонять. В тексте просто ставите метку вида <div class=video-frame" data-video-src="код видео на ютубе"></div> ну и вешаете скрипт, который будет туда фрейм подгружать по событию- позволит не заморачиваться с картинкой-превью.
  4. Raino

    Почасовая оплата.

    Есть старая байка на эту же тему. Однажды Джеймса Уатта пригласили найти неисправность в большой паровой машине. Так как хозяева из-за простоя несли большие убытки, и другие инженеры сделать ничего не смогли, они пригласили самого изобретателя паровой машины и обещали заплатить 100 долларов, огромные деньги по тем временам. Уатт трижды обошел вокруг машины, потом попросил большую кувалду. Ему принесли кувалду, он примерился и ударил по кожуху машины. "Теперь запускайте", — сказал он. Машина заработала. После этого начинается самое интересное. Хозяевам стало жалко платить 100 долларов за один удар кувалдой, они чувствовали себя одураченными. Тогда они решили схитрить и предложили Уатту написать счет, чтобы затем его попытаться оспорить. Уатт взял лист бумаги и написал следующее. За удар кувалдой — 1 доллар, за знание, куда ударить — 99 долларов. Хозяева была вынуждены выплатить гонорар полностью. Так и здесь. Правка\доработка может быть всего в один символ, но нужно знать, где его поставить\убрать.
  5. Raino

    Почасовая оплата.

    Работая по почасовой ставке Вам оплачивают не фактически затраченное время проведенное за клавиатурой. В данном случае час это не столько единица времени, сколько единица оценки сложности задачи. Вот если Вы боженька кода и способны по дизайнерским макетам ровно за час под ключ сделать роскошный магазин, Вам должны оплатить всего лишь час реально затраченной работы? Сомневаюсь. Схема довольно простая. Вы определились с заказчиком, что сложность задачи 5 часов, по тарифу Х за час, на этом всё, больше никого ничего волновать не должно, именно эти 5 часов по оговоренной ставке будут оплачены. В реальности вы можете затратить на них 2 недели реального времени - и это будет только Ваша проблема, что Вы некорректно оценили сложность задачи, ровно так же как если Вы затратите на 5 часовую задачу 10 минут (например, если Вы уже решали ранее такую задачу и у Вас есть готовое решение, которого нет у других и которое нужно только адаптировать и т.д.), а остальное время пили кофе - это опять же Ваше личное дело и заказчика это не должно волновать. И это НУЖНО объяснять заказчику. Если заказчик даже после объяснения не понимает эти моменты и начинаются разговоры в стиле "а вдруг Вы будете не работать а в носу ковырять, а я Вам за это платить" - просто не работайте с ним, сэкономите и себе и человеку кучу нервов. Для исполнителя очень важно уметь корректно оценить сложность задачи, не пытайтесь задвинуть десяток часов про запас. Конечно, бывает всякое и если в ходе работы всплывут новые факты, которые сильно усложняют процесс (например вы нашли куски кода злого индуса, который пытался что-то делать за Вас и нужно сперва "исправлять исправленное" - сообщите об этом заказчику, объясните в чем сложность, практически всегда Вам пойдут на встречу. Не относитесь к заказчикам как к идиотам, им вполне можно в общих чертах рассказать о том, что будет сделано и как и почему х займет больше чем у. Если у Вас будут неадекватные оценки сложности, поверьте, это очень быстро всплывает, заказчику достаточно просто попросить прикинуть время у пары других исполнителей, и если у трех человек оценка будет 4-5 часов, а у одного 20-30, тот тут все будет предельно ясно.
  6. Raino

    Статусы заказов

    Проверьте в используемых методах оплаты, какой у них указан статус после оплаты.
  7. Raino

    Сервер режет GET запросы

    Если я правильно понимаю, он у Вас отдает не ошибку, а 302-й редирект. Если проявляется только при активном suhosin, то проверьте в конфиге раздел suhosin.filter.action, может у Вас там некие совсем нестандартные настройки.
  8. Raino

    Шаблоны с Themeforest - опыт?!?

    Не рекомендую. Внешне красивые, а внутри- каша. Встречал прямо в контроллерах и tpl куски кода, которые копируют функционал имеющихся моделей (выборка категорий, идиотское построение хлебных крошек и т.д.). Не стоит никакая красота такого бардака.
  9. Raino

    2 и 3

    Тон больно борзый у топикстартера "мне в лом читать топик, где все разжовано, я спрашивал не совета, бистра мне ответил" и т.д., это что за формат общения? Ну так и отвечать такому чОткому поцыку наверняка тоже "влом" порядочным гражданам. Вообще удивительно, что такой конкретный персонаж не семки щелкает в подворотне, а постит что-то на данном ресурсе. Но я по доброте душевной Вам отвечу, в доступной фанатам абибаса форме, сообразно Вашему образу мышления: 3 отличается в лучшую сторону самым главным параметром и вообще всем остальным. Там релиз на целую единицу больше, 3 по определению круче 2, а еще там модный магазин дополнений и сможете хвастаться крутым словом TWIG, использовать нужно строго самую новую версию (даже из альфа билда и не смотреть на красный ярлык "НЕ ИСПОЛЬЗОВАТЬ В ПРОДАКШЕНЕ", ставится то в 1 клик!), так как не просто так она появилась, это также верно, как и то что win 8 надо было использовать вместо win 7. В общем, смело берите тройку, никого не слушайте, не читайте многостраничные топики со сравнением "ибо влом" и дальше выгибайте пальцы, а потом завозите деньги чемоданами на исправление детских болезней самой новой и лучшей версии. P.S. для всех остальных читателей, которым интересен данный вопрос и они случайно наткнулись на эту ветку - если хотите получить информацию о существенных различиях между второй и третьей версиями движка - все же ознакомьтесь с соответствующей веткой на этом форуме, там много информации о различиях версий, анализ и сравнение изменений. Если кратко - для простого пользователя тройка в данный момент не даст никаких существенных преимуществ в плане производительности или удобства работы, т.к. в плане работы с базой практически ничего не изменилось, все существенные изменения связаны с витриной, да и их однозначно положительными я лично не назову.
  10. Raino

    JOIN-ы в SQL запросе

    Where итоговое должно идти после всех joinов. у вас оно в середине запроса да еще и в кол-ве двух штук. Должно быть так (если в самих джоинах нет ошибок): SELECT DISTINCT ps.product_id, (SELECT AVG(rating) FROM oc_review r1 WHERE r1.product_id = ps.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating FROM oc_product_special ps LEFT JOIN oc_product p ON (ps.product_id = p.product_id) LEFT JOIN oc_product_description pd ON (p.product_id = pd.product_id)  LEFT JOIN oc_product_to_category p2c ON (p.product_id = p2c.product_id) LEFT JOIN oc_product_to_store p2s ON (p.product_id = p2s.product_id) WHERE p2c.category='421' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '0' AND ps.customer_group_id = '1' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) GROUP BY ps.product_id ORDER BY p.sort_order ASC, LCASE(pd.name) ASC LIMIT 0,27
  11. Raino

    Journal 3 - новый "шедевр"

    Journal определенно приносит бабки, даже разработчикам. Т.к. работа с этим шедевром лично у меня идет по тарифу х2 (хотя иногда хочется х20 ставить, за ментальное изнасилование). С третьим видимо придется ставить х30. Плюс людям иногда хочется странного... Кто-то плетки, наручники и кожаные костюмчики покупает, а можно просто попытаться поработать с этим поделием. Не поставить и сидеть на том, что есть из коробки, а именно попытаться впихнуть в него некий желаемый клиентом функционал, которого в нем изначально нет - масса незабываемых впечатлений обеспечена. Эдакое садо-мазо для мозга. И дело даже не только в том, что это уже не опенкарт - у него и на морде бреда полно. Помню, как на ранних версиях второго джорнала браузер раком вставал при кол-ве товара всего-лишь за 50, т.к. чтобы при наведении на плашку товара, повысить ее z-index использовалась функция, пробегающая по всем dom элементам, выискивая наибольшее значение, увеличивало его на единичку и вешало плашке. Прекрасный шаблон, "надежный, как швейцарские часы".
  12. Raino

    Кнопка поднять товар в списке

    Самое простое и бесплатное- это именно проставлять порядок сортировки нужному товару. Каждому товару в каталоге его проставлять нет необходимости. Поле позволяет ставить отрицательные значения, и если у всех прочих товаров стоит по умолчанию порядок 0, то желаемому ставите -1 и он будет выше прочих. Когда это перестало быть актуальным - поставили ему снова 0 и всё.
  13. Raino

    Этично ли?

    Интересная позиция. А если заказчик попросил поправить некий баг, который мешал ему жить и работа заключается именно в поиске и устранения ошибки присутствующей в сборке изначально, но с которой столкнулся первый именно он, то значит нигде нельзя постить багрепорт о ней, чтобы она была исправлена в сборке? Он ведь заплатил, зачем ее исправлять глобально или постить на форумах решение - это ведь будет не честно по такой логике, т.к. кто-то ранее за эту работу уже заплатил, а теперь другие получат бесплатно, так получается?
  14. Если Вы недавно ничего не меняли в контрольной панели хостинга, не создавали там почтовый домен, не пытались его самостоятельно настраивать и т.д., то могу посоветовать гвоздь в голову вбить техподдержке, если она не видит проблему со своей стороны, 2 и 3 строка в приведенном логе четко описывает проблему. Почта делегирована на внешний сервер, на него указывают mx записи и т.д. и при этом на хостинге естественно находится одноименный домен. При отправке сообщения из магазина хост не отправляет его на тот внешний почтовый сервер, куда делегирована почта, не проверяет mx записи, а просто шлет его сам себе, т.к. имеет это же доменное имя и сам себе отвечает, что у него такого почтового ящика нет. Поэтому, когда указываете в настройках другие почтовые ящики - письма идут отлично, т.к. сервер перестает направлять их сам себе и по этой же причине если отправить на эти доменные ящики письма не их магазина, а из любого другого источника- они доходят. И если раньше этого не было, а сейчас есть, значит хостер (если Вы сами ничего не меняли в панели хостинга) "меняя настройки" доменялся эти самые настройки и почтовика в придачу. И еще ТП можете сообщить что функция php mail() не требует никаких особых данных для простой отправки, которые могут быть "указаны неверно", кроме исходящего мыла, которое проблематично указать неверно. Более того, они даже в приведенном тесте проверяют вообще не тот случай, который вызывает проблему. Если бы они через свой тест скрипт отправили мыло не на некий гмейловский адрес, а на тот, куда блин письма у Вас не доходят в логе, т.е. на [email protected] - получили бы ту же самую ошибку. Если техподдержка все равно не в состоянии будет решить проблему то гуглить на предмет XXX disable local delivery, где XXX - используемая для отправки служба, в данном случае это судя по логу exim.
  15. Если увеличиваете время жизни через session_set_cookie_params(XXX, '/') то все сессии умирают сразу в момент создания, т.к. на 2.3 есть ошибка в установке сессионной куки. В этом файле есть код вида 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')); } В нем время жизни куки устанавливается неверно. Правильно так if ($key != 'PHPSESSID') { setcookie($key, $this->session_id, time() + 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')); } либо же напрямую указать желаемое время ХХХ в секундах, если по каким-то причинам нет возможности изменить параметр session.cookie_lifetime. if ($key != 'PHPSESSID') { setcookie($key, $this->session_id, time() + XXX, ini_get('session.cookie_path'), ini_get('session.cookie_domain'), ini_get('session.cookie_secure'), ini_get('session.cookie_httponly')); }
  16. Вам нужно создать свою функцию в модели product, например getMainCategory($product_id) которая будет выбирать из базы данные по ней и потом вызывать ее по необходимости в произвольных местах. public function getMainCategory($product_id) { $query = $this->db->query("SELECT DISTINCT * FROM " . DB_PREFIX . "product_to_category ptc LEFT JOIN " . DB_PREFIX . "category_description cd ON (ptc.category_id = cd.category_id) LEFT JOIN " . DB_PREFIX . "category_to_store c2s ON (ptc.category_id = c2s.category_id) WHERE ptc.product_id = '" . (int)$product_id . "' AND ptc.main_category = '1' AND cd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND c2s.store_id = '" . (int)$this->config->get('config_store_id') . "'"); return $query->row; } что-нибудь вроде такого, где вместо * можно оставить только те данные, которые Вам нужны по главной категории и работать с полученным массивом. Если нужны какие-то доп поля кроме названия, вроде картинки- нужно в запрос подцепить еще и выборку из таблицы category, но для GA это не нужно.
  17. Врожденный баг чпу в опенкарте. В версии 1.5. еще был, распространяется на категории и производителей, присутствует как при включенном штатном чпу формирователе, так и при включенном сео про.как пример демо сайт ocstore производители https://demo.ocstore.com/delivery/apple https://demo.ocstore.com/apple/delivery категории https://demo.ocstore.com/desktops/mac/terms https://demo.ocstore.com/terms/desktops/mac можно подставить любой существующий урл от статей и не только от статей. пофиксить можно доработав сеопро, штатный наверняка тоже можно, но кому он нужен) В индекс такие страницы попадают через счетчики метрики, аналитики и им подобные. при прямом посещении страницы кем-либо они скорее всего добавятся в индекс. По хорошему надо бы не внешними модулями решать, а в сборке пофиксить, т.к. штука неприятная.
  18. Самые простые варианты: Использовать параметр ?ver=xx для изменившегося css или js в шапке , только потом не забудьте удалить этот параметр, т.к. статические ресурсы с параметрами не кешируются вообще. Т.е. если у Вас время жизни css стоит неделя- через неделю уберите данный параметр, тогда гарантированно у всех пользователей будет актуальная версия. Либо просто переименуйте изменившийся css/js файл, например в stylesheet-v2.css.(и сам файл и ссылку на него в коде страницы).
  19. Декодируйте описание в контроллере. 'description' => html_entity_decode($category['description'], ENT_QUOTES, 'UTF-8'),
  20. Или не там добавили, или не там выводите. Вы записали минимальную цену для каждой дочерней категории текущей родительской (те которые выводятся над товарами, как правило), а в tpl обращаетесь к ней, как будто хотели вывести это значение для родительской. Соответственно, если хотите вывести мин. цену для каждой дочки, то в шаблоне нужно выводить например так: <?php foreach ($categories as $category) { ?> <li><a href="<?php echo $category['href']; ?>"><?php echo $category['name']; ?><span><?php echo $category['min_price']; ?></span></a></li> <?php } ?> Кстати, запрос довольно тяжелый и при большом кол-ве товара-категорий будет создавать нагрузку, поэтому, если без этого никак- то хорошо бы это дело кешировать хотя бы. Если же нужно выводить мин цену только для текущей категории, то тогда в контроллере надо ее задавать иначе: $data['min_price'] = $this->model_catalog_product->getMinPriceFromCategory($category_id); и потом уже выводить в тпльке через $min_price Само собой в функции в модели не должно быть ошибок (ее код не смотрел).
  21. https://opencartforum.com/topic/10263-modul-dobavliaet-vozmozhnost-vybora-kolichestv/ посмотрите этот топик, там детально описан пример как сделать самому поля ввода кол-ва в категориях, в Вашем случае, просто слайдеры еще добавить нужно. Был и готовый модуль, на этом форуме, но увы название не вспомню а по поиску не найти.
  22. Странное замечание. А мне вот не нужно. Если у меня мультимагазины то там и так для каждого была своя настройка размеров изображения для магазина в целом. Повторюсь, настройка размеров конкретного шаблона - сомнительной полезности функционал и если бы он шел бонусом, не ухудшая удобство, то и проблем бы не было. Как часто меняется шаблон на магазине работающем? Нечасто, примерно никогда, только обновляется изредка. Если пойти дальше-то с чего тогда настройки фавика и лого оставили как было, может мне для разных тем разные лого и фавик потребуются? Непонятно. Задумка может и хорошая, но реализация как-то подкачала в плане удобства. В чём сложность разместить этот блок непосредственно на вкладке изображений с выборами настроек для темы для данного магазина? Или хотя бы линк там сделать на соответствующий раздел? Я без претензий к разработчикам сборки, как было в 2.3 так и сделали, но почему этот момент столь непродуман мне непонятно. Повторюсь, продукт делается для людей. Людям как мы видим- неудобно, вот и всё. Я думаю Вы согласитесь, что ни разу не очевидное расположение теперь этих настроек. И если влепить в сборку простой линк на новое место/текстовое описание как найти/скрин с пометками на вкладке "изображения" настроек магазина (если уже не охота заморачиваться с переносом блока), то вопросов у людей не будет, все всё найдут.
  23. К сожалению разработчики решили, что жизненно необходимо взять и выдрать привычное и логичное расположение данного функционала и поместили его в жжж... , пардон, в раздел админки "дополнения" - фильтр "шаблоны", где Вы и можете их найти сейчас. Теперь изображения индивидуально настраиваются для каждой темы (незаменимая вещь, ведь на каждом магазине как правило стоит шаблонов по десять, которые регулярно переключаются). P.S. темы с этим вопросом "где картинки изображений?!" плодятся практически ежедневно. На мой взгляд это говорит о том, что решение было неудачным, пользователи его не понимают. Да в теории, это замечательно и удобно, независимые настройки изображений для каждой темы! Просто мечта, если ты каждый день сидишь и переключаешь шаблоны в магазине, а вот если не переключаешь (а как правило шаблон ставится настраивается и забывается)- бесполезная, неудобно расположенная вещь.
  24. http://docs.myopencart.com/index.php?title=%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0
  25. Также недавно столкнулся у клиента с данной проблемой на oc 1.5.5.1.2 Проблема заключается в методе построения ключа товара при добавлении его в корзину в файле system\library\cart.php функция add строка 258 ....$key = (int)$product_id . ':' . base64_encode(serialize($option));... этот самый base64_encode на выходе дает строку, которая согласно спецификации может содержать символы +/=. А т.к потом этот ключ используется в гет запросах для удаления товара, то эти символы там недопустимы отсюда и "неудаление", по сути идет попытка удалить товар с несуществующим ключом. воспроизвести в 1.5 можно следующим образом - добавьте к товару опцию текстового ввода и вручную в базе присвойте ей номер 12960, забейте в поле текст "напол" к примеру и добавьте в корзину- данное сочетание опции и значения опции приведет к формированию ключа, содержащего + и товар не удалится из корзины стандартной кнопкой. encodeURIComponent для исправления как предлагалось выше не совсем корректно. Как вариант можно "доработать" функции для генерации ключа: public function base64_url_encode($input) { return strtr(base64_encode($input), '+/=', '-_,'); } public function base64_url_decode($input) { return base64_decode(strtr($input, '-_,', '+/=')); } . их необходимо прописать в библиотеку корзины и заменить стандартный вызов base64_decode / base64_encode на них и товар будет удалятся с любым набором опций. В теории может к коллизиям привести, но вероятность куда меньше, чем генерация "кривого ключа". P.S. прошу прощения за некропост, но может пригодится кому-нибудь. Да и бага по факту устойчивая и гарантированно воспроизводится, можно и пофиксить в сборке.
×
×
  • Создать...

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.