Архитектура монолит.У Вас модуль = агрегат? Это не одно и то же.
например для Order это его классы которые лежать в папке Order, его Aggregate Root
За пределами своего неймспейса модуля, классы напрямую не используются и не вызываются, кроме Api service классовМодуль - самостоятельная единица, которая должна работать без других модулей. Low coupling, high cohesion. Представьте, что он может подключаться через composer, вот каким он должен быть? У Вас так?
сперва у модуля Store проверить работает ли этот store, то есть проверить его рабочие часы и дневной лимит на продажуМне кажется, очевидно, что если это все-таки 2 разных агрегата одного контекста, то Store даже бизнес-логику тут не реализует, нужно просто проверить спецификацию. Делать это нужно в Application, вызвать 2 агрегата последовательно. Не нужно делать это ответственностью Order.
$items = array_intersect(
$companyItems, // на сайте
array_map(
function (string $item) {
$parts = explode(' ', $item);
return end($parts);
},
$supplierItems // от поставщика
),
);
Проверкаin_array($item['name'], $supplierNames, true)
public function makeRequest(array $args, string $type) {
Здесь выполняете логику в зависимости от typeif($type === "source1") {
class SpecificTypeApiService implemets ApiServiceInterface
{
public function send()
{
//код ниже просто скопирован, стоит вынести что-то в параметры, что-то в конструктор и сделать код более элегантным
//можно сделать абстрактный класс и делегировать ему общий для разных type (сервисов) функционал
$proxiesArr = array('72.37.217.3:4145', '174.77.111.196:4145');
$randProx = array_rand($proxiesArr, 1);
$proxyIp = $proxiesArr[$randProx];
// $proxyIp = '174.77.111.196:4145';
$url1 = $args[0] . $args[1];
$headers = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.105 YaBrowser/21.3.3.230 Yowser/2.5 Safari/537.36'
];
$curl = curl_init();
curl_setopt($curl, CURLOPT_PROXY, $proxyIp);
curl_setopt($curl, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS4);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_VERBOSE, 1);
curl_setopt($curl, CURLOPT_POST, false);
curl_setopt($curl, CURLOPT_URL, $url1);
$result = curl_exec($curl);
if(curl_exec($curl) === false)
{
echo 'Ошибка curl: ' . curl_error($curl);
} else {
echo 'Операция завершена без каких-либо ошибок';
}
return $result;
}
}
public function makeRequest(array $args, ApiServiceInterface $apiService) {
$apiService->send();
configuration_value
, то можно напрямую //$array - исходный массив
//$configurationValue - новый массив
$configurationValue = $array['configuration_value'];
Однако смысла в этом никогда нет, только память расходовать. Значения по ключу можно получать там, где это нужно, не сохраняя их в отдельную переменную. $datetime
создается внутри условия, в else
не хватает return
, т.к. код дальше требует переменную $datetime
, которой нет ($formatter->format($datetime)
)$datetime = new DateTime($user_reg);
+ $datetime->setTimezone(new DateTimeZone('Europe/Moscow'));
$sql = "SELECT
o.overhead_code,
f.name from_name,
f.comapny from_company,
f.city from_city,
f.address from_address,
f.phone from_phone,
t.name to_name,
t.comapny to_company,
t.city to_city,
t.address to_address,
t.phone to_phone,
FROM overheads o
JOIN cities f
ON f.from_city = o.id
JOIN cities t
ON t.to_city = o.id
WHERE o.overhead_code = '$trackingNumber'";
открывается второй файл и подгружается первый есть есть номер т звоним а если нет ищем другой вариант
$phones = file("./promotion.dat");
$users = file("./promotion2.dat");
foreach ($users as $index => $data) {
if (!array_key_exists($index, $phones)) {
continue;
}
$user = preg_replace('/[^<]*<\|>[^<]*<\|>([^<]+).*/', '\1', $data);
$phone = preg_replace('/.*<\|>(\d+)<\|>.*/', '\1', $phones[$index]);
echo sprintf('%s: %s', $user, $phone);
echo PHP_EOL;
}
echo Carbon::now()->subMinutes(2)->locale('ru_RU')->diffForHumans(); // '2 минуты назад'
$files = [
'file-foo.php',
'file.php',
'file2.php',
'file-bar.php',
'file3.php',
];
shuffle($files);
foreach ($files as $file) {
include ($file);
}
foreach (array_slice($files, 0, 10) as $file) {
include ($file);
}
- shuffle($files);
- foreach ($files as $file) {
+ foreach (array_rand($files, 10) as $file) {
include ($file);
}
Но array_rand не подойдет, если нужно сделать некую пагинацию (выводить первые 10 случайных файлов, затем следующие 10 других случайных файлов и в итоге вывести все файлы в случайном порядке, а затем поменять порядок и снова выводить по 10). Подход с array_slice позволит сделать такую пагинацию. $datetime = new DateTime($user_reg);
+ $formatter = new IntlDateFormatter('ru_RU');
+ $formatter->setPattern('d MMM, Y');
- echo $datetime->format('F j, Y');
+ echo $formatter->format($datetime);
if (!str_contains($url, '/info/') && !str_contains($url, '/news/')) {
echo 'вывод содержимого';
} else {
echo 'вывод содержимого';
}
$str = "$status['Совершенно_новое'] = 'Brand_new<br>New'";
$pattern = "(?<=\$status\[')([а-яА-ЯёЁa-zA-Z]+?.*')([A-za-z]+?.*)(?=')";
preg_match($patern, $str, $matches);
var_dump($matches);
// полный match и группы
\$status\['([^']+)'\][^']*'([^']*)'
?>
и писать чистый HTML, можно посреди HTML открыть PHP тег <?php
и воспользоваться языком, например вывести HTML в цикле (опять же, закрыв тег после начала цикла), или использовать переменную как значение, или выводить HTML по условию.тут всякие визуальные уточнения страницы; форма, css специфика для страницыcss стоит писать отдельно и подключать как файл/файлы, для формы будет отдельный шаблон
тут всякие оперативные реакции на действия в браузере требуемые страницей.js тоже стоит писать отдельно и подключать как файл/файлы
- $ref_system = $pdo->prepare("SELECT * FROM `db_ref_system` GROUP BY `rs_type` ORDER BY `id` ASC");
+ $ref_system = $pdo->prepare("SELECT * FROM `db_ref_system` ORDER BY `id` ASC");
<?php
$all = $ref_system->fetchAll();
$plc = array_filter($all, fn ($fields) => $fields['rs_type'] === 'plc');
$deposit = array_filter($all, fn ($fields) => $fields['rs_type'] === 'deposit');
$offer = array_filter($all, fn ($fields) => $fields['rs_type'] === 'offer');
?>
<?php foreach ([$plc, $deposit, $offer] as $level => $data): ?>
<div class="col-md-4 col-12 mb-lg-0 mb-4">
<div class="fw-bold h5 mb-3">
<?= $level + 1 ?>-й уровень
</div>
<?php foreach($data as $ref) : ?>
<div class="mb-4">
<span class="text-muted fw-semibold"><?=$ref['rs_type']?></span>
<div>
<div class="d-flex align-items-center pt-2">
<div class="progress w-100">
<div class="progress-bar bg-warning" role="progressbar" style="width: 100%;" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100"></div>
</div>
<span class="ms-3 fw-bold text-warning"><?=$ref['rs_percent']?>%</span>
</div>
</div>
</div>
<?php endforeach; ?>
</div>
<?php endforeach; ?>
\Bitrix\Main\XmlWriter
, то с его помощью - никак.class AppXmlWriter extends XmlWriter
{
private $file = '';
private $charset = '';
private $tab = 0;
private $f = null;
private $lowercaseTag = false;
private $errors = array();
// конструктор скопирован, т.к. там все private
public function __construct(array $params)
{
if (isset($params['file']))
{
$server = \Bitrix\Main\Application::getInstance()->getContext()->getServer();
$this->file = $server->getDocumentRoot() . trim($params['file']);
// create new file
if (
isset($params['create_file']) &&
$params['create_file'] === true &&
is_writable($this->file)
)
{
unlink($this->file);
}
}
if (isset($params['charset']))
{
$this->charset = trim($params['charset']);
}
else
{
$this->charset = SITE_CHARSET;
}
if (isset($params['lowercase']) && $params['lowercase'] === true)
{
$this->lowercaseTag = true;
}
if (isset($params['tab']))
{
$this->tab = (int)$params['tab'];
}
}
public function prepareAttributes(array $attributes): string
{
$result = '';
if (empty($attributes)) {
return $result;
}
foreach ($attributes as $key => $value) {
$result .= sprintf(' %s="%s"', $key, $value);
}
return $result;
}
public function writeBeginTag($code, array $attributes = [])
{
if (!$this->f) {
return;
}
fwrite($this->f, str_repeat("\t", $this->tab) . '<' . $this->prepareTag($code) . $this->prepareAttributes($attributes) . '>' . PHP_EOL);
$this->tab++;
}
public function writeFullTag($code, $value, array $attributes = [])
{
if (!$this->f) {
return;
}
$code = $this->prepareTag($code);
$codeAttributes = $this->prepareAttributes($attributes);
fwrite($this->f,
str_repeat("\t", $this->tab) .
(
trim($value) == ''
? '<' . $code . $codeAttributes . ' />' . PHP_EOL
: '<' . $code . $codeAttributes . '>' .
$this->prepareValue($value) .
'</' . $code . '>' . PHP_EOL
)
);
}
}
)">
после span
идут, href
не назначен (переменная вызывается, в которой массив, а ключ массива отсутствует и php не закрывается).<a href="<?=$arSection["SECTION_PAGE_UR"]?>" data-bx-app-ex-href="<?=$arSection["SECTION_PAGE_UR"]?>" class="section">
<div class="section__picture">
<?
$picture = SITE_TEMPLATE_PATH.'/img/no_photo.png';
if ($arSection["PICTURE"] != ""){
$picture = CFile::ResizeImageGet($arSection["PICTURE"], Array("height" => 175))["src"];
}
?>
<div style="background-image:url('<span id=" title="Код PHP: <?=$picture;?>" class="bxhtmled-surrogate">
<span class="bxhtmled-surrogate-inner"><span class="bxhtmled-right-side-item-icon"></span><span class="bxhtmled-comp-lable" unselectable="on" spellcheck="false">Код PHP</span></span>
</div>
<div class="section__icon">
<i class="far fa-sign-in"></i>
</div>
</div>
<div class="section__main">
<?=$arSection["NAME"];?>
</div>
</a>
</div>
<?
if ($s > 5)
break;
$s++;?> <?endforeach;?>
</div>
<?if (count($arSections) > 6):?>
<div class="button-line">
<a href="/katalog/" class="button button_black wstyle wstyle_white">Посмотреть все категории</a>
</div>
<?endif;?>
</div>
<?endif;?> <?
$iblock_id = 4;
$arServices = Array();
$arFilterE = Array("IBLOCK_ID" => $iblock_id, "ACTIVE" => "Y");
$arSelectE = Array("IBLOCK_ID", "ID", "NAME", "PREVIEW_PICTURE");
$rsElement = CIBlockElement::GetList(
Array("SORT"=>"ASC"),
$arFilterE,
false,
false,
$arSelectE
);
while($arElement = $rsElement->GetNextElement()){
$arFieldsE = $arElement->GetFields();
$arServices[] = $arFieldsE;
}
?> <?if (count($arServices) > 0):?>
<div class="block block_border">
<div class="title title_center">
Популярные услуги
</div>
<div class="row">
<?$s = 1;?> <?foreach ($arServices as $arService):?>
<div class="col-lg-4">
<a href="<?=$arService["DETAIL_PAGE_URL"]?>" data-bx-app-ex-href="<?=$arService["DETAIL_PAGE_URL"];?>" class="section section_wtitle">
<div class="section__picture">
<?
$picture = SITE_TEMPLATE_PATH.'/img/no_photo.png';
if ($arService["PREVIEW_PICTURE"] != ""){
$picture = CFile::ResizeImageGet($arService["PREVIEW_PICTURE"], Array("height" => 200))["src"];
}
?>
<div style="background-image:url('<span id=" title="Код PHP: <?=$picture;?>" class="bxhtmled-surrogate">
<span class="bxhtmled-surrogate-inner"><span class="bxhtmled-right-side-item-icon"></span><span class="bxhtmled-comp-lable" unselectable="on" spellcheck="false">Код PHP</span></span>
</div>
<div class="section__title">
<?=$arService["NAME"];?>
</div>
</div>
</a>