Заказы экспорта от Magento для отправки

Интерполяция перехода

В D3 переход в основном интерполирует начальное значение к конечному значению. Это может быть легко продемонстрировать, если мы интерполируем числа. Например, давайте перейдем от 50 к 2000:

const interpolator = d3.interpolate(50, 2000);
d3.range(0, 1.05, 0.05).forEach(function(d) {
  console.log(interpolator(d))
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>

Мы также можем интерполировать строки:

const interpolator = d3.interpolate("March, 2000", "March, 2020");
d3.range(0, 1.05, 0.05).forEach(function(d) {
  console.log(interpolator(d))
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>

Проблема

Теперь давайте посмотрим на ваш случай: вы хотите интерполировать из этого:

  • url("#gradient-red")

К этому:

  • url("#gradient-blue") [1130]

Каковы возможные промежуточные звенья здесь? Вы видите, что это невозможно? Вот доказательство:

const interpolator = d3.interpolate("url(#gradient-red)", "url(#gradient-blue)");
d3.range(0, 1.1, 0.1).forEach(function(d) {
  console.log(interpolator(d))
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>

Как видите, самая первая интерполяция мгновенно приведет к концу значение. [тысяча сто сорок четыре]

Возможные решения

Наиболее очевидным решением является интерполяция стоп-цвета. Однако, как вы только что обнаружили, это изменит градиент всех кругов.

Итак, наивное исправление создает несколько градиентов, по одному на каждый круг, с уникальными идентификаторами. Хотя это может быть подходящим решением для 3 или 4 кругов, это явно не умное решение, если у вас есть десятки или сотни элементов.

Это, как говорится, это мое предложение:

  1. Создайте временный градиент, давайте присвоим ему идентификатор #gradient-temporary, точно так же, как красный. [тысяча сто тридцать одна]
  2. Затем, когда вы выбираете (или фильтруете его каким-либо образом) круг, меняете его заливку с "url(#gradient-red)" на "url(#gradient-temporary)". Это изменение немедленно, никакого эффекта на экране не видно.
  3. Выполните переход по стоп-цвету этого временного градиента.
  4. Когда переход завершится, измените заполнение круга с "url(#gradient-temporary)" на "url(#gradient-blue)". Опять же, это немедленно. Также измените цвет остановки временного градиента на красный.

Таким образом, вы можете иметь сотни кругов, но вам просто нужно 3 градиента для их перехода.

Вот демонстрация с этим подходом, нажмите на каждый кружок, чтобы перевести его:

const circles = d3.selectAll("circle");
circles.on("click", function() {
  const element = this;
  d3.select(element).style("fill", "url(#gradient-temporary)");
  d3.select("#gradient-temporary").select("stop:nth-child(2)")
    .transition()
    .duration(1000)
    .style("stop-color", "rgb(0,0,255)")
    .on("end", function() {
      d3.select(element).style("fill", "url(#gradient-blue)");
      d3.select("#gradient-temporary").select("stop:nth-child(2)")
        .style("stop-color", "rgb(255,0,0)")
    })
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
<svg>
    <defs>
        <linearGradient id="gradient-red" x1="0%" y1="0%" x2="100%" y2="0%">
            <stop offset="0%" style="stop-color:rgb(211,211,211);stop-opacity:1" />
            <stop offset="100%" style="stop-color:rgb(255,0,0);stop-opacity:1" />
        </linearGradient>
        <linearGradient id="gradient-temporary" x1="0%" y1="0%" x2="100%" y2="0%">
            <stop offset="0%" style="stop-color:rgb(211,211,211);stop-opacity:1" />
            <stop offset="100%" style="stop-color:rgb(255,0,0);stop-opacity:1" />
        </linearGradient>
        <linearGradient id="gradient-blue" x1="0%" y1="0%" x2="100%" y2="0%">
            <stop offset="0%" style="stop-color:rgb(211,211,211);stop-opacity:1" />
            <stop offset="100%" style="stop-color:rgb(0,0,255);stop-opacity:1" />
        </linearGradient>
    </defs>
    <g class="node">
        <circle r="20" cx="20" cy="70" style="fill: url('#gradient-red');"></circle>
    </g>
    <g class="node">
        <circle r="20" cx="80" cy="70" style="fill: url('#gradient-red');"></circle>
    </g>
    <g class="node">
        <circle r="20" cx="140" cy="70" style="fill: url('#gradient-red');"></circle>
    </g>
    <g class="node">
        <circle r="20" cx="200" cy="70" style="fill: url('#gradient-red');"></circle>
    </g>
    <g class="node">
        <circle r="20" cx="260" cy="70" style="fill: url('#gradient-red');"></circle>
    </g>
</svg>

9
задан Daniel Mann 26 September 2015 в 04:22
поделиться

4 ответа

Наблюдение, поскольку Вы хотите это для поставки Вас, могло бы хотеть спросить, кто бы ни обрабатывает Вашу поставку, есть ли у них своего рода API, таким образом, можно создавать/покупать/загружать соответствующий модуль поставки и сэкономить себя стычка слоняния без дела с файлами CSV.

Если Вы действительно хотите файл CSV однако, я могу показать Вам, как создать его. Вы не упоминали, куда этот сценарий будет работать так, я предположу, что это - внешний сценарий (который поможет использовать с заданием крона). Вы хотите сделать следующее:

//External script - Load magento framework
require_once("C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\magento\app\Mage.php");
Mage::app('default');

$myOrder=Mage::getModel('sales/order'); 
$orders=Mage::getModel('sales/mysql4_order_collection');

//Optional filters you might want to use - more available operations in method _getConditionSql in Varien_Data_Collection_Db. 
$orders->addFieldToFilter('total_paid',Array('gt'=>0)); //Amount paid larger than 0
$orders->addFieldToFilter('status',Array('eq'=>"processing"));  //Status is "processing"

$allIds=$orders->getAllIds();
foreach($allIds as $thisId) {
    $myOrder->reset()->load($thisId);
    //echo "<pre>";
    //print_r($myOrder);
    //echo "</pre>";

    //Some random fields
    echo "'" . $myOrder->getBillingAddress()->getLastname() . "',";
    echo "'" . $myOrder->getTotal_paid() . "',";
    echo "'" . $myOrder->getShippingAddress()->getTelephone() . "',";
    echo "'" . $myOrder->getPayment()->getCc_type() . "',";
    echo "'" . $myOrder->getStatus() . "',";
    echo "\r\n";
}

Ради краткости (и исправность) я не перечислил всю доступную информацию для заказа. Можно узнать, какие поля доступны путем дампа соответствующих объектов и взгляда на их поля.

Например, если необходимо было сделать print_r ($myOrder-> getBillingAddress ()); Вы видели бы поля как "address_type" и "lastname". Можно использовать их с $myOrder-> getBillingAddress ()-> getAddress_type () и $myOrder-> getBillingAddress ()-> getLastname () соответственно.

Править: Измененный код согласно ответу craig.michael.morris

24
ответ дан 4 December 2019 в 06:49
поделиться

I was in the process of implementing your solution and noticed that it was only returning the first values for all the foreign keys such as billing address, shipping address, payment etc...

This can be fixed by changing

$myOrder->load($thisId);

to

$myOrder->reset()->load($thisId);

4
ответ дан 4 December 2019 в 06:49
поделиться

Если система не поддерживает прямого способа экспортировать заказы, Вы могли бы создать представление в базе данных, которая перечисляет заказы, которые необходимо экспортировать. Затем используйте что-то как phpMyAdmin для экспорта данных из представления как CSV.

0
ответ дан 4 December 2019 в 06:49
поделиться

Вы также можете посмотреть это расширение: http://www.magentocommerce.com/extension/1158/manual-order-export

Также вы можете подключиться через мыло: Этот пример настроен для localhost и предполагает, что вы настроили пользователя и роль веб-служб в разделе system >> web-службы в admin.

    <?php 
$time = microtime(); 
$time = explode(' ', $time); 
$time = $time[1] + $time[0]; 
$begintime = $time; 
?> 
<?php 
ini_set('error_reporting', E_ALL); 
ini_set('display_errors', 1); 
// hostname 
$host= '127.0.0.1'; 
// if store in /magento change /shop, if store in root remove /shop 
$client= new SoapClient('http://'.$host.'/magento/index.php/api/soap/?wsdl'); 

// Can be added in Magento-Admin -> Web Services with role set to admin 
$apiuser= 'soap'; 
// API key is password 
$apikey = '******'; 
$sess_id= $client->login($apiuser, $apikey); 
echo "<html>"; 
echo "<head>"; 
echo "<LINK REL=StyleSheet HREF=\"style.css\" TYPE=\"text/css\" MEDIA=screen>"; 
echo "</head>"; 
echo "<body>";

$result= $client->call($sess_id, 'sales_order.list',  array(array('status'=>array('='=>'Pending'))));
echo '<pre>';
print_r($result);
echo '<pre>';


?> 
<?php 
// Let's see how long this took… 
$time = microtime(); 
$time = explode(" ", $time); 
$time = $time[1] + $time[0]; 
$endtime = $time; 
$totaltime = ($endtime - $begintime); 
echo '<br /><br /><em>This Magento SOAP API script took ' .$totaltime. ' seconds, precisely.</em>'; 
// ...and close the HTML document 
echo "</body>"; 
echo "</html>"; 
?>
4
ответ дан 4 December 2019 в 06:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: