I currently have a set of urls which are derived from their controller names but they're not very url friendly.
For example, is there anyway I change:
example.com/admin/news_manager/add_article
to
example.com/admin/news-manager/add-article
Any help would be greatly appreciated! Thank you.
If its just that one function you can open applications/config/routes.php and add a line something like this:
$route['^admin/news-manager/add-article'] = $route['admin/news_manager/add_article'];
depending on what your other urls are you could come up with a more generic rule.
Here's what I have, put this in your application/core folder as MY_Router.php
It will convert all of the -'s in your url to _'s.
<?php
class MY_Router extends CI_Router {
function set_class($class)
{
$this->class = $this->replace_underscores($class);
}
function set_method($method)
{
$this->method = $this->replace_underscores($method);
}
private function replace_underscores($string){
return str_replace('-', '_', $string);
}
function _validate_request($segments)
{
$this->segments = $segments;
if(empty($this->segments) || $this->controller_is_in_root_folder())
return $this->segments;
if ($this->controller_is_in_a_subfolder())
{
$this->segments = $this->set_directory_and_remove_from_array();
if ($this->at_least_one_segment() > 0 && !$this->default_controller_is_in_subfolder())
{
show_404($this->fetch_directory().$this->segments[0]);
}
else
{
$this->set_class($this->default_controller);
$this->set_method('index');
if (!$this->default_controller_is_in_subfolder())
{
$this->directory = '';
return array();
}
}
return $this->segments;
}
else
show_404($this->segments[0]);
}
private function at_least_one_segment(){
return count($this->segments) >= 1;
}
private function controller_is_in_a_subfolder(){
return is_dir(APPPATH.'controllers/'.$this->segments[0]);
}
private function controller_is_in_root_folder(){
return file_exists(APPPATH.'controllers/'.str_replace('-', '_', $this->segments[0]).EXT);
}
private function set_directory_and_remove_from_array(){
$this->set_directory($this->segments[0]);
return array_slice($this->segments, 1);
}
private function default_controller_is_in_subfolder(){
return file_exists(APPPATH.'controllers/'.$this->fetch_directory().str_replace('-', '_', $this->segments[0]).EXT);
}
}
You can use URI routing. See the URI routing page in the CodeIgniter docs.
Related
I have Tag table, Post Table and PostHasTag Table. But when I go to store my tags in, PostHasTag with post_id and tag_id.
I am using foreach loop for storing tags, but it just stored last tag. Now where is my problem?
public static function postHasTags($post_id, $tag_ids)
{
$store = new PostHasTag();
foreach ($tag_ids as $tag_id) {
$checkTag = PostHasTag::where('post_id', $post_id)->where('tag_id', $tag_id)->get();
if (count($checkTag) > 0) {
return back()->with('error', 'Tag already exists');
} else{
$store->post_id = $post_id;
$store->tag_id = $tag_id;
$store->save();
}
}
return $store;
}
Line $store = new PostHasTag(); should be inside foreach() loop, so it should look like this :
public static function postHasTags($post_id, $tag_ids)
{
foreach ($tag_ids as $tag_id) {
$checkTag = PostHasTag::where('post_id', $post_id)->where('tag_id', $tag_id)->get();
if (count($checkTag)) {
return back()->with('error', 'Tag already exists');
} else{
$store = new PostHasTag(); // Better to put it here
$store->post_id = $post_id;
$store->tag_id = $tag_id;
$store->save();
}
}
return $store;
}
But in this case you are returning only last created PostHasTag. If you need all of them, then push each PostHasTag in a collection and return it.
I have a laravel application that uses a while loop to process a txt file(6000 lines) line by line together with various helpers to manipulate each string. At the end of the manipulation it stores a record in db for each line. Everything works fine, the application process the entire file in a minute and returns the view indicated. The problem is that the application than freeze(not sure if this is the appropriate term), it keeps running and the browser ask repeatedly to wait or close the application.
I noticed also this message in the laravel server if it may help
[Wed Apr 21 10:28:26 2021] 127.0.0.1:50897 Closed without sending a request; it was probably just an unused speculative preconnection
Thanks to anyone who could help me.
This is the process:
$log = new UserActivityHelper;
$log->create(Config::get('constants.user_activities.FTP_FILE_PROCESSED_START'), 'test');
$file = fopen(Storage::path("1-2021.txt"), 'r');
while(!feof($file))
{
$line = fgets($file);
//call the method that validate the string
$string = new ValidateStringHelper($line); //FIRST HELPER
$string->validate();
//check the result of the validation
if($string->validated == false){
dd("out");
} elseif ($string->empty == true){
continue;
}else{
//save the validated array of substrings as variable
$my_arr = $string->validatedChars;
//check if the province exists or create it
$province = new ProvinceExistsHelper($my_arr['district']); //SECOND HELPER
$province->check_if_exists_or_create();
if($province->new_province == true) {
$log = new UserActivityHelper;
$log->create(Config::get('constants.ftp_process.FTP_PROVINCE_CREATED'), "Creata nuova provincia con id {$province->district_id}");
self::message('yellow', "Attenzione. Nell'elaborazione sono state create nuove provincie, controllare le impostazioni.");
}
//manipolation of name and lastname
$name = ucwords(strtolower($my_arr['name_lastname']));
//check if the person already exists or create it (passing fiscal code, name and district_id)
$person = new PersonExistsHelper($my_arr['fiscal_code'], $name, $province->district_id); //THIRD HELPER
$person->check_if_exists_or_create();
$newMovement = new Movement;
$newMovement->person_id = $person->person_id;
if(array_key_exists('level', $my_arr)){
$newMovement->level = $my_arr['level'];
}
...
try {
$newMovement->save();
} catch (\Throwable $exception) {
report($exception);
return;
}
}
}
fclose($file);
$log = new UserActivityHelper;
$log->create(Config::get('constants.user_activities.FTP_FILE_PROCESSED_END'), 'test');
return view('ftp.test');
Helpers called:
class ValidateStringHelper
{
public $line;
public $empty = false;
public $validated = false;
public $validationErrors = array();
public $validatedChars = array();
public function __construct($line){
$this->line = $line;
}
public function validate(){
if ($this->line!="")
{
if(strlen($this->line) >= 186)
{
//substrings
$district = trim(substr($this->line, 0, 2));
$trade_union_tax_code = trim(substr($this->line, 2, 3));
...
//validation
//check if validated
$this->validatedChars['district'] = $district;
$this->validatedChars['trade_union_tax_code'] = $trade_union_tax_code;
...
//filter all non empty string values and not all zero strings
$filter_arr = array_filter($this->validatedChars, fn($value) => $value !== '' && preg_filter('/^(?!0*$).*$/', '$0', $value));
$this->validatedChars = $filter_arr;
$this->validated = true;
return $this->validated;
//return $this->validatedChars;
//eturn $this->validated;
} else {
$this->validationErrors[] = "string_length";
return $this->validated;
}
} else {
$this->empty = true;
return $this->empty;
}
}
class PersonExistsHelper
{
public $name_lastname;
public $fiscal_code;
public $district_id;
public $new_person = false;
public $person_id;
public function __construct(string $fiscal_code, string $name_lastname, string $district_id){
$this->fiscal_code = $fiscal_code;
$this->name_lastname = $name_lastname;
$this->district_id = $district_id;
}
public function check_if_exists_or_create()
{
$person = Person::where('fiscal_code', '=', $this->fiscal_code)->first();
if($person == NULL)
{
$this->new_person = true;
$newPerson = new Person;
$newPerson->name_lastname = $this->name_lastname;
$newPerson->district_id = $this->district_id;
$newPerson->fiscal_code = $this->fiscal_code;
$newPerson->created_by = Config::get('constants.people_creation.FTP_PROCESS');
$newPerson->save();
$this->person_id = $newPerson->id;
return $this->person_id;
} else{
$this->person_id = $person->id;
return $this->person_id;
}
}
}
class ProvinceExistsHelper
{
public $district_id;
public $district_code;
public $new_province = false;
public function __construct($district_code){
$this->district_code = $district_code;
}
public function check_if_exists_or_create()
{
//check if the province is in the Provinces table
$province = Province::where('code', '=', $this->district_code)->first();
if(!isset($province))
{
$this->new_province = true;
$newProvince = new Province;
$newProvince->name = $this->district_code;
$newProvince->code = $this->district_code;
$newProvince->save();
$this->district_id = $newProvince->id;
return $this->district_id;
} else {
//if yes, just return the id of the province
$this->district_id = $province->id;
return $this->district_id;
}
}
}
I added this in my User model:
private $rank;
public function isSuperAdmin(): bool {
if ($this->rank >= 3) {
return true;
}
return false;
}
public function isAdmin(): bool
{
if ($this->rank == 2 || $this->isSuperAdmin()) {
return true;
}
return false;
}
public function isCustomer(): bool {
if ($this->rank == 1|| ($this->isSuperAdmin() || $this->isAdmin())) {
return true;
}
return false;
}
I have rank '3' which equals the isSuperAdmin() function. So when I do the following:
if (Auth::user()->isSuperAdmin())
This works as expected. However when I, as SuperAdmin, try to do the following:
if (Auth::user()->isAdmin())
It doesn't work at all, Laravel doesn't display whatever is between #if(Auth::user()->isAdmin()) in my views when I have the role SuperAdmin. This is the same for all the roles and I don't understand why.. what am I doing wrong?
Ps. I also tried the following in the isAdmin function, which also doesn't work:
if ($this->rank >= 2 || $this->isSuperAdmin()) {
After I removed private $rank everything worked as expected.
I have condition in Controller with checks the value in database and based on this value is redirecting user to different login pages
public function getLogin()
{
$login = DB::table('login')->pluck('login');
//var_dump($login);
if ($login == 1) {
return View::make('users.login');
} else {
return View::make('users.login1');
}
}
When I go to login page I've got this error
Object of class Illuminate\Support\Collection could not be converted to int
When I var_dump($login); I get
object(Illuminate\Support\Collection)#304 (1) { ["items":protected]=> array(1) { [0]=> int(1) } }
How can I fix this error?
You can use it like this :
public function getLogin()
{
$login = DB::table('login')->pluck('login');
//var_dump($login);
if ($login->count() == 1) {
return View::make('users.login');
} else {
return View::make('users.login1');
}
}
$login is a collection, you get all the values of table login with your query. if you want this create a for loop and have your if statement inside.
for example :
foreach ($login as $val) {
if ($val== 1) {
return View::make('users.login');
} else {
return View::make('users.login1');
}
}
You should use isEmpty() or count() here, for example:
if (!$login->isEmpty())
if (count($login) > 0)
if ($login->count() > 0)
Ok Its just simple in this case, You can use [0] with login to access it as int.
public function getLogin()
{
$login = DB::table('login')->pluck('login');
//var_dump($login);
if ($login[0] == 1) {
return View::make('users.login');
} else {
return View::make('users.login1');
}
}
I try to get data from a model, but the value of the column name from the data model is in another variable. Here's a little preview what I try to achieve:
switch($device->target_objectclass_id) {
case 10:
$handler = Servers::findOrFail($device->target_object_id);
default:
break;
}
if($handler->($condition->column) ($condition->condition) ($condition->value)) {
//process the other data it it's true
}
Example of what should be displayed:
if($handler->status == 1) {
//handle data
}
The reason behide this is a little bit complicated. The user's need to create triggers which will be executed.
Btw, all possible conditons are possible.
For example:
check table where column condition value
check servers where status == 1
Hope someone has an answer if you can understand my problem...
I'm not sure how feasible it is to dynamically insert the operator into an expression like that. However, with a limited set of operators, you could do something like this:
class YourClass
{
public function yourMethod()
{
// Your model instance to test, I've just used a stdClass as an example
$instance = new stdClass;
$instance->status = 1;
// Your condition instance
$condition = new stdClass;
$condition->column = 'status';
$condition->condition = '==';
$condition->value = '1';
if ($this->compare($instance, $condition)) {
// This code will execute then $instance->status == '1'
}
}
public function compare($instance, $condition)
{
$operator = $condition->condition;
$condition = $condition->column;
$value = $condition->value;
switch ($operator) {
case '==':
return $instance->$column == $value;
case '!=':
return $instance->$column != $value;
case '>':
return $instance->$column > $value;
case '<':
return $instance->$column < $value;
case '>=':
return $instance->$column >= $value;
case '<=':
return $instance->$column <= $value;
default:
throw new \Exception('Unsupported operator');
}
}
}
Or a nicer, class based way of doing it...
class Conditional
{
protected $operator;
protected $column;
protected $value;
protected $supportedOperators = [
'==' => 'equals',
'!=' => 'notEquals'
];
public function __construct($column, $operator, $value)
{
$this->column = $column;
$this->operator = $operator;
$this->value = $value;
}
public function check($instance)
{
$method = $this->getMethod();
$instanceValue = $instance->{$this->column};
return $this->$method($instanceValue, $this->value);
}
private function getMethod()
{
if (isset($this->supportedOperators[$this->operator]) && method_exists($this, $this->supportedOperators[$this->operator])) {
return $this->supportedOperators[$this->operator];
}
throw new \Exception('Unsupported operator');
}
protected function equals($one, $two)
{
return $one == $two;
}
protected function notEquals($one, $two)
{
return $one != $two;
}
}
Then you can use it like this...
$instance = new stdClass;
$instance->status = 1;
$conditional = new Conditional('status', '==', 1);
if ($conditional->check($instance)) {
// Execute if $instance->status == 1.
}