Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

colordays

Користувачі
  
  • Публікації

    101
  • З нами

  • Відвідування

Усі публікації користувача colordays

  1. Сам его использую, меня устраивает. Единственное, что нужно учитывать - ссылки он будет делать на страницы фильтрации только в связке с фильтром Filter Vier. Есть еще такие:
  2. О, а этого я и не знал. Так это еще раз говорит о пользе вашего модуля.
  3. Как по мне, все относительно. Конечно, в идеале такой ситуации быть вообще не должно, и логичнее было бы вместо пустой страницы пагинации отдавать 404 ошибку, но, насколько я знаю, это особенность движка opencart. С этой точки зрения такое решение - костыль. Но чтобы реализовать 404 ошибку нужно править контроллер, что тоже не комильфо, или же делать правки модификатором, а это тоже костыль своего рода. Поисковые боты не всегда следуют директивам robots.txt, к тому же, в таком случае закроются все страницы пагинации, кроме первой. И тогда поисковый робот не сможет проиндексировать страницы товаров, находящиеся на 2, 3 и т.д. страницах пагинации.
  4. Есть модуль Он делает редирект со страниц пагинации без товаров на первую страницу
  5. Сам использую модуль атрибутов от @vier . Он использует для атрибутов и их значений свои таблицы, поэтому редактировать их в Batch Editor как стандартные не получится. Но в принципе, выход есть. Заходим в настройки модуля Batch Editor на вкладку связи, далее: 1. Нажимаем на зеленый плюсик 2. Выбираем нужную таблицу 3. Добавляем описание 4. Сохраняем 5. В связях появляются атрибуты Attribute text select Потом переходим на основную страницу Batch Editor и на вкладке связи выбираем созданные ранее связи И тут главное неудобство. Редактировать можно только id атрибутов и id значений, то есть данные представлены не в виде текста, а в виде цифр. 1 - это id атрибута 2 - это id значения атрибута 3 - честно, не знаю, что это. Там всегда стоит 0. Заходим в базу данных, находим там нужные данные и составляем табличку в экселе И с помощью таких костылей можно массово редактировать атрибуты модуля. Неудобно? Конечно! Но в моем случае этого хватает. Я обращался к автору Batch Editor, чтобы доработать его под эти атрибуты и он ответил мне, что сделать можно, только занят был. Надо уточнять у него этот момент. В случае с модулем от Чукчи в этом моменте проблем, думаю, не будет. Но мне нужен был именно модуль от Vier, поэтому выкручиваюсь таким образом. Как-то так.
  6. @Gariks , не переживайте так, красным большим шрифтом написано для тех, кто считает, что за 1 тыс.руб. исполнитель должен установить модуль, тыкнуть носом и разжевать что такое логин и пароль, на какую кнопочку нажать, чтобы делегировать доступы, угадать что тебе нужно, как настроить тег менеджер и т.д. Дело в том, что автор модуля - не фирма, где тебе нальют чашечку кофе и подробно расспросят чего ты хочешь и все за тебя сделают. В таких фирмах ты заплатишь за нужную тебе услугу не тысячу, а десять тысяч. Тут же имеется ввиду, что ты сам по максимуму изучил и разобрался в вопросах, связанных с работой модуля: какие нужны доступы, из чего состоят, что такое делегирование, как это происходит и т.д. И если осталось пара вопросов, то можно задавать не стесняясь - тебе без проблем ответят или подскажут где это изучить. Бывает такое, что человек в этих вопросах ВООБЩЕ не разбирается. Тут уж нет смысла задавать вопросы, а стоит уточнить у автора о возможности услуги "Все включено". По поводу совместимости с шаблонами. Это уже как повезет. Бывают шаблоны, что там черт ногу сломит или стоит дефолтный шаблон, но изменен так и настолько, что пропадает совместимость модуля. Опять же, есть модули, влияющие на работу других модулей. Это все - форсмажор. Автор же заранее не знает что и как там у вас.И тут нужно быть готовым, что это выльется в доп. расходы. Если вы случайно указали не тот пароль доступа - думаю, ничего страшного. Ну напишите автору, мол так и так, извините, ошибся. И все будет нормально, вам пойдут навстреу. Но если будет неправильный пароль, потом окажется неправильный логин, а потом окажется, что нужно на другой сайт это ставить, то, конечно, в бесплатной настройке вам откажут. Главное не тупить сильно, быть вежливым и понимать, что в наше время можно приобрести на 1 тыс. руб.
  7. Здравствуйте, можно разные директивы присваивать тегу, например noindex, follow?
  8. Спасибо большое, @specialforce22 . Очень познавательно, да еще и с живым примером! Еще лайк для вас. Ждал от вас этот пост, и думал: "Ну проясню до конца этот вопрос и успокоюсь". Прочитал, прояснил. Но возникают новые вопросы. Если вам несложно, можете ответить? 1. Вы сами писали тексты (раз уж вы пишете, что бюджет на продвижение 0, значит 99% - сами, но, спрошу на всякий случай)? Если да, то как быстро удавалось написать текст для страницы? Понятно, что при постоянной практике этот скилл прокачивается, через какое время вы поняли, что тексты писать для вас стало легко? 2. У вас была какие-то параметры написания текста, типа объем текста такой-то, количество вхождений ключевых слов столько-то и т.д.? 3. Как вы поступали: сначала доводили продвигаемую страницу до идеала и потом пускали в индекс? Или написали тест как получилось, а потом в процессе страницу корректировали? 3. Может глупый вопрос задам. Перед написанием текста вы проходили этапы сбора семантического ядра, его кластеризацию, разбивку на леммы и т.д.? Если да, то, наверное, сами? 4. Понятно, что в идеале нужно писать тексты одновременно и для людей и для поисковых роботов. Были ли у вас ситуации, когда нужно было выбирать или для людей или под сео? Если да, что вы выбирали, оправдывалось такое решение? Вопросы не по теме, просто праздный интерес: 5. Почему вы потеряли интерес к продвижению маркетплейсов? Потому что только текстом не продвинешь, или из-за огромного количества номенклатуры товаров и как следствие необходимости привлечения для написания текстов других людей, т.к. такой объем текста один человек физически не потянет? 6. А почему вы решили закрыть Билетовпачку, наверное, в связи с короной? 7. Я так прикинул, у вас конверсия на сайте была до 10%, если это так, то мое почтение, это очень круто! У меня был интернет-магазин товаров для творчества, так там была конверсия 2%, бижутерии - 1%. Скажите это нормальная для такой сферы конверсия, или вы реально крутой ? Спасибо за пост.
  9. Многие из авторитетов форума советуют брать OcFilter. Я использую Filter Vier и сейчас меня он полностью устраивает. Функционал в нем богатый от сео-настроек до внешнего вида. По другим фильтрам ничего не могу сказать, т.к. ничем другим не пользовался. По атрибутам знаю, что такое может По-моему, он использует свои таблицы в БД для атрибутов и это нужно иметь в виду и уточнить у автора так ли это.
  10. Вот так (см. ниже). А вообще лучше прислушайтесь к товарищу @AlexDW Точно не знаю, но похоже на то, что ocmod.net - это варез, а это может грозить вам в будущем проблемами. <?php class ControllerCheckoutCart extends Controller { public function index() { if ($this->cart->hasProducts()){ $this->response->redirect($this->url->link('checkout/checkout')); } $this->load->language('checkout/cart'); $this->document->setTitle($this->language->get('heading_title')); $data['breadcrumbs'] = array(); $data['breadcrumbs'][] = array( 'href' => $this->url->link('common/home'), 'text' => $this->language->get('text_home') ); $data['breadcrumbs'][] = array( 'href' => $this->url->link('checkout/cart'), 'text' => $this->language->get('heading_title') ); if ($this->cart->hasProducts() || !empty($this->session->data['vouchers'])) { if (!$this->cart->hasStock() && (!$this->config->get('config_stock_checkout') || $this->config->get('config_stock_warning'))) { $data['error_warning'] = $this->language->get('error_stock'); } elseif (isset($this->session->data['error'])) { $data['error_warning'] = $this->session->data['error']; unset($this->session->data['error']); } else { $data['error_warning'] = ''; } if ($this->config->get('config_customer_price') && !$this->customer->isLogged()) { $data['attention'] = sprintf($this->language->get('text_login'), $this->url->link('account/login'), $this->url->link('account/register')); } else { $data['attention'] = ''; } if (isset($this->session->data['success'])) { $data['success'] = $this->session->data['success']; unset($this->session->data['success']); } else { $data['success'] = ''; } $data['action'] = $this->url->link('checkout/cart/edit', '', true); if ($this->config->get('config_cart_weight')) { $data['weight'] = $this->weight->format($this->cart->getWeight(), $this->config->get('config_weight_class_id'), $this->language->get('decimal_point'), $this->language->get('thousand_point')); } else { $data['weight'] = ''; } $this->load->model('tool/image'); $this->load->model('tool/upload'); $data['products'] = array(); $products = $this->cart->getProducts(); foreach ($products as $product) { $product_total = 0; foreach ($products as $product_2) { if ($product_2['product_id'] == $product['product_id']) { $product_total += $product_2['quantity']; } } if ($product['minimum'] > $product_total) { $data['error_warning'] = sprintf($this->language->get('error_minimum'), $product['name'], $product['minimum']); } if ($product['image']) { $image = $this->model_tool_image->resize($product['image'], $this->config->get('theme_' . $this->config->get('config_theme') . '_image_cart_width'), $this->config->get('theme_' . $this->config->get('config_theme') . '_image_cart_height')); } else { $image = ''; } $option_data = array(); foreach ($product['option'] as $option) { if ($option['type'] != 'file') { $value = $option['value']; } else { $upload_info = $this->model_tool_upload->getUploadByCode($option['value']); if ($upload_info) { $value = $upload_info['name']; } else { $value = ''; } } $option_data[] = array( 'name' => $option['name'], 'value' => (utf8_strlen($value) > 20 ? utf8_substr($value, 0, 20) . '..' : $value) ); } // Display prices if ($this->customer->isLogged() || !$this->config->get('config_customer_price')) { $unit_price = $this->tax->calculate($product['price'], $product['tax_class_id'], $this->config->get('config_tax')); $price = $this->currency->format($unit_price, $this->session->data['currency']); $total = $this->currency->format($unit_price * $product['quantity'], $this->session->data['currency']); } else { $price = false; $total = false; } $recurring = ''; if ($product['recurring']) { $frequencies = array( 'day' => $this->language->get('text_day'), 'week' => $this->language->get('text_week'), 'semi_month' => $this->language->get('text_semi_month'), 'month' => $this->language->get('text_month'), 'year' => $this->language->get('text_year') ); if ($product['recurring']['trial']) { $recurring = sprintf($this->language->get('text_trial_description'), $this->currency->format($this->tax->calculate($product['recurring']['trial_price'] * $product['quantity'], $product['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency']), $product['recurring']['trial_cycle'], $frequencies[$product['recurring']['trial_frequency']], $product['recurring']['trial_duration']) . ' '; } if ($product['recurring']['duration']) { $recurring .= sprintf($this->language->get('text_payment_description'), $this->currency->format($this->tax->calculate($product['recurring']['price'] * $product['quantity'], $product['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency']), $product['recurring']['cycle'], $frequencies[$product['recurring']['frequency']], $product['recurring']['duration']); } else { $recurring .= sprintf($this->language->get('text_payment_cancel'), $this->currency->format($this->tax->calculate($product['recurring']['price'] * $product['quantity'], $product['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency']), $product['recurring']['cycle'], $frequencies[$product['recurring']['frequency']], $product['recurring']['duration']); } } $data['products'][] = array( 'cart_id' => $product['cart_id'], 'thumb' => $image, 'name' => $product['name'], 'model' => $product['model'], 'option' => $option_data, 'recurring' => $recurring, 'quantity' => $product['quantity'], 'stock' => $product['stock'] ? true : !(!$this->config->get('config_stock_checkout') || $this->config->get('config_stock_warning')), 'reward' => ($product['reward'] ? sprintf($this->language->get('text_points'), $product['reward']) : ''), 'price' => $price, 'total' => $total, 'href' => $this->url->link('product/product', 'product_id=' . $product['product_id']) ); } // Gift Voucher $data['vouchers'] = array(); if (!empty($this->session->data['vouchers'])) { foreach ($this->session->data['vouchers'] as $key => $voucher) { $data['vouchers'][] = array( 'key' => $key, 'description' => $voucher['description'], 'amount' => $this->currency->format($voucher['amount'], $this->session->data['currency']), 'remove' => $this->url->link('checkout/cart', 'remove=' . $key) ); } } // Totals $this->load->model('setting/extension'); $totals = array(); $taxes = $this->cart->getTaxes(); $total = 0; // Because __call can not keep var references so we put them into an array. $total_data = array( 'totals' => &$totals, 'taxes' => &$taxes, 'total' => &$total ); // Display prices if ($this->customer->isLogged() || !$this->config->get('config_customer_price')) { $sort_order = array(); $results = $this->model_setting_extension->getExtensions('total'); foreach ($results as $key => $value) { $sort_order[$key] = $this->config->get('total_' . $value['code'] . '_sort_order'); } array_multisort($sort_order, SORT_ASC, $results); foreach ($results as $result) { if ($this->config->get('total_' . $result['code'] . '_status')) { $this->load->model('extension/total/' . $result['code']); // We have to put the totals in an array so that they pass by reference. $this->{'model_extension_total_' . $result['code']}->getTotal($total_data); } } $sort_order = array(); foreach ($totals as $key => $value) { $sort_order[$key] = $value['sort_order']; } array_multisort($sort_order, SORT_ASC, $totals); } $data['totals'] = array(); foreach ($totals as $total) { $data['totals'][] = array( 'title' => $total['title'], 'text' => $this->currency->format($total['value'], $this->session->data['currency']) ); } $data['continue'] = $this->url->link('common/home'); $data['checkout'] = $this->url->link('checkout/checkout', '', true); $this->load->model('setting/extension'); $data['modules'] = array(); $files = glob(DIR_APPLICATION . '/controller/extension/total/*.php'); if ($files) { foreach ($files as $file) { $result = $this->load->controller('extension/total/' . basename($file, '.php')); if ($result) { $data['modules'][] = $result; } } } $data['column_left'] = $this->load->controller('common/column_left'); $data['column_right'] = $this->load->controller('common/column_right'); $data['content_top'] = $this->load->controller('common/content_top'); $data['content_bottom'] = $this->load->controller('common/content_bottom'); $data['footer'] = $this->load->controller('common/footer'); $data['header'] = $this->load->controller('common/header'); $this->response->setOutput($this->load->view('checkout/cart', $data)); } else { $data['text_error'] = $this->language->get('text_empty'); $data['continue'] = $this->url->link('common/home'); unset($this->session->data['success']); $data['column_left'] = $this->load->controller('common/column_left'); $data['column_right'] = $this->load->controller('common/column_right'); $data['content_top'] = $this->load->controller('common/content_top'); $data['content_bottom'] = $this->load->controller('common/content_bottom'); $data['footer'] = $this->load->controller('common/footer'); $data['header'] = $this->load->controller('common/header'); $this->response->setOutput($this->load->view('error/not_found', $data)); } } public function add() { $this->load->language('checkout/cart'); $json = array(); if (isset($this->request->post['product_id'])) { $product_id = (int)$this->request->post['product_id']; } else { $product_id = 0; } $this->load->model('catalog/product'); $product_info = $this->model_catalog_product->getProduct($product_id); if ($product_info) { if (isset($this->request->post['quantity'])) { $quantity = (int)$this->request->post['quantity']; } else { $quantity = 1; } if (isset($this->request->post['option'])) { $option = array_filter($this->request->post['option']); } else { $option = array(); } $product_options = $this->model_catalog_product->getProductOptions($this->request->post['product_id']); foreach ($product_options as $product_option) { if ($product_option['required'] && empty($option[$product_option['product_option_id']])) { $json['error']['option'][$product_option['product_option_id']] = sprintf($this->language->get('error_required'), $product_option['name']); } } if (isset($this->request->post['recurring_id'])) { $recurring_id = $this->request->post['recurring_id']; } else { $recurring_id = 0; } $recurrings = $this->model_catalog_product->getProfiles($product_info['product_id']); if ($recurrings) { $recurring_ids = array(); foreach ($recurrings as $recurring) { $recurring_ids[] = $recurring['recurring_id']; } if (!in_array($recurring_id, $recurring_ids)) { $json['error']['recurring'] = $this->language->get('error_recurring_required'); } } if (!$json) { $this->cart->add($this->request->post['product_id'], $quantity, $option, $recurring_id); $json['success'] = sprintf($this->language->get('text_success'), $this->url->link('product/product', 'product_id=' . $this->request->post['product_id']), $product_info['name'], $this->url->link('checkout/cart')); // Unset all shipping and payment methods unset($this->session->data['shipping_method']); unset($this->session->data['shipping_methods']); unset($this->session->data['payment_method']); unset($this->session->data['payment_methods']); // Totals $this->load->model('setting/extension'); $totals = array(); $taxes = $this->cart->getTaxes(); $total = 0; // Because __call can not keep var references so we put them into an array. $total_data = array( 'totals' => &$totals, 'taxes' => &$taxes, 'total' => &$total ); // Display prices if ($this->customer->isLogged() || !$this->config->get('config_customer_price')) { $sort_order = array(); $results = $this->model_setting_extension->getExtensions('total'); foreach ($results as $key => $value) { $sort_order[$key] = $this->config->get('total_' . $value['code'] . '_sort_order'); } array_multisort($sort_order, SORT_ASC, $results); foreach ($results as $result) { if ($this->config->get('total_' . $result['code'] . '_status')) { $this->load->model('extension/total/' . $result['code']); // We have to put the totals in an array so that they pass by reference. $this->{'model_extension_total_' . $result['code']}->getTotal($total_data); } } $sort_order = array(); foreach ($totals as $key => $value) { $sort_order[$key] = $value['sort_order']; } array_multisort($sort_order, SORT_ASC, $totals); } $json['total'] = sprintf($this->language->get('text_items'), $this->cart->countProducts() + (isset($this->session->data['vouchers']) ? count($this->session->data['vouchers']) : 0), $this->currency->format($total, $this->session->data['currency'])); } else { $json['redirect'] = str_replace('&amp;', '&', $this->url->link('product/product', 'product_id=' . $this->request->post['product_id'])); } } $this->response->addHeader('Content-Type: application/json'); $this->response->setOutput(json_encode($json)); } public function edit() { $this->load->language('checkout/cart'); $json = array(); // Update if (!empty($this->request->post['quantity'])) { foreach ($this->request->post['quantity'] as $key => $value) { $this->cart->update($key, $value); } $this->session->data['success'] = $this->language->get('text_remove'); unset($this->session->data['shipping_method']); unset($this->session->data['shipping_methods']); unset($this->session->data['payment_method']); unset($this->session->data['payment_methods']); unset($this->session->data['reward']); $this->response->redirect($this->url->link('checkout/cart')); } $this->response->addHeader('Content-Type: application/json'); $this->response->setOutput(json_encode($json)); } public function remove() { $this->load->language('checkout/cart'); $json = array(); // Remove if (isset($this->request->post['key'])) { $this->cart->remove($this->request->post['key']); unset($this->session->data['vouchers'][$this->request->post['key']]); $json['success'] = $this->language->get('text_remove'); unset($this->session->data['shipping_method']); unset($this->session->data['shipping_methods']); unset($this->session->data['payment_method']); unset($this->session->data['payment_methods']); unset($this->session->data['reward']); // Totals $this->load->model('setting/extension'); $totals = array(); $taxes = $this->cart->getTaxes(); $total = 0; // Because __call can not keep var references so we put them into an array. $total_data = array( 'totals' => &$totals, 'taxes' => &$taxes, 'total' => &$total ); // Display prices if ($this->customer->isLogged() || !$this->config->get('config_customer_price')) { $sort_order = array(); $results = $this->model_setting_extension->getExtensions('total'); foreach ($results as $key => $value) { $sort_order[$key] = $this->config->get('total_' . $value['code'] . '_sort_order'); } array_multisort($sort_order, SORT_ASC, $results); foreach ($results as $result) { if ($this->config->get('total_' . $result['code'] . '_status')) { $this->load->model('extension/total/' . $result['code']); // We have to put the totals in an array so that they pass by reference. $this->{'model_extension_total_' . $result['code']}->getTotal($total_data); } } $sort_order = array(); foreach ($totals as $key => $value) { $sort_order[$key] = $value['sort_order']; } array_multisort($sort_order, SORT_ASC, $totals); } $json['total'] = sprintf($this->language->get('text_items'), $this->cart->countProducts() + (isset($this->session->data['vouchers']) ? count($this->session->data['vouchers']) : 0), $this->currency->format($total, $this->session->data['currency'])); } $this->response->addHeader('Content-Type: application/json'); $this->response->setOutput(json_encode($json)); } }
  11. Пусть поправят меня знающие, судя по логике в файле catalog/controller/checkout/cart.php после ![CDATA[public function index() {]] добавляет ![CDATA[ if ($this->cart->hasProducts()){ $this->response->redirect($this->url->link('checkout/checkout')); } ]]
  12. В принципе, живым пользователям текст практически не нужен, но, как по мне, текст необходим поисковым роботами для определения релевантности страницы поисковым запросам. На сегодняшний день текст - это самое эффективное средство для определения релевантности. Другое дело, что форма текста для этого может быть разной в зависимости от тематики. Есть сферы, где для определения релевантности хватит одной строчки текста или вообще только текст метатегов, а есть области, для которых нужно писать портянки. Хотя, конечно, алгоритмы ПС совершенствуются и сегодня они способны более точно определить тематику и релевантность при меньшем объёме текста. Поэтому для ПС размер текста имеет все меньшее значение. В таких условиях все большее значение приобретает текст анкоров ссылок как входящих так и исходящих. Поэтому мы нередко можем наблюдать на хороших позициях, например, страницу категории товаров без сео текста, но с толково прописанными текстами ссылок на товары. А в карточках этих товаров есть толковые тексты ссылок на данную страницу категории.
  13. Посмотрите это Или это Выбирал из этих двух. В итоге у меня стоит первый вариант. Очень доволен модулем, т.к. точно и автоматически подбирает похожие товары. Но для этого нужно использовать атрибуты.
  14. Скачайте резервную копию вашего сайта. Затем откройте ее в программе Total Commander. В этой программе есть возможность поиска по тексту в файлах. Вставляете искомый текст в поле (не забудьте выставить галочку кодировка utf-8) поиска и получаете список файлов, в которых встречается фраза и их местонахождение. Наверняка есть более простые и изящные способы, но я их не знаю )
  15. Все работает нормально. По первому скрину: в категории "Мониторы" находятся 2 товара. Эти 2 товара привязаны только к категории "Мониторы" и больше ни к какой. Поэтому в категории "Комплектующие" они уже не отображаются. Если эти 2 товара привязать к категории "Мониторы" и "Комплектующие", то, соответственно они будут отображаться и там, и там. По второму скрину: там товары привязаны к категории "Компьютеры", поэтому и отображаются там.
  16. Прислушайтесь к товарищу. Возьмите какой-нибудь минималистичный шаблон без наворотов и отвлекающих внимание элементов. Посоветовать могу только то, что сам использовал. Это или Шаблон Sela использую сейчас, модули на него встают без проблем. На демо Sela настроен на всю ширину экрана и это может исказить восприятие дизайна. Он может отображаться и с фиксированной шириной, и выглядит приблизительно вот так: Кстати, у автора Sela есть шаблон Mart (на форуме он не продается, https://demo.themefiber.com/mart/index.php?route=common/home), он очень похож на Sela, и мне кажется для косметики очень хорошо подойдет. Также для вашей темы подошли бы шаблоны Лайтшоп Йога Или Мэйдшоп Но у лайтшопа проблемы с совместимостью с модулями. У остальных не знаю как там на этот счет, нужно узнавать у разработчиков. Как-то так.
  17. В шаблоне вы не сможете найти html тег баннера, так как там выводятся позиции. А уже в позиции вы вставляете через схемы баннеры. Если вы хотите что-то убрать с десктопа и оставить для мобилки - лучше воспользуйтесь одним из модулей ниже.
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.