Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

florapraktik

Users
  
  • Posts

    1,236
  • Joined

  • Last visited

Everything posted by florapraktik

  1. <?php if ($sku && $model) { ?> <div class = "sku_true"><?php echo $sku; ?></div> <div class = "model_true"><?php echo $model; ?></div> <?php } ?> Не выводится ничего , если хотя бы один пустой. Если надо показать заполненный и не показывать пустой, то Вы уже написали выше - два отдельных if. Если оба пустые, то тоже не выводится ничего.
  2. @AndreyIvanov, Вы ещё с нами? Отчитываюсь о проделанной работе. Удалось получить дополнительное поле для продукта, заполняемое из админки, с поддержкой мультиязычности и html разметки. Выводится в дополнительном табе (только в случае, если это доп поле вообще заполнено). Вы хотели "типа стринг", поэтому я его обозвал addi_string. Но при этом, важная деталь! Когда я пытаюсь читать большие блоки чужого кода, то часто возникает проблема, что разные сущности имеют одинаковые названия. И не всегда понятно, где суть одно и тоже, а где разные сущности с одинаковым названием. У меня новая абстракция называется addi_string, а префиксы и постфиксы разделяют её проявления в различных блоках и частях кода. 1) addi_string_db - название столбца в базе данных. 2) input-addi-string - id textarea в форме редактирования. Точнее, это часть id - весь id имеет ещё дополнительный языковый постфикс. 3) addi_string_form - значение атрибута name той же textarea. Точнее, это только часть name - есть ещё дополнительный языковый префикс. 4) addi_string_admin - значение addi_string, полученное из БД для вывода в админке при редактировании товара. 5) addi_string_info - ключ в массиве $product_info со значением соответствующим addi_string_db. 6) addi_string_product - ключ в массиве $data, со значением, соответствующим значению addi_string_info. 7) $addi_string_product - переменная PHP, соответствующая значению addi_string_product и используемая непосредственно на странице продукта. Ну вот, не много, не мало, а семь разных сущностей для одной абстракции. В принципе можно было каждый раз использовать одно слово addi_string, но мне кажется, что так, как сейчас будет проще разобраться, что откуда берётся. Итак. Пункт А. Первое, что надо сделать, это создать столбец в базе данных. На мой взгляд лучше всего подходит таблица product_description, - там как раз вся вкладка General. Вроде как логично. Я создавал вручную инструментами phpMyAdmin, чего и Вам желаю. Так что кода здесь не будет. Я назвал этот столбец addi_string_db, где постфикс _db говорит о том, что сущность относится к базе данных и больше ни к чему. Пункт Б. Создаём форму ввода в админке. Файл называется product_form.tpl и находится по адресу /admin/view/template/catalog/product_form.tpl Код вставляется в <form action="<?php echo $action; ?>" method="post" enctype="multipart/form-data" id="form-product" class="form-horizontal"> ... <div class="tab-content"> <div class="tab-pane active" id="tab-general"> ... <div class="tab-content"> ... Закрывающие теги здесь не проставлены. Вот внутри этого последнего <div class="tab-content"> находятся все инпуты и текстареа вкладки General. Я вставил свой код после инпута Product Name Вот сам код: <!-- addi_string start --> <div class="form-group"> <label class="col-sm-2 control-label" for="input-addi-string<?php echo $language['language_id']; ?>">***</label> <div class="col-sm-10"> <textarea name="product_description[<?php echo $language['language_id']; ?>][addi_string_form]" rows="5" placeholder="***" id="input-addi-string<?php echo $language['language_id']; ?>" class="form-control"> <?php echo isset($product_description[$language['language_id']]) ? $product_description[$language['language_id']]['addi_string_admin'] : ''; ?> </textarea> </div> </div> <!-- addi_string end --> Комментарии к коду: а) id имеет не совсем привычный вид id="input-addi-string<?php echo $language['language_id']; ?>" Часть input-addi-string мы задаём любую, отражающую смысл значения. Потом при помощи <?php echo $language['language_id']; ?> добавляем к ней идетнификатор языка. Для английского на дефолте инспектор браузера покажет id="input-addi-string1", где 1 - это англ яз Таким образом, для разных языков будет разный id. б) Атрибут name тоже не совсем обычный: name="product_description[<?php echo $language['language_id']; ?>][addi_string_form]" Здесь: часть product_description, - это название массива в который записываются значения всех атрибутов name инпутов и текстарея вкладки General. К тому же для всех используемых языков. (я в этом месте долго фтыкал, блин) часть [<?php echo $language['language_id']; ?>] - это доступ к массиву текущего используемого языка. часть [addi_string_form] - это название именно этого поля формы (этой текстареа) Для английского на дефолте инспектор браузера покажет name="product_description[1][addi_string_form]", где 1 - это англ яз в) Для значения placeholder и внуть тега label я поставил звёздочки. Вообще, там должны быть языковые переменные, но я пытался упростить и сократить код. В принципе, в качестве временной меры можно написать любой уместный текст прямо вместо этих звёздочек. Либо заморочится с чзыковыми файлами. г) Внутри тега textarea выводится значение переменной $product_description[$language['language_id']]['addi_string_admin'], если оно установленно. Здесь $product_description, - это массив из массивов языков. Каждый массив языка, это тоже массив и он имеет ключ 'addi_string_admin' (объяснение того, откуда это берётся будет позже). д) И на закуску: В самом низу этого файла, после всех закрывающих дивов есть яваскрипт: <script type="text/javascript"><!-- <?php foreach ($languages as $language) { ?> $('#input-description<?php echo $language['language_id']; ?>').summernote({height: 300}); <?php } ?> //--></script> Так вот, в тупо сделал вот так: <script type="text/javascript"><!-- <?php foreach ($languages as $language) { ?> $('#input-description<?php echo $language['language_id']; ?>').summernote({height: 300}); $('#input-addi-string<?php echo $language['language_id']; ?>').summernote({height: 300}); <?php } ?> //--></script> И текстареа стала с поддержкой визуального редактора кода. По формам всё. Пункт В. Делаем запись в базу данных. Файл называется product.php и находится по адресу: admin/model/catalog/product.php Необходимо добавить две записи: 1) В функцию addProduct (функция добавления нового продукта). Это в самом начале файла. Но добавлять надо не в начало функции, а в запрос где есть INSERT INTO " . DB_PREFIX . "product_description SET т.е. запрос, который работает с таблицей product_description. Надо понимать, авторы движка считают этот запрос нередактируемым тем варварским способом, который мы применяем, поэтому запрос написан в одну строчку. Редактировать неудобно. Вставить надо вот это: addi_string_db = '" . $this->db->escape($value['addi_string_form']) . "', Вставить надо после любой запятой и перед название следующего столбца. В этом месте я тоже долго мучился, потому что пытался красиво отформатировать текст запроса, но имел проблемы с заголовками для браузера. Так что, в этом месте поаккуратней с пробелами. Здесь addi_string_db - это как раз название столбца в базе данных, а addi_string_form - это значение атрибута name в форме ввода в админке. Причём, не всё значение этого атрибута, а только то, что в последних квадратных скобках. Остальные части атрибута name разобраны циклом foreach, перебирающего массив product_description Надо понимать, будет столько запросов, сколько используется языков. 2) В функцию editProduct (функция редактирования существующего продукта). В принципе, всё аналогично. Ищите аналогичный запрос INSERT INTO " . DB_PREFIX . "product_description SET но внутри функции editProduct Манипуляции с запросом те же самые. С записью в таблицу всё. Можно открыть phpMyAdmin и проверить наличие записей в столбце addi_string_db таблицы product_description. Хотя, конечно, с первого раза вряд-ли получиться. КОНЕЦ ПЕРВОЙ СЕРИИ. Вывод на экран в админке и карточке товара в следующей серии. ПС код лучше не копипастить тупо и бездумно (могут быть опечатки). Но у меня всё работает, включая содержание второй серии.
  3. Ну, блин! @AndreyIvanov, я помучился, конечно. Но, кое-что получилось. Во всяком случае, в БД добавил, а это главное. Причём, менее костыльно, чем в примере от mazein (ещё раз спасибо!) - по идее, у меня будет работать поддержка нескольких языков. В том примере в качестве образца использовалось поле, одинаковое для всех языков. Кроме того, там надо организовать проверку в контроллере (в примере её нет). Думаю, всё получится в конце концов, но на сегодня устал. Попутно разобрался, почему поле sku обнуляется при копировании - как раз надо, что бы не обнулялось.
  4. @AndreyIvanov, так Вы именно модуль хотите или тупо изуродовать оригинальные файлы тоже годиться? Потому что, если можно изменять оригинальные файлы, то завтра будем пробовать Сегодня уже поздно. Спать пора.
  5. Спасибо! С кавычками разобрался. В той цитате, что я привёл, первые двойные кавычки на самом деле закрывающие (я ошибочно подумал, что открывающие). ... db - это ключ массива $data, имеющий значение в виде объекта от намеспейса DB. Создан и описан в файле index.php, содержание взято из файла config.php, блок // DB в самом низу. По сути, это данные для подключения к базе. В запросе .$this->db->escape($data['example']). db, это член (переменная, принадлежащая и доступная внутри) класса ModelCatalogProduct, которая унаследована от родительского класса Model через метод set($key, $value) объекта $registry, класса Registry. Нифигасебе "один сплошной пример"! Тут в пору разноцветную схему рисовать. ... Не, всё равно не понятно. $registry, который в index.php $registry = new Registry(); Это тот же самый $registry, который в Model abstract class Model { protected $registry; //..... } Или они просто однофамильцы?
  6. Кстати! Вот это экранирование по фен-шую: '".$this->db->escape($data['example'])."' Правильно? Угадал? Зачем столько кавычек? Наружные одинарные зачем? А метод escape() описан в папке system/library/db/? Блин, но там пять файлов и в каждом escape() описан по разному. ... И ещё. Вот это: $this->db это не потому что папка называется db. Это потому что: $db = new DB(DB_DRIVER, DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE); Правильно?
  7. Спасибо, конечно. Вы гораздо добрее к людям, чем некоторые. Но в той теме обсуждаются костыли.
  8. Тогда почему паттерн называется MVC+L, а не MVC+L+S и плюс вкумод?
  9. Ничего не мешает, кроме вот этого требования: Поэтому: Как можно понять, что там не г*мнокод? Как я пойму, что, например, экранирование данных проведено по фен-шую? Например: try { $sql = 'INSERT INTO plant SET description = :description, $s = $pdo->prepare($sql); $s->bindValue(':description', $_POST['plant-description']); $s->execute(); } Это экранирование? Или экранирование это что-то другое? Во всяком случае, это точно НЕ стандарты ОС? Или стандарты? И куда это записать? Создаём доп столбец в product_description? Или лучше создать отдельную таблицу для дополнительного поля? Или использовать какой-нибудь "ненужный" столбец в таблице product (там их обычно много "запасных")? По стандартам, куда лучше записать? Хорошо, посоветуйте, пожалуйста, эталонный модуль, который можно принять за образец.
  10. Ээээ На выходе получаем ПО, которое после загрузки на сайт ОС сделает следующее: 1) В админке в карточке товара появится дополнительное поле. 2) Текст, введённый в это поле сохранится в бд (после сохранения карточки товара). 3) Этот сохранённый текст появится в карточках товара фронта. А, если надо, то и в категориях. При этом. MVC и стандарты ОС. И ещё с комментариями и объяснениями. 25 минут.
  11. Да, папка. Конечно папка. Там много чего, непонятно зачем.
  12. Пользуясь случаем: Зачем нужен файл system? Модель спрашивает базу Контролер всё разруливает Вью показывает. Ленгвич языкует. А system зачем?
  13. Если не секрет, вы за какую сумму "не договорились"?
  14. Если я отключу аналитику, то как я пойму, какой результат принесли сделанные изменения? Вебмастер как бы должен понимать, что у него на сайте твориться? Нет?
  15. Он же предложил оплату сразу. Просто объём работы там НЕ "пару строчек кода в нескольких файлах". Поэтому и цена "как заказ всего магазина =)" ... Вообще, идея хорошая. По поводу "Как сделать модуль? Желательно правильно и по фен-шую". Автор, когда и если Вам кто-то этот мануал сделает, Вы не могли бы его здесь выложить?
  16. П 1). string, это тип переменной. А у полей в таблице varcharы. П 2). А Вы сможете проверить это требование? С учётом П 1).
  17. На одной из встреч для вебмастеров я задал Липатцеву вопрос: "Сколько раз надо написать слово "купить", что бы гугл понял, что у меня интернет магазин и страница релевантна запросу со словом "купить"? Потому что, подзамучился я уже читать "у нас вы можете купить" и другие "сео тексты" для даунов". Липатцев ответил: "Не пишите!". Теперь надо спросить: "Какой длины должен быть список городов, что бы гугл понял, что я отправляю товары не только на соседнюю улицу?" Мне кажется, что он назовёт это спамом. Я верю Вам, что это работает. Но мне таки кажется, что они там в гугле должны сидеть и думать, как сделать региональную выдачу без привязки к таким простыням спама городами. Как-то это не правильно, это не делает интернет лучше.
  18. Просто надо обфусцировать и/или кубить и не надо признаваться Шучу. С другой стороны: а если не 300 руб, а бесплатно, то можно? Или всё равно нельзя - пусть так и будет только для полтора?
  19. Больше всего интересно, КАК вы собрались заполнять вкладку "отзывы"? Ну, что бы сделать её полноценной страницей... Потому что уникальные метаданные сами по себе не делают страницу, ни полноценной, ни полезной. Не факт, что вообще в выдачу попадёт. Где брать контент для страницы "Отзывы"? Ещё интересно, а не пострадает-ли страница продукта, если вырезать с неё характеристики? Она ведь станет "легче"? Ну, по идее? Информации меньше = ценность ниже. Пробовать надо на магазине, который не жалко.
  20. И неплохо, что бы на главном фото сразу было не просто фото товара, фото выбранной опции. И при нажатии кнопки "купить" в корзину добавлялась именно эта опция.
  21. Яндекс любитель такого. Был. Гугл редко игнорирует description - уважает труд веб-мастера
×
×
  • Create New...

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.