В 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 кругов, это явно не умное решение, если у вас есть десятки или сотни элементов.
Это, как говорится, это мое предложение:
#gradient-temporary
, точно так же, как красный. [тысяча сто тридцать одна] "url(#gradient-red)"
на "url(#gradient-temporary)"
. Это изменение немедленно, никакого эффекта на экране не видно. "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>
Наблюдение, поскольку Вы хотите это для поставки Вас, могло бы хотеть спросить, кто бы ни обрабатывает Вашу поставку, есть ли у них своего рода 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
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);
Если система не поддерживает прямого способа экспортировать заказы, Вы могли бы создать представление в базе данных, которая перечисляет заказы, которые необходимо экспортировать. Затем используйте что-то как phpMyAdmin для экспорта данных из представления как CSV.
Вы также можете посмотреть это расширение: 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>";
?>