use Illuminate\Database\Eloquent\Casts\Attribute;
class Order extends Model{
protected $casts = ['date_time' => 'datetime:Y-m-d H:00'];
function dateTime(): Attribute
{
return Attribute::make(
get: fn () => $this->castAttribute(
'date_time',
($this->date ?: '1970-01-01') . ' ' . ($this->time ?: '10:00:01')
)
)
);
}
}
# php artisan tinker
App\Models\Order::first()->date_time;
# = Illuminate\Support\Carbon @0 {#7053
# date: 1970-01-01 00:00:00.0 UTC (+00:00),
# }
//Псевдокод. не проверял.
$lastProductIndex=100000;
// сначала нужно дочитать до <products>
// потом перебирать <product>
while($xmlReader->next("product") && --$lastProductIndex) {
// skip
}
if($lastProductIndex==0){
// тут последний обработанный прошлый раз
}else{
// продуктов стало меньше?
}
->orderByRaw('CASE isread WHEN 0 THEN 0 ELSE 1 END, last_message_time DESC')
ORDER BY FIELD(id, 100, 100500, 300), last_message_time
<table id="example" width="70%" style=" white-space: pre-wrap;">
<thead>
<tr><th>1</th><th>2</th><th>3</th><th>4</th><th>5</th><th>6</th></tr>
</thead>
<!-- ... -->
$('#example').DataTable( {
autoWidth: false,
columnDefs: [
{ targets: '_all', "width": "1%" }
]
} );
style="overflow-wrap: anywhere;"
eсли в датасете есть слишком_длинные_значения_которые_точно_не_влезут в конечную ширину колонки . и так же имеется pinia такого вида:
const {search} useSearchStore ()
выполняется const search = ref('')
. т.е. это новый search.@searchData = "updateSearchQuery"
- обновляете свой отдельный инстанс search.// вот pinia
export const useSearchStore = defineStore('search', () => {
const search= ref('')
function updateSearch(v) {
search.value=v
}
return { search, updateSearch }
})
через "v-if/v-else-if" рендерить ту, которая равна "close".
// пакет config/logging.php
return [
'channels' => [
'my-packet-name-log-channel' => [
'driver' => 'single',
'path' => env('MY_P_N_LOG_PATH', storage_path('logs/my-packet-name.log')),
'level' => env('LOG_LEVEL', 'debug'),
'replace_placeholders' => true,
'permission' => 0664
// ...
],
],
];
// сервис провайдер пакета
public function register(): void
{
if (!($this->app instanceof CachesConfiguration && $this->app->configurationIsCached())) {
$config = $this->app->make('config');
$config->set('logging', array_merge_recursive(
require __DIR__ . '/../config/logging.php',
$config->get('logging', [])
));
}
}
function aggregator (a, c, maxChars){
if (a[0].textContent.length > maxChars) {
a[1].appendChild(c)
} else if (c.children?.length > 0) {
const agg = spanParse(c, maxChars - a[0].textContent.length);
a[0].appendChild(agg[0])
if (agg[1]) {
a[1].appendChild(agg[1])
}
} else {
a[0].appendChild(c)
}
return a;
}
function spanParse(rootSpan, maxChars) {
const aggregated = [document.createElement('span'), document.createElement('span')]
return [...rootSpan.childNodes].reduce((a, c) => aggregator(a, c, maxChars), aggregated)
}
function split(elem) {
const r = spanParse(elem, elem.textContent.length / 2)
console.log(r[0].textContent.length, r[1].textContent.length)
}
split(document.getElementByTag('span'));
const readAsDataURL = (image) => {
const fr= new FileReader();
return new Promise((resolve, reject) => {
fr.onerror = () => { fr.abort(); reject(new Error( 'err msg' )); };
fr.onload = () => { resolve(fr.result); };
fr.readAsDataURL(image)
});
};
[...selectedImages].map( async (image, index) => {
const data = await readAsDataURL(image)
return (<img src={data} alt="" key={`previewImage:${index}`} />
})
<?php
ignore_user_abort(true);
set_time_limit(0);
ob_start();
header('Connection: close');
header('Content-Length: '.ob_get_length());
// можно добавить http статус подходящий
ob_end_flush();
ob_flush();
flush();
// дальше запуск
run_havy_task();
json {'img'=>full_image_url, 'tumb'=>tumb_image_url}
<img src=tumb_image_url @click=showImage(full_image_url)>
Вариантов вывода несколько
"resizeImageGet", которая при первом вызове сжимает и обрезает изображение
var ordered = Object.entries({
4889: "Скрипт ", 4914: "Ааа", 11994: "Сервис", 12344: "иииии", 12417: "Тестовая", 12432: "ТТТ ", 12446: "Ма"
}).sort(
(a,b)=>a[1]<b[1]?-1:a[1]>b[1]?1:0
).reduce(
(a,c)=>{a[`'${c[0]}'`]=c[1]; return a},
{}
);
Object.getOwnPropertyNames(ordered)
// ["'4914'", "'12446'", "'11994'", "'4889'", "'12432'", "'12417'", "'12344'"]
// range.setValues(arr);
arr.forEach(
(val,idx) => {
if (val!=='') range.getCell(1, idx+1).setValue(val)
}
);