Добавить дополнительное поле Трекинг номер в детали заказа в Админ панели

  • 5 Ответов
  • 1089 Просмотров

0 Пользователей и 1 Гость просматривают эту тему.

*

nick-gr

Добрый день!
Я новичок в программировании и в Joomla, уверен, для многих данная задача пустяк, но я уже 2-ой день не могу с ней разобраться. Необходимо выполнить следующее: добавить в деталях заказа в Админке дополнительное текстовое поле с кнопкой («Отправить»), для внесения почтового идентификатора (Трекинг номера) в таблицу заказов (virtuemart_orders). Как здесь: https://cloud.mail.ru/public/hj3a/ghKzR8GFD

Создал в phpMyAdmin дополнительную колонку tracking_number в таблице virtuemart_orders.
В файле Вида (\administrator\components\com_virtuemart\views\orders\tmpl\order.php) создал текстовое поле с кнопкой, вставил код для получения значения <input value> и запись его в БД. Но к сожалению, результата это не даёт. Значение value из текстового поля не передаётся переменной $track (присваивая переменной значение напрямую, например $track = "1111111", значение в БД записывается исправно).
Где-то читал, что необходимо передать значение, полученное из текстового поля в Контроллер, и уже там, в файле Контроллера, выполнять операции записи значения в БД. Но, к сожалению, как это сделать понятия не имею.
Заранее благодарю!

Код
<tr>
     <td><?php echo JText::_ ('Tracking Number')  ?>
        <td>
                       
        <form action="" method="post">
        <input type="text" name="track" id="track" value=""/>
        <input type="submit" name="submit"  />
        </form>
                       
        <?php
$input = JFactory::getApplication()->input;
$track = $input->get('track');
if ($track == NULL){
$track = "ERROR: no data accepted";
}
$db = JFactory::getDBO();
$query= " UPDATE #__virtuemart_orders SET ".$db->nameQuote('tracking_number')."=". $db->Quote($track)."  WHERE ".$db->nameQuote('virtuemart_order_id')." = ". $db->Quote($this->orderbt->virtuemart_order_id);
$db->setQuery($query);
$db->query();
?>
                       
    </td>
  </td>
</tr>

*

nick-gr

Решение данной задачи было найдено самостоятельно, методом проб и ошибок. Хочу поделиться, может кому пригодится. (Версия VirtueMart 2.0.26d, Joomla 2.5.19 , PHP 5.2.12)
Для чтения данных из текстового поля и передачи их в PHP для записи в БД я использовал Javascript (Ajax), поэтому данная процедура происходит без перезагрузки страницы.
Делаем следующее:

1)   Создаём в БД в таблице virtuemart_orders колонку с именем tracking_number (я задал тип как текст)
2)   Заходим в файл order.php (administrator\components\com_virtuemart\views\orders\tmpl)  
3)   Переходим примерно на 330 строку и после:

Код
<?php
foreach($shipments as $shipment) {
if($shipment->virtuemart_shipmentmethod_id == $this->orderbt->virtuemart_shipmentmethod_id) echo $shipment->shipment_name;
}
?>
</td>
</tr>

Вставляем следующие строки:

Код
<tr>
<td><?php echo JText::_ ('Tracking Number')  ?>
<td>
<?php //Получаем существующее значение Трекинг номера из БД
             $db = JFactory::getDBO();
$query = 'SELECT `tracking_number` from `#__virtuemart_orders` WHERE `virtuemart_order_id`= "'.$this->orderbt->virtuemart_order_id.'"';
$db->setQuery($query);
$get_track = $db->loadResult();
?>
                    
<script language="JavaScript" type="text/javascript">

function get_track_number(){
var track_num = document.getElementById('track').value; //Получаем введёный текст
var track_id = '<?php echo $this->orderbt->virtuemart_order_id ?>'; //Получаем ID заказа
var track_num_saved = '<?php echo $get_track ?>'; //Получаем существующее значение Трекинг номера

if (window.XMLHttpRequest) {
xmlhttp=new XMLHttpRequest();
}
else {
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}

if(track_num == "") {
alert("Please input tracking number");
}

else if(track_num == track_num_saved){
alert("Tracking number hasn't changed. Please make a change");
}

else{
xmlhttp.open("GET","../t_num.php?track_number=" + track_num + "&tracking_id=" + track_id, true); //Передаём значение в PHP файл
xmlhttp.send();
alert("Data Updated Successfully. Tracking Number for this order is: " + track_num);
}
}

</script>
                        
<input type="text" name="track" id="track" value="<?php
//Если значение текстового поля не пустое, делаем вывод  
if(!$get_track == NULL)
echo $get_track;
else
echo "Ther is no tracking data";
?>"/>
<!--При нажатии кнопки вызываем функцию Javascript -->  
<input type="button" name="submit" id="submit" value="update" onclick="get_track_number()">
                    
</td>
</td>
</tr>

4)   Создаём в корне сайта файл t_num.php и вставляем в него следующий код:

Код
<?php

define('_JEXEC', 1);
define('JPATH_BASE', dirname(__FILE__)); //файл лежит в корне, иначе меняйте пути
define('DS', DIRECTORY_SEPARATOR);
header('Content-Type: text/html; charset=utf-8');
 
require_once(JPATH_BASE . DS . 'includes' . DS . 'defines.php');
require_once(JPATH_BASE . DS . 'includes' . DS . 'framework.php');
jimport('joomla.database.table');
 
$app = JFactory::getApplication('administrator'); //для фронта site
$app->initialise();

//Получаем значение текстового поля и id заказа из order.php
$input = JFactory::getApplication()->input;
$track_number = $input->get('track_number', '', 'string');
$order_id = $input->get('tracking_id', '', 'string');

if(!$track_number == NULL){ //Проверяем если полученое значение не пустое

//Записываем полученый результат в БД
$db = JFactory::getDBO();
$query= " UPDATE #__virtuemart_orders SET ".$db->nameQuote('tracking_number')."=". $db->Quote($track_number)."  WHERE ".$db->nameQuote('virtuemart_order_id')." = ". $db->Quote($order_id);
$db->setQuery($query);
$db->query();

}

?>

5)   Выводим Трекин номер заказа в деталях заказа покупателя (во Frontend). Открываем файл details_order.php расположенный в \templates\ваш_шаблон\html\com_virtuemart\orders
И вставляем в него код:

Код
<?php foreach($this->orderdetails['details'] as $_details); //Проверяем, если заказ находится в статусе отправлен (Код статуса заказа ОТПРАВЛЕН должен быть S)
 if($_details->order_status == "S"): ?>  
<tr>
<td class=""><?php echo JText::_('COM_VIRTUEMART_TRACKING_SHORT')?></td>
<td align="left"><?php
//Получаем значение из БД
$db = JFactory::getDBO();
$query = 'SELECT `tracking_number` from `#__virtuemart_orders` WHERE `virtuemart_order_id`= "'.$_details->virtuemart_order_id.'"';
$db->setQuery($query);
$result = $db->loadResult();
if(!$result == NULL)
echo $result;
else
echo "Ther is no tracking data";

?>
</td>
</tr>
<?php endif; ?>

6)   Теперь отображаем Трекин номер в списке заказов со стороны администратора (в Backend). Таким образом: https://cloud.mail.ru/public/DAei/9UASEsdXn
Открываем файл orders.php который находится в administrator\components\com_virtuemart\views\orders\tmpl
Переходим примерно на 140 строку и вставляем после:

Код
<textarea class="element-hidden vm-order_comment vm-showable" name="orders[<?php echo $order->virtuemart_order_id; ?>][comments]" cols="15" rows="1"></textarea>
<?php echo JHTML::_ ('link', '#', JText::_ ('COM_VIRTUEMART_ADD_COMMENT'), array('class' => 'show_comment')); ?>
</td>
<!-- Update -->

Следующий код:

Код
<td>
                
<input type="text" disabled="disabled" style="text-align:center" value="<?php
$db = JFactory::getDBO();
$query = 'SELECT `tracking_number` from `#__virtuemart_orders` WHERE `virtuemart_order_id`= "'.$order->virtuemart_order_id.'"';
$db->setQuery($query);
$result = $db->loadResult();
if(!$result == NULL)
echo $result;
else
echo "Ther is no tracking data";
?>" />
                
</td>

А также, в том же файле примерно на 51 строке, после:

Код
<th><?php echo $this->sort ('order_status', 'COM_VIRTUEMART_STATUS')  ?></th>

вставляем:

Код
<th><?php echo JText::_ ('Tracking number')  ?></th>

7)   Ну вот и всё
« Последнее редактирование: 10.07.2015, 17:40:34 от nick-gr »

*

fsv

  • *****
  • 2502
  • + 366 -
$_GET["track_number"] в базу пишите, потом на сайт выводите. ! фильтруйте данные

Цитировать
Заходим в файл order.php (administrator\components\com_virtuemart\views\orders\tmpl
переопределяйте шаблоны компонента, дальше у вас по тексту есть - в папке HTML шаблона
Заказать разработку:    расширения Joomla  |   интерфейсы на javascript(jQuery)  |  мобильные приложения

*

nick-gr

$_GET["track_number"] в базу пишите, потом на сайт выводите. ! фильтруйте данные
переопределяйте шаблоны компонента, дальше у вас по тексту есть - в папке HTML шаблона

Не понял, что здесь не так? Поясните пожалуйста. У меня всё работает прекрасно.

*

fsv

  • *****
  • 2502
  • + 366 -
У меня всё работает прекрасно.
Вы свой сайт здесь укажите, через какое-то время скажите, насколько прекрасно.

https://docs.joomla.org/Retrieving_request_data_using_JInput
http://joomlablog.ru/dokumentatsiya/dlya-razrabotchika/api/484-jinput-poluchenie-i-filtratsiya-peremennykh-zaprosa
http://inet-reklama.com/blog/joomla/obrabotka-polzovatelskogo-vvoda-v-joomla-2-5-jinput.html
https://docs.joomla.org/How_to_add_CSRF_anti-spoofing_to_forms
https://docs.joomla.org/How_to_override_the_output_from_the_Joomla!_core

Доработайте выложенный код, сделайте его нормальное форматирование, и цены вам не будет. Но за труды и за "поделился" спасибо.
Заказать разработку:    расширения Joomla  |   интерфейсы на javascript(jQuery)  |  мобильные приложения

*

nick-gr

Вы свой сайт здесь укажите, через какое-то время скажите, насколько прекрасно.

https://docs.joomla.org/Retrieving_request_data_using_JInput
http://joomlablog.ru/dokumentatsiya/dlya-razrabotchika/api/484-jinput-poluchenie-i-filtratsiya-peremennykh-zaprosa
http://inet-reklama.com/blog/joomla/obrabotka-polzovatelskogo-vvoda-v-joomla-2-5-jinput.html
https://docs.joomla.org/How_to_add_CSRF_anti-spoofing_to_forms
https://docs.joomla.org/How_to_override_the_output_from_the_Joomla!_core

Доработайте выложенный код, сделайте его нормальное форматирование, и цены вам не будет. Но за труды и за "поделился" спасибо.

Изменил код. Написал в t_num.php получение значения текстового поля через JInput. Спасибо за поправку.
« Последнее редактирование: 10.07.2015, 17:41:18 от nick-gr »