oct_product_tabs.ocmod.xml 15.3 KB
<?xml version="1.0" encoding="UTF-8"?>
<modification>
	<code>oct_product_tabs</code>
	<name>Octemplates - Product tabs</name>
	<version>1.0.0</version>
	<author>Octemplates</author>
	<link>http://octemplates.net/</link>
	<file path="admin/controller/catalog/product.php">
		<operation error="skip">
			<search><![CDATA[$this->load->model('design/layout');]]></search>
			<add position="before"><![CDATA[
            $data['oct_product_tabs_status'] = $this->config->get('oct_product_tabs_status');
            $oct_product_tabs_status = $this->config->get('oct_product_tabs_status');

            if (isset($oct_product_tabs_status) && $oct_product_tabs_status) {
                $this->load->model('octemplates/module/oct_product_tabs');

                if (isset($this->request->post['oct_product_extra_tab'])) {
                    $oct_product_extra_tabs = $this->request->post['oct_product_extra_tab'];
                } elseif (isset($this->request->get['product_id'])) {
                    $oct_product_extra_tabs = $this->model_catalog_product->getProductExtraTabs($this->request->get['product_id']);
                } else {
                    $oct_product_extra_tabs = [];
                }

                $data['oct_product_extra_tabs'] = [];

                foreach ($oct_product_extra_tabs as $oct_product_extra_tab) {
                    $oct_product_extra_tab_info = $this->model_octemplates_module_oct_product_tabs->getProductTab($oct_product_extra_tab['extra_tab_id']);

                    if ($oct_product_extra_tab_info) {
                        $data['oct_product_extra_tabs'][] = [
                            'extra_tab_id' => $oct_product_extra_tab['extra_tab_id'],
                            'title' => $oct_product_extra_tab_info['title'],
                            'oct_product_extra_tab_description' => $oct_product_extra_tab['oct_product_extra_tab_description']
                        ];
                    }
                }
            }
          ]]></add>
		</operation>
	</file>
	<file path="admin/model/catalog/product.php">
		<operation error="skip">
			<search><![CDATA[if (isset($data['product_attribute'])) {]]></search>
			<add position="before"><![CDATA[
			if ($this->config->get('oct_product_tabs_status') && isset($data['oct_product_extra_tab'])) {
				foreach ($data['oct_product_extra_tab'] as $oct_product_extra_tab) {
					if ($oct_product_extra_tab['extra_tab_id']) {
						foreach ($oct_product_extra_tab['oct_product_extra_tab_description'] as $language_id => $oct_product_extra_tab_description) {
							$this->db->query("INSERT INTO " . DB_PREFIX . "oct_product_extra_tabs SET product_id = '" . (int)$product_id . "', extra_tab_id = '" . (int)$oct_product_extra_tab['extra_tab_id'] . "', language_id = '" . (int)$language_id . "', text = '" .  $this->db->escape($oct_product_extra_tab_description['text']) . "'");
						}
					}
				}
			}
			]]></add>
		</operation>
		<operation error="skip">
			<search index="0"><![CDATA[$this->db->query("DELETE FROM " . DB_PREFIX . "product_attribute WHERE product_id = '" . (int)$product_id . "'");]]></search>
			<add position="before"><![CDATA[
			$oct_product_tabs_status = $this->config->get('oct_product_tabs_status');

			if (isset($oct_product_tabs_status) && $oct_product_tabs_status) {
				$this->db->query("DELETE FROM " . DB_PREFIX . "oct_product_extra_tabs WHERE product_id = '" . (int)$product_id . "'");

				if (isset($data['oct_product_extra_tab']) && !empty($data['oct_product_extra_tab'])) {
					foreach ($data['oct_product_extra_tab'] as $oct_product_extra_tab) {
						if ($oct_product_extra_tab['extra_tab_id']) {
							foreach ($oct_product_extra_tab['oct_product_extra_tab_description'] as $language_id => $oct_product_extra_tab_description) {
								$this->db->query("INSERT INTO " . DB_PREFIX . "oct_product_extra_tabs SET product_id = '" . (int)$product_id . "', extra_tab_id = '" . (int)$oct_product_extra_tab['extra_tab_id'] . "', language_id = '" . (int)$language_id . "', text = '" .  $this->db->escape($oct_product_extra_tab_description['text']) . "'");
							}
						}
					}
				}
			}
			]]></add>
		</operation>
		<operation error="skip">
			<search index="1"><![CDATA[$this->db->query("DELETE FROM " . DB_PREFIX . "product_attribute WHERE product_id = '" . (int)$product_id . "'");]]></search>
			<add position="before"><![CDATA[
			$oct_product_tabs_status = $this->config->get('oct_product_tabs_status');

			if (isset($oct_product_tabs_status) && $oct_product_tabs_status) {
				$this->db->query("DELETE FROM " . DB_PREFIX . "oct_product_extra_tabs WHERE product_id = '" . (int)$product_id . "'");
			}
			]]></add>
		</operation>
		<operation error="skip">
			<search><![CDATA[public function getProductAttributes($product_id) {]]></search>
			<add position="before"><![CDATA[
			public function getProductExtraTabs($product_id) {
				$oct_product_extra_tab_data = [];

				$oct_product_extra_tab_query = $this->db->query("SELECT extra_tab_id FROM " . DB_PREFIX . "oct_product_extra_tabs WHERE product_id = '" . (int)$product_id . "' GROUP BY extra_tab_id");

				foreach ($oct_product_extra_tab_query->rows as $oct_product_extra_tab) {
					$oct_product_extra_tab_description_data = [];

					$oct_product_extra_tab_description_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "oct_product_extra_tabs WHERE product_id = '" . (int)$product_id . "' AND extra_tab_id = '" . (int)$oct_product_extra_tab['extra_tab_id'] . "'");

					foreach ($oct_product_extra_tab_description_query->rows as $oct_product_extra_tab_description) {
						$oct_product_extra_tab_description_data[$oct_product_extra_tab_description['language_id']] = ['text' => $oct_product_extra_tab_description['text']];
					}

					$oct_product_extra_tab_data[] = [
						'extra_tab_id'                  => $oct_product_extra_tab['extra_tab_id'],
						'oct_product_extra_tab_description' => $oct_product_extra_tab_description_data
					];
				}

				return $oct_product_extra_tab_data;
			}
			]]></add>
		</operation>
	</file>
	<file path="admin/view/template/catalog/product_form.twig">
		<operation error="skip">
			<search><![CDATA[<li><a href="#tab-data" data-toggle="tab">{{ tab_data }}</a></li>]]></search>
			<add position="after"><![CDATA[
			{% if oct_product_tabs_status is defined and oct_product_tabs_status %}
				<li><a href="#tab-extra_tabs" data-toggle="tab">{{ tab_extra_tabs }}</a></li>
	        {% endif %}
			]]></add>
		</operation>
		<operation error="skip">
			<search><![CDATA[<div class="tab-pane" id="tab-option">]]></search>
			<add position="before"><![CDATA[
			{% if oct_product_tabs_status is defined and oct_product_tabs_status %}
	        <div class="tab-pane" id="tab-extra_tabs">
	          <div class="col-sm-2">
	            <ul class="nav nav-pills nav-stacked" id="extra_tabs">
	              {% set extra_tab_row = 0 %}
	              {% for oct_product_extra_tab in oct_product_extra_tabs %}
	              <li><a href="#tab-extra_tabs{{ extra_tab_row }}" data-toggle="tab"><i class="fa fa-minus-circle" onclick="$('a[href=\'#tab-extra_tabs{{ extra_tab_row }}\']').parent().remove(); $('#tab-extra_tabs{{ extra_tab_row }}').remove(); $('#extra_tabs a:first').tab('show');"></i> {{ oct_product_extra_tab.title }}</a></li>
	              {% set extra_tab_row = extra_tab_row + 1 %}
	              {% endfor %}
	              <li>
	                <input type="text" name="extra_tabs" value="" placeholder="{{ entry_extra_tab }}" id="input-extra_tabs" class="form-control" />
	              </li>
	            </ul>
	          </div>
	          <div class="col-sm-10">
	            <div class="tab-content">
	              {% set extra_tab_row = 0 %}
	              {% for oct_product_extra_tab in oct_product_extra_tabs %}
	              <div class="tab-pane" id="tab-extra_tabs{{ extra_tab_row }}">
	                <input type="hidden" name="oct_product_extra_tab[{{ extra_tab_row }}][title]" value="{{ oct_product_extra_tab.title }}" />
	                <input type="hidden" name="oct_product_extra_tab[{{ extra_tab_row }}][extra_tab_id]" value="{{ oct_product_extra_tab.extra_tab_id }}" />
	                <ul class="nav nav-tabs" id="extra_tab_description_div{{ extra_tab_row }}">
	                  {% for language in languages %}
	                  <li><a href="#extra_tab_description{{ extra_tab_row }}{{ language.language_id }}" data-toggle="tab"><img src="language/{{ language.code }}/{{ language.code }}.png" title="{{ language.name }}" /> {{ language.name }}</a></li>
	                  {% endfor %}
	                </ul>
	                <div class="tab-content">
	                  {% for language in languages %}
	                  <div class="tab-pane" id="extra_tab_description{{ extra_tab_row }}{{ language.language_id }}">
	                    <textarea id="extra_tab_description_textarea{{ extra_tab_row }}{{ language.language_id }}" name="oct_product_extra_tab[{{ extra_tab_row }}][oct_product_extra_tab_description][{{ language.language_id }}][text]" placeholder="{{ entry_text }}" data-toggle="summernote" data-lang="{{ summernote }}" class="form-control">{{ oct_product_extra_tab['oct_product_extra_tab_description'][language.language_id] is defined ? oct_product_extra_tab['oct_product_extra_tab_description'][language.language_id]['text'] : '' }}</textarea>
	                  </div>
	                  {% endfor %}
	                </div>
	              </div>
	              {% set extra_tab_row = extra_tab_row + 1 %}
	              {% endfor %}
	            </div>
	          </div>
	        </div>
	        <script>
	          var extra_tab_row = {{ extra_tab_row }};

	          $('input[name=\'extra_tabs\']').autocomplete({
	            'source': function(request, response) {
	              $.ajax({
	                url: 'index.php?route=octemplates/module/oct_product_tabs/autocomplete&user_token={{ user_token }}&filter_name=' +  encodeURIComponent(request),
	                dataType: 'json',
	                	cache: false,
	                success: function(json) {
	                  response($.map(json, function(item) {
	                    return {
	                      label: item['title'],
	                      value: item['extra_tab_id']
	                    }
	                  }));
	                }
	              });
	            },
	            'select': function(item) {
	              html  = '<div class="tab-pane" id="tab-extra_tabs'+extra_tab_row+'">';
	                html  += '<input type="hidden" name="oct_product_extra_tab['+extra_tab_row+'][title]" value="'+item['label']+'" />';
	                html  += '<input type="hidden" name="oct_product_extra_tab['+extra_tab_row+'][extra_tab_id]" value="'+item['value']+'" />';
	                html  += '<ul class="nav nav-tabs" id="extra_tab_description_div'+extra_tab_row+'">';
	                  {% for language in languages %}
	                  html  += '<li><a href="#extra_tab_description'+extra_tab_row+'{{ language.language_id }}" data-toggle="tab"><img src="language/{{ language.code }}/{{ language.code }}.png" title="{{ language.name }}" /> {{ language.name }}</a></li>';
	                  {% endfor %}
	                html  += '</ul>';
	                html  += '<div class="tab-content">';
	                  {% for language in languages %}
	                  html  += '<div class="tab-pane" id="extra_tab_description'+extra_tab_row+'{{ language.language_id }}">';
	                    html  += '<textarea name="oct_product_extra_tab['+extra_tab_row+'][oct_product_extra_tab_description][{{ language.language_id }}][text]" placeholder="{{ entry_text }}" data-toggle="summernote" data-lang="{{ summernote }}" class="form-control" id="extra_tab_description_textarea'+extra_tab_row+'{{ language.language_id }}"></textarea>';
	                  html  += '</div>';
	                  {% endfor %}
	                html  += '</div>';
	              html  += '</div>';

	              $('#tab-extra_tabs .col-sm-10 > .tab-content').append(html);

	              $('#extra_tabs > li:last-child').before('<li><a href="#tab-extra_tabs' + extra_tab_row + '" data-toggle="tab"><i class="fa fa-minus-circle" onclick="$(\'a[href=\\\'#tab-extra_tabs' + extra_tab_row + '\\\']\').parent().remove(); $(\'#tab-extra_tabs' + extra_tab_row + '\').remove(); $(\'#extra_tabs a:first\').tab(\'show\')"></i> ' + item['label'] + '</li>');

	              $('#extra_tabs a[href=\'#tab-extra_tabs' + extra_tab_row + '\']').tab('show');

	              $('#extra_tab_description_div'+extra_tab_row).tab('show');

	              $('#extra_tab_description_div'+extra_tab_row+' a:first').trigger('click');

	              extra_tab_row++;

				  $('[data-toggle=\'summernote\']').each(function() {
					var element = this;

					$(element).summernote({
						lang: $(this).attr('data-lang'),
						disableDragAndDrop: true,
						height: 300,
						emptyPara: '',
						codemirror: { // codemirror options
							mode: 'text/html',
							htmlMode: true,
							lineNumbers: true,
							theme: 'monokai'
						},
						fontsize: ['8', '9', '10', '11', '12', '14', '16', '18', '20', '24', '30', '36', '48' , '64'],
						toolbar: [
							['style', ['style']],
							['font', ['bold', 'underline', 'clear']],
							['fontname', ['fontname']],
							['fontsize', ['fontsize']],
							['color', ['color']],
							['para', ['ul', 'ol', 'paragraph']],
							['table', ['table']],
							['insert', ['link', 'image', 'video']],
							['view', ['fullscreen', 'codeview', 'help']]
						],
						popover: {
			           		image: [
								['custom', ['imageAttributes']],
								['imagesize', ['imageSize100', 'imageSize50', 'imageSize25']],
								['float', ['floatLeft', 'floatRight', 'floatNone']],
								['remove', ['removeMedia']]
							],
						},
						buttons: {
			    			image: function() {
								var ui = $.summernote.ui;

								// create button
								var button = ui.button({
									contents: '<i class="note-icon-picture" />',
									tooltip: $.summernote.lang[$.summernote.options.lang].image.image,
									click: function () {
										$('#modal-image').remove();

										$.ajax({
											url: 'index.php?route=common/filemanager&user_token=' + getURLVar('user_token'),
											dataType: 'html',
											beforeSend: function() {
												$('#button-image i').replaceWith('<i class="fa fa-circle-o-notch fa-spin"></i>');
												$('#button-image').prop('disabled', true);
											},
											complete: function() {
												$('#button-image i').replaceWith('<i class="fa fa-upload"></i>');
												$('#button-image').prop('disabled', false);
											},
											success: function(html) {
												$('body').append('<div id="modal-image" class="modal">' + html + '</div>');

												$('#modal-image').modal('show');

												$('#modal-image').delegate('a.thumbnail', 'click', function(e) {
													e.preventDefault();

													$(element).summernote('insertImage', $(this).attr('href'));

													$('#modal-image').modal('hide');
												});
											}
										});
									}
								});

								return button.render();
							}
			  			}
					});
				});
	            }
	          });

	          $('#extra_tabs a:first').tab('show');

	          {% set extra_tab_row = 0 %}
	          {% for oct_product_extra_tab in oct_product_extra_tabs %}
			  	$('#extra_tab_description_div{{ extra_tab_row }} a:first').tab('show');

	          	{% set extra_tab_row = extra_tab_row + 1 %}
	          {% endfor %}

	          </script>
	        {% endif %}
			]]></add>
		</operation>
	</file>
</modification>