Как это клеется с result_modifier остается только догадыватьься
// объект и di будет получен из service locator
$component = new \App\Common\Component\Component(
[
'news' => new App\Common\Component\Bitrix\NewsList\ComponentFactory(),
]
);
/** @var array $arResult */
$arResult = $component->create('news')->modifyResult($arResult);
// local/templates/main/components/bitrix/news.list/archive/result_modifier.php
namespace App\Component\Bitrix\NewsList\Archive;
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) {
die;
}
function modifyResult(array &$result): void
{
$result = [];
}
modifyResult();
Поэтому вручную его никогда не надо вызывать - что и запрещается в симфоневских конроллерах - а только для автоматического создания классов.
use AppBundle\Service\MessageGenerator;
// получение доступа к сервисам таким образом работает только,
// если вы расширите контроллер
class ProductController extends Controller
{
public function newAction()
{
// only works if your service is public
$messageGenerator = $this->get(MessageGenerator::class);
$message = $messageGenerator->getHappyMessage();
$this->addFlash('success', $message);
// ...
}
}
\Product::getName
в интерфейс. Этот метод должен возвращать одно и то же значение для нескольких конкретных продуктов, поэтому добавил также абстрактный класс BaseProduct
. Подходит ли такая реализация? interface Product
{
public function getName(): string;
public function operation(): string;
}
abstract class BaseProduct implements Product
{
public function getName(): string
{
return 'some_product1';
}
}
class ConcreteProduct1 extends BaseProduct
{
public function operation(): string
{
return "{Result of the ConcreteProduct1}";
}
}
class ConcreteProduct2 extends BaseProduct
{
public function operation(): string
{
return "{Result of the ConcreteProduct2}";
}
}
CREATE INDEX `idx_table_DATETIME_IP` ON `table` (`DATETIME`, IP(15))
ClassA
парсит страницу и отдает пользователю Excel-файл со списком этих заказов.ClassA
я менять не могу.$classA = new ClassA;
$classA->foo();
class ClassA
{
public function foo()
{
if ($_REQUEST["mode"] == 'excel') {
$fname = basename($APPLICATION->GetCurPage(), ".php");
// http response splitting defence
$fname = str_replace(array("\r", "\n"), "", $fname);
header("Content-Type: application/vnd.ms-excel");
header("Content-Disposition: filename=" . $fname . ".xls");
$this->DisplayExcel(); // echo '<html></html>';
require($_SERVER["DOCUMENT_ROOT"] . BX_ROOT . "/modules/main/include/epilog_admin_after.php");
die();
}
}
}
ClassB
переопределить foo()
, добавить проверку наличия параметра save-excel в строке запроса, буферизировать вывод DisplayExcel()
и сохранить в файл. Во всяком случае, я думал так отделаться малой кровью.